mod_DevAdptEntityBase.hpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. #ifndef _RVC_DEVICE_ADAPTER_ENTITY_BASE_H__
  2. #define _RVC_DEVICE_ADAPTER_ENTITY_BASE_H__
  3. #pragma once
  4. #include "SpBase.h"
  5. #include "SpHelper.h"
  6. #include "DeviceBaseClass.h"
  7. #include "SimpleString.h"
  8. #include "path.h"
  9. #include <regex>
  10. #include <winpr/file.h>
  11. #include <winpr/environment.h>
  12. #define SAFE_FREE_LIBRARY(hModule) \
  13. do { \
  14. if(hModule){ \
  15. FreeLibrary(hModule); \
  16. hModule = NULL; \
  17. } \
  18. }while(0)
  19. #if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
  20. using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pOutDevAptObj);
  21. using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pInDevAptObj);
  22. #else
  23. using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pOutDevAptObj);
  24. using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pInDevAptObj);
  25. #endif
  26. template <typename TSubAdpt>
  27. struct DevAdptLibHelper
  28. {
  29. ErrorCodeEnum LoadLibAddress(const CSimpleStringA& strFullLibPath)
  30. {
  31. ErrorCodeEnum erroCode = Error_Succeed;
  32. do
  33. {
  34. hModule = LoadLibraryA(strFullLibPath);
  35. if (hModule == NULL) {
  36. DWORD tmpError = GetLastError();
  37. Dbg("LoadLibraryA[%s] failed with error %u.", strFullLibPath, tmpError);
  38. if (tmpError == 126) {
  39. Dbg("该问题是缺失某个DLL导致的错误。");
  40. SetLastError(126);
  41. }
  42. erroCode = Error_DevLoadFileFailed;
  43. break;
  44. }
  45. if ((pFuncCreateAdapt = (DevAdaptObjCreateFunc)GetProcAddress(hModule,
  46. "CreateDevComponent")) == NULL) {
  47. //TODO: SetCustLastErrorCode();
  48. Dbg("Get 'CreateDevComponent' Func address failed with code %d", GetLastError());
  49. erroCode = Error_DevLoadFileFailed;
  50. break;
  51. }
  52. if ((pFuncReleaseAdapt = (DevAdaptObjReleaseFunc)GetProcAddress(hModule,
  53. "ReleaseDevComponent")) == NULL) {
  54. Dbg("Get 'ReleaseDevComponent' Func address failed with code %d", GetLastError());
  55. erroCode = Error_DevLoadFileFailed;
  56. break;
  57. }
  58. } while (false);
  59. if (IS_FAILURED(erroCode)) {
  60. TearDown();
  61. }
  62. return erroCode;
  63. }
  64. ErrorCodeEnum CreateDevAdptObject()
  65. {
  66. if (m_AdptObjPtr != nullptr) {
  67. return Error_AlreadyExist;
  68. }
  69. if (hModule == nullptr || pFuncCreateAdapt == nullptr || pFuncReleaseAdapt == nullptr) {
  70. return Error_NotInit;
  71. }
  72. ErrorCodeEnum erroCode = Error_Succeed;
  73. erroCode = pFuncCreateAdapt((DeviceBaseClass*&)m_AdptObjPtr);
  74. if (IS_FAILURED(erroCode)) {
  75. Dbg("Create device adapter object failed! EC=%s", SpStrError(erroCode));
  76. return erroCode;
  77. }
  78. LOG_ASSERT(m_AdptObjPtr != nullptr);
  79. return Error_Succeed;
  80. }
  81. ErrorCodeEnum LoadUp(const CSimpleStringA& strFullLibPath)
  82. {
  83. ErrorCodeEnum erroCode = LoadLibAddress(strFullLibPath);
  84. if (IS_SUCCEED(erroCode)) {
  85. erroCode = CreateDevAdptObject();
  86. }
  87. return erroCode;
  88. }
  89. ErrorCodeEnum TearDown()
  90. {
  91. if (m_AdptObjPtr != nullptr) {
  92. m_AdptObjPtr->DevClose();
  93. if (nullptr != pFuncReleaseAdapt) {
  94. pFuncReleaseAdapt(0, m_AdptObjPtr);
  95. m_AdptObjPtr = nullptr;
  96. }
  97. }
  98. SAFE_FREE_LIBRARY(hModule);
  99. }
  100. TSubAdpt* operator ->() { return m_AdptObjPtr; }
  101. DevAdptLibHelper()
  102. :hModule(nullptr)
  103. , pFuncCreateAdapt(nullptr), pFuncReleaseAdapt(nullptr)
  104. , m_AdptObjPtr(nullptr)
  105. {
  106. }
  107. ~DevAdptLibHelper()
  108. {
  109. TearDown();
  110. }
  111. private:
  112. HMODULE hModule;
  113. DevAdaptObjCreateFunc pFuncCreateAdapt;
  114. DevAdaptObjReleaseFunc pFuncReleaseAdapt;
  115. TSubAdpt* m_AdptObjPtr;
  116. };
  117. struct VendorLibInfo
  118. {
  119. CSimpleStringA strDevice;
  120. CSimpleStringA strVendor;
  121. CSimpleStringA strVersion;
  122. CSimpleStringA strBatch;
  123. VendorLibInfo() :strDevice(true), strVendor(true), strVersion(true), strBatch(true) {}
  124. bool IsValid() const {
  125. return (!strDevice.IsNullOrEmpty()
  126. && !strVendor.IsNullOrEmpty()
  127. && !strVersion.IsNullOrEmpty()
  128. && !strBatch.IsNullOrEmpty());
  129. }
  130. int GetVersion()
  131. {
  132. int result = 0;
  133. if (!strVersion.IsNullOrEmpty()) {
  134. result = atoi(strVersion.GetData());
  135. }
  136. return result;
  137. }
  138. int GetBatch()
  139. {
  140. int result = 0;
  141. if (!strBatch.IsNullOrEmpty()) {
  142. result = atoi(strBatch.GetData());
  143. }
  144. return result;
  145. }
  146. CSimpleStringA toLibNameString()
  147. {
  148. CSimpleStringA strFullLibName(true);
  149. if (!strDevice.IsNullOrEmpty()) {
  150. strFullLibName = strDevice;
  151. if (strVendor.IsNullOrEmpty()) {
  152. strFullLibName += ".";
  153. strFullLibName += strVendor;
  154. }
  155. if (strVersion.IsNullOrEmpty()) {
  156. strFullLibName += ".";
  157. strFullLibName += strVersion;
  158. }
  159. if (strBatch.IsNullOrEmpty()) {
  160. strFullLibName += ".";
  161. strFullLibName += strBatch;
  162. }
  163. #ifdef _WIN32
  164. strFullLibName += ".dll";
  165. #else
  166. CSimpleStringA strPrefix("lib");
  167. strPrefix += strFullLibName;
  168. strPrefix += ".so";
  169. strFullLibName = strPrefix;
  170. #endif //_WIN32
  171. }
  172. return strFullLibName;
  173. }
  174. };
  175. class CDevAdptEntityBase : public CEntityBase
  176. {
  177. public:
  178. CDevAdptEntityBase(){}
  179. CSimpleStringA GetVendorLibName()
  180. {
  181. if (m_libInfo.IsValid()) {
  182. ExtractVendorLibName();
  183. }
  184. return m_libInfo.toLibNameString();
  185. }
  186. ErrorCodeEnum ExtractVendorLibFullPath(CSimpleStringA& csLibFullPath);
  187. ErrorCodeEnum InitializeVendorLogSwitch();
  188. private:
  189. ErrorCodeEnum ExtractVendorLibName();
  190. protected:
  191. VendorLibInfo m_libInfo;
  192. };
  193. inline ErrorCodeEnum CDevAdptEntityBase::ExtractVendorLibName()
  194. {
  195. CSmartPointer<IConfigInfo> spRootConfig;
  196. ErrorCodeEnum erroCode = GetFunction()->OpenConfig(Config_Root, spRootConfig);
  197. if (IS_SUCCEED(erroCode)) {
  198. CSimpleStringA strSection = CSimpleStringA("Device.") + GetEntityName();
  199. m_libInfo.strDevice = GetEntityName();
  200. spRootConfig->ReadConfigValue(strSection, "Vendor", m_libInfo.strVendor);
  201. spRootConfig->ReadConfigValue(strSection, "Version", m_libInfo.strVersion);
  202. spRootConfig->ReadConfigValue(strSection, "Batch", m_libInfo.strBatch);
  203. if (!m_libInfo.IsValid())
  204. erroCode = Error_NotConfig;
  205. }
  206. return erroCode;
  207. }
  208. inline ErrorCodeEnum CDevAdptEntityBase::ExtractVendorLibFullPath(CSimpleStringA& csLibFullPath)
  209. {
  210. CSimpleStringA strLibName = GetVendorLibName();
  211. if (strLibName.IsNullOrEmpty()) {
  212. return Error_Unexpect;
  213. }
  214. CSimpleStringA strDepPath;
  215. GetFunction()->GetPath("Dep", strDepPath);
  216. csLibFullPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (LPCTSTR)strDepPath, (LPCTSTR)strLibName);
  217. return Error_Succeed;
  218. }
  219. inline ErrorCodeEnum CDevAdptEntityBase::InitializeVendorLogSwitch()
  220. {
  221. CSystemStaticInfo sysInfo;
  222. GetFunction()->GetSystemStaticInfo(sysInfo);
  223. if (!m_libInfo.IsValid())
  224. ExtractVendorLibName();
  225. struct VendorLogConfig {
  226. CSimpleStringA strLevel;
  227. CSimpleStringA strType;
  228. CSimpleStringA strDllName;
  229. CSimpleStringA strLogPath;
  230. void Settle() {
  231. SetEnvironmentVariableA("VENDOR_RECODE_LEVEL", strLevel);
  232. SetEnvironmentVariableA("VENDOR_RECODE_TYPE", strType);
  233. SetEnvironmentVariableA("VENDOR_DLL_NAME", strDllName);
  234. SetEnvironmentVariableA("VENDOR_LOG_PATH", strLogPath);
  235. }
  236. } stLogConfig = { "OFF" "FILE", m_libInfo.toLibNameString(), ""};
  237. CSmartPointer<IConfigInfo> centerConfig;
  238. GetFunction()->OpenConfig(Config_CenterSetting, centerConfig);
  239. CSimpleStringA str;
  240. centerConfig->ReadConfigValue(GetEntityName(), m_libInfo.strVendor, str);
  241. if (str.IsNullOrEmpty()) {
  242. centerConfig->ReadConfigValue(GetEntityName(), "All", str);
  243. }
  244. if (!str.IsNullOrEmpty())
  245. stLogConfig.strLevel = str;
  246. if (stLogConfig.strLevel.Compare("OFF", true) != 0) {
  247. CSimpleStringA strWhiteNameSheet;
  248. centerConfig->ReadConfigValue(GetEntityName(), "AllowTerminals", strWhiteNameSheet);
  249. if (!strWhiteNameSheet.IsNullOrEmpty()) {
  250. bool bWhiteNameSheet = false;
  251. CAutoArray<CSimpleStringA> arrayWhiteNameSheet = strWhiteNameSheet.Split(',');
  252. for (int i = 0; i < arrayWhiteNameSheet.GetCount(); i++) {
  253. std::regex pattern(arrayWhiteNameSheet[i]);
  254. if (std::regex_match(sysInfo.strTerminalID.GetData(), pattern)) {
  255. bWhiteNameSheet = true;
  256. break;
  257. }
  258. }
  259. //if this terminal is not at WhiteNameSheet,set level with "OFF".
  260. if (!bWhiteNameSheet)
  261. stLogConfig.strLevel = "OFF";
  262. }
  263. }
  264. if (stLogConfig.strLevel.Compare("OFF", true) != 0) {
  265. str.Clear();
  266. centerConfig->ReadConfigValue(GetEntityName(), "Type", str);
  267. if (!str.IsNullOrEmpty())
  268. stLogConfig.strType = str;
  269. TCHAR szPath[MAX_PATH] = { 0 };
  270. GetModuleFileNameA(NULL, szPath, MAX_PATH);
  271. CSimpleStringA strDir = szPath;
  272. str = strDir.SubString(0, 1);
  273. str += ":/rvc/dbg";
  274. stLogConfig.strLogPath = str;
  275. stLogConfig.Settle();
  276. }
  277. }
  278. #endif /*_RVC_DEVICE_ADAPTER_ENTITY_BASE_H__*/