DataNodeBase.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. // DataNodeBase.h: interface for the CDataNodeBase class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_DATANODEBASE_H__B726FC8C_2E3D_4924_94DE_7BFA5677FD51__INCLUDED_)
  5. #define AFX_DATANODEBASE_H__B726FC8C_2E3D_4924_94DE_7BFA5677FD51__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include <afxtempl.h>
  10. #include <afxmt.h>
  11. #define DATA_MANAGER_INCLUDED
  12. #define EXPORT_CLASS __declspec(dllexport)
  13. class EXPORT_CLASS CDataNodeBase;
  14. class EXPORT_CLASS CDataNodeBaseEx;
  15. class EXPORT_CLASS CMenuEx;
  16. class EXPORT_CLASS CLanguage;
  17. class EXPORT_CLASS CDataNodeList;
  18. class EXPORT_CLASS CDataNodeTree;
  19. class EXPORT_CLASS CImageListDyn;
  20. class EXPORT_CLASS CDataNodeListCtrl;
  21. class EXPORT_CLASS CDataNodeTreeCtrl;
  22. class EXPORT_CLASS CVariable;
  23. class EXPORT_CLASS CFilteredFolderDialog;
  24. class EXPORT_CLASS CFolderDialog;
  25. class EXPORT_CLASS CMyMapPtrToPtr;
  26. #define MAX_DEPTH 256
  27. //此类禁止随意修改,任何修改将可能导致这个系统不可用。
  28. //所以需要具备此类特性的类不能直接派生于此类,要派生可以派生于
  29. //此类的派生类CDataNodeBaseExe;同时,也不能直接使用此类来实例化任何变量
  30. //(上述限制该类库除外)。通常,操作变量时多用CDataNodeBase来定义变量。
  31. // 2005年7月20日
  32. // DXL Tech. Daiamao.
  33. // 版权所有,保留所有权利。
  34. // 在动态库中,所有共享类的公共成员函数的首行必须是:
  35. // AFX_MANAGE_STATE(AfxGetStaticModuleState());
  36. // 在应用程序中,所有共享类的公共成员函数的首行必须是:
  37. // AFX_MANAGE_STATE(theApp.GetModuleState());
  38. // 其中GetModuleState()的内容是:
  39. // AFX_MODULE_STATE* CXXXApp::GetModuleState()
  40. // {
  41. // return m_pModuleState;
  42. // }
  43. // 否则,调用MFC函数时可能会出现问题.
  44. // 接口约定声明
  45. typedef __declspec(dllexport) CDataNodeBase*Def_CreateObj(CString strClassName);
  46. typedef __declspec(dllexport) void Def_ReleaseObj(CDataNodeBase *pObj);
  47. //typedef __declspec(dllexport) void Def_SetMainProgObjInterface(LPVOID pfCreateObj, LPVOID pfReleaseObj);
  48. // 管理模块说明
  49. typedef __declspec(dllexport) CString Def_GetMgrModuleFuncDesc();
  50. //无参数函数声明
  51. typedef void Def_NoParamsFunc();
  52. // ===================================================================
  53. // 接口函数
  54. // 创建一个指定类型的对象,每个动态库或应用程序必须实现以下两个函数
  55. __declspec(dllexport) CDataNodeBase*CreateObj(CString strClassName);
  56. // 释放指定对象,此接口强烈建议实现,并且派生CDataNodeBaseEx类时,析构函数必须为虚函数
  57. __declspec(dllexport) void ReleaseObj(CDataNodeBase *pObj);
  58. // 传递主程序的CreateObj和ReleaseObj接口
  59. __declspec(dllexport) void SetMainProgObjInterface(LPVOID pfCreateObj, LPVOID pfReleaseObj);
  60. // 以上两个函数的实现方案实例:
  61. // __declspec(dllexport) CDataNodeBase*CreateObj(CString strClassName)
  62. // {
  63. // AFX_MANAGE_STATE(theApp.GetModuleState());
  64. // if(strClassName == "CDataRoot")
  65. // return new CDataNodeBaseEx;
  66. // else //if(strClassName == "CDataNodeBase")
  67. // return new CDataNodeBase;
  68. // }
  69. //
  70. // __declspec(dllexport) void ReleaseObj(CDataNodeBase *pObj)
  71. // {
  72. // AFX_MANAGE_STATE(theApp.GetModuleState());
  73. // delete pObj;
  74. // }
  75. //=============================================================
  76. // AFX_MODULE_STATE* CXXXApp::GetModuleState()
  77. // {
  78. // return m_pModuleState;
  79. // }
  80. // 通用函数:
  81. __declspec(dllexport) CString MyGetPrivateProfileString(CString strApp, CString strKey, CString strDefault, CString strIni);
  82. __declspec(dllexport) void MyWritePrivateProfileInt(CString strApp, CString strKey, int nVal, CString strIni);
  83. __declspec(dllexport) bool Encrypt(const char szFileOrig[], const char szFileNew[], const char szPwd[]);
  84. __declspec(dllexport) CString GetText(UINT uData);//数字转化为文本
  85. //由数据精度获得浮点数的字符串值
  86. __declspec(dllexport) CString GetDoubleText(double d);
  87. __declspec(dllexport) BOOL MyCreateDirectory(CString strPath);//创建任意深度的路径
  88. __declspec(dllexport) BOOL MyCopyFiles(CString strSource, CString strDest);//复制文件夹
  89. __declspec(dllexport) BOOL MyDeleteDirectory(CString strPath);//删除任意深度的路径
  90. __declspec(dllexport) CString GetAppPath();//获取App的路径
  91. __declspec(dllexport) CString SetPrjPath(CString strPrjPath);//设置工程的路径
  92. __declspec(dllexport) CString GetPrjPath();//获取工程的路径
  93. __declspec(dllexport) void SetPrjRoot(CDataNodeBase* pRoot);//设置工程的根节点,由主程序设置
  94. __declspec(dllexport) CDataNodeBase* GetPrjRoot();//获取工程的根节点
  95. __declspec(dllexport) void FreeObList(CObList &obList);//清除obList内的对象
  96. __declspec(dllexport) CString EncodeString(CString strOld, BYTE cKey);//字符串加密
  97. __declspec(dllexport) CString GetDllPath();//获取Dll的路径
  98. __declspec(dllexport) BYTE TwoByteToByte(BYTE b1, BYTE b2);//两个字符转换为一个字符
  99. __declspec(dllexport) void ByteToTwoByte(BYTE b, BYTE b2[]);//一个字符转换为两个字符
  100. __declspec(dllexport) char TwoHexCharToChar(char ch1,char ch2);
  101. __declspec(dllexport) void Str2HexStr(char *szHexString,char *szString,int *iHexStringLen);
  102. __declspec(dllexport) void GetCRC(char *CRC_char1,char *CRC_char2,char *szString,int iStrLen);
  103. __declspec(dllexport) void AddCRC(char *szBuffer,
  104. int iLen); /* the szBuffer length, this means the
  105. szBuffer[iLen] is error data,
  106. perhaps szBuffer[iLen-1] != 0;
  107. also perhaps szBuffer[iLen] != 0; */
  108. __declspec(dllexport) BOOL CheckCRC (char *szString,int iStrLen);
  109. __declspec(dllexport) int StrToInt(CString strTxt);
  110. //给采集点赋值,该函数负责产生各种可能的事件
  111. __declspec(dllexport) void SetSpotTextValue(CDataNodeBase* pDevive, CDataNodeBase* pSpot, CString strTxtValue);
  112. #define SYSTEM_OK 0
  113. #define COMMON_EVENT 1
  114. #define ALARM_EVENT 2
  115. //将路径加入到环境变量Path中
  116. __declspec(dllexport) void AddPathToEnvirPath(CString strNewPath);
  117. //向文本文件中追加文本
  118. __declspec(dllexport) BOOL AppendStringToFile(CString strMsg, CString strFile);
  119. //找到指定的字符串,但必须排除有控制符号'\'的情况
  120. __declspec(dllexport) int MyStrFind(CString strSource, CString strSub, int nStartPos=0);
  121. //找到指定的字符,但必须排除有前导符号'\'的情况
  122. __declspec(dllexport) int MyStrFind(CString strSource, char cSub, int nStartPos=0);
  123. //获取原始字符串,去除控制符号'\'
  124. __declspec(dllexport) CString GetOrigStr(CString strSaved);
  125. //获取保存字符串,对于需要添加控制符号的自动追加控制符号
  126. __declspec(dllexport) CString GetSavedStr(CString strOrig);
  127. //汇报一个新的事件
  128. __declspec(dllexport) void ReportNewEvent(
  129. CDataNodeBase* pNode, //事件的发出节点
  130. CString strMsg, //事件内容
  131. int nLevel, //事件级别1~10
  132. int nStatus //状态:0:恢复正常,1:普通事件, 2:报警事件
  133. );
  134. //Power Function
  135. __declspec(dllexport) BOOL PowerFunc(CString strFunc, CString &strExchange);
  136. //自动化程序使用的帐号
  137. __declspec(dllexport) BOOL GetAutoProcUser(CString &strUser, UINT &nFlag);
  138. __declspec(dllexport) void SetAutoProcUser(CString strUser);
  139. //获取字符串中用分号隔开的子字符串
  140. __declspec(dllexport) CString GetSubString(CString strSource, CString strItem);
  141. //记载出错信息
  142. __declspec(dllexport) void WriteErrorMsg(CString strErrorMsg);
  143. //调试输出窗体
  144. void StartConsoleWin();
  145. // Use wprintf like TRACE0, TRACE1, ... (The arguments are the same as printf)
  146. __declspec(dllexport) void MyDebugOutput(const char *fmt, ...);
  147. #define _MY_DEBUG
  148. #ifdef _MY_DEBUG
  149. #define MyTRACE MyDebugOutput
  150. #else
  151. #define MyTRACE TRACE
  152. #endif
  153. //获取对象的属性的C接口
  154. __declspec(dllexport) int GetItemProperty(LPVOID pDataNodeBase, const char* szItem, char* szValue, int nLen);
  155. //设置对象的属性的C接口
  156. __declspec(dllexport) BOOL SetItemProperty(LPVOID pDataNodeBase, const char* szItem, const char* szValue);
  157. //获取对象的属性的C接口
  158. __declspec(dllexport) int V_GetItemProperty(LPVOID pDataNodeBase, const char* szItem, char* szValue, int nLen);
  159. //设置对象的属性的C接口
  160. __declspec(dllexport) BOOL V_SetItemProperty(LPVOID pDataNodeBase, const char* szItem, const char* szValue);
  161. //返回DataManager.dll是否为Release版本
  162. __declspec(dllexport) BOOL DataManagerIsReleaseVersion();
  163. //设置数据精度
  164. __declspec(dllexport) int SetPrecision(int p);
  165. //删除文件,支持通配符
  166. __declspec(dllexport) void MyDeleteFile(CString strFiles);
  167. //获得用户临时目录
  168. __declspec(dllexport) CString GetUserTempPath();
  169. //子项排序
  170. __declspec(dllexport) void SortSubs(CMapPtrToPtr &mapSubs, CPtrList &listSorted);
  171. //判断一个字符串是否为合法的文件名
  172. __declspec(dllexport) BOOL IsLegalFileName(CString strFileName, BOOL bShowErr);
  173. //主程序注册主窗体句柄接口
  174. __declspec(dllexport) void SetMainFramWnd(HWND hWnd);
  175. //获取主程序主窗体句柄
  176. __declspec(dllexport) HWND GetMainFramWnd();
  177. //exe程序必须调用的初始化接口
  178. __declspec(dllexport) void InitCallForExe(const char* szParamsReserved);
  179. //exe程序必须调用的反初始化接口
  180. __declspec(dllexport) void UinitCallForExe(const char* szParamsReserved);
  181. //设置全局临时值,在任意一个模块中设置,也可在任意模块中获取其值
  182. __declspec(dllexport) void SetTempVar(const char* szName, const char* szValue);
  183. //获取全局临时值,在任意一个模块中设置,也可在任意模块中获取其值
  184. __declspec(dllexport) BOOL GetTempVar(const char* szName, CString& strValue);
  185. //获取全局临时值C接口,在任意一个模块中设置,也可在任意模块中获取其值
  186. __declspec(dllexport) int GetTempVarC(const char* szName, char* szValue, int nSize);
  187. //获取系统参数
  188. __declspec(dllexport) BOOL GetSysParams();
  189. //设置系统参数
  190. __declspec(dllexport) BOOL SetSysParams();
  191. //获取某节点的报警错误页面
  192. __declspec(dllexport) BOOL GetRelatePage(CDataNodeBase* pNode, CString& strRelatePage, CString& strUidReq, CString& strIP);
  193. //获取某文件夹的父文件夹
  194. __declspec(dllexport) CString GetParentDir(CString strDir);
  195. //通知主程序刷新树结构
  196. __declspec(dllexport) void CallMainWndToRefreshNode(CDataNodeBase* pNode);
  197. //选择给定Uid的节点
  198. __declspec(dllexport) BOOL SelectNode(CDataNodeTreeCtrl& tree, CString strUid);
  199. //获取与之关联的管理或页面分组的节点
  200. __declspec(dllexport) CDataNodeBase* GetRelatePageGroupNode(CDataNodeBase* pNode);
  201. //事件联动触发动作
  202. __declspec(dllexport) void EventRaiseAction(CDataNodeBase* pNode, int nStatus);
  203. //获取OEM产品的文件夹名字
  204. __declspec(dllexport) CString GetMapDir(CString strDirDefault);
  205. // ===================================================================
  206. // 接口类
  207. const CString LineEnd = "\r\n";
  208. #define ATTR_SET_NULL NULL
  209. #define ATTR_NEET_SET_MODIFY_FLAG (1<<0)
  210. #define ATTR_MANUAL_SET_VALUE (1<<1)
  211. #define FLAG0_NODE_ON_GET_PROC (1<<0) //处于采集中
  212. #define FLAG0_NODE_ON_LEFT_TREE_VISIBLE (1<<1) //节点在左侧设备树中可见
  213. #define TEMP_VAR_ATTACH_LIMITE_SETTING "TVALS"
  214. enum ManagerNodeType
  215. {
  216. NOT_MANAGER_NODE = 0, //不是管理节点
  217. COMM_MANAGER_NODE = 1, //普通管理接点
  218. NET_LINK_MANAGER_NODE = 2, //网络客户端管理节点
  219. NET_SERVER_MANAGER_NODE = 3, //网络服务端管理节点
  220. CURVE_MANAGER_NODE = 4, //曲线服务节点
  221. ALARM_MANAGER_NODE = 5, //报警服务节点
  222. REPORT_MANAGER_NODE = 6, //报表服务节点
  223. DEVICE_MANAGER_NODE = 7, //设备管理节点
  224. };
  225. #define EDIT_APPLY_TO_WHOLE_PROJECT (1<<0)
  226. #define EDIT_ADD_IF_IS_NEW_PROP (1<<1)
  227. #define TryDo(x) try{x;}catch(...){};
  228. #define TRYDO(x) TRY{x;}CATCH(CDBException, E){}END_CATCH;
  229. class EXPORT_CLASS CMyMapPtrToPtr : public CMapPtrToPtr
  230. {
  231. friend CDataNodeBase;
  232. public:
  233. //ID递增方式管理的子项集合
  234. CPtrList& GetPtrList();
  235. protected:
  236. CMyMapPtrToPtr();
  237. virtual ~CMyMapPtrToPtr();
  238. void SetAt( LPVOID key, LPVOID newValue );
  239. BOOL RemoveKey( LPVOID key );
  240. void RemoveAll( );
  241. CPtrList m_listSubs;//子项集,用列表方式管理
  242. };
  243. class EXPORT_CLASS CDataNodeBase : public CObject
  244. {
  245. DECLARE_SERIAL(CDataNodeBase)
  246. public:
  247. CDataNodeBase();
  248. virtual ~CDataNodeBase();
  249. // 获取节点的父结点
  250. inline virtual CDataNodeBase *GetParent();
  251. // 设置节点的父结点
  252. inline virtual void SetParent(CDataNodeBase *pParent);
  253. // 获取子项列表
  254. CMapPtrToPtr& GetSubs();
  255. // 获取指定ID的直接子项
  256. CDataNodeBase* GetSub(UINT uID);
  257. // 获取指定路径的任意深度的子项
  258. CDataNodeBase* GetSub(CString strPath);
  259. // 获取名字
  260. virtual CString GetName();
  261. // 获取ID
  262. UINT GetID();
  263. // 设置名字
  264. virtual void SetName(CString strName);
  265. // 获取属性的字符串值
  266. virtual BOOL V_GetPropertyTxtValue(CString strPropertyName, CString &strTxtValue);
  267. // 获取属性的原始值
  268. virtual CVariable* GetProperty(CString strPropertyName);
  269. // 获取属性,支持无限深度子节点的属性获取
  270. virtual BOOL GetProperty(CString strPropertyPath, CString &strTxtValue);
  271. //获取所有属性
  272. virtual void GetPropertyNames(CMapStringToPtr &mapProperties);
  273. // 设置或增加属性的字符串值,名字以V_开头表示每个派生类强烈建议重载该函数.
  274. // uAttrFlag: ATTR_NEET_SET_MODIFY_FLAG, ATTR_MANUAL_SET_VALUE
  275. virtual BOOL V_SetPropertyTxtValue(CString strPropertyName, CString strTxtValue, BOOL bAddIfNotExist, UINT uAttrFlag);
  276. // 设置属性的值, 此函数必须重写.
  277. virtual BOOL SetProperty(CString strPropertyName, CVariable* pVar, UINT uAttrFlag);
  278. // 设置属性,支持无限深度子节点的属性设置
  279. virtual BOOL SetProperty(CString strPropertyPath, CString &strTxtValue, BOOL bAddIfNotExist, UINT uAttrFlag);
  280. // 保存对象到文件
  281. virtual CString V_GetSaveFileName();
  282. // 保存对象到文件, 文件名由虚函数GetSaveFileName给定。
  283. virtual BOOL SaveObj();
  284. // 保存对象到文件
  285. virtual BOOL SaveObj(CString strFileName);
  286. // 从文件中装载对象, 文件名由虚函数GetSaveFileName给定。
  287. virtual BOOL LoadObj();
  288. // 从文件中装载对象
  289. virtual BOOL LoadObj(CString strFileName);
  290. // 添加对象为子项
  291. virtual void AddSub(CDataNodeBase *pSub, BOOL bNotChangeID);
  292. // 移除子项
  293. virtual void RemoveSub(CDataNodeBase* pSub);
  294. // 动态库的名字
  295. //注意基类不能用AfxGetAppName(); 而其派生类,相反,必须用AfxGetAppName();
  296. virtual CString PV_GetAppName();
  297. // 获取类型名字, 名字以PV_开头表示每个派生类都必须重载该函数.
  298. //注意基类不能直接用类类型的名字,而用变量,而其派生类, 相反, 必须返回其类名的字符串
  299. virtual CString PV_GetType();
  300. // 任意函数调用,万能接口,调用通常是顶层调用底层的节点
  301. virtual void AnyDownCall(int nCallStackDepth, CString strFuncName, CStringList &strParams, CStringList &strReturns);
  302. // 任意汇报接口,万能接口,与AnyDownCall的区别是,该接口是由底层节点往顶层调用
  303. virtual void AnyUpCall(
  304. CString strPathInternal, //调用发出位置路径内部管理路径,用ID作为节点名的路径
  305. CString strPathShow, //调用发出位置路径显示路径,用名字作为节点的路径
  306. CString strFuncName, //函数名
  307. CStringList &strParams, //函数的输入参数表
  308. CStringList &strReturns //函数的输出参数表
  309. );
  310. // 获取ID方式表达的路径
  311. virtual CString GetIdPath();
  312. // 获取名字方式表达的路径
  313. virtual CString GetNamePath();
  314. // 将对象展现在树结构中
  315. virtual HTREEITEM BuildTree(CDataNodeTree &treeCtrl, HTREEITEM hItemNow, int nBuildDepth = MAX_DEPTH, BOOL bBuildSubOnly = FALSE, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
  316. // 将对象展现在树结构中
  317. virtual HTREEITEM BuildTree(CDataNodeTreeCtrl &treeCtrl, HTREEITEM hItemNow, int nBuildDepth = MAX_DEPTH, BOOL bBuildSubOnly = FALSE, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
  318. // 获取图标
  319. virtual void GetImage(CImageListDyn &imageList, int &nImage, int &nSelectedImage);
  320. // 是否为管理类的节点
  321. virtual BOOL PV_IsManagerNode();
  322. // 对象配置接口
  323. virtual BOOL DoConfig(CDataNodeBase* pPrjRoot, CString strPathCur);
  324. // 子对象配置接口
  325. virtual BOOL DoConfigSub(CDataNodeBase* pPrjRoot, CDataNodeBase* pNodeSub, CString strPathCur);
  326. // 对象属性编辑接口,此接口只负责编辑内容,不负责将修改后的值应用到相应点。(因为要支持多点同时设置。)
  327. virtual BOOL EditProperty(
  328. CString strProp,
  329. CString& strValue,
  330. UINT& uOption, //EDIT_APPLY_TO_WHOLE_PROJECT, EDIT_ADD_IF_IS_NEW_PROP 取或
  331. UINT& uResult //弹对话框时用户选择的IDOK、IDCANCEL等
  332. );
  333. // 获取修改标志
  334. virtual BOOL GetModified();
  335. // 设置修改标志
  336. virtual void SetModified(BOOL bModified = TRUE);
  337. // 获取指定属性的特性
  338. virtual CString GetAttributes(CString strPropertyName);
  339. // 根据对象的AppName属性,替换对象为对应App中定义的类, 替换后,原来对象将被删除
  340. static CDataNodeBase* ReplaceObj(CDataNodeBase* pNodeOld, BOOL bAlsoSubs);
  341. // 工程装载后调用
  342. virtual void DoAfterProjectLoaded(CString strProjectPath);
  343. // 工程关闭前调用
  344. virtual void DoBeforeProjectClose();
  345. // 从字符串中装载对象
  346. virtual BOOL LoadObjFromString(CString strXmlTxt);
  347. // 保存对象到多行字符串
  348. virtual BOOL SaveObjToString(CString &strXmlTxt);
  349. //代理的方式异步调用获取属性
  350. virtual void AsyncDelegateGetProperty(CString strPropertyName);
  351. //代理的方式异步接收属性,该事件在调用AsyncDelegateGetProperty获取请求后对方回应后被调用,
  352. //调用发起者通常是重载了AsyncDelegateGetProperty函数的类的对象.
  353. virtual void OnAsyncDelegateReceiveProperty(CString strPropertyName, CString strTxtValue, BOOL bDataFromNet);
  354. //登记定制回调定制者
  355. virtual void RegisterCustomCall(CDataNodeBase* pCustomer, BOOL bLowPriority);
  356. //取消登记定制回调定制者
  357. virtual void UnRegisterCustomCall(CDataNodeBase* pCustomer);
  358. //删除属性
  359. virtual void DeleteProperty(CString strPropertyName);
  360. //设置临时变量
  361. BOOL SetTempItem(CString strItemName, CString strValue);
  362. //获取临时变量
  363. BOOL GetTempItem(CString strItemName, CString &strValue);
  364. //一步获得属性的字符串值
  365. CString GetProperty1(CString strPropertyName);
  366. //找出所有指定字母开头的项目
  367. void GetItemsName(CStringList& strlistNames, char cHead);
  368. //保存修改
  369. virtual void SaveChange();
  370. //获取与之关联的管理节点
  371. CDataNodeBase* GetRelateManagerNode();
  372. UINT m_uFlags4[4];
  373. protected:
  374. //判断一个属性是否为不可编辑
  375. virtual BOOL IsUnEditableProperty(CString strPropertyName);
  376. // 更换属性
  377. virtual void ReplaceProperty(CString strPropertyName, CVariable* pVar);
  378. // 更换子项
  379. virtual void ReplaceSub(UINT uID, CDataNodeBase* pNodeNew);
  380. //文件保持加密种子, 为空表示文件不加密
  381. virtual CString GetSaveEncryptSeed();
  382. // 清除子项
  383. void FreeSubs();
  384. // 由全路径分离出路径和属性名称
  385. void SeparatePathAndProperty(CString strFullName, CString &strPath, CString &strPropertyName);
  386. // 检查文件是否为正确的xml文件
  387. BOOL CheckXMLFile(CStdioFile &file);
  388. // 保存对象到文件
  389. virtual void SaveObj(CFile* pFile, CString strHeadSpace, CDataNodeBase* pNodeRoot, BOOL bIncludeMgrSub);
  390. // 字符串中提炼1个属性,并将提炼的属性从字符串中移出
  391. virtual BOOL PickOneItem(CString &strLine, CString &strItem, CString &strValue);
  392. // 字符串中提炼1个属性,并将提炼的属性从字符串中移出
  393. virtual BOOL PickItemType(CString &strLine, CString &strItemType);
  394. // 重置对象
  395. virtual void Reset();
  396. //从一行字符串中提取属性信息
  397. virtual void PickItemsFromStrLine(
  398. CString strLine,
  399. CDataNodeBase* &pCurrentNode,
  400. CDataNodeBase* &pParent
  401. );
  402. //将子项替换为制定App内的对象
  403. virtual void ReplaceSubs();
  404. //从多行字符串中读取一行字符串
  405. virtual BOOL ReadStringLine(CString &strXmlTxt, CString &strLine);
  406. //检查多行字符串是否为合法的xml字符串
  407. BOOL CheckXMLString(CString strXmlTxt);
  408. //定制回调
  409. BOOL DoCustomCall(
  410. CString strPathInternalFromRoot, //调用发出位置路径内部管理路径,用ID作为节点名的路径
  411. CString strPathShowFromRoot, //调用发出位置路径显示路径,用名字作为节点的路径
  412. CString strFuncName, //函数名
  413. CStringList &strParams, //函数的输入参数表
  414. CStringList &strReturns //函数的输出参数表
  415. );
  416. //执行定制回调,处理完毕,无需后续处理时返回TRUE,否则返回FALSE
  417. virtual BOOL OnCustomCall(
  418. CString strPathInternalFromRoot, //调用发出位置路径内部管理路径,用ID作为节点名的路径
  419. CString strPathShowFromRoot, //调用发出位置路径显示路径,用名字作为节点的路径
  420. CString strFuncName, //函数名
  421. CStringList &strParams, //函数的输入参数表
  422. CStringList &strReturns //函数的输出参数表
  423. );
  424. CList<CDataNodeBase*, CDataNodeBase*> m_customersCutomCall;//添加的定制回调定制者
  425. CMutex m_mutexCustomCall;
  426. BOOL m_bModified;// 修改标志
  427. CDataNodeBase *m_pParent; //父结点
  428. CMyMapPtrToPtr m_mapSubs; //子项集
  429. CMutex m_mutexMapSubs; //子项集同步锁
  430. CMapStringToPtr m_mapExtProperties; //扩展字符串属性
  431. CMutex m_mutexMapProperties; //子项集同步锁
  432. CString m_strName; //节点的名字
  433. UINT m_uID; //节点的ID
  434. BOOL __classCanUseDirectly; //此类禁止派生出除CDataNodeBaseEx以外的其它类,用此作为标记,不常用,不加m_前缀。
  435. // HTREEITEM m_hItem;
  436. // 获取指定AppName的App的对象创建和释放函数
  437. CString m_strAppName; //程序名字
  438. CString m_strType; //类的名字
  439. private:
  440. CMapStringToString m_mapTempItems;
  441. CMutex m_mutexTempItems;
  442. };
  443. #endif // !defined(AFX_DATANODEBASE_H__B726FC8C_2E3D_4924_94DE_7BFA5677FD51__INCLUDED_)