UpgradeMgrCnn.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817
  1. #include "UpgradeMgrConn.h"
  2. #include <string.h>
  3. #include "GetDevInfoHelper.h"
  4. #include "UpgradeMgrFSM.h"
  5. #include "mod_UpgradeMgr.h"
  6. #ifdef RVC_OS_WIN
  7. #else
  8. #include <sys/utsname.h>
  9. #include <errno.h>
  10. #endif
  11. namespace UpgradeConnect {
  12. void CUpgradeMgrConn::OnDisconnect()
  13. {
  14. Dbg("connection disconnect");
  15. m_pFSM->PostEventFIFO(new FSMEvent(CReportMgrFSM::Event_Disconnected));
  16. }
  17. void CUpgradeMgrConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  18. {
  19. string serviceCode = pRecvPkg->GetServiceCode();
  20. if (serviceCode == "POLL")
  21. {
  22. HandlePollUpgradeRet(pRecvPkg);
  23. }
  24. else if (serviceCode == "CONFIRM")
  25. {
  26. HandleConfirmUpgradeRet(pRecvPkg);
  27. }
  28. else if (serviceCode == "REPORT")
  29. {
  30. HandleReportRet(pRecvPkg);
  31. }
  32. else if (serviceCode == "QRYEXEC")
  33. {
  34. HandleQueryExecInfoRet(pRecvPkg);
  35. }
  36. else if (serviceCode == "MD5List")
  37. {
  38. HandleMD5ListRet(pRecvPkg);
  39. }
  40. else if (serviceCode == "CUSVER")
  41. {
  42. HandleReportSysCustomVerRet(pRecvPkg);
  43. }
  44. else
  45. {
  46. LOG_TRACE("unknown service code: %s", serviceCode.c_str());
  47. }
  48. }
  49. ErrorCodeEnum CUpgradeMgrConn::SendConfirmUpgradeReq(const char* pPackExecID)
  50. {
  51. CSmartPointer<IPackage> package = CreateNewPackage("CONFIRM");
  52. Confirm_Req req = {};
  53. #ifdef RVC_OS_WIN
  54. strncpy_s(req.PackExecID, sizeof(req.PackExecID), pPackExecID, _TRUNCATE);
  55. #else
  56. strncpy(req.PackExecID, pPackExecID, sizeof(req.PackExecID));
  57. #endif
  58. package->AddStruct("CONF_REQ", false, false, (BYTE*)&req, sizeof(req), 1);
  59. //Dbg("send upgrade confirm package");
  60. SendPackage(package);
  61. return Error_Succeed;
  62. }
  63. ErrorCodeEnum CUpgradeMgrConn::SendQueryExecInfoReq(const char* pPackExecID)
  64. {
  65. CSmartPointer<IPackage> package = CreateNewPackage("QRYEXEC");
  66. QueryExec_Req req = {};
  67. #ifdef RVC_OS_WIN
  68. strncpy_s(req.PackExecID, sizeof(req.PackExecID), pPackExecID, _TRUNCATE);
  69. #else
  70. strncpy(req.PackExecID, pPackExecID, sizeof(req.PackExecID));
  71. #endif
  72. package->AddStruct("EXEC_REQ", false, false, (BYTE*)&req, sizeof(req), 1);
  73. //Dbg("send upgrade confirm package");
  74. SendPackage(package);
  75. return Error_Succeed;
  76. }
  77. ErrorCodeEnum CUpgradeMgrConn::SendPollUpgradeReq(bool IsHashComputed)
  78. {
  79. auto pFunc = m_pEntity->GetFunction();
  80. CSystemStaticInfo info;
  81. auto rc = pFunc->GetSystemStaticInfo(info);
  82. if (rc != Error_Succeed)
  83. {
  84. LogError(Severity_Middle, rc, 0, "get system static info error");
  85. return rc;
  86. }
  87. PollUpgrade_Req4 req1;
  88. memset(&req1, 0, sizeof(req1));
  89. strncpy(req1.TerminalNo, info.strTerminalID, sizeof(req1.TerminalNo)-1);
  90. strncpy(req1.MachineType, info.strMachineType, sizeof(req1.MachineType)-1);
  91. // 设备版本,低两位为小版本号,高两位为大版本号 Binary 4
  92. WORD nMajor = info.MachineVersion.GetMajor();
  93. req1.MachineVersion[0] = (nMajor >> 8) & 0xFF;
  94. req1.MachineVersion[1] = nMajor & 0xFF;
  95. WORD nMinor = info.MachineVersion.GetMinor();
  96. req1.MachineVersion[2] = (nMinor >> 8) & 0xFF;
  97. req1.MachineVersion[3] = nMinor & 0xFF;
  98. // 安装版本,其中包含软件框架版本 binary 8
  99. WORD nTmp = info.InstallVersion.GetMajor();
  100. req1.InstallVersion[0] = (nTmp >> 8) & 0xFF;
  101. req1.InstallVersion[1] = nTmp & 0xFF;
  102. nTmp = info.InstallVersion.GetMinor();
  103. req1.InstallVersion[2] = (nTmp >> 8) & 0xFF;
  104. req1.InstallVersion[3] = nTmp & 0xFF;
  105. nTmp = info.InstallVersion.GetRevision();
  106. req1.InstallVersion[4] = (nTmp >> 8) & 0xFF;
  107. req1.InstallVersion[5] = nTmp & 0xFF;
  108. nTmp = info.InstallVersion.GetBuild();
  109. req1.InstallVersion[6] = (nTmp >> 8) & 0xFF;
  110. req1.InstallVersion[7] = nTmp & 0xFF;
  111. // OS版本
  112. #ifdef RVC_OS_WIN
  113. OSVERSIONINFO osvi;
  114. ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  115. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  116. GetVersionEx(&osvi);
  117. req1.OSVersion[0] = (osvi.dwMajorVersion >> 8) & 0xFF;
  118. req1.OSVersion[1] = osvi.dwMajorVersion & 0xFF;
  119. req1.OSVersion[2] = (osvi.dwMinorVersion >> 8) & 0xFF;
  120. req1.OSVersion[3] = osvi.dwMinorVersion & 0xFF;
  121. req1.OSVersion[4] = (osvi.dwBuildNumber >> 8) & 0xFF;
  122. req1.OSVersion[5] = osvi.dwBuildNumber & 0xFF;
  123. #else
  124. DWORD dwMajorVersion(0), dwMinorVersion(0), dwBuildNumber(0);
  125. struct utsname kernel_info;
  126. int ret = uname(&kernel_info);
  127. if (ret == 0) {
  128. int n = sscanf((const char*)kernel_info.release, "%d.%d", &dwMajorVersion, &dwMinorVersion);
  129. }
  130. else {
  131. Dbg("get linux kernel version fail: %s", strerror(errno));
  132. }
  133. req1.OSVersion[0] = (dwMajorVersion >> 8) & 0xFF;
  134. req1.OSVersion[1] = dwMajorVersion & 0xFF;
  135. req1.OSVersion[2] = (dwMinorVersion >> 8) & 0xFF;
  136. req1.OSVersion[3] = dwMinorVersion & 0xFF;
  137. req1.OSVersion[4] = (dwBuildNumber >> 8) & 0xFF;
  138. req1.OSVersion[5] = dwBuildNumber & 0xFF;
  139. #endif
  140. strncpy(req1.Sites, info.strSite, sizeof(req1.Sites)-1);
  141. CSmartPointer<IPackage> package = CreateNewPackage("POLL");
  142. package->AddStruct("POLLREQ4", false, false, (BYTE*)&req1, sizeof(req1));
  143. // 获取硬件信息
  144. CAutoArray<CSimpleStringA> devNames;
  145. rc = SpGetAllDevices(m_pEntity, devNames);
  146. if (rc != Error_Succeed)
  147. {
  148. LogError(Severity_Middle, rc, 0, "get all device info error");
  149. return rc;
  150. }
  151. int nDevEntityCount = devNames.GetCount();
  152. if (nDevEntityCount >0)
  153. {
  154. int nBufLen = nDevEntityCount * sizeof(PollUpgrade_Req2);
  155. char *pBuf = new char[nBufLen];
  156. memset(pBuf, 0, nBufLen);
  157. PollUpgrade_Req2 *pDevInfo = (PollUpgrade_Req2*)pBuf;
  158. for(int i=0; i<nDevEntityCount; i++)
  159. {
  160. CSimpleStringA strVersion, strModel, strVendor;
  161. rc = SpGetDeviceInfo(m_pEntity, devNames[i], strModel, strVendor, strVersion);
  162. if (rc == Error_Succeed)
  163. {
  164. strncpy(pDevInfo->Type, (const char*)devNames[i], sizeof(pDevInfo->Type)-1);
  165. strncpy(pDevInfo->Modal, (const char*)strModel, sizeof(pDevInfo->Modal)-1);
  166. strncpy(pDevInfo->Factory,(const char*)strVendor, sizeof(pDevInfo->Factory)-1);
  167. if (strVersion.GetLength() >0)
  168. {
  169. CAutoArray<CSimpleStringA> arr = strVersion.Split('.');
  170. for(int i=0; i<4 && i<arr.GetCount(); i++)
  171. {
  172. WORD w = (WORD) atoi(arr[i]);
  173. ((BYTE*)pDevInfo->Version)[i*2] = (w >> 8) & 0xFF;
  174. ((BYTE*)pDevInfo->Version)[i*2+1] = w & 0xFF;
  175. }
  176. }
  177. }
  178. pDevInfo++;
  179. }
  180. package->AddStruct("POLLREQ2", false, false, (BYTE*)pBuf, nBufLen, nDevEntityCount);
  181. delete[] pBuf;
  182. }
  183. // 获取当前版本安装包信息
  184. vector<CSimpleStringA> installedPacks;
  185. for(int i=0; i<info.LightPackInfos.GetCount(); i++)
  186. installedPacks.push_back(info.LightPackInfos[i].strPackName);
  187. if (!info.InstallPack.IsNullOrEmpty())
  188. installedPacks.push_back(info.InstallPack);
  189. CVersion lastVer = info.PreviousInstallVersion;
  190. while (lastVer.IsValid())
  191. {
  192. CInstallInfo lastVerInfo = {};
  193. rc = pFunc->GetInstallInfo(lastVer, lastVerInfo);
  194. if (rc != Error_Succeed)
  195. break;
  196. if (!lastVerInfo.InstallPack.IsNullOrEmpty())
  197. installedPacks.push_back(lastVerInfo.InstallPack);
  198. lastVer = lastVerInfo.PreviousInstallVersion;
  199. }
  200. int nPackCount = installedPacks.size();
  201. if (nPackCount >0)
  202. {
  203. //Dbg("current version has %d packs installed", nPackCount);
  204. int nBufLen = nPackCount * sizeof(PollUpgrade_Req5);
  205. char *pBuf = new char[nBufLen];
  206. memset(pBuf, 0, nBufLen);
  207. PollUpgrade_Req5 *pPackInfo = (PollUpgrade_Req5*)pBuf;
  208. for(int i=0; i<nPackCount; i++)
  209. {
  210. CSimpleStringA &strPackName = installedPacks[i];
  211. strncpy(pPackInfo->UpgradePack, strPackName, strPackName.GetLength()>MAX_PACKNAME_LEN?MAX_PACKNAME_LEN:strPackName.GetLength());
  212. pPackInfo->PackState = 'D';//CUpgradeMgrEntity::GetInstallStateVal(info.LightPackInfos[i].State);
  213. pPackInfo++;
  214. //Dbg("pack %s installed", (const char*)installedPacks[i]);
  215. }
  216. package->AddStruct("POLLREQ5", false, false, (BYTE*)pBuf, nBufLen, nPackCount);
  217. delete[] pBuf;
  218. }
  219. //CSimpleStringA strMD5List = "";
  220. //((CUpgradeMgrEntity*)m_pEntity)->GetMD5List(strMD5List);
  221. PollUpgrade_Req6 req6;
  222. memset(&req6, 0, sizeof(req6));
  223. //hash完成才添加hash文件
  224. if(IsHashComputed){
  225. CSimpleStringA SM3Hash= ((CUpgradeMgrEntity*)m_pEntity)->m_strSM3Hash;
  226. if (!SM3Hash.IsNullOrEmpty())
  227. {
  228. Dbg("add md5list hash");
  229. strncpy(req6.MD5ListHash, SM3Hash, SM3Hash.GetLength());
  230. }else{
  231. Dbg("add md5list hash fail");
  232. }
  233. }
  234. //CSimpleStringA md5List = ((CUpgradeMgrEntity*)m_pEntity)->m_strMD5List;
  235. //if (!md5List.IsNullOrEmpty())
  236. //{
  237. // CSimpleStringA strMD5ListHash = "";
  238. // ((CUpgradeMgrEntity*)m_pEntity)->MD5Data(md5List, strMD5ListHash);
  239. // if (strMD5ListHash.IsNullOrEmpty())
  240. // {
  241. // Dbg("get md5list hash fail");
  242. // }
  243. // else
  244. // {
  245. // Dbg("add md5list hash");
  246. // strncpy(req6.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  247. // }
  248. //}
  249. package->AddStruct("POLLREQ6", false, false, (BYTE*)&req6, sizeof(req6));
  250. Dbg("send poll upgrade package");
  251. SendPackage(package);
  252. return Error_Succeed;
  253. }
  254. ErrorCodeEnum CUpgradeMgrConn::SendMD5ListReq(CSimpleStringA strBlockId)
  255. {
  256. m_BlockId = atoi(strBlockId);
  257. Dbg("send MD5 list m_BlockId=%d", m_BlockId);
  258. auto pFunc = m_pEntity->GetFunction();
  259. CSystemStaticInfo info;
  260. auto rc = pFunc->GetSystemStaticInfo(info);
  261. if (rc != Error_Succeed)
  262. {
  263. LogError(Severity_Middle, rc, 0, "get system static info error");
  264. return rc;
  265. }
  266. CSmartPointer<IPackage> package = CreateNewPackage("MD5List");
  267. MD5List_Req req;
  268. memset(&req, 0, sizeof(req));
  269. strncpy(req.TerminalNo, info.strTerminalID, sizeof(req.TerminalNo)-1);
  270. // 安装版本,其中包含软件框架版本 binary 8
  271. WORD nTmp = info.InstallVersion.GetMajor();
  272. req.InstallVersion[0] = (nTmp >> 8) & 0xFF;
  273. req.InstallVersion[1] = nTmp & 0xFF;
  274. nTmp = info.InstallVersion.GetMinor();
  275. req.InstallVersion[2] = (nTmp >> 8) & 0xFF;
  276. req.InstallVersion[3] = nTmp & 0xFF;
  277. nTmp = info.InstallVersion.GetRevision();
  278. req.InstallVersion[4] = (nTmp >> 8) & 0xFF;
  279. req.InstallVersion[5] = nTmp & 0xFF;
  280. nTmp = info.InstallVersion.GetBuild();
  281. req.InstallVersion[6] = (nTmp >> 8) & 0xFF;
  282. req.InstallVersion[7] = nTmp & 0xFF;
  283. req.BlockId = m_BlockId;
  284. CSimpleStringA strMD5List = "";
  285. ((CUpgradeMgrEntity*)m_pEntity)->GetMD5List(strMD5List);
  286. Dbg("MD5 list len=%d", strMD5List.GetLength());
  287. if (!strMD5List.IsNullOrEmpty())
  288. {
  289. if (strMD5List.GetLength() > m_BlockId*MAX_MD5LIST_LEN)
  290. {
  291. req.bEnd = false;
  292. strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, MAX_MD5LIST_LEN);
  293. }
  294. else
  295. {
  296. req.bEnd = true;
  297. strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, strMD5List.GetLength()-(m_BlockId-1)*MAX_MD5LIST_LEN);
  298. }
  299. //SM3hash字符串拷贝
  300. if(((CUpgradeMgrEntity*)m_pEntity)->m_IsSM3listSucc){
  301. CSimpleStringA strMD5ListHash = ((CUpgradeMgrEntity*)m_pEntity)->m_strSM3Hash;
  302. strncpy(req.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  303. }else{
  304. Dbg("get md5list hash fail");
  305. }
  306. //CSimpleStringA strMD5ListHash = "";
  307. //((CUpgradeMgrEntity*)m_pEntity)->MD5Data(strMD5List, strMD5ListHash);
  308. //if (strMD5ListHash.IsNullOrEmpty())
  309. //{
  310. // Dbg("get md5list hash fail");
  311. //}
  312. //else
  313. //{
  314. // strncpy(req.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  315. //}
  316. package->AddStruct("MD5REQ", false, false, (BYTE*)&req, sizeof(req));
  317. }
  318. else
  319. {
  320. Dbg("get MD5 list fail");
  321. }
  322. Dbg("send MD5 list package");
  323. SendPackage(package);
  324. return Error_Succeed;
  325. }
  326. //ErrorCodeEnum CUpgradeMgrConn::SendMD5ListReq(CSimpleStringA strTerminalNo,CSimpleStringA strBlockId)//test
  327. //{
  328. // m_BlockId = atoi(strBlockId);
  329. // Dbg("send MD5 list m_BlockId=%d", m_BlockId);
  330. //
  331. // auto pFunc = m_pEntity->GetFunction();
  332. // CSystemStaticInfo info;
  333. // auto rc = pFunc->GetSystemStaticInfo(info);
  334. // if (rc != Error_Succeed)
  335. // {
  336. // LogError(Severity_Middle, rc, 0, "get system static info error");
  337. // return rc;
  338. // }
  339. //
  340. // CSmartPointer<IPackage> package = CreateNewPackage("MD5List");
  341. //
  342. // MD5List_Req req;
  343. // memset(&req, 0, sizeof(req));
  344. // strncpy(req.TerminalNo, strTerminalNo, sizeof(req.TerminalNo)-1);
  345. //
  346. // // 安装版本,其中包含软件框架版本 binary 8
  347. // WORD nTmp = info.InstallVersion.GetMajor();
  348. // req.InstallVersion[0] = (nTmp >> 8) & 0xFF;
  349. // req.InstallVersion[1] = nTmp & 0xFF;
  350. // nTmp = info.InstallVersion.GetMinor();
  351. // req.InstallVersion[2] = (nTmp >> 8) & 0xFF;
  352. // req.InstallVersion[3] = nTmp & 0xFF;
  353. // nTmp = info.InstallVersion.GetRevision();
  354. // req.InstallVersion[4] = (nTmp >> 8) & 0xFF;
  355. // req.InstallVersion[5] = nTmp & 0xFF;
  356. // nTmp = info.InstallVersion.GetBuild();
  357. // req.InstallVersion[6] = (nTmp >> 8) & 0xFF;
  358. // req.InstallVersion[7] = nTmp & 0xFF;
  359. //
  360. // req.BlockId = m_BlockId;
  361. //
  362. // CSimpleStringA strMD5List = "";
  363. // ((CUpgradeMgrEntity*)m_pEntity)->GetMD5List(strMD5List);
  364. // Dbg("MD5 list len=%d", strMD5List.GetLength());
  365. //
  366. // if (!strMD5List.IsNullOrEmpty())
  367. // {
  368. // if (strMD5List.GetLength() > m_BlockId*MAX_MD5LIST_LEN)
  369. // {
  370. // req.bEnd = false;
  371. // strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, MAX_MD5LIST_LEN);
  372. // }
  373. // else
  374. // {
  375. // req.bEnd = true;
  376. // strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, strMD5List.GetLength()-(m_BlockId-1)*MAX_MD5LIST_LEN);
  377. // }
  378. //
  379. // CSimpleStringA strMD5ListHash = "";
  380. // ((CUpgradeMgrEntity*)m_pEntity)->MD5Data(strMD5List, strMD5ListHash);
  381. // if (strMD5ListHash.IsNullOrEmpty())
  382. // {
  383. // Dbg("get md5list hash fail");
  384. // }
  385. // else
  386. // {
  387. // strncpy(req.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  388. // }
  389. //
  390. // package->AddStruct("MD5REQ", false, false, (BYTE*)&req, sizeof(req));
  391. // }
  392. // else
  393. // {
  394. // Dbg("get MD5 list fail");
  395. // }
  396. //
  397. // Dbg("send MD5 list package");
  398. // //SendPackage(package);
  399. //
  400. // if (SendPackage(package) == "")
  401. // {
  402. // Dbg("SendPackage failed, send MD5REQ failed");
  403. // return Error_Unexpect;
  404. // }
  405. // else
  406. // {
  407. // Dbg("send MD5REQ success");
  408. // }
  409. //
  410. // package = ReceivePackage(5);
  411. // if (package == NULL)
  412. // {
  413. // Dbg("ReceivePackage failed, don't revceive MD5REQ ans");
  414. // return Error_Unexpect;
  415. // }
  416. //
  417. // int nRetLen = package->GetStructLen("MD5RET");
  418. // if (nRetLen > 0)
  419. // {
  420. // BYTE *pBuf = new BYTE[nRetLen];
  421. // memset(pBuf, 0, nRetLen);
  422. //
  423. // int nArrayNum(0);
  424. // int nBufLen = nRetLen;
  425. // bool bRet = package->GetStructData("MD5RET", pBuf, &nBufLen, &nArrayNum);
  426. // assert(bRet && nArrayNum>0);
  427. // MD5List_Ret md5Ret;
  428. // memset(&md5Ret,0,sizeof(MD5List_Ret));
  429. // memcpy(&md5Ret, pBuf, sizeof(MD5List_Ret));
  430. //
  431. // if (md5Ret.BlockId == 0)
  432. // {
  433. // Dbg("recieve blockid %d, start to poll new pack!", md5Ret.BlockId);
  434. // /*auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_StartPoll, pBuf, nArrayNum);
  435. // m_pFSM->PostEventFIFO(pEvent);*/
  436. //
  437. // m_BlockId = 0;
  438. // }
  439. // else if (md5Ret.BlockId == m_BlockId)
  440. // {
  441. // Dbg("recieve right blockid %d, start to send next block %d!", md5Ret.BlockId, md5Ret.BlockId+1);
  442. // CSimpleStringA nextBlockId = CSimpleStringA::Format("%d",md5Ret.BlockId+1);
  443. // SendMD5ListReq(strTerminalNo, nextBlockId);
  444. // }
  445. // else
  446. // {
  447. // Dbg("recieve wrong blockid %d, resend md5list!",md5Ret.BlockId);
  448. // SendMD5ListReq(strTerminalNo, "1");
  449. // }
  450. // delete pBuf;
  451. // }
  452. // else
  453. // {
  454. // Dbg("don't recieve MD5RET packet!");
  455. // //OnDisconnect();
  456. // }
  457. //
  458. // return Error_Succeed;
  459. //}
  460. ErrorCodeEnum CUpgradeMgrConn::HandleReportRet(const CSmartPointer<IPackage> &pRecvPkg)
  461. {
  462. DWORD dwSysCode, dwUserCode;
  463. string strErrMsg;
  464. ErrorCodeEnum rc;
  465. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  466. {
  467. rc = (ErrorCodeEnum)dwSysCode;
  468. CSimpleStringA strMsg = CSimpleStringA::Format("report upgrade state error: %s", strErrMsg.c_str());
  469. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strMsg);
  470. }
  471. return Error_Succeed;
  472. }
  473. ErrorCodeEnum CUpgradeMgrConn::HandleConfirmUpgradeRet(const CSmartPointer<IPackage> &pRecvPkg)
  474. {
  475. DWORD dwSysCode, dwUserCode;
  476. string strErrMsg;
  477. ErrorCodeEnum rc;
  478. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  479. {
  480. rc = (ErrorCodeEnum)dwSysCode;
  481. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  482. return rc;
  483. }
  484. int nRetLen = pRecvPkg->GetStructLen("CONF_RET");
  485. if (nRetLen >0)
  486. {
  487. BYTE *pBuf = new BYTE[nRetLen];
  488. memset(pBuf, 0, nRetLen);
  489. int nArrayNum(0);
  490. int nBufLen = nRetLen;
  491. bool bRet = pRecvPkg->GetStructData("CONF_RET", pBuf, &nBufLen, &nArrayNum);
  492. assert(bRet && nArrayNum>0);
  493. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndConfirm, pBuf, nArrayNum);
  494. m_pFSM->PostEventFIFO(pEvent);
  495. return Error_Succeed;
  496. }
  497. else
  498. {
  499. LogError(Severity_Low, Error_Unexpect, 0, "get struct [CONF_RET] from confirm return package fail");
  500. return Error_Unexpect;
  501. }
  502. }
  503. ErrorCodeEnum CUpgradeMgrConn::HandleQueryExecInfoRet(const CSmartPointer<IPackage> &pRecvPkg)
  504. {
  505. DWORD dwSysCode, dwUserCode;
  506. string strErrMsg;
  507. ErrorCodeEnum rc;
  508. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  509. {
  510. rc = (ErrorCodeEnum)dwSysCode;
  511. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  512. return rc;
  513. }
  514. int nRetLen = pRecvPkg->GetStructLen("EXEC_RET");
  515. if (nRetLen >0)
  516. {
  517. BYTE *pBuf = new BYTE[nRetLen];
  518. memset(pBuf, 0, nRetLen);
  519. int nArrayNum(0);
  520. int nBufLen = nRetLen;
  521. bool bRet = pRecvPkg->GetStructData("EXEC_RET", pBuf, &nBufLen, &nArrayNum);
  522. assert(bRet && nArrayNum>0);
  523. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndQueryExec, pBuf, nArrayNum);
  524. m_pFSM->PostEventFIFO(pEvent);
  525. return Error_Succeed;
  526. }
  527. else
  528. {
  529. LogError(Severity_Low, Error_Unexpect, 0, "get struct [EXEC_RET] fail");
  530. return Error_Unexpect;
  531. }
  532. }
  533. ErrorCodeEnum CUpgradeMgrConn::HandlePollUpgradeRet(const CSmartPointer<IPackage> &pRecvPkg)
  534. {
  535. DWORD dwSysCode, dwUserCode;
  536. string strErrMsg;
  537. ErrorCodeEnum rc = Error_Succeed;
  538. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  539. {
  540. rc = (ErrorCodeEnum)dwSysCode;
  541. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  542. return rc;
  543. }
  544. int nRetLen = pRecvPkg->GetStructLen("POLLRET1");
  545. if (nRetLen >0)
  546. {
  547. BYTE *pBuf = new BYTE[nRetLen];
  548. memset(pBuf, 0, nRetLen);
  549. int nArrayNum(0);
  550. int nBufLen = nRetLen;
  551. bool bRet = pRecvPkg->GetStructData("POLLRET1", pBuf, &nBufLen, &nArrayNum);
  552. assert(bRet && nArrayNum>0);
  553. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, pBuf, nArrayNum);
  554. m_pFSM->PostEventFIFO(pEvent);
  555. }
  556. else if ((nRetLen =pRecvPkg->GetStructLen("POLLRET3")) > 0)
  557. {
  558. BYTE *pBuf = new BYTE[nRetLen];
  559. memset(pBuf, 0, nRetLen);
  560. int nArrayNum(0);
  561. int nBufLen = nRetLen;
  562. bool bRet = pRecvPkg->GetStructData("POLLRET3", pBuf, &nBufLen, &nArrayNum);
  563. assert(bRet && nArrayNum>0);
  564. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, pBuf, nArrayNum);
  565. m_pFSM->PostEventFIFO(pEvent);
  566. }
  567. else if ((nRetLen =pRecvPkg->GetStructLen("POLLRET5")) > 0)
  568. {
  569. BYTE *pBuf = new BYTE[nRetLen];
  570. memset(pBuf, 0, nRetLen);
  571. int nArrayNum(0);
  572. int nBufLen = nRetLen;
  573. bool bRet = pRecvPkg->GetStructData("POLLRET5", pBuf, &nBufLen, &nArrayNum);
  574. assert(bRet && nArrayNum>0);
  575. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, pBuf, nArrayNum);
  576. m_pFSM->PostEventFIFO(pEvent);
  577. }
  578. else
  579. {
  580. m_pFSM->PostEventFIFO(new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, 0, 0));
  581. }
  582. nRetLen = pRecvPkg->GetStructLen("POLLRET2");
  583. if (nRetLen >0)
  584. {
  585. LogEvent(Severity_Low, 0, "receive cancell upgrade instruct");
  586. BYTE *pBuf = new BYTE[nRetLen];
  587. memset(pBuf, 0, nRetLen);
  588. int nArrayNum(0);
  589. int nBufLen = nRetLen;
  590. bool bRet = pRecvPkg->GetStructData("POLLRET2", pBuf, &nBufLen, &nArrayNum);
  591. assert(bRet && nArrayNum>0);
  592. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_CancelUpgrade, pBuf, nArrayNum);
  593. m_pFSM->PostEventFIFO(pEvent);
  594. }
  595. return rc;
  596. }
  597. ErrorCodeEnum CUpgradeMgrConn::HandleMD5ListRet(const CSmartPointer<IPackage> &pRecvPkg)
  598. {
  599. DWORD dwSysCode, dwUserCode;
  600. string strErrMsg;
  601. ErrorCodeEnum rc = Error_Succeed;
  602. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  603. {
  604. rc = (ErrorCodeEnum)dwSysCode;
  605. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  606. return rc;
  607. }
  608. int nRetLen = pRecvPkg->GetStructLen("MD5RET");
  609. if (nRetLen >0)
  610. {
  611. BYTE *pBuf = new BYTE[nRetLen];
  612. memset(pBuf, 0, nRetLen);
  613. int nArrayNum(0);
  614. int nBufLen = nRetLen;
  615. bool bRet = pRecvPkg->GetStructData("MD5RET", pBuf, &nBufLen, &nArrayNum);
  616. assert(bRet && nArrayNum>0);
  617. MD5List_Ret md5Ret;
  618. memset(&md5Ret,0,sizeof(MD5List_Ret));
  619. memcpy(&md5Ret, pBuf, sizeof(MD5List_Ret));
  620. if (md5Ret.BlockId == 0)
  621. {
  622. Dbg("recieve blockid %d, send md5list succ", md5Ret.BlockId);
  623. //auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_StartPoll, pBuf, nArrayNum);
  624. //m_pFSM->PostEventFIFO(pEvent);
  625. m_BlockId = 0;
  626. }
  627. else if (md5Ret.BlockId == m_BlockId)
  628. {
  629. Dbg("recieve right blockid %d, start to send next block %d!", md5Ret.BlockId, md5Ret.BlockId+1);
  630. CSimpleStringA nextBlockId = CSimpleStringA::Format("%d",md5Ret.BlockId+1);
  631. SendMD5ListReq(nextBlockId);
  632. }
  633. else
  634. {
  635. Dbg("recieve wrong blockid %d, resend md5list!",md5Ret.BlockId);
  636. SendMD5ListReq("1");
  637. }
  638. //delete pBuf;
  639. }
  640. return rc;
  641. }
  642. ErrorCodeEnum CUpgradeMgrConn::ReportUpgradeResult(const char* pPackName, CVersion &installVersion, char installState, DWORD stateTime, DWORD dwErrCode, const char *pComment)
  643. {
  644. CSmartPointer<IPackage> package = CreateNewPackage("REPORT");
  645. Report3_Req req = {};
  646. auto pFunc = m_pEntity->GetFunction();
  647. CSystemStaticInfo info;
  648. auto rc = pFunc->GetSystemStaticInfo(info);
  649. if (rc != Error_Succeed)
  650. {
  651. LogError(Severity_Middle, rc, 0, "get system static info error");
  652. return rc;
  653. }
  654. strncpy(req.TerminalNo, (const char*)info.strTerminalID, sizeof(req.TerminalNo)-1);
  655. strncpy(req.UpgradePack, pPackName, sizeof(req.UpgradePack)-1);
  656. __int64 ver64 = installVersion.GetVersion64();
  657. for(int i=0; i<8; i++)
  658. req.InstallVersion[7-i] = ((BYTE*)&ver64)[i];
  659. req.InstallState = installState;
  660. req.FailCode = dwErrCode;
  661. req.StateTime = stateTime;
  662. if (pComment != NULL)
  663. strncpy(req.Comment, pComment, sizeof(req.Comment) - 1);
  664. package->AddStruct("REP3_REQ", false, false, (BYTE*)&req, sizeof(req));
  665. //Dbg("send report package");
  666. SendPackage(package);
  667. return Error_Succeed;
  668. }
  669. ErrorCodeEnum CUpgradeMgrConn::ReportSysCustomVer(const char* pPackName, const char* pSysCustomVer, const char* pFWID, const char* pSysPatchName)
  670. {
  671. CSmartPointer<IPackage> package = CreateNewPackage("CUSVER");
  672. ReportSysCustomVer_Req3 req = {};
  673. auto pFunc = m_pEntity->GetFunction();
  674. CSystemStaticInfo info;
  675. auto rc = pFunc->GetSystemStaticInfo(info);
  676. if (rc != Error_Succeed)
  677. {
  678. LogError(Severity_Middle, rc, 0, "get system static info fail");
  679. return rc;
  680. }
  681. CSimpleStringA strSysCustomVer = pSysCustomVer;
  682. CSimpleStringA strFWID = pFWID;
  683. CSimpleStringA strSysPatchName = pSysPatchName;
  684. strncpy(req.TerminalNo, (const char*)info.strTerminalID, sizeof(req.TerminalNo) - 1);
  685. strncpy(req.SysPackName, pPackName, sizeof(req.SysPackName) - 1);
  686. if (!strSysCustomVer.IsNullOrEmpty())
  687. {
  688. strncpy(req.SysCustomVer, pSysCustomVer, sizeof(req.SysCustomVer) - 1);
  689. }
  690. if (!strFWID.IsNullOrEmpty())
  691. {
  692. strncpy(req.FWID, pFWID, sizeof(req.FWID) - 1);
  693. }
  694. if (!strSysPatchName.IsNullOrEmpty())
  695. {
  696. strncpy(req.SysPatchName, pSysPatchName, sizeof(req.SysPatchName) - 1);
  697. }
  698. package->AddStruct("CUSVER_R3", false, false, (BYTE*)&req, sizeof(req));
  699. SendPackage(package);
  700. Dbg("ReportSysCustomVer()");
  701. return Error_Succeed;
  702. }
  703. ErrorCodeEnum CUpgradeMgrConn::HandleReportSysCustomVerRet(const CSmartPointer<IPackage> &pRecvPkg)
  704. {
  705. DWORD dwSysCode, dwUserCode;
  706. string strErrMsg;
  707. ErrorCodeEnum rc;
  708. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  709. {
  710. rc = (ErrorCodeEnum)dwSysCode;
  711. CSimpleStringA strMsg = CSimpleStringA::Format("report system custom version error: %s", strErrMsg.c_str());
  712. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strMsg);
  713. }
  714. return Error_Succeed;
  715. }
  716. }