idcer_impl.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "stdafx.h"
  3. #include "idcer_impl.h"
  4. #include <cstring>
  5. #include <cstdio>
  6. #include "log4vendor.h"
  7. #include <path.h>
  8. #ifdef RVC_OS_WIN
  9. #include <direct.h>
  10. #define GetCurrentDir _getcwd
  11. #else
  12. #define GetCurrentDir getcwd
  13. #endif // RVC_OS_WIN
  14. #define w 102 //头像宽度
  15. #define h 126 //头像高度
  16. #define DEFAULT_URL "http://localhost:8080/avs/imitate/simulateData"
  17. string get_current_directory() {
  18. char buff[256];
  19. GetCurrentDir(buff, 256);
  20. string current_working_directory(buff);
  21. return current_working_directory;
  22. }
  23. //string GetLocalIP()
  24. //{
  25. // hostent* ent = gethostbyname(NULL);
  26. // if (ent && ent->h_addr_list[0] != NULL)
  27. // {
  28. // int i = 0;
  29. // for (; ent->h_addr_list[i] != NULL; ++i)
  30. // {
  31. // struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  32. // if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
  33. // break;
  34. // }
  35. //
  36. // if (ent->h_addr_list[i] == NULL)
  37. // i = 0;
  38. //
  39. // auto in = (struct in_addr*)ent->h_addr_list[i];
  40. // char xIP[64] = {};
  41. // sprintf(xIP, "%d.%d.%d.%d", in->S_un.S_un_b.s_b1, in->S_un.S_un_b.s_b2, in->S_un.S_un_b.s_b3, in->S_un.S_un_b.s_b4);
  42. // LOG4VTM(INFO, "ip:" << xIP);
  43. //
  44. // return string(xIP);
  45. // }
  46. //}
  47. typedef unsigned short UINT16;
  48. typedef unsigned char UINT8;
  49. #ifdef RVC_OS_WIN
  50. char* ConvertGBKToUtf8(const char* gbk, int* n)
  51. {
  52. int len = MultiByteToWideChar(CP_ACP, 0, gbk, -1, NULL, 0);
  53. WCHAR* wszGBK = new WCHAR[len + 1];
  54. memset(wszGBK, 0, len * 2 + 2);
  55. MultiByteToWideChar(CP_ACP, 0, gbk, -1, wszGBK, len);
  56. len = WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, NULL, 0, NULL, NULL);
  57. char* szUtf8 = new char[len + 1];
  58. memset(szUtf8, 0, len + 1);
  59. WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, szUtf8, len, NULL, NULL);
  60. delete[] wszGBK;
  61. *n = len - 1;
  62. return szUtf8;
  63. }
  64. void ConvertGBKToUtf8(std::string& str)
  65. {
  66. int len = 0;
  67. char* dst = ConvertGBKToUtf8(str.c_str(), &len);
  68. str = dst;
  69. delete[] dst;
  70. }
  71. #endif // RVC_OS_WIN
  72. bool UTF8_to_UCS2(const UINT8* UINT8_code, UINT16* ucs2_code)
  73. {
  74. UINT16 temp1, temp2;
  75. bool is_unrecognized = false;
  76. UINT8* in = (UINT8*)UINT8_code;
  77. if (!UINT8_code || !ucs2_code)
  78. {
  79. return is_unrecognized;
  80. }
  81. while (*in != 0)
  82. {
  83. //1字节 0xxxxxxx
  84. //0x80=1000,0000,判断最高位是否为0,如果为0,那么是ASCII字符
  85. //不需要处理,直接拷贝即可
  86. if (0x00 == (*in & 0x80))
  87. {
  88. /* 1 byte UTF-8 Charater.*/
  89. *ucs2_code = *in;
  90. is_unrecognized = true;
  91. in += 1;
  92. }
  93. //2字节 110xxxxx 10xxxxxx
  94. //0xe0=1110,0000
  95. //0xc0=1100,0000
  96. else if (0xc0 == (*in & 0xe0) && 0x80 == (*(in + 1) & 0xc0))
  97. {
  98. /* 2 bytes UTF-8 Charater.*/
  99. //0x1f=0001,1111,获得第一个字节的后5位
  100. temp1 = (UINT16)(*in & 0x1f);
  101. //左移6位
  102. temp1 <<= 6;
  103. //0x3f=0011,1111,获得第二个字节的后6位
  104. //加上上面的5位一共有11位
  105. temp1 |= (UINT16)(*(in + 1) & 0x3f);
  106. *ucs2_code = temp1;
  107. is_unrecognized = true;
  108. in += 2;
  109. }
  110. //3字节 1110xxxx 10xxxxxx 10xxxxxx
  111. //中文要进入这一个分支
  112. else if (0xe0 == (*in & 0xf0) &&
  113. 0x80 == (*(in + 1) & 0xc0) &&
  114. 0x80 == (*(in + 2) & 0xc0)
  115. )
  116. {
  117. /* 3bytes UTF-8 Charater.*/
  118. //0x0f=0000,1111
  119. //取出第一个字节的低4位
  120. temp1 = (UINT16)(*in & 0x0f);
  121. temp1 <<= 12;
  122. //0x3f=0011,1111
  123. //取得第二个字节的低6位
  124. temp2 = (UINT16)(*(in + 1) & 0x3F);
  125. temp2 <<= 6;
  126. //取得第三个字节的低6位,最后组成16位
  127. temp1 = temp1 | temp2 | (UINT16)(*(in + 2) & 0x3F);
  128. *ucs2_code = temp1;
  129. //移动到下一个字符
  130. in += 3;
  131. is_unrecognized = true;
  132. }
  133. else
  134. {
  135. /* unrecognize byte. */
  136. *ucs2_code = 0x22e0;
  137. is_unrecognized = false;
  138. //直接退出循环
  139. break;
  140. }
  141. ucs2_code += 1;
  142. }
  143. return is_unrecognized;
  144. }
  145. std::string current_working_directory()
  146. {
  147. char buff[250];
  148. GetCurrentDir(buff, 250);
  149. std::string current_working_directory(buff);
  150. return current_working_directory;
  151. }
  152. void WriteBMP(char* img, const char* filename)
  153. {
  154. int l = (w * 3 + 3) / 4 * 4;
  155. int bmi[] = {
  156. l * h + 54,0,54,40,w,h,1 | 3 * 8 << 16,0,l * h,0,0,100,0 };
  157. FILE* fp = fopen(filename, "wb");
  158. fprintf(fp, "BM");
  159. fwrite(&bmi, 52, 1, fp);
  160. fwrite(img, 1, l * h, fp);
  161. fclose(fp);
  162. }
  163. IDCerClassImpl::IDCerClassImpl()
  164. :m_mode(0)
  165. {
  166. lastErrMsg = "";
  167. }
  168. IDCerClassImpl::~IDCerClassImpl()
  169. {
  170. }
  171. ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo& devCategory)
  172. {
  173. ErrorCodeEnum err = Error_Succeed;
  174. strcpy(devCategory.szModel, "STYLE=IG#FUNCTION=ITF#CODE=UCS2");
  175. strcpy(devCategory.szType, "szCategory");
  176. strcpy(devCategory.szVendor, "szVendor=cmbszSimulator");
  177. return err;
  178. }
  179. ErrorCodeEnum IDCerClassImpl::Reset()
  180. {
  181. ErrorCodeEnum err = Error_Succeed;
  182. m_mode = 0;
  183. return err;
  184. }
  185. ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
  186. {
  187. ErrorCodeEnum err = Error_Succeed;
  188. /*bool flag = authHttpFunction();
  189. m_mode = 0;
  190. if (!flag)
  191. {
  192. err = Error_Dev_IDCardNotFound;
  193. lastErrMsg = "未识别到身份证件";
  194. }*/
  195. SimulatorCommonAns ans;
  196. err = SimulatorHttpFunction("IDCertificate", "IDCerAuthenticate", ans);
  197. return err;
  198. }
  199. ErrorCodeEnum IDCerClassImpl::ForceIDEject()
  200. {
  201. ErrorCodeEnum err = Error_Succeed;
  202. m_mode = 0;
  203. return err;
  204. }
  205. ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
  206. {
  207. ErrorCodeEnum err = Error_NotImpl;
  208. m_mode = 0;
  209. SimulatorCommonAns ans;
  210. err = SimulatorHttpFunction("IDCertificate", "ScanIDAndSaveImage", ans);
  211. return err;
  212. }
  213. ErrorCodeEnum IDCerClassImpl::QueryCardPos(int& pos)
  214. {
  215. ErrorCodeEnum err = Error_Succeed;
  216. m_mode = 0;
  217. SimulatorCommonAns ans;
  218. err = SimulatorHttpFunction("IDCertificate", "QueryCardPos", ans);
  219. return err;
  220. }
  221. ErrorCodeEnum IDCerClassImpl::IDCerRFControl(bool bControl)
  222. {
  223. ErrorCodeEnum err = Error_Succeed;
  224. m_mode = 0;
  225. SimulatorCommonAns ans;
  226. err = SimulatorHttpFunction("IDCertificate", "IDCerRFControl", ans);
  227. return err;
  228. }
  229. ErrorCodeEnum IDCerClassImpl::DevOpen(DWORD dwPort)
  230. {
  231. depCfgPath = get_current_directory() + SPLIT_SLASH_STR + "dep" + SPLIT_SLASH_STR + "cmbsz.ini";
  232. bool ret = iniRead.ReadConfig(depCfgPath);
  233. if (ret == false)
  234. {
  235. LOG4VTM(INFO, "dep ReadConfig is Error,cfg=" << depCfgPath);
  236. }
  237. ErrorCodeEnum err = Error_Succeed;
  238. return err;
  239. }
  240. ErrorCodeEnum IDCerClassImpl::DevClose()
  241. {
  242. ErrorCodeEnum err = Error_Succeed;
  243. return err;
  244. }
  245. ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo& idCerInfo)
  246. {
  247. ErrorCodeEnum err = Error_Succeed;
  248. memset(&idCerInfo, 0, sizeof(IDCerInfo));
  249. strcpy(idCerInfo.startDate.data, "2009.03.25");
  250. idCerInfo.startDate.dwSize = strlen("2009.03.25");
  251. strcpy(idCerInfo.endDate.data, "2029.03.24");
  252. idCerInfo.endDate.dwSize = strlen("2029.03.24");
  253. return err;
  254. }
  255. ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx& idCerInfoEx)
  256. {
  257. ErrorCodeEnum err = Error_Succeed;
  258. memset(&idCerInfoEx, 0, sizeof(IDCerInfoEx));
  259. std::string path;
  260. path = current_working_directory();
  261. path = path + "/dep/zp.bmp";
  262. char img[w * h * 3];
  263. for (int i = 0; i < w * h * 3; i++)img[i] = rand() % 256;
  264. WriteBMP(img, path.c_str());
  265. bool testRe = exHttpFunction(idCerInfoEx);
  266. return err;
  267. }
  268. ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx2(IDCerInfoEx2& idCerInfoEx2)
  269. {
  270. ErrorCodeEnum err = Error_Succeed;
  271. memset(&idCerInfoEx2, 0, sizeof(IDCerInfoEx2));
  272. bool testRe = ex2HttpFunction(idCerInfoEx2);
  273. if (!testRe)
  274. {
  275. lastErrMsg = "{\"Description\": \"获取身份证芯片数据失败\"}";
  276. err = Error_Unexpect;
  277. return err;
  278. }
  279. std::string path;
  280. path = current_working_directory();
  281. path = path + "/dep/zp.bmp";
  282. char img[w * h * 3];
  283. for (int i = 0; i < w * h * 3; i++)img[i] = rand() % 256;
  284. WriteBMP(img, path.c_str());
  285. return err;
  286. }
  287. ErrorCodeEnum IDCerClassImpl::GetLastErr(DevErrorInfo& devErrInfo)
  288. {
  289. static int times = 0;
  290. char szMessage[128];
  291. //sprintf(szMessage, "这是第 %d 条错误信息", ++times);
  292. bool flag = authHttpFunction("GetLastErr");
  293. if (!flag)
  294. {
  295. lastErrMsg = "";
  296. }
  297. strcpy(devErrInfo.szErrMsg, lastErrMsg.c_str());
  298. devErrInfo.dwErrMsgLen = lastErrMsg.length();
  299. return Error_Succeed;
  300. }
  301. bool IDCerClassImpl::authHttpFunction(string depName)
  302. {
  303. IHttpFunc* client;
  304. client = create_http(HttpsLogCallBack);
  305. IDCerDevReq idCerReq;
  306. IDCerDevRet idCerRet;
  307. idCerReq.ip = GetLocalIP();
  308. idCerReq.entityName = "IDCertificate";
  309. idCerReq.method = "readAndScan";
  310. idCerReq.adapterInterName = depName.c_str();
  311. string url = GetSimulatorUrl();
  312. if (url.length() == 0)
  313. {
  314. url = DEFAULT_URL;
  315. }
  316. idCerReq.m_url = url;
  317. LOG4VTM(INFO, "请求地址:" << idCerReq.m_url.c_str());
  318. bool ret = client->Post(idCerReq, idCerRet);
  319. if (ret) {
  320. if (idCerRet.success == false)
  321. {
  322. LOG4VTM(INFO, "请求失败");
  323. return false;
  324. }
  325. if (idCerRet.result == true)
  326. {
  327. return true;
  328. }
  329. else
  330. {
  331. return false;
  332. }
  333. }
  334. else
  335. {
  336. LOG4VTM(INFO, "ret = 0, 请求失败");
  337. return false;
  338. }
  339. }
  340. bool IDCerClassImpl::exHttpFunction(IDCerInfoEx& idCerInfoEx)
  341. {
  342. IHttpFunc* client;
  343. client = create_http(HttpsLogCallBack);
  344. IDCerDevReq idCerReq;
  345. IDCerDevRet idCerRet;
  346. idCerReq.ip = GetLocalIP();
  347. idCerReq.entityName = "IDCertificate";
  348. idCerReq.method = "readAndScan";
  349. idCerReq.adapterInterName = "IDCerGetDataEx";
  350. string url = GetSimulatorUrl();
  351. if (url.length() == 0)
  352. {
  353. url = DEFAULT_URL;
  354. }
  355. idCerReq.m_url = url;
  356. LOG4VTM(INFO, "请求地址:" << idCerReq.m_url.c_str());
  357. bool ret = client->Post(idCerReq, idCerRet);
  358. if (ret) {
  359. if (!idCerRet.success)
  360. {
  361. LOG4VTM(INFO, "请求失败");
  362. return false;
  363. }
  364. std::strcpy(idCerInfoEx.name.data, idCerRet.name.c_str());
  365. idCerInfoEx.name.dwSize = strlen(idCerRet.name.c_str());
  366. std::strcpy(idCerInfoEx.sex.data, idCerRet.sex.c_str());
  367. idCerInfoEx.sex.dwSize = strlen(idCerRet.sex.c_str());
  368. std::strcpy(idCerInfoEx.nation.data, idCerRet.nation.c_str());
  369. idCerInfoEx.nation.dwSize = strlen(idCerRet.nation.c_str());
  370. std::strcpy(idCerInfoEx.birthday.data, idCerRet.birthday.c_str());
  371. idCerInfoEx.birthday.dwSize = strlen(idCerRet.birthday.c_str());
  372. std::strcpy(idCerInfoEx.address.data, idCerRet.address.c_str());
  373. idCerInfoEx.address.dwSize = strlen(idCerRet.address.c_str());
  374. if (strlen(idCerRet.idcode.c_str()) == 0)
  375. {
  376. idCerRet.idcode = "testnum00000";
  377. }
  378. std::strcpy(idCerInfoEx.idno.data, idCerRet.idcode.c_str());
  379. idCerInfoEx.idno.dwSize = strlen(idCerRet.idcode.c_str());
  380. std::strcpy(idCerInfoEx.department.data, idCerRet.department.c_str());
  381. idCerInfoEx.department.dwSize = strlen(idCerRet.department.c_str());
  382. std::strcpy(idCerInfoEx.startDate.data, idCerRet.startdate.c_str());
  383. idCerInfoEx.startDate.dwSize = strlen(idCerRet.startdate.c_str());
  384. std::strcpy(idCerInfoEx.endDate.data, idCerRet.enddate.c_str());
  385. idCerInfoEx.endDate.dwSize = strlen(idCerRet.enddate.c_str());
  386. std::strcpy(idCerInfoEx.englishName.data, idCerRet.englishname.c_str());
  387. idCerInfoEx.englishName.dwSize = strlen(idCerRet.englishname.c_str());
  388. std::strcpy(idCerInfoEx.nationality.data, idCerRet.nationality.c_str());
  389. idCerInfoEx.nationality.dwSize = strlen(idCerRet.nationality.c_str());
  390. std::strcpy(idCerInfoEx.idVersion.data, idCerRet.idversion.c_str());
  391. idCerInfoEx.idVersion.dwSize = strlen(idCerRet.idversion.c_str());
  392. std::strcpy(idCerInfoEx.idType.data, idCerRet.idtype.c_str());
  393. idCerInfoEx.idType.dwSize = strlen(idCerRet.idtype.c_str());
  394. std::strcpy(idCerInfoEx.reserved.data, idCerRet.reserved.c_str());
  395. idCerInfoEx.reserved.dwSize = strlen(idCerRet.reserved.c_str());
  396. return true;
  397. }
  398. else
  399. {
  400. LOG4VTM(INFO, "ret = 0, 请求失败");
  401. return false;
  402. }
  403. }
  404. bool IDCerClassImpl::ex2HttpFunction(IDCerInfoEx2& idCerInfoEx2)
  405. {
  406. IHttpFunc* client;
  407. client = create_http(HttpsLogCallBack);
  408. IDCerDevReq idCerReq;
  409. IDCerDevRet idCerRet;
  410. idCerReq.ip = GetLocalIP();
  411. idCerReq.entityName = "IDCertificate";
  412. idCerReq.adapterInterName = "IDCerGetDataEx2";
  413. string url = GetSimulatorUrl();
  414. if (url.length() == 0)
  415. {
  416. url = DEFAULT_URL;
  417. }
  418. idCerReq.m_url = url;
  419. LOG4VTM(INFO, "请求地址:" << idCerReq.m_url.c_str());
  420. bool ret = client->Post(idCerReq, idCerRet);
  421. if (ret) {
  422. if (!idCerRet.success)
  423. {
  424. LOG4VTM(INFO, "请求失败");
  425. return false;
  426. }
  427. if (idCerRet.name.length() <= 0)
  428. {
  429. return false;
  430. }
  431. #ifdef RVC_OS_WIN
  432. ConvertGBKToUtf8(idCerRet.name);
  433. ConvertGBKToUtf8(idCerRet.englishname);
  434. ConvertGBKToUtf8(idCerRet.sex);
  435. ConvertGBKToUtf8(idCerRet.birthday);
  436. ConvertGBKToUtf8(idCerRet.address);
  437. ConvertGBKToUtf8(idCerRet.department);
  438. ConvertGBKToUtf8(idCerRet.idcode);
  439. ConvertGBKToUtf8(idCerRet.startdate);
  440. ConvertGBKToUtf8(idCerRet.enddate);
  441. ConvertGBKToUtf8(idCerRet.nation);
  442. ConvertGBKToUtf8(idCerRet.nationality);
  443. #endif // RVC_OS_WIN
  444. char name[1024]; memset(name, 0, 1024);
  445. std::strcpy(name, idCerRet.name.c_str());
  446. UTF8_to_UCS2((UINT8*)name, (UINT16*)idCerInfoEx2.name.data);
  447. idCerInfoEx2.name.dwSize = strlen(idCerInfoEx2.name.data);
  448. char englishname[1024]; memset(englishname, 0, 1024);
  449. std::strcpy(englishname, idCerRet.englishname.c_str());
  450. UTF8_to_UCS2((UINT8*)englishname, (UINT16*)idCerInfoEx2.englishName.data);
  451. idCerInfoEx2.englishName.dwSize = strlen(idCerInfoEx2.englishName.data);
  452. char sex[1024]; memset(sex, 0, 1024);
  453. std::strcpy(sex, idCerRet.sex.c_str());
  454. UTF8_to_UCS2((UINT8*)sex, (UINT16*)idCerInfoEx2.sex.data);
  455. idCerInfoEx2.sex.dwSize = strlen(idCerInfoEx2.sex.data);
  456. char birthday[1024]; memset(birthday, 0, 1024);
  457. std::strcpy(birthday, idCerRet.birthday.c_str());
  458. UTF8_to_UCS2((UINT8*)birthday, (UINT16*)idCerInfoEx2.birthday.data);
  459. idCerInfoEx2.birthday.dwSize = strlen(idCerInfoEx2.birthday.data);
  460. char address[1024]; memset(address, 0, 1024);
  461. std::strcpy(address, idCerRet.address.c_str());
  462. UTF8_to_UCS2((UINT8*)address, (UINT16*)idCerInfoEx2.address.data);
  463. idCerInfoEx2.address.dwSize = strlen(idCerInfoEx2.address.data);
  464. char department[1024]; memset(department, 0, 1024);
  465. std::strcpy(department, idCerRet.department.c_str());
  466. UTF8_to_UCS2((UINT8*)department, (UINT16*)idCerInfoEx2.department.data);
  467. idCerInfoEx2.department.dwSize = strlen(idCerInfoEx2.department.data);
  468. char idno[1024]; memset(idno, 0, 1024);
  469. std::strcpy(idno, idCerRet.idcode.c_str());
  470. UTF8_to_UCS2((UINT8*)idno, (UINT16*)idCerInfoEx2.idno.data);
  471. idCerInfoEx2.idno.dwSize = strlen(idCerInfoEx2.idno.data);
  472. char startDate[1024]; memset(startDate, 0, 1024);
  473. std::strcpy(startDate, idCerRet.startdate.c_str());
  474. UTF8_to_UCS2((UINT8*)startDate, (UINT16*)idCerInfoEx2.startDate.data);
  475. idCerInfoEx2.startDate.dwSize = strlen(idCerInfoEx2.startDate.data);
  476. char endDate[1024]; memset(endDate, 0, 1024);
  477. std::strcpy(endDate, idCerRet.enddate.c_str());
  478. UTF8_to_UCS2((UINT8*)endDate, (UINT16*)idCerInfoEx2.endDate.data);
  479. idCerInfoEx2.endDate.dwSize = strlen(idCerInfoEx2.endDate.data);
  480. char nation[1024]; memset(nation, 0, 1024);
  481. std::strcpy(nation, idCerRet.nation.c_str());
  482. UTF8_to_UCS2((UINT8*)nation, (UINT16*)idCerInfoEx2.nation.data);
  483. idCerInfoEx2.nation.dwSize = strlen(idCerInfoEx2.nation.data);
  484. char nationality[1024]; memset(nationality, 0, 1024);
  485. std::strcpy(nationality, idCerRet.nationality.c_str());
  486. UTF8_to_UCS2((UINT8*)nationality, (UINT16*)idCerInfoEx2.nationality.data);
  487. idCerInfoEx2.nationality.dwSize = strlen(idCerInfoEx2.nationality.data);
  488. char idType[1024]; memset(idType, 0, 1024);
  489. std::strcpy(idType, idCerRet.idtype.c_str());
  490. UTF8_to_UCS2((UINT8*)idType, (UINT16*)idCerInfoEx2.idType.data);
  491. idCerInfoEx2.idType.dwSize = strlen(idCerInfoEx2.idType.data);
  492. char othercode[1024]; memset(othercode, 0, 1024);
  493. std::strcpy(othercode, idCerRet.othercode.c_str());
  494. UTF8_to_UCS2((UINT8*)othercode, (UINT16*)idCerInfoEx2.reserved2.data);
  495. idCerInfoEx2.reserved2.dwSize = strlen(idCerInfoEx2.reserved2.data);
  496. char reserved[1024]; memset(reserved, 0, 1024);
  497. std::strcpy(reserved, idCerRet.reserved.c_str());
  498. UTF8_to_UCS2((UINT8*)reserved, (UINT16*)idCerInfoEx2.reserved.data);
  499. idCerInfoEx2.reserved.dwSize = strlen(idCerInfoEx2.reserved.data);
  500. return true;
  501. }
  502. else
  503. {
  504. LOG4VTM(INFO, "ret = 0, 请求失败");
  505. return false;
  506. }
  507. }
  508. #ifdef RVC_OS_WIN
  509. BOOL APIENTRY DllMain(HMODULE hModule,
  510. DWORD ul_reason_for_call,
  511. LPVOID lpReserved
  512. )
  513. {
  514. switch (ul_reason_for_call)
  515. {
  516. case DLL_PROCESS_ATTACH:
  517. case DLL_THREAD_ATTACH:
  518. case DLL_THREAD_DETACH:
  519. case DLL_PROCESS_DETACH:
  520. break;
  521. }
  522. return TRUE;
  523. }
  524. #endif // RVC_OS_WIN
  525. DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
  526. {
  527. pBaseObj = new IDCerClassImpl();
  528. if (pBaseObj == NULL)
  529. return Error_Resource;
  530. cmb::log_init_config config;
  531. config.dev_name = "vendor_IDCertificate";
  532. #ifdef RVC_OS_WIN
  533. config.log_dir = ("D:\\rvc\\dbg\\");
  534. #else
  535. config.log_dir = ("/opt/rvc/dbg/");
  536. #endif
  537. std::string str;
  538. cmb::log4vendor::init(config, str);
  539. printf("init after: %s\n", str.c_str());
  540. return Error_Succeed;
  541. }
  542. DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass*& pBaseObj)
  543. {
  544. if (pBaseObj == NULL)
  545. return Error_Param;
  546. IDCerClassImpl* pTmp = (IDCerClassImpl*)(pBaseObj);
  547. delete pTmp;
  548. pTmp = NULL;
  549. pBaseObj = NULL;
  550. return Error_Succeed;
  551. }
  552. #ifdef NEWER_COMPILER_WORKAROUNDS
  553. DEVICEBASE_API ErrorCodeEnum GetDevAdapterVersion(DevSoftVersion& retVesion)
  554. {
  555. retVesion.wMajor = retVesion.wMinor = retVesion.wBuild = retVesion.wRevision = 0;
  556. return Error_Succeed;
  557. }
  558. #endif // NEWER_COMPILER_WORKAROUNDS