#pragma once // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 LOGICCLIENT_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // LOGICCLIENT_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef LOGICCLIENT_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "LogicClientX64D.lib") #else #pragma comment(lib, "LogicClientX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "LogicClientD.lib") #else #pragma comment(lib, "LogicClient.lib") #endif #endif #endif #ifdef LOGICCLIENT_EXPORTS #define LOGICCLIENT_API __declspec(dllexport) #else #define LOGICCLIENT_API __declspec(dllimport) #endif #include #include #include #include "MsgQueue.h" #include "DiosFileHandle.h" #include "LogicDevice.h" using namespace std; class LOGICCLIENT_API LogicClient { HANDLE m_ClientLock; ACTION_SYNC_MODE m_SyncMode; DWORD m_OwnerThreadId;//线程安全:不能让多线程同时访问当前CLIENT MsgQueue *m_pPacketWaitQue; MsgQueue *m_pPacketReceivedQue; bool InitClient(const char *pPath, int flags); void ConnectCDI(); void DisconnectCDI();//after close,Disconnect the Client from the system bool DeQueuePacket_Internal(ResDataObject &Packet); void ClearQueue_Internal(); protected: bool m_ClosedFlag; LogicDeviceSysIF *m_pSysIF; DWORD m_ReqIdx;//for the Action_req&Action_Res string *m_pActionName; LogicDevice *pLogicDeivce; int m_FileFlags; string *m_pLastMsgInfo; string *m_pFilePath; ResDataObject m_DeviceResource; DiosDevFileHandle *m_pFileHandle; RET_STATUS ProcessClose(ResDataObject &packet); RET_STATUS ProcessOpenResponse(ResDataObject &packet); RET_STATUS ProcessResource(ResDataObject &packet); RET_STATUS ProcessActionResponse(ResDataObject &packet, ResDataObject &OutputParam); RET_STATUS UpdateDeviceResource(int cmdType, ResDataObject &packet); public: HANDLE m_ResponseEvent; HANDLE m_NotifyEvent; LogicClient(void); virtual ~LogicClient(void); //router DIOS_PACKET_ROUTE m_Router; bool SetRouter(DIOS_PACKET_ROUTE Route); //Open+Resource virtual int Open(const char *pPath, int flags, DWORD timeout = INFINITE); //Close virtual int Close(); bool GetFilePath(ResDataObject &path); bool Lock(DWORD timeout = INFINITE); void UnLock(); RET_STATUS UpdateDeviceResource(DWORD timeout = INFINITE); bool IsClosed(); bool IsThreadSafe();//thread safe op const char *GetLastErrorInfo(); bool IsAllReqFinished(); bool SetRequestSyncMode(ACTION_SYNC_MODE Sync); ACTION_SYNC_MODE GetRequestSyncMode(); //resource get RET_STATUS GetDeviceType(GUID PARAM_OUT &DevType); RET_STATUS GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource); RET_STATUS GetDeviceResource(const char* ResourceKey,ResDataObject PARAM_OUT *pDeviceResource); void PacketArrived(ResDataObject *pResponse); //Actions virtual int Action(const char *pActionName, ResDataObject &ReqParams, ResDataObject &ResParams, DWORD timeout = INFINITE); //同步Action的异步模式 virtual int Action_Req(const char *pActionName, ResDataObject &ReqParams, DWORD timeout = INFINITE); virtual int Action_Res(const char *pActionName, ResDataObject &ResParams, DWORD timeout = INFINITE); HANDLE GetResponseHandle(); bool GetFileHandle(DiosDevFileHandle &Handle); HANDLE GetNotifyHandle(); void CleanupQueue(); bool IsDataArrived(); virtual PACKET_CMD ReadCmd(ResDataObject &CmdObject); RET_STATUS SYSTEM_CALL WaitForState(const char* state,DWORD timeout = INFINITE); };