spbranch.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. #pragma once
  2. #include "resource.h"
  3. #include <tchar.h>
  4. #include <strsafe.h>
  5. #include <Shlobj.h>
  6. #include "branch_def.h"
  7. #include "Logger.h"
  8. #include "..\..\DeviceAdapter\DevInc\BranchDeviceClass.h"
  9. using namespace SpBranch;
  10. #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
  11. #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
  12. #define SAFE_FREE_LIBRARY(hModule) \
  13. do { \
  14. if(hModule){ \
  15. FreeLibrary(hModule); \
  16. hModule = NULL; \
  17. } \
  18. }while(0)
  19. #define GETFUNC_ERRORMSG(fuc, ec) \
  20. GetAdapterLastErr(#fuc, ec)
  21. #define MAX_PRINTF_MSG_LEN 512
  22. #define MAX_PRINTF_INFOR_LEN 1024
  23. typedef ErrorCodeEnum ( *LpCreateDevCom)(DeviceBaseClass *&baseObj);
  24. typedef ErrorCodeEnum ( *LpReleaseDevCom)(DeviceBaseClass *&pBaseObj);
  25. void InitLogger(LPCTSTR lpszDbgPath = NULL);
  26. LPCTSTR ErrorMessage(DWORD error);
  27. void FormatError(LPCTSTR fmt, ...);
  28. void FormatInfo(LPCTSTR fmt, ...);
  29. void PrintError(LPCTSTR errDesc, BOOL bGetLastError = TRUE);
  30. void PrintInfo(LPCTSTR inforDesc);
  31. //outCovertParam must be MAX_PRINTF_MSG_LEN len.
  32. void CovertCmdParam(LPTSTR outCovertParam, LPCTSTR lpszParam)
  33. {
  34. //PrintInfo("Test security param.");
  35. char szSecurParam[20] = {0};
  36. memset(outCovertParam, 0, sizeof(char)*MAX_PRINTF_MSG_LEN);
  37. memset(szSecurParam, 0, sizeof(szSecurParam));
  38. int len = strlen(lpszParam);
  39. bool bCoverted = false;
  40. if(len > 0)
  41. {
  42. if(len > 6)
  43. {
  44. szSecurParam[0] = lpszParam[0];
  45. szSecurParam[1] = lpszParam[1];
  46. szSecurParam[2] = lpszParam[2];
  47. strcat_s(szSecurParam, "***");
  48. szSecurParam[6] = lpszParam[len-3];
  49. szSecurParam[7] = lpszParam[len-2];
  50. szSecurParam[8] = lpszParam[len-1];
  51. szSecurParam[9] = '\0';
  52. bCoverted = true;
  53. }
  54. else if(len > 2)
  55. {
  56. szSecurParam[0] = lpszParam[0];
  57. szSecurParam[1] = '*';
  58. szSecurParam[2] = lpszParam[len-1];
  59. szSecurParam[3] = '\0';
  60. bCoverted = true;
  61. }
  62. }
  63. if(!bCoverted)
  64. {
  65. sprintf_s(outCovertParam, MAX_PRINTF_MSG_LEN, "(%s)", lpszParam);
  66. }
  67. else
  68. {
  69. sprintf_s(outCovertParam, MAX_PRINTF_MSG_LEN, "(%s)(len#%d)", szSecurParam, len);
  70. }
  71. return;
  72. }
  73. class CSpBranch
  74. {
  75. public:
  76. CSpBranch()
  77. :m_hVendorDll(NULL),
  78. m_pDevClass(NULL),
  79. m_FuncCreate(NULL),
  80. m_FuncRelease(NULL),
  81. m_eStatus(State_NoInit),
  82. m_devErrCode(Error_Succeed)
  83. {
  84. memset(m_szDllName, 0, sizeof(char)*MAX_PATH);
  85. memset(m_szDevName, 0, sizeof(char)*MAX_PATH);
  86. memset(m_szInfo, 0, sizeof(char)*MAX_PRINTF_INFOR_LEN);
  87. }
  88. ~CSpBranch()
  89. {
  90. //LOG_FUNCTION();
  91. if(m_eStatus >= State_LoadSucc)
  92. {
  93. if(m_eStatus > State_LoadSucc)
  94. CloseDevice();
  95. m_devErrCode = m_FuncRelease((DeviceBaseClass *&) m_pDevClass);
  96. }
  97. SAFE_FREE_LIBRARY(m_hVendorDll);
  98. FormatInfo("** The branch loaded process terminate ! processId = %u", GetCurrentProcessId());
  99. }
  100. //LoadLibrary and Create Object
  101. BOOL Init(_TCHAR* argv1, _TCHAR* argv2);
  102. BOOL OpenDevice(LPCTSTR lpszOpenParam1, LPCTSTR lpszOpenParam2);
  103. BOOL CloseDevice();
  104. BOOL ExecuteCmd(LPCTSTR lpszParam, CSimpleStringA& ssRetVal);
  105. BOOL GetDevCategory(DevCategoryInfo& info);
  106. DevThreadState GetDevThreadState() { return m_eStatus; }
  107. DWORD GetLastErrorCode() { return m_devErrCode; }
  108. void GetLastOperatError(DWORD& dwErrCode, CSimpleStringA& ssErrMsg)
  109. {
  110. //dwErrCode = m_eStatus;
  111. dwErrCode = m_devErrCode;
  112. ssErrMsg = m_szInfo;
  113. }
  114. void GetLastErrorMsg(CSimpleStringA& ssErrMsg)
  115. {
  116. ssErrMsg = m_szInfo;
  117. }
  118. protected:
  119. ErrorCodeEnum GetAdapterLastErr(LPCTSTR lpDescFunc, ErrorCodeEnum errCodeFunc);
  120. private:
  121. char m_szDllName[MAX_PATH];
  122. char m_szDevName[MAX_PATH];
  123. char m_szInfo[MAX_PRINTF_INFOR_LEN];
  124. HMODULE m_hVendorDll;
  125. BranchDeviceClass* m_pDevClass;
  126. LpCreateDevCom m_FuncCreate;
  127. LpReleaseDevCom m_FuncRelease;
  128. DevThreadState m_eStatus;
  129. DWORD m_devErrCode;
  130. };
  131. BOOL CSpBranch::Init(_TCHAR* argv1, _TCHAR* argv2)
  132. {
  133. strcpy_s(m_szDllName, MAX_PATH, argv1);
  134. strcpy_s(m_szDevName, MAX_PATH, argv2);
  135. m_eStatus = State_LoadFailed;
  136. ErrorCodeEnum erroCode = Error_Unexpect;
  137. FormatInfo("DllPath: %s", m_szDllName);
  138. m_hVendorDll = LoadLibraryA(m_szDllName);
  139. if(m_hVendorDll == NULL || m_hVendorDll == INVALID_HANDLE_VALUE)
  140. {
  141. PrintError("LoadLibrary failed");
  142. sprintf_s(m_szInfo, "LoadLibrary(%s) failed", m_szDllName);
  143. m_devErrCode = Error_DevLoadFileFailed;
  144. return FALSE;
  145. }
  146. if((m_FuncCreate = (LpCreateDevCom)GetProcAddress(m_hVendorDll, "CreateDevComponent")) == NULL)
  147. {
  148. sprintf_s(m_szInfo, "Get CreateDevComponent failed");
  149. PrintError("Get CreateDevComponent failed");
  150. SAFE_FREE_LIBRARY(m_hVendorDll);
  151. m_devErrCode = Error_Unregisted;
  152. return FALSE;
  153. }
  154. if((m_FuncRelease = (LpReleaseDevCom)GetProcAddress(m_hVendorDll, "ReleaseDevComponent")) == NULL)
  155. {
  156. sprintf_s(m_szInfo, "Get ReleaseDevComponent failed");
  157. PrintError("Get ReleaseDevComponent failed");
  158. SAFE_FREE_LIBRARY(m_hVendorDll);
  159. m_devErrCode = Error_Unregisted;
  160. return FALSE;
  161. }
  162. PrintInfo("Get DevComponent functions suc.");
  163. erroCode = m_FuncCreate((DeviceBaseClass *&)m_pDevClass);
  164. if(FAILURED(erroCode) || !m_pDevClass)
  165. {
  166. sprintf_s(m_szInfo, "Create dll entity failed");
  167. FormatError("Create DevAdapter Object failed, EC = %d.", erroCode);
  168. SAFE_FREE_LIBRARY(m_hVendorDll);
  169. m_devErrCode = Error_NoTarget;
  170. return FALSE;
  171. }
  172. sprintf_s(m_szInfo, "Create DevAdapter dll entity suc");
  173. PrintInfo("Create DevAdapter dll entity suc");
  174. m_devErrCode = Error_Succeed;
  175. m_eStatus = State_LoadSucc;
  176. return TRUE;
  177. }
  178. BOOL CSpBranch::OpenDevice(LPCTSTR lpszOpenParam1, LPCTSTR lpszOpenParam2)
  179. {
  180. if(m_pDevClass == NULL)
  181. {
  182. m_devErrCode = Error_NotInit;
  183. return FALSE;
  184. }
  185. ErrorCodeEnum erroCode = Error_Unexpect;
  186. BOOL bRet = FALSE;
  187. if(m_eStatus < State_LoadSucc)
  188. {
  189. PrintError("LoadLibraray first.", FALSE);
  190. m_devErrCode = Error_InvalidState;
  191. return FALSE;
  192. }
  193. if(m_eStatus >= State_Opened)
  194. {
  195. PrintInfo("BranchDevice been opened already.");
  196. m_devErrCode = Error_Duplication;
  197. return TRUE;
  198. }
  199. __try
  200. {
  201. FormatInfo("Start to open device with param: [%s][%s].", lpszOpenParam1, lpszOpenParam2);
  202. m_devErrCode = m_pDevClass->DevOpen(lpszOpenParam1, lpszOpenParam2);
  203. if(ISSUCCEEDED(m_devErrCode))
  204. {
  205. PrintInfo("Open device suc.");
  206. m_eStatus = State_Opened;
  207. }
  208. else
  209. {
  210. FormatError("Open device failed returned 0x%08x.", m_devErrCode);
  211. GETFUNC_ERRORMSG(DevOpen, (ErrorCodeEnum)m_devErrCode);
  212. }
  213. }
  214. __finally
  215. {
  216. if(AbnormalTermination())
  217. {
  218. FormatError("DevOpen([%s][%s]) appears exeception", lpszOpenParam1, lpszOpenParam2);
  219. m_devErrCode = Error_Exception;
  220. strcpy_s(m_szInfo, "DevOpen appears exeception");
  221. }
  222. }
  223. return (ISSUCCEEDED(m_devErrCode));
  224. }
  225. BOOL CSpBranch::CloseDevice()
  226. {
  227. if(m_pDevClass == NULL)
  228. {
  229. m_devErrCode = Error_NotInit;
  230. return FALSE;
  231. }
  232. if(m_eStatus < State_Opened)
  233. {
  234. PrintError("BranchDevice is not opend current.", FALSE);
  235. m_devErrCode = Error_InvalidState;
  236. return TRUE;
  237. }
  238. __try
  239. {
  240. m_devErrCode = m_pDevClass->DevClose();
  241. if(ISSUCCEEDED(m_devErrCode))
  242. {
  243. PrintInfo("Close device succ.");
  244. }
  245. else
  246. {
  247. GETFUNC_ERRORMSG(DevClose, (ErrorCodeEnum)m_devErrCode);
  248. }
  249. }
  250. __finally
  251. {
  252. if(AbnormalTermination())
  253. {
  254. FormatError("DevClose appears exeception");
  255. m_devErrCode = Error_Exception;
  256. strcpy_s(m_szInfo, "DevOpen appears exeception");
  257. }
  258. }
  259. return (ISSUCCEEDED(m_devErrCode));
  260. }
  261. ErrorCodeEnum CSpBranch::GetAdapterLastErr(LPCTSTR lpDescFunc, ErrorCodeEnum errCodeFunc)
  262. {
  263. if(m_pDevClass == NULL)
  264. {
  265. return Error_NotInit;
  266. }
  267. DevErrorInfo erroInfo;
  268. memset(erroInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  269. ErrorCodeEnum errLastErr = m_pDevClass->GetLastErr(erroInfo);
  270. if(ISSUCCEEDED(errLastErr) && erroInfo.dwErrMsgLen > 0)
  271. {
  272. CSimpleStringA str = CSimpleStringA::Format("%s failed GLE: %s", lpDescFunc, erroInfo.szErrMsg);
  273. sprintf_s(m_szInfo, (LPCTSTR)str);
  274. FormatError("%s failed GLE: %s", lpDescFunc, erroInfo.szErrMsg);
  275. }
  276. else
  277. {
  278. FormatError("GetLastErr for %s failed, %d %s.", lpDescFunc, errLastErr, erroInfo.szErrMsg);
  279. CSimpleStringA str = CSimpleStringA::Format("%s failed returned 0x%08x", lpDescFunc, errCodeFunc);
  280. sprintf_s(m_szInfo, (LPCTSTR)str);
  281. }
  282. return errLastErr;
  283. }
  284. BOOL CSpBranch::ExecuteCmd(LPCTSTR lpszParam, CSimpleStringA& ssRetVal)
  285. {
  286. if(m_pDevClass == NULL)
  287. {
  288. m_devErrCode = Error_NotInit;
  289. return FALSE;
  290. }
  291. char* retValue = new char[MAX_RETVALUE_LEN];
  292. ZeroMemory(retValue, MAX_RETVALUE_LEN);
  293. if(retValue == NULL)
  294. {
  295. strcpy_s(m_szInfo, "Allocate memory for retValue failed");
  296. PrintError("Allocate memory for retValue failed");
  297. m_devErrCode = Error_Resource;
  298. return FALSE;
  299. }
  300. __try
  301. {
  302. char szPrintMsg[MAX_PRINTF_MSG_LEN] = {0};
  303. CovertCmdParam(szPrintMsg, lpszParam);
  304. FormatInfo("Start to Invoke ExecuteCmd%s routine.", szPrintMsg);
  305. m_devErrCode = m_pDevClass->ExecuteCmd(lpszParam, retValue, MAX_RETVALUE_LEN);
  306. if(ISSUCCEEDED(m_devErrCode))
  307. {
  308. ssRetVal = retValue;
  309. }
  310. else
  311. {
  312. GETFUNC_ERRORMSG(ExecuteCmd, (ErrorCodeEnum)m_devErrCode);
  313. }
  314. }
  315. __finally
  316. {
  317. delete[] retValue;
  318. retValue = NULL;
  319. if(AbnormalTermination())
  320. {
  321. char szPrintMsg[MAX_PRINTF_MSG_LEN] = {0};
  322. CovertCmdParam(szPrintMsg, lpszParam);
  323. FormatError("ExecuteCmd%s appears exeception", szPrintMsg);
  324. m_devErrCode = Error_Exception;
  325. strcpy_s(m_szInfo, "ExecuteCmd appears exeception");
  326. }
  327. }
  328. return (ISSUCCEEDED(m_devErrCode));
  329. }
  330. BOOL CSpBranch::GetDevCategory(DevCategoryInfo& info)
  331. {
  332. if(m_pDevClass == NULL)
  333. {
  334. m_devErrCode = Error_NotInit;
  335. return FALSE;
  336. }
  337. __try
  338. {
  339. memset((void*)&info, 0, sizeof(DevCategoryInfo));
  340. m_devErrCode = m_pDevClass->GetDevCategory(info);
  341. if(!ISSUCCEEDED(m_devErrCode))
  342. {
  343. GetAdapterLastErr("GetDevCategory", (ErrorCodeEnum)m_devErrCode);
  344. }
  345. }
  346. __finally
  347. {
  348. if(AbnormalTermination())
  349. {
  350. FormatError("GetDevCategory appears exeception");
  351. m_devErrCode = Error_Exception;
  352. strcpy_s(m_szInfo, "GetDevCategory appears exeception");
  353. }
  354. }
  355. return (ISSUCCEEDED(m_devErrCode));
  356. }