#pragma once // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DIOSFILEHANDLE_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // DIOSFILEHANDLE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef DIOSFILEHANDLE_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "DiosFileHandleX64D.lib") #else #pragma comment(lib, "DiosFileHandleX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "DiosFileHandleD.lib") #else #pragma comment(lib, "DiosFileHandle.lib") #endif #endif #endif #ifdef DIOSFILEHANDLE_EXPORTS #define DIOSFILEHANDLE_API __declspec(dllexport) #define DIOSFILEHANDLE_C_API extern "C" __declspec(dllexport) #else #define DIOSFILEHANDLE_API __declspec(dllimport) #define DIOSFILEHANDLE_C_API extern "C" __declspec(dllimport) #endif #include #include "Definitions.h" #include "ResDataObject.h" using namespace std; typedef enum _Cmd_Echo { CMD_ECHO_IGNORE = -1, CMD_ECHO_NOTARGET, CMD_ECHO_NG, CMD_ECHO_OK, CMD_ECHO_MAX }CMD_ECHO; #ifndef _Packet_Cmd typedef enum _Packet_Cmd { PACKET_CMD_NONE = -1, PACKET_CMD_OPEN, PACKET_CMD_CLOSE, PACKET_CMD_GET, PACKET_CMD_UPDATE,//更新对象 PACKET_CMD_ADD, PACKET_CMD_DEL, PACKET_CMD_EXE, PACKET_CMD_DATA, PACKET_CMD_MSG, PACKET_CMD_ONLINE,//设备掉线后重新注册到Root PACKET_CMD_PART_UPDATE,//只更新对象的子节点 PACKET_CMD_SET, PACKET_CMD_MAX }PACKET_CMD; #endif const string _Packet_Cmd_String[] = { "Open", "Close", "Get", "Update", "Add", "Del", "Action", "Data", "Message", "Online", "PartUpdate", "Set" }; typedef enum _Packet_Type { PACKET_TYPE_NONE = -1, PACKET_TYPE_REQ, PACKET_TYPE_RES, PACKET_TYPE_NOTIFY, PACKET_TYPE_MAX }PACKET_TYPE; typedef enum _Dios_File_Flags { IMAGE_FH = 1, ACTION = 2, NOTIFY_MSG = 4, NOTIFY_UPDATE = 8, NOTIFY_DATA = 16, NOTIFY_ACTION = 32, ALL_ACCESS = 64 - 1, ABSCRACT_ONLINE = 128 }DIOS_FILE_FLAGS; typedef enum _Action_Sync_Mode { ACTION_SYNC, ACTION_ASYNC, }ACTION_SYNC_MODE; #define DIOS_PACK_IDX ("IDX") #define DIOS_PACK_TYPE ("TYPE") #define DIOS_PACK_TYPE_REQ ("REQUEST") #define DIOS_PACK_TYPE_RES ("RESPONSE") #define DIOS_PACK_TYPE_NOTIFY ("NOTIFY") #define DIOS_PACK_CMD ("CMD") //#define DIOS_PACK_CMD_GET ("GET") //#define DIOS_PACK_CMD_UPDATE ("UPDATE") //#define DIOS_PACK_CMD_ADD ("ADD") //#define DIOS_PACK_CMD_DEL ("DEL") //#define DIOS_PACK_CMD_EXE ("EXE") //#define DIOS_PACK_CMD_DATA ("DATA") //#define DIOS_PACK_CMD_OPEN ("OPEN") //#define DIOS_PACK_CMD_CLOSE ("CLOSE") #define DIOS_PACKET_SYNC ("SYNC") #define DIOS_PACK_HANDLE ("HANDLE") #define DIOS_PACK_HANDLE_ROUTE ("ROUTE") #define DIOS_PACK_HANDLE_FLAGS ("FLAGS") #define DIOS_PACK_HANDLE_LANG ("LANG") #define DIOS_PACKET_HANDLE_KEY ("HANDLEID") #define DIOS_PACK_HANDLE_OWNERID ("OWNERID") #define DIOS_PACK_HANDLE_DEVID ("DEVID") #define DIOS_PACK_TARGET_BUSID ("EBUSID") #define DIOS_PACK_TARGET_MACHINEID ("MACHINEID") #define DIOS_PACK_TARGET_PROCID ("PROCID") #define DIOS_PACK_TARGET_ADDR ("ADDR") #define DIOS_PACK_KEY ("KEY") #define DIOS_PACK_ACTION ("Action") #define DIOS_PACK_CONTEXT ("CONTEXT") #define DIOS_PACK_RETURN ("RET") #define DIOS_PACK_CODE ("CODE") #define DIOS_PACK_MSG ("MSG") #define DIOS_PACKET_VER ("Ver") #define DIOS_PACKET_VER_NOW ("3") #define DIOS_TOPIC ("TOPIC") #define DIOS_PUBLISH ("PUBLISH") #define DIOS_RESP_TOPIC ("RespTopic") #define DIOS_TRANSACTION ("Transaction") #define DIOS_CLIENT_ROOT_TOPIC ("DIOS/CLIENT/PLATFORM") #define DIOS_CLIENT_ID_PREFIX ("DIOS_CLIENT_") //因为路由要发往Local or Eth, //OPEN命令除了TargetBusID以外,没有其他信息,导致无法确定是发给哪个方向. //所以额外添加此ROUTE Flag到文件句柄中 //这个选项只在内部跟不同Channel通信的时候用,应用的Client应该缺省就是Any. //框架层截断应用层的包,并由框架层分析并判断发给谁. //any:路由方向是先发往本地,如果本地无目的地,再次发往Eth. //Local:路由方向就是本地,同理,Req&Res&Notify应该都是本地. //Eth:路由方向就是远程机器,其他同上. typedef enum _Dios_Packet_Route { DIOS_PACKET_ROUTE_NOTARGET = -1,//can't send DIOS_PACKET_ROUTE_ANY,//to any possible direction DIOS_PACKET_ROUTE_LOCAL,//only local machine DIOS_PACKET_ROUTE_ETH,//only remote machine DIOS_PACKET_ROUTE_MAX }DIOS_PACKET_ROUTE; class DIOSFILEHANDLE_API DiosTargetAddress { string *m_pKey; string *m_ValString; ResDataObject * m_pTargetObject; public: DiosTargetAddress(void); DiosTargetAddress(const DiosTargetAddress &tValue); virtual ~DiosTargetAddress(void); virtual const char *GetVal(); bool operator ==(const DiosTargetAddress &target); DiosTargetAddress& operator = (const DiosTargetAddress &tValue); void GetResDataObject(ResDataObject &obj); bool SetResDataObject(ResDataObject &obj); virtual bool SetVal(const char* pValString); void SetKey(const char *pKey); const char *GetKey(); ResDataObject &operator [](const char *pKey); void PrintOut();//for test }; class DIOSFILEHANDLE_API DiosDevFileHandle { string *m_pKey; string *m_ValString; ResDataObject *m_pRoute;//0:any,1:local,2:eth ResDataObject *m_pFlags; ResDataObject *m_pLang; ResDataObject *m_pHandleId; DiosTargetAddress *m_pOwner; DiosTargetAddress *m_pDev; public: DiosDevFileHandle(void); DiosDevFileHandle(const DiosDevFileHandle &tValue); virtual ~DiosDevFileHandle(void); void SetKey(const char *pKey); const char *GetKey(); void GetResDataObject(ResDataObject &obj); bool SetResDataObject(ResDataObject &obj); virtual const char *GetVal(); virtual bool SetVal(const char* pValString); DiosTargetAddress &GetTarget(bool Owner = true); DiosDevFileHandle& operator = (const DiosDevFileHandle &tValue); ResDataObject &operator [](const char *pKey); bool operator ==(const DiosDevFileHandle &target); void PrintOut();//for test };