VtmLoaderFSM.cpp 111 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035
  1. #include "stdafx.h"
  2. #include <algorithm>
  3. #include <winpr/file.h>
  4. #include "fileutil.h"
  5. #include "VtmLoaderFSM.h"
  6. #include "VtmLoader_UserCode.h"
  7. #include "EventCode.h"
  8. #if defined(RVC_OS_WIN)
  9. #include <io.h>
  10. #else
  11. #include <unistd.h>
  12. #include <fcntl.h>
  13. #include <errno.h>
  14. #include "RestfulFunc.h"
  15. #endif //RVC_OS_WIN
  16. #include "../mod_healthmanager/HealthManager_client_g.h"
  17. #include "../mod_pinpad/PinPad_client_g.h"
  18. #include "../mod_CardIssuerStand/CardIssuerStand_client_g.h"
  19. #include "../mod_cardissuerstore/CardIssuerStore_client_g.h"
  20. #include "../mod_IDCertificate/IDCertificate_client_g.h"
  21. #include "../mod_HSPScanner/HSPScanner_client_g.h"
  22. #include "../mod_ContactlessCard/ContactlessCard_client_g.h"
  23. #include "../mod_FingerPrint/FingerPrint_client_g.h"
  24. #include "../mod_gpio/Gpio_client_g.h"
  25. #include "SpDefine.h"
  26. using namespace HealthManager;
  27. using namespace PinPad;
  28. using namespace CardIssuerStand;
  29. using namespace CardIssuerStore;
  30. using namespace IDCertificate;
  31. using namespace HSPScanner;
  32. using namespace ContactlessCard;
  33. using namespace FingerPrint;
  34. using namespace Gpio;
  35. using namespace SP::Module::Net;
  36. #define ALLOW_MULTI_NETWORKD_CARDS
  37. const int MAX_AYSNC_TIMEOUT = 60000;
  38. const int MAX_IGNORE_TIMEOUT = 100;
  39. enum EntityOP
  40. {
  41. OP_STOP_ENTITY,
  42. OP_START_ENTITY,
  43. OP_PAUSE_ENTITY,
  44. OP_TERMINATE_ENTITY,
  45. OP_CONTINUE_ENTITY,
  46. };
  47. struct callback_entry : public IReleasable
  48. {
  49. virtual ~callback_entry() {}
  50. CSimpleStringA EntityName;
  51. union {
  52. void* pRawData;
  53. int state;
  54. };
  55. int op;
  56. ErrorCodeEnum ErrorResult;
  57. };
  58. DWORD tokenUpdate(void* param)
  59. {
  60. CVtmLoaderFSM* t_entity = (CVtmLoaderFSM*)param;
  61. DWORD lastUpdateTime = 0; // 获取当前时间(以毫秒为单位)
  62. while (true)
  63. {
  64. DWORD currentTime = SP::Module::Comm::RVCGetTickCount(); // 获取当前时间
  65. DWORD elapsedTime = currentTime - lastUpdateTime; // 计算与上次更新的时间间隔(毫秒)
  66. if (elapsedTime >= (t_entity->m_refreshWaitSec * 1000))
  67. {
  68. // 如果距离上次更新时间已经超过了指定的刷新间隔
  69. if (t_entity->refreshToken())
  70. {
  71. // 更新成功,更新上次更新时间
  72. lastUpdateTime = currentTime;
  73. }
  74. else
  75. {
  76. // 更新失败,可以处理一些错误逻辑
  77. }
  78. }
  79. // 等待一段时间后再次检查
  80. Sleep(20000); // 20秒
  81. }
  82. return 0;
  83. }
  84. DWORD errMsgListUpdate(void* param)
  85. {
  86. CVtmLoaderFSM* t_entity = (CVtmLoaderFSM*)param;
  87. static bool msgErrThreadExist = false;
  88. if (msgErrThreadExist)
  89. return true;
  90. else
  91. {
  92. msgErrThreadExist = true;
  93. }
  94. /*
  95. CSimpleString code, des;
  96. t_entity->GetEntityBase()->GetFunction()->GetVTMErrMsg(VtmLoader_DETECT_VERSION_ERR, code, des);
  97. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("VtmLoader_DETECT_VERSION_ERR, %s, %s", code.GetData(), des.GetData());
  98. */
  99. //update err list after setting centersetting urls
  100. //try updating every 20s until success
  101. int times = 0;
  102. ErrorCodeEnum rc = Error_Succeed;
  103. while (times < 5 && Error_Succeed != (rc = t_entity->GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateVTMERRMSG()))
  104. {
  105. LogWarn(SeverityLevelEnum::Severity_Low, Error_Unexpect, LOG_WARN_VtmLoader_GetVTMERRMSG_Failed, "Get errMsgListUpdate config failed.");
  106. Sleep(20000);
  107. times++;
  108. }
  109. if(rc == Error_Succeed)
  110. LogEvent(Severity_High, Event_VtmLoader_GetVTMERRMSG_Suc, "Get errMsgListUpdate config succeed.");
  111. /*
  112. t_entity->GetEntityBase()->GetFunction()->GetVTMErrMsg(VtmLoader_DETECT_VERSION_ERR, code, des);
  113. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("VtmLoader_DETECT_VERSION_ERR, %s, %s", code.GetData(), des.GetData());
  114. t_entity->GetEntityBase()->GetFunction()->GetVTMErrMsg(123456, code, des);
  115. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("123456, %s, %s", code.GetData(), des.GetData());
  116. t_entity->GetEntityBase()->GetFunction()->GetVTMErrMsg(VtmLoader_FailToConnectEntity, code, des);
  117. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("VtmLoader_FailToConnectEntity, %s, %s", code.GetData(), des.GetData());
  118. t_entity->GetEntityBase()->GetFunction()->GetVTMErrMsg(WARN_SendEndpoint_URL_ERR, code, des);
  119. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("WARN_SendEndpoint_URL_ERR, %s, %s", code.GetData(), des.GetData());
  120. t_entity->GetEntityBase()->GetFunction()->GetVTMErrMsg(VtmLoader_GetConfig_UpdateCfg_Failed, code, des);
  121. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("VtmLoader_GetConfig_UpdateCfg_Failed, %s, %s", code.GetData(), des.GetData());
  122. t_entity->GetEntityBase()->GetFunction()->GetVTMErrMsg(0x50100215, code, des);
  123. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("0x50100215, %s, %s", code.GetData(), des.GetData());
  124. */
  125. return 0;
  126. }
  127. DWORD checkUrlActive(LPVOID param)
  128. {
  129. CVtmLoaderFSM* entityInfo = (CVtmLoaderFSM*)param;
  130. CSmartPointer<IConfigInfo> pConfig;
  131. CSimpleString t_endpoint, t_materialUrl;
  132. CSimpleString errMsg;
  133. Sleep(60 * 1000);
  134. long srcClo = clock();
  135. entityInfo->GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
  136. do {
  137. if (Error_Succeed != pConfig->ReadConfigValue("Common", "SendEndpoint", t_endpoint))
  138. {
  139. errMsg = "checkUrlActive read Common::SendEndpoint err";
  140. break;
  141. }
  142. if (t_endpoint.GetLength() == 0)
  143. {
  144. errMsg = "checkUrlActive endpoint len=0 err";
  145. break;
  146. }
  147. //if (!checkHttpActive(t_endpoint.GetData()))
  148. // errMsg.Append(CSimpleString::Format("checkHttpActive endpoint err:%s !", t_endpoint.GetData()));
  149. //else if((clock() - srcClo) > 3000)
  150. // errMsg.Append(CSimpleString::Format("checkHttpActive endpoint too long:%d !", clock() - srcClo));
  151. srcClo = clock();
  152. } while (false);
  153. if (errMsg.GetLength() > 0)
  154. LogWarn(SeverityLevelEnum::Severity_Middle, Error_Unexpect, WARN_SendEndpoint_URL_ERR, errMsg.GetData());
  155. //do get upload log Info for a while
  156. while (true)
  157. {
  158. if (entityInfo->m_uploadLogInfo_waitSec <= 0)
  159. break;
  160. unsigned long t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc;
  161. unsigned long t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err;
  162. unsigned long t_discard_full, t_discard_RTI1002, curLogNum;
  163. entityInfo->GetEntityBase()->GetFunction()->GetPrivilegeFunction()->GetSendLogInfo(&t_upload_TerminalSys_Suc, &t_upload_TerminalUser_Suc,
  164. &t_upload_BussinessSys_Suc, &t_upload_BussinessUser_Suc, &t_upload_beidou_Suc,
  165. &t_upload_TerminalSys_Err, &t_upload_TerminalUser_Err, &t_upload_BussinessSys_Err, &t_upload_BussinessUser_Err, &t_upload_beidou_Err,
  166. &t_discard_full, &t_discard_RTI1002, &curLogNum);
  167. LogWarn(SeverityLevelEnum::Severity_Low, Error_Trace, WARN_SendEndpoint_LOG_INFO,
  168. CSimpleString::Format("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
  169. , t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
  170. t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err
  171. , t_discard_full, t_discard_RTI1002, curLogNum).GetData());
  172. Sleep(entityInfo->m_uploadLogInfo_waitSec * 1000);
  173. }
  174. return 0;
  175. }
  176. DWORD AlarmVersionErr(LPVOID param)
  177. {
  178. CVtmLoaderFSM* cur = (CVtmLoaderFSM*)param;
  179. Sleep(5000);//wait mod_alarm start
  180. LogWarn(Severity_Middle, Error_Bug, VtmLoader_DETECT_VERSION_ERR, cur->m_verShowMsg.GetData());
  181. return 0;
  182. }
  183. bool CVtmLoaderFSM::refreshToken()
  184. {
  185. CSimpleString oldToken, newToken;
  186. ErrorCodeEnum eErr = Error_Succeed;
  187. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateToken(oldToken, newToken)))
  188. {
  189. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F02")("Get center setting, TryUpdateToken failed:0x%x", eErr);
  190. LogWarn(Severity_High, Error_Unexpect, VtmLoader_GetConfig_UpdateToken_Failed, CSimpleStringA::Format("拉取配置失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
  191. return false;
  192. }
  193. return true;
  194. }
  195. CVtmLoaderFSM::CVtmLoaderFSM()
  196. {
  197. m_refreshWaitSec = 1200;
  198. m_uploadLogInfo_waitSec = 3600;
  199. m_defaultSystemId = "LR04.02_Terminal";
  200. m_iCanIgnoreAddrDetect = 0;
  201. m_ullMaxAddrDetectTime = 10*60*1000;//10 minutes
  202. m_iDetectInterval = 5000;
  203. m_terminalNoFromWeb = m_verShowMsg = "";
  204. m_iNoCheckMachineModel = 0;
  205. m_bSIPPhoneStartFail = false;
  206. m_eDepCopyStage = DepDirInitCopy_NoNeed;
  207. }
  208. CVtmLoaderFSM::~CVtmLoaderFSM()
  209. {
  210. }
  211. ErrorCodeEnum CVtmLoaderFSM::OnInit()
  212. {
  213. AddStateHooker(this);
  214. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  215. return Error_Succeed;
  216. }
  217. ErrorCodeEnum CVtmLoaderFSM::OnExit()
  218. {
  219. RemoveStateHooker(this);
  220. return Error_Succeed;
  221. }
  222. void CVtmLoaderFSM::OnStateTrans(int iSrcState, int iDstState)
  223. {
  224. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("state change from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  225. }
  226. void CVtmLoaderFSM::s0_on_entry()
  227. {
  228. CSimpleStringA csTmpTS("");
  229. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTmpTS);
  230. if (eErr == Error_Succeed && !csTmpTS.IsNullOrEmpty() && csTmpTS.Compare("X") != 0)
  231. {
  232. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)(" eErr:%d", eErr);
  233. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("TerminalStage:%s, The entity maybe lost, and have beed restart by healthmanager.To do GetConfig only", csTmpTS.GetData());
  234. GetConfig();
  235. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("redo GetConfig finished.");
  236. }
  237. else
  238. {
  239. if (CheckIfNeedCopyDepFiles())
  240. {
  241. m_eDepCopyStage = DepDirInitCopy_Copying;
  242. CopyDepFilesToNewDepPathTask* pCopyTask = new CopyDepFilesToNewDepPathTask(this);
  243. GetEntityBase()->GetFunction()->PostThreadPoolTask(pCopyTask);
  244. }
  245. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始网卡、网络连通性检查");
  246. NetWorkCheckAndGetSettingTask* task = new NetWorkCheckAndGetSettingTask(this);
  247. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  248. }
  249. }
  250. void CVtmLoaderFSM::s0_on_exit()
  251. {
  252. }
  253. unsigned int CVtmLoaderFSM::s0_on_event(FSMEvent* pEvt)
  254. {
  255. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event,pEvt:%d,pEvt->param1:%d", pEvt->iEvt, pEvt->param1);
  256. switch (pEvt->iEvt)
  257. {
  258. case USER_EVT_NetworkCheck_Passed:
  259. pEvt->SetHandled();
  260. return pEvt->param1;
  261. case USER_EVT_CHECK_DEVICE_ENTITY:
  262. pEvt->SetHandled();
  263. {
  264. CheckDeviceEntityEvent* cdee = dynamic_cast<CheckDeviceEntityEvent*>(pEvt);
  265. CheckDeviceEntityTask* pTask = new CheckDeviceEntityTask(this);
  266. pTask->ctx = cdee->ctx;
  267. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  268. }
  269. break;
  270. case USER_EVT_SAVE_TERMINALNO:
  271. pEvt->SetHandled();
  272. {
  273. SaveTerminalNoEvent* stne = dynamic_cast<SaveTerminalNoEvent*>(pEvt);
  274. SaveTerminalNoTask* pTask = new SaveTerminalNoTask(this);
  275. pTask->ctx = stne->ctx;
  276. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  277. }
  278. break;
  279. case USER_EVT_DEALWITH_OLD_EVENT:
  280. pEvt->SetHandled();
  281. {
  282. DealWithOldEvent_Event *evt = dynamic_cast<DealWithOldEvent_Event*>(pEvt);
  283. DealWithOldEvent_Task* pTask = new DealWithOldEvent_Task(this);
  284. pTask->ctx = evt->ctx;
  285. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  286. }
  287. break;
  288. default:
  289. break;
  290. }
  291. return 0;
  292. }
  293. //CoreBoot
  294. void CVtmLoaderFSM::s1_on_entry()
  295. {
  296. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1_on_entry");
  297. ErrorCodeEnum eErrCode;
  298. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  299. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
  300. bool bAsync = false;
  301. m_eStage = LOADSTAGE_COREBOOT;
  302. int ret = 0;
  303. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  304. //start entity
  305. vector<CSimpleStringA>::iterator vIt;
  306. if (m_coreBootOpt.size() == 0)
  307. goto COREBOOT_FINISH;
  308. char startMsg[128];
  309. for (vIt = m_vCoreBoot.begin(); vIt != m_vCoreBoot.end(); ++vIt)
  310. {
  311. CSmartPointer<IAsynWaitSp> spWait;//oilyang 20160325 see the following comment
  312. it = m_coreBootOpt.find(*vIt);
  313. if (it == m_coreBootOpt.end())
  314. {
  315. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  316. continue;
  317. }
  318. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start,%s,%d", (LPCSTR)it->first, it->second.loadOpt);
  319. CEntityRunInfo entRunInfo;
  320. ErrorCodeEnum errCode = spEntityFunction->GetEntityRunInfo(it->first, entRunInfo);
  321. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  322. {
  323. it->second.eResult = LOADING_SUCCEED;
  324. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  325. if (ret == 0 || ret == 2)
  326. goto COREBOOT_FINISH;
  327. else
  328. continue;
  329. }
  330. ZeroMemory(startMsg, 128);
  331. //sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  332. //GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  333. switch (it->second.loadOpt)
  334. {
  335. case LOADOPT_IGNORE:
  336. {
  337. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  338. if (spWait != NULL)
  339. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);//oilyang 20160325 the null pointer
  340. it->second.eResult = LOADING_SUCCEED;
  341. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  342. if (ret == 0 || ret == 2)
  343. goto COREBOOT_FINISH;
  344. }
  345. break;
  346. case LOADOPT_ASYNC_VERIFY:
  347. errCode = AsyncStartEntity(it->first, NULL, NULL);
  348. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AsyncStartEntity:%d", errCode);
  349. bAsync = true;
  350. break;
  351. case LOADOPT_SYNC_VERIFY:
  352. {
  353. ULONGLONG dwEntityStart = SP::Module::Comm::RVCGetTickCount();
  354. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  355. if (spWait != NULL)
  356. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  357. ULONGLONG dwEntityEnd = SP::Module::Comm::RVCGetTickCount();
  358. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncStartEntity").setCostTime((dwEntityEnd - dwEntityStart) / 1000)("%d", errCode);
  359. if (errCode == Error_Succeed)
  360. it->second.eResult = LOADING_SUCCEED;
  361. else if (errCode == Error_TimeOut)
  362. it->second.eResult = LOADING_TIMEOUT;
  363. else
  364. it->second.eResult = LOADING_FAILED;
  365. if (errCode != Error_Succeed) {
  366. CSimpleStringA tmpAuthErrMsg("");
  367. if (GetEntityBase()->GetFunction()->GetSysVar("AuthErrMsg", tmpAuthErrMsg) == Error_Succeed && tmpAuthErrMsg.IsNullOrEmpty())
  368. GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", CSimpleStringA::Format("%s 启动失败,请尝试重启应用或重启系统恢复", it->first.GetData()).GetData());
  369. if (it->first.Compare("SIPPhone") == 0)
  370. m_bSIPPhoneStartFail = true;
  371. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("启动失败:%s", it->first.GetData());
  372. m_csErrEntity = m_csErrEntity + "|" + it->first;
  373. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  374. e->param1 = 2;//"SYNC START" enity started failed.
  375. PostEventFIFO(e);
  376. return;
  377. }
  378. else
  379. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  380. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 check ret %d", ret);
  381. if (ret == 0 || ret == 2)
  382. goto COREBOOT_FINISH;
  383. }
  384. break;
  385. default:
  386. break;
  387. }
  388. }
  389. COREBOOT_FINISH:
  390. if (!bAsync)
  391. {
  392. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  393. e->param1 = ret;
  394. PostEventFIFO(e);
  395. }
  396. else
  397. {
  398. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  399. if (ret == 0 || ret == 2)
  400. {
  401. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  402. e->param1 = ret;
  403. PostEventFIFO(e);
  404. }
  405. }
  406. return;
  407. }
  408. void CVtmLoaderFSM::s1_on_exit()
  409. {
  410. LOG_FUNCTION();
  411. }
  412. unsigned int CVtmLoaderFSM::s1_on_event(FSMEvent* pEvt)
  413. {
  414. LOG_FUNCTION();
  415. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 evt %d", pEvt->iEvt);
  416. switch (pEvt->iEvt)
  417. {
  418. case USER_EVT_COREBOOT_FINISHED:
  419. pEvt->SetHandled();
  420. return pEvt->param1;
  421. default:
  422. break;
  423. }
  424. return 0;
  425. }
  426. //SafeLoad
  427. void CVtmLoaderFSM::s2_on_entry()
  428. {
  429. LOG_FUNCTION();
  430. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "CoreBoot 阶段实体加载完成");
  431. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F14")("Stage Coreboot have done.");
  432. ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();//使用机器启动时间秒数
  433. DWORD elapseTimeTemp = dwElapse / 1000;
  434. CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Enter safeload state.\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), elapseTimeTemp);
  435. //LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
  436. if (!VerifyVer())
  437. return;
  438. bool bAsync = false;
  439. m_eStage = LOADSTAGE_SAFELOAD;
  440. int ret = 0;
  441. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  442. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  443. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  444. ErrorCodeEnum errCode;
  445. vector<CSimpleStringA>::iterator vIt;
  446. if (m_safeLoadOpt.size() == 0)
  447. goto SAFELOAD_FINISH;
  448. char startMsg[128];
  449. for (vIt = m_vSafeLoad.begin(); vIt != m_vSafeLoad.end(); ++vIt)
  450. {
  451. CSmartPointer<IAsynWaitSp> spWait;
  452. it = m_safeLoadOpt.find(*vIt);
  453. if (it == m_safeLoadOpt.end())
  454. {
  455. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  456. continue;
  457. }
  458. CEntityRunInfo entRunInfo;
  459. errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
  460. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  461. {
  462. it->second.eResult = LOADING_SUCCEED;
  463. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  464. if (ret == 0 || ret == 2)
  465. goto SAFELOAD_FINISH;
  466. else
  467. continue;
  468. }
  469. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
  470. switch (it->second.loadOpt)
  471. {
  472. case LOADOPT_IGNORE:
  473. {
  474. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  475. if (spWait != NULL)
  476. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  477. it->second.eResult = LOADING_SUCCEED;
  478. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  479. if (ret == 0 || ret == 2)
  480. goto SAFELOAD_FINISH;
  481. }
  482. break;
  483. case LOADOPT_ASYNC_VERIFY:
  484. AsyncStartEntity(it->first, NULL, NULL);
  485. bAsync = true;
  486. break;
  487. case LOADOPT_SYNC_VERIFY:
  488. {
  489. ZeroMemory(startMsg, 128);
  490. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  491. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  492. ULONGLONG dwEntityStart = SP::Module::Comm::RVCGetTickCount();
  493. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  494. if (spWait != NULL)
  495. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  496. ULONGLONG dwEntityEnd = SP::Module::Comm::RVCGetTickCount();
  497. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncStartEntity").setCostTime((dwEntityEnd - dwEntityStart) / 1000)("%d", errCode);
  498. if (it->first.Compare("SIPPhone") == 0)
  499. LogWarn(Severity_Low, Error_Succeed, VtmLoader_SIPPhoneEntityLoad_Cost, CSimpleStringA::Format("%d", (dwEntityEnd - dwEntityStart) / 1000));
  500. if (errCode == Error_Succeed) {
  501. it->second.eResult = LOADING_SUCCEED;
  502. }
  503. else if (errCode == Error_TimeOut)
  504. it->second.eResult = LOADING_TIMEOUT;
  505. else
  506. it->second.eResult = LOADING_FAILED;
  507. if (it->second.eResult != Error_Succeed)
  508. {
  509. CSimpleStringA tmpAuthErrMsg("");
  510. if (GetEntityBase()->GetFunction()->GetSysVar("AuthErrMsg", tmpAuthErrMsg) == Error_Succeed && tmpAuthErrMsg.IsNullOrEmpty())
  511. GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", CSimpleStringA::Format("%s 启动失败,请尝试重启应用或重启系统恢复", it->first.GetData()).GetData());
  512. if (it->first.Compare("SIPPhone") == 0)
  513. m_bSIPPhoneStartFail = true;
  514. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("启动失败:%s", it->first.GetData());
  515. m_csErrEntity = m_csErrEntity + "|" + it->first;
  516. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  517. e->param1 = 2;//"SYNC START" enity started failed.
  518. PostEventFIFO(e);
  519. return;
  520. }
  521. //if (errCode != Error_Succeed)
  522. // return;
  523. //else
  524. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  525. if (ret == 0 || ret == 2)
  526. goto SAFELOAD_FINISH;
  527. }
  528. break;
  529. default:
  530. break;
  531. }
  532. }
  533. SAFELOAD_FINISH:
  534. if (!bAsync)
  535. {
  536. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  537. e->param1 = ret;
  538. PostEventFIFO(e);
  539. }
  540. else
  541. {
  542. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  543. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 %d", ret);
  544. if (ret == 0 || ret == 2)
  545. {
  546. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  547. e->param1 = ret;
  548. PostEventFIFO(e);
  549. }
  550. }
  551. SAFELOAD_END:
  552. return;
  553. }
  554. void CVtmLoaderFSM::s2_on_exit()
  555. {
  556. LOG_FUNCTION();
  557. }
  558. unsigned int CVtmLoaderFSM::s2_on_event(FSMEvent* pEvt)
  559. {
  560. LOG_FUNCTION();
  561. int ret = 0;
  562. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 event %d,%d", pEvt->iEvt, pEvt->param1);
  563. switch (pEvt->iEvt)
  564. {
  565. case USER_EVT_SAFELOAD_FINISHED:
  566. {
  567. pEvt->SetHandled();
  568. //oiltmp
  569. //according to the system varible TerminalState to do sth.
  570. //Configed
  571. //Breakdown
  572. //Blocking
  573. //Authentication
  574. {
  575. if (pEvt->param1 == 0)
  576. {
  577. //initializer if configured
  578. CSimpleStringA csTermStage("");
  579. ErrorCodeEnum eErrCode;
  580. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
  581. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("after safeload to get termstage %s", (LPCTSTR)csTermStage);
  582. if (csTermStage == "B" || csTermStage == "N")
  583. return 1;
  584. }
  585. else if (pEvt->param1 == 2)
  586. ret = 2;
  587. }
  588. //Unsubscrible
  589. }
  590. break;
  591. case USER_EVT_SAFELOAD_EXMINE_FINISHED:
  592. if (pEvt->param1 == 0)
  593. ret = 0;
  594. //do something else oiltmp
  595. pEvt->SetHandled();
  596. break;
  597. default:
  598. break;
  599. }
  600. return ret;
  601. }
  602. //Operating
  603. void CVtmLoaderFSM::s3_on_entry()
  604. {
  605. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "SafeLoad 阶段实体加载完成");
  606. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F15")("Stage Safeload have done.");
  607. Sleep(m_sleepEnterOpMS);
  608. bool bAsync = false;
  609. m_eStage = LOADSTAGE_OPERATING;
  610. int ret = 0;
  611. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  612. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  613. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  614. //start entity
  615. ErrorCodeEnum errCode;
  616. vector<CSimpleStringA>::iterator vIt;
  617. if (m_operatingOpt.size() == 0)
  618. goto OPERATING_FINISH;
  619. char startMsg[128];
  620. for (vIt = m_vOperating.begin(); vIt != m_vOperating.end(); ++vIt)
  621. {
  622. CSmartPointer<IAsynWaitSp> spWait;
  623. it = m_operatingOpt.find(*vIt);
  624. if (it == m_operatingOpt.end())
  625. {
  626. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  627. continue;
  628. }
  629. CEntityRunInfo entRunInfo;
  630. errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
  631. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  632. {
  633. it->second.eResult = LOADING_SUCCEED;
  634. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  635. if (ret == 0 || ret == 2)
  636. goto OPERATING_FINISH;
  637. else
  638. continue;
  639. }
  640. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("op start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
  641. switch (it->second.loadOpt)
  642. {
  643. case LOADOPT_IGNORE:
  644. {
  645. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  646. if (spWait != NULL)
  647. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  648. it->second.eResult = LOADING_SUCCEED;
  649. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  650. if (ret == 0 || ret == 2)
  651. goto OPERATING_FINISH;
  652. }
  653. break;
  654. case LOADOPT_ASYNC_VERIFY:
  655. errCode = AsyncStartEntity(it->first, NULL, NULL);
  656. bAsync = true;
  657. break;
  658. case LOADOPT_SYNC_VERIFY:
  659. {
  660. ZeroMemory(startMsg, 128);
  661. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  662. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  663. ULONGLONG dwEntityStart = SP::Module::Comm::RVCGetTickCount();
  664. errCode = pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  665. if (errCode == Error_Succeed)
  666. {
  667. if (spWait != NULL)
  668. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  669. }
  670. else
  671. {
  672. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", (LPCSTR)it->first, errCode);
  673. break;
  674. }
  675. ULONGLONG dwEntityEnd = SP::Module::Comm::RVCGetTickCount();
  676. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncStartEntity").setCostTime((dwEntityEnd - dwEntityStart) / 1000)("%d", errCode);
  677. if (errCode == Error_Succeed)
  678. it->second.eResult = LOADING_SUCCEED;
  679. else if (errCode == Error_TimeOut)
  680. it->second.eResult = LOADING_TIMEOUT;
  681. else
  682. it->second.eResult = LOADING_FAILED;
  683. if (it->second.eResult != Error_Succeed)
  684. {
  685. if (it->first.Compare("SIPPhone") == 0)
  686. m_bSIPPhoneStartFail = true;
  687. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("启动失败:%s", it->first.GetData());
  688. m_csErrEntity = m_csErrEntity + "|" + it->first;
  689. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  690. e->param1 = 2;//"SYNC START" enity started failed.
  691. PostEventFIFO(e);
  692. return;
  693. }
  694. if (errCode != Error_Succeed)
  695. return;
  696. else
  697. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  698. if (ret == 0 || ret == 2)
  699. goto OPERATING_FINISH;
  700. }
  701. break;
  702. default:
  703. break;
  704. }
  705. }
  706. OPERATING_FINISH:
  707. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3 ret %d", ret);
  708. if (!bAsync)
  709. {
  710. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  711. e->param1 = ret;
  712. PostEventFIFO(e);
  713. }
  714. else
  715. {
  716. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  717. if (ret == 0 || ret == 2)
  718. {
  719. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  720. e->param1 = ret;
  721. PostEventFIFO(e);
  722. }
  723. }
  724. return;
  725. }
  726. void CVtmLoaderFSM::s3_on_exit()
  727. {
  728. LOG_FUNCTION();
  729. }
  730. unsigned int CVtmLoaderFSM::s3_on_event(FSMEvent* pEvt)
  731. {
  732. LOG_FUNCTION();
  733. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3(Operating) event %d,%d", pEvt->iEvt, pEvt->param1);
  734. int ret = 0;
  735. switch (pEvt->iEvt)
  736. {
  737. case USER_EVT_OPERATING_FINISHED:
  738. ret = pEvt->param1;
  739. pEvt->SetHandled();
  740. break;
  741. default:
  742. break;
  743. }
  744. return ret;
  745. }
  746. //Idle(Operating finished)
  747. void CVtmLoaderFSM::s4_on_entry()
  748. {
  749. LOG_FUNCTION();
  750. std::map<std::string, std::string> msgInfo;
  751. msgInfo["NetCardCheckCost"] = CSimpleStringA::Format("%d", m_ullNetCardCost).GetData();
  752. msgInfo["NetworkDetectCost"] = CSimpleStringA::Format("%d", m_ullNetDetectCost).GetData();
  753. msgInfo["GetConfigCost"] = CSimpleStringA::Format("%d", m_ullGetConfigCost).GetData();
  754. msgInfo["EntityLoadCost"] = CSimpleStringA::Format("%d", (SP::Module::Comm::RVCGetTickCount() - m_ullEntityLoadStart) / 1000).GetData();
  755. std::pair<bool, std::string> strResult;
  756. strResult = generateJsonStr(msgInfo);
  757. LogWarn(Severity_Low, Error_Succeed, VtmLoader_InfoAboutBootCost, strResult.second.c_str());
  758. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F16")("%s", strResult.second.c_str());
  759. //oiltmp wait for analyse progress, then change to app log format
  760. LogWarn(Severity_Low, Error_Succeed, VtmLoader_NetCard_Cost, msgInfo["NetCardCheckCost"].c_str());
  761. LogWarn(Severity_Low, Error_Succeed, VtmLoader_NetworkDetect_Cost, msgInfo["NetworkDetectCost"].c_str());
  762. LogWarn(Severity_Low, Error_Succeed, VtmLoader_GetConfig_Cost, msgInfo["GetConfigCost"].c_str());
  763. LogWarn(Severity_Low, Error_Succeed, VtmLoader_EntityLoad_Cost, msgInfo["EntityLoadCost"].c_str());
  764. NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this,Event_VtmLoader_EntityLoad_Finished);
  765. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  766. }
  767. void CVtmLoaderFSM::s4_on_exit()
  768. {
  769. LOG_FUNCTION();
  770. }
  771. unsigned int CVtmLoaderFSM::s4_on_event(FSMEvent* pEvt)
  772. {
  773. LOG_FUNCTION();
  774. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s4 event %d,%d", pEvt->iEvt, pEvt->param1);
  775. switch (pEvt->iEvt)
  776. {
  777. case USER_EVT_CHECK_DEVICE_ENTITY:
  778. pEvt->SetHandled();
  779. {
  780. CheckDeviceEntityEvent* cdee = dynamic_cast<CheckDeviceEntityEvent*>(pEvt);
  781. CheckDeviceEntityTask* pTask = new CheckDeviceEntityTask(this);
  782. pTask->ctx = cdee->ctx;
  783. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  784. }
  785. break;
  786. default:
  787. break;
  788. }
  789. return 0;
  790. }
  791. //Fault
  792. void CVtmLoaderFSM::s5_on_entry()
  793. {
  794. LOG_FUNCTION();
  795. if (m_bSIPPhoneStartFail)
  796. {
  797. NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this, Event_VtmLoader_SIPPhoneEntityLoad_Failed);
  798. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  799. }
  800. else
  801. {
  802. NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this, Event_VtmLoader_OtherSyncEntityLoad_Failed);
  803. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  804. }
  805. }
  806. void CVtmLoaderFSM::s5_on_exit()
  807. {
  808. LOG_FUNCTION();
  809. }
  810. unsigned int CVtmLoaderFSM::s5_on_event(FSMEvent* pEvt)
  811. {
  812. LOG_FUNCTION();
  813. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s5(Fault) event %d,%d", pEvt->iEvt, pEvt->param1);
  814. switch (pEvt->iEvt)
  815. {
  816. case USER_EVT_CHECK_DEVICE_ENTITY:
  817. pEvt->SetHandled();
  818. {
  819. CheckDeviceEntityEvent* cdee = dynamic_cast<CheckDeviceEntityEvent*>(pEvt);
  820. CheckDeviceEntityTask* pTask = new CheckDeviceEntityTask(this);
  821. pTask->ctx = cdee->ctx;
  822. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  823. }
  824. break;
  825. default:
  826. break;
  827. }
  828. return 0;
  829. }
  830. BOOL CVtmLoaderFSM::DetectNetworkLegality(CSimpleStringA& strInfo)
  831. {
  832. BOOL result(TRUE);
  833. strInfo.Clear();
  834. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Detect network legality...");
  835. BOOL fLocalLANConnected(FALSE);
  836. unsigned int curTimes = 1;
  837. const unsigned int maxTimes = 3;
  838. do {
  839. CAutoArray<NetworkAdapterItem> netList;
  840. if (SP::Module::Net::GetINETMacAddresses(netList) == Error_Succeed)
  841. {
  842. for (int i = 0; i < netList.GetCount(); i++) {
  843. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("interface(%d):%s", i, netList[i].description.c_str());
  844. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ip(%d):%s", i, netList[i].ip.c_str());
  845. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("mac(%d):%s", i, netList[i].mac.c_str());
  846. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("operStatus(%d):%d", i, netList[i].operStatus);
  847. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("type(%d):%d", i, netList[i].type);
  848. //if (netList[i].type == IF_TYPE_ETHERNET_CSMACD && netList[i].operStatus == IfOperStatusUp)
  849. if (netList[i].operStatus == 1)//oiltest
  850. {
  851. fLocalLANConnected = TRUE;
  852. break;
  853. }
  854. }
  855. }
  856. Sleep(500);
  857. curTimes++;
  858. } while (curTimes < maxTimes && !fLocalLANConnected);
  859. if (!fLocalLANConnected) {
  860. strInfo = "未检查到有网卡连接,请检查网络连接";
  861. result = FALSE;
  862. }
  863. return result;
  864. }
  865. int CVtmLoaderFSM::NetWorkCheckAndGetSetting()
  866. {
  867. //检查网卡状态
  868. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to check network status");
  869. CSimpleStringA strMsg(true), tmpTS("X");
  870. //GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", tmpTS);
  871. int netcheckCount = 1;
  872. ULLINT ullTmpStart = SP::Module::Comm::RVCGetTickCount();
  873. while (true)
  874. {
  875. if (!DetectNetworkLegality(strMsg)) {
  876. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F10").setResultCode("RTA1F00")("can't find valid network interface");
  877. LogWarn(Severity_High, Error_Unexpect, VtmLoader_UserCode_NetCard_UnAvaible, CSimpleStringA::Format("%s。%d 秒后自动重试(第%d次重试)。请检查网线是否插好、网络是否正常"
  878. , strMsg.GetData(), m_iDetectInterval / 1000, netcheckCount).GetData());
  879. //if (tmpTS.Compare("E") != 0)
  880. //{
  881. // GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "E");
  882. // tmpTS = "E";
  883. //}
  884. Sleep(5000);
  885. netcheckCount++;
  886. }
  887. else
  888. {
  889. m_ullNetCardCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
  890. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "网卡状态正常");
  891. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F10")("network interface ok.");
  892. break;
  893. }
  894. }
  895. ullTmpStart = SP::Module::Comm::RVCGetTickCount();
  896. //检查网络连通性(网络连通性是否作为关键路径走配置,默认不是关键路径)
  897. if (!DetectHttpActive())
  898. {
  899. //网络连通性检查未通过,提示确认网络后重启应用?界面加一个重启按钮?
  900. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, "网络连通性检查失败,请检查网络");
  901. return -1;
  902. }
  903. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F11")("connect to http(s) service ok.");
  904. m_ullNetDetectCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
  905. ToCheckIfInstalling();
  906. ullTmpStart = SP::Module::Comm::RVCGetTickCount();
  907. //拉取配置并通知提前启动的实体(Chromium)
  908. //重试5次,失败则放弃
  909. int getRetry = 0;
  910. while(true)
  911. {
  912. if (GetConfig())
  913. break;
  914. else
  915. {
  916. if (getRetry >= 5)
  917. return -2;
  918. getRetry++;
  919. Sleep(5000 * getRetry);
  920. }
  921. }
  922. m_ullGetConfigCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
  923. //加载实体列表
  924. CSimpleStringA csTmpRootIni("");
  925. if (!IsRootINIExist(csTmpRootIni))
  926. {
  927. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("root.ini不存在(%s),Set TerminalStage N ", csTmpRootIni.GetData()).GetData());
  928. GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "N");
  929. }
  930. //oilyang@20241017 to check if have copied dep directory
  931. int copyTries = 0;
  932. while (true)
  933. {
  934. if (m_eDepCopyStage == DepDirInitCopy_NoNeed || m_eDepCopyStage == DepDirInitCopy_CopySuc)
  935. {
  936. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("no need or have done dep copy, DepCopyStage:%d", m_eDepCopyStage);
  937. break;
  938. }
  939. else if (m_eDepCopyStage == DepDirInitCopy_Copying)
  940. {
  941. Sleep(1000);
  942. continue;
  943. }
  944. else
  945. {
  946. LogWarn(Severity_High, Error_Unexpect, VtmLoader_DepDirCopyFailed, "厂商适配器Dep文件拷贝失败,请联系分行IT排查是否安全软件干扰文件拷贝");
  947. Sleep(60000);
  948. copyTries++;
  949. if (copyTries > 4)
  950. {
  951. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("have tried %d times, give up", copyTries);
  952. return -1;
  953. }
  954. m_eDepCopyStage = DepDirInitCopy_Copying;
  955. CopyDepFilesToNewDepPathTask* pCopyTask = new CopyDepFilesToNewDepPathTask(this);
  956. GetEntityBase()->GetFunction()->PostThreadPoolTask(pCopyTask);
  957. }
  958. }
  959. return EntityLoad();
  960. }
  961. int CVtmLoaderFSM::EntityLoad()
  962. {
  963. //前提:收到了配置拉取完成的指令,才会进入到这里
  964. //为了测试,假装已经拿到了集中配置
  965. m_ullEntityLoadStart = SP::Module::Comm::RVCGetTickCount();
  966. CSmartPointer<IConfigInfo> spConfigCen,spRunCfg;
  967. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  968. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunCfg);
  969. CSimpleStringA csCoreBootList(true), csSafeLoadList(true), csOperatingList(true), csKeyCB("CoreBootList."), csKeySL("SafeLoadList."), csKeyOp("OperatingList."), csExcludedLoadList(true);
  970. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeyCB + m_sysInfo.strMachineType).GetData(), csCoreBootList);
  971. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeySL + m_sysInfo.strMachineType).GetData(), csSafeLoadList);
  972. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeyOp + m_sysInfo.strMachineType).GetData(), csOperatingList);
  973. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), "ExcludedLoadList", csExcludedLoadList);
  974. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CoreBoot.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csCoreBootList.GetData());
  975. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SafeLoad.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csSafeLoadList.GetData());
  976. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Operating.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csOperatingList.GetData());
  977. //oiltmp 如果没有配置,则走默认配置
  978. if (csCoreBootList.IsNullOrEmpty() || csCoreBootList.IndexOf("HealthManager") < 0 || csCoreBootList.IndexOf("AccessAuthorization") < 0
  979. || csCoreBootList.IndexOf("UpgradeManager") < 0 || csCoreBootList.IndexOf("HeartBeat") < 0
  980. || csCoreBootList.IndexOf("TokenKeeper") < 0 || csCoreBootList.IndexOf("ResourceWatcher") < 0
  981. || csCoreBootList.IndexOf("EventConverter") < 0 || csCoreBootList.IndexOf("Alarm") < 0)
  982. {
  983. if (csCoreBootList.IsNullOrEmpty())
  984. {
  985. LogWarn(Severity_High, Error_Unexpect, VtmLoader_CoreBootCfg_Err, CSimpleStringA::Format("terminalNo[%s] CoreBoot配置为空,请联系总行开发人员检查", m_sysInfo.strTerminalID.GetData()).GetData());
  986. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR040210F14").setResultCode("RTA1F05")("terminalNo[%s] CoreBoot配置为空,请联系总行开发人员检查", m_sysInfo.strTerminalID.GetData());
  987. }
  988. else
  989. {
  990. LogWarn(Severity_High, Error_Unexpect, VtmLoader_CoreBootCfg_Err, CSimpleStringA::Format("terminalNo[%s] CoreBoot配置异常,请联系总行开发人员检查(%s)", m_sysInfo.strTerminalID.GetData(), csCoreBootList.GetData()).GetData());
  991. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR040210F14").setResultCode("RTA1F05")(CSimpleStringA::Format("terminalNo[%s] CoreBoot配置异常,请联系总行开发人员检查(%s)",m_sysInfo.strTerminalID.GetData(), csCoreBootList.GetData()));
  992. }
  993. //if have PinPad module
  994. //if (m_sysInfo.strMachineType.Compare("RVC.CardStore", true) == 0)
  995. // csCoreBootList = "HealthManager=0|TokenKeeper=0|Alarm=0|UpgradeManager=0|DeviceControl=0|ResourceWatcher=0|AccessAuthorization=0|HeartBeat=0|EventConverter=0|CenterSetting=0";
  996. //else
  997. // csCoreBootList = "HealthManager=0|TokenKeeper=0|Alarm=0|UpgradeManager=0|DeviceControl=0|ResourceWatcher=0|AccessAuthorization=0|HeartBeat=0|EventConverter=0|CenterSetting=0|PinPad=0";
  998. }
  999. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SleepEnterOpMS", m_sleepEnterOpMS);
  1000. if (m_sleepEnterOpMS <= 0 || m_sleepEnterOpMS > 20000)
  1001. m_sleepEnterOpMS = 1000;//default
  1002. //save centersetting to runcfg for vtmloader. using it before download centersetting
  1003. int iTmp = 0;
  1004. if (spConfigCen->ReadConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp) == Error_Succeed && iTmp > 0)
  1005. spRunCfg->WriteConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp);
  1006. iTmp = 0;
  1007. if (spConfigCen->ReadConfigValueInt("Common", "MaxAddrDetectTimes", iTmp) == Error_Succeed && iTmp > 0)
  1008. spRunCfg->WriteConfigValueInt("Common", "MaxAddrDetectTimes", iTmp);
  1009. iTmp = 0;
  1010. if (spConfigCen->ReadConfigValueInt("Common", "AddrDetectInterval", iTmp) == Error_Succeed && iTmp > 0)
  1011. spRunCfg->WriteConfigValueInt("Common", "AddrDetectInterval", iTmp);
  1012. CSimpleStringA csTmpAddr(true);
  1013. if (spConfigCen->ReadConfigValue("Common", "SettingDetectAddr", csTmpAddr) == Error_Succeed && !csTmpAddr.IsNullOrEmpty())
  1014. spRunCfg->WriteConfigValue("Common", "SettingDetectAddr", csTmpAddr.GetData());
  1015. csTmpAddr = "";
  1016. if (spConfigCen->ReadConfigValue("Common", "AccessAuthDetectAddr", csTmpAddr) == Error_Succeed && !csTmpAddr.IsNullOrEmpty())
  1017. spRunCfg->WriteConfigValue("Common", "AccessAuthDetectAddr", csTmpAddr.GetData());
  1018. iTmp = 0;
  1019. if (spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "NoCheckMachineModel", iTmp) == Error_Succeed && iTmp == 1)
  1020. m_iNoCheckMachineModel = 1;
  1021. //oilyang@20240407 add check machine model in ST/UAT test room
  1022. if (!CheckConfigInfoInTestRoom())
  1023. return -1;
  1024. CSystemRunInfo sysRunInfo;
  1025. if (GetEntityBase()->GetFunction()->GetSystemRunInfo(sysRunInfo) != Error_Succeed || sysRunInfo.eAppBootState == AppBootState_Init)
  1026. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->RefreshAppBootState(AppBootState_StartEntity);
  1027. else
  1028. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GetSystemRunInfo failed:%d");
  1029. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始加载实体");
  1030. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("StartLoadEntity")("开始加载实体");
  1031. m_arrExCludedList.Init(64);
  1032. m_arrExCludedList = csExcludedLoadList.Split('|');
  1033. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ExcludedLoadList:%s, count:%d", csExcludedLoadList.GetData(), m_arrExCludedList.GetCount());
  1034. m_csEntityList = "GuiConsole|Chromium|VtmLoader|";
  1035. CAutoArray<CSimpleStringA> arrCoreBoot;
  1036. arrCoreBoot.Init(64);
  1037. arrCoreBoot = csCoreBootList.Split('|');
  1038. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("arrCoreBoot count:%d", arrCoreBoot.GetCount());
  1039. for (int i = 0; i < arrCoreBoot.GetCount(); ++i)
  1040. {
  1041. CAutoArray<CSimpleStringA> arrEntity;
  1042. arrEntity.Init(2);
  1043. arrEntity = arrCoreBoot[i].Split('=');
  1044. if (arrEntity.GetCount() < 2)
  1045. break;
  1046. if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
  1047. || arrEntity[0].Compare("GuiConsole", true) == 0)
  1048. continue;
  1049. //Exclude the "ExcludedLoadList" entity
  1050. if (IfInExcludedLoadList(arrEntity[0]))
  1051. continue;
  1052. m_vCoreBoot.push_back(arrEntity[0]);
  1053. m_csEntityList += arrEntity[0] + "|";
  1054. if (arrEntity[1].Compare("1") == 0)
  1055. m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
  1056. else if (arrEntity[1].Compare("2") == 0)
  1057. m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
  1058. else
  1059. m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
  1060. m_coreBootOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
  1061. //m_entityBootOpt[arrEntity[0].GetData()].initSn = cbNum;
  1062. //cbNum++;
  1063. }
  1064. CAutoArray<CSimpleStringA> arrSafeLoad;
  1065. arrSafeLoad.Init(64);
  1066. arrSafeLoad = csSafeLoadList.Split('|');
  1067. for (int i = 0; i < arrSafeLoad.GetCount(); ++i)
  1068. {
  1069. CAutoArray<CSimpleStringA> arrEntity;
  1070. arrEntity.Init(2);
  1071. arrEntity = arrSafeLoad[i].Split('=');
  1072. if (arrEntity.GetCount() < 2)
  1073. break;
  1074. if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
  1075. || arrEntity[0].Compare("GuiConsole", true) == 0)
  1076. continue;
  1077. //Exclude the "ExcludedLoadList" entity
  1078. if (IfInExcludedLoadList(arrEntity[0]))
  1079. continue;
  1080. //去重,防止前面已经加载了
  1081. if (find(m_vCoreBoot.begin(), m_vCoreBoot.end(), arrEntity[0].GetData()) != m_vCoreBoot.end())
  1082. continue;
  1083. m_vSafeLoad.push_back(arrEntity[0].GetData());
  1084. m_csEntityList += arrEntity[0] + "|";
  1085. if (arrEntity[1].Compare("1") == 0)
  1086. m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
  1087. else if (arrEntity[1].Compare("2") == 0)
  1088. m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
  1089. else
  1090. m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
  1091. m_safeLoadOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
  1092. //m_safeLoadOpt[arrEntity[0].GetData()].initSn = slNum;
  1093. //slNum++;
  1094. }
  1095. CAutoArray<CSimpleStringA> arrOperating;
  1096. arrOperating.Init(64);
  1097. arrOperating = csOperatingList.Split('|');
  1098. for (int i = 0; i < arrOperating.GetCount(); ++i)
  1099. {
  1100. CAutoArray<CSimpleStringA> arrEntity;
  1101. arrEntity.Init(2);
  1102. arrEntity = arrOperating[i].Split('=');
  1103. if (arrEntity.GetCount() < 2)
  1104. break;
  1105. if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
  1106. || arrEntity[0].Compare("GuiConsole", true) == 0)
  1107. continue;
  1108. //Exclude the "ExcludedLoadList" entity
  1109. if (IfInExcludedLoadList(arrEntity[0]))
  1110. continue;
  1111. //去重,防止前面已经加载了
  1112. if (find(m_vCoreBoot.begin(), m_vCoreBoot.end(), arrEntity[0].GetData()) != m_vCoreBoot.end()
  1113. || find(m_vSafeLoad.begin(), m_vSafeLoad.end(), arrEntity[0].GetData()) != m_vSafeLoad.end())
  1114. continue;
  1115. m_vOperating.push_back(arrEntity[0].GetData());
  1116. m_csEntityList += arrEntity[0] + "|";
  1117. if (arrEntity[1].Compare("1") == 0)
  1118. m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
  1119. else if (arrEntity[1].Compare("2") == 0)
  1120. m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
  1121. else
  1122. m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
  1123. m_operatingOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
  1124. //m_operatingOpt[arrEntity[0].GetData()].initSn = opNum;
  1125. //opNum++;
  1126. }
  1127. //oilyang if install VTM ,just wait for msg to start entity
  1128. CSimpleStringA csTermStage("");
  1129. ErrorCodeEnum eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
  1130. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("TerminalStage %s.", csTermStage.GetData());
  1131. if (csTermStage.Compare("N") == 0)//"N" for installing
  1132. {
  1133. //start UpgradeManager
  1134. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to start entity UpgradeManager");
  1135. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
  1136. CSmartPointer<IAsynWaitSp> spWait;
  1137. eErrCode = pFuncPrivilege->StartEntity("UpgradeManager", NULL, spWait);
  1138. if (eErrCode == Error_Succeed)
  1139. {
  1140. if (spWait != NULL)
  1141. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1142. }
  1143. else
  1144. {
  1145. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity UpgradeManager failed(%d).", eErrCode);
  1146. return -1;
  1147. }
  1148. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to start entity HealthManager");
  1149. eErrCode = pFuncPrivilege->StartEntity("HealthManager", NULL, spWait);
  1150. if (eErrCode == Error_Succeed)
  1151. {
  1152. if (spWait != NULL)
  1153. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1154. }
  1155. else
  1156. {
  1157. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity HealthManager failed(%d).", eErrCode);
  1158. return -1;
  1159. }
  1160. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to start entity InteractiveControl");
  1161. eErrCode = pFuncPrivilege->StartEntity("InteractiveControl", NULL, spWait);
  1162. if (eErrCode == Error_Succeed)
  1163. {
  1164. if (spWait != NULL)
  1165. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1166. }
  1167. else
  1168. {
  1169. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity InteractiveControl failed(%d).", eErrCode);
  1170. return -1;
  1171. }
  1172. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to start entity MediaController");
  1173. eErrCode = pFuncPrivilege->StartEntity("MediaController", NULL, spWait);
  1174. if (eErrCode == Error_Succeed)
  1175. {
  1176. if (spWait != NULL)
  1177. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1178. }
  1179. else
  1180. {
  1181. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity MediaController failed(%d).", eErrCode);
  1182. return -1;
  1183. }
  1184. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to start entity AccessAuthorization");
  1185. eErrCode = pFuncPrivilege->StartEntity("AccessAuthorization", NULL, spWait);
  1186. if (eErrCode == Error_Succeed)
  1187. {
  1188. if (spWait != NULL)
  1189. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1190. }
  1191. else
  1192. {
  1193. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity AccessAuthorization failed(%d).", eErrCode);
  1194. return -1;
  1195. }
  1196. //wait for all the things have beed done,then save TerminalNo to root.ini
  1197. while (true)
  1198. {
  1199. m_hSaveTerminalNoVar.Wait();
  1200. return 1;
  1201. }
  1202. }
  1203. return 0;
  1204. }
  1205. int CVtmLoaderFSM::CheckLoadResult(LoadStage eStage)
  1206. {
  1207. int ret = 0;
  1208. CSimpleStringA csLogCode = "QLR040210F14";
  1209. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  1210. if (eStage == LOADSTAGE_COREBOOT)
  1211. it = m_coreBootOpt.begin();
  1212. else if (eStage == LOADSTAGE_SAFELOAD)
  1213. {
  1214. it = m_safeLoadOpt.begin();
  1215. csLogCode = "QLR040210F15";
  1216. }
  1217. else
  1218. {
  1219. it = m_operatingOpt.begin();
  1220. csLogCode = "QLR040210F16";
  1221. }
  1222. while (1)
  1223. {
  1224. switch (it->second.loadOpt)
  1225. {
  1226. case LOADOPT_IGNORE:
  1227. if (it->second.eResult == LOADING_INIT)
  1228. return 1;
  1229. break;
  1230. case LOADOPT_ASYNC_VERIFY:
  1231. case LOADOPT_SYNC_VERIFY:
  1232. default:
  1233. if (it->second.eResult == LOADING_INIT)
  1234. return 3;
  1235. else if (it->second.eResult != LOADING_SUCCEED)
  1236. {
  1237. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(csLogCode).setResultCode("RTA1F04")("%s start failed", m_csErrEntity);
  1238. LogWarn(Severity_High, Error_Unexpect, VtmLoader_EntityLoad_Failed, CSimpleStringA::Format("实体%s加载失败,启动终止。请排查启动失败实体或重启应用", m_csErrEntity.GetData()));
  1239. m_csErrEntity = m_csErrEntity + "|" + it->first;
  1240. ret = 2;
  1241. if (it->first.Compare("SIPPhone") == 0)
  1242. m_bSIPPhoneStartFail = true;
  1243. }
  1244. break;
  1245. }
  1246. it++;
  1247. if (eStage == LOADSTAGE_COREBOOT && it == m_coreBootOpt.end())
  1248. break;
  1249. else if (eStage == LOADSTAGE_SAFELOAD && it == m_safeLoadOpt.end())
  1250. break;
  1251. else if (eStage == LOADSTAGE_OPERATING && it == m_operatingOpt.end())
  1252. break;
  1253. }
  1254. return ret;
  1255. }
  1256. ErrorCodeEnum CVtmLoaderFSM::AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData)
  1257. {
  1258. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1259. ErrorCodeEnum errCode;
  1260. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1261. if (pFuncPrivilege != NULL) {
  1262. CSmartPointer<IAsynWaitSp> spWait;
  1263. errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  1264. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AsyncStartEntity")("start entity %s", entity_name);
  1265. if (errCode == Error_Succeed) {
  1266. callback_entry* entry = new callback_entry();
  1267. entry->pRawData = pData;
  1268. entry->EntityName = entity_name;
  1269. entry->ErrorResult = Error_Unexpect;
  1270. entry->op = OP_START_ENTITY;
  1271. if (spWait != NULL)
  1272. spWait->SetCallback(this, entry);
  1273. }
  1274. return errCode;
  1275. }
  1276. else {
  1277. return Error_NoPrivilege;
  1278. }
  1279. }
  1280. void CVtmLoaderFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  1281. {
  1282. CSmartPointer<ICallbackListener> spCallback;
  1283. CSmartPointer<IReleasable> pData;
  1284. pAsynWaitSp->GetCallback(spCallback, pData);
  1285. callback_entry* entry = dynamic_cast<callback_entry*>((IReleasable*)(pData.GetRawPointer()));
  1286. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  1287. callback_entry* new_entry = new callback_entry();
  1288. new_entry->EntityName = entry->EntityName;
  1289. new_entry->ErrorResult = entry->ErrorResult;
  1290. new_entry->op = entry->op;
  1291. new_entry->state = entry->state;
  1292. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  1293. int ret;
  1294. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("stage %d,%s,result %d", m_eStage, (LPCSTR)new_entry->EntityName, new_entry->ErrorResult);
  1295. switch (m_eStage)
  1296. {
  1297. case LOADSTAGE_COREBOOT:
  1298. it = m_coreBootOpt.find(new_entry->EntityName);
  1299. if (it != m_coreBootOpt.end())
  1300. {
  1301. if (new_entry->ErrorResult == Error_Succeed)
  1302. it->second.eResult = LOADING_SUCCEED;
  1303. else if (new_entry->ErrorResult == Error_TimeOut)
  1304. it->second.eResult = LOADING_TIMEOUT;
  1305. else
  1306. it->second.eResult = LOADING_FAILED;
  1307. if (it->second.eResult != Error_Succeed)
  1308. {
  1309. char tmp[64] = { 0 };
  1310. sprintf(tmp, "实体 %s 启动失败-----", it->first.GetData());
  1311. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("启动失败:%s -----", tmp);
  1312. }
  1313. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  1314. if (ret == 0 || ret == 2)
  1315. {
  1316. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  1317. e->param1 = ret;
  1318. PostEventFIFO(e);
  1319. }
  1320. }
  1321. break;
  1322. case LOADSTAGE_SAFELOAD:
  1323. it = m_safeLoadOpt.find(new_entry->EntityName);
  1324. if (it != m_safeLoadOpt.end())
  1325. {
  1326. if (new_entry->ErrorResult == Error_Succeed)
  1327. it->second.eResult = LOADING_SUCCEED;
  1328. else if (new_entry->ErrorResult == Error_TimeOut)
  1329. it->second.eResult = LOADING_TIMEOUT;
  1330. else
  1331. it->second.eResult = LOADING_FAILED;
  1332. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  1333. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("safeload answer %d", ret);
  1334. if (ret == 0 || ret == 2)
  1335. {
  1336. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  1337. e->param1 = ret;
  1338. PostEventFIFO(e);
  1339. }
  1340. }
  1341. else {
  1342. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("cannot find %s", (LPCTSTR)new_entry->EntityName);
  1343. }
  1344. break;
  1345. case LOADSTAGE_OPERATING:
  1346. it = m_operatingOpt.find(new_entry->EntityName);
  1347. if (it != m_operatingOpt.end())
  1348. {
  1349. if (new_entry->ErrorResult == Error_Succeed)
  1350. it->second.eResult = LOADING_SUCCEED;
  1351. else if (new_entry->ErrorResult == Error_TimeOut)
  1352. it->second.eResult = LOADING_TIMEOUT;
  1353. else
  1354. it->second.eResult = LOADING_FAILED;
  1355. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  1356. if (ret == 0 || ret == 2)
  1357. {
  1358. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  1359. e->param1 = ret;
  1360. PostEventFIFO(e);
  1361. }
  1362. }
  1363. break;
  1364. default:
  1365. break;
  1366. }
  1367. }
  1368. DWORD GetDualTime(SYSTEMTIME& t1, SYSTEMTIME& t2)
  1369. {
  1370. //assume t2 > t1...
  1371. //oiltest for simple
  1372. int s1, s2;
  1373. s1 = (t1.wMinute * 60 + t1.wSecond) * 1000 + t1.wMilliseconds;
  1374. s2 = (t2.wMinute * 60 + t2.wSecond) * 1000 + t2.wMilliseconds;
  1375. return s2 - s1;
  1376. }
  1377. void CVtmLoaderFSM::NoticeEntityLoad(int evtCode)
  1378. {
  1379. //oilyang@20240520 in case of healthmanager started failed, we should to restart healthmanager first
  1380. CSimpleStringA csEntityName("HealthManager");
  1381. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1382. CSmartPointer<IAsynWaitSp> spWait;
  1383. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
  1384. CEntityRunInfo acInfo;
  1385. ErrorCodeEnum eErrCode = spEntityFunction->GetEntityRunInfo(csEntityName.GetData(), acInfo);
  1386. if (eErrCode == Error_Succeed && acInfo.eState == EntityState_NoStart)
  1387. {
  1388. eErrCode = pFuncPrivilege->StartEntity(csEntityName, NULL, spWait);
  1389. if (eErrCode == Error_Succeed)
  1390. {
  1391. if (spWait != NULL)
  1392. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1393. }
  1394. else
  1395. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity HealthManager failed(%d).", eErrCode);
  1396. }
  1397. else if (eErrCode == Error_Succeed && acInfo.eState != EntityState_Idle)
  1398. {
  1399. eErrCode = pFuncPrivilege->TerminateEntity(csEntityName.GetData(), spWait);
  1400. if (eErrCode == Error_Succeed)
  1401. {
  1402. if (spWait != NULL)
  1403. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1404. }
  1405. else
  1406. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("TerminateEntity HealthManager failed(%d).", eErrCode);
  1407. Sleep(5000);
  1408. //(re)start entity
  1409. eErrCode = pFuncPrivilege->StartEntity(csEntityName.GetData(), NULL, spWait);
  1410. if (eErrCode == Error_Succeed)
  1411. {
  1412. if (spWait != NULL)
  1413. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1414. }
  1415. else
  1416. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity HealthManager failed(%d).", eErrCode);
  1417. }
  1418. HealthManagerService_ClientBase* pHMClient = new HealthManagerService_ClientBase(m_pEntity);
  1419. int count = 0;
  1420. bool bConnected = false;
  1421. do
  1422. {
  1423. ErrorCodeEnum eErrConn = Error_Unexpect;
  1424. ErrorCodeEnum eErrCall = Error_Unexpect;
  1425. if (!bConnected)
  1426. {
  1427. eErrConn = pHMClient->Connect();
  1428. if (eErrConn == Error_Succeed)
  1429. bConnected = true;
  1430. }
  1431. if (bConnected)
  1432. {
  1433. HealthManagerService_DoEvent_Req req;
  1434. HealthManagerService_DoEvent_Ans ans;
  1435. req.code = evtCode;
  1436. req.entityList = m_csEntityList;
  1437. eErrCall = pHMClient->DoEvent(req, ans, 5000);
  1438. if (eErrCall == Error_Succeed)
  1439. {
  1440. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Notice HealthManager suc");
  1441. break;
  1442. }
  1443. }
  1444. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Notice HealthManager failed,eErrConn:%d,eErrCall:%d", eErrConn, eErrCall);
  1445. Sleep(2000);
  1446. count++;
  1447. } while (count < 100);
  1448. //oilyang@20240517 to calculate cost time of entity start after notice healthmanager 4 minutes later (a time that set experientially)
  1449. ULLINT ullStart = SP::Module::Comm::RVCGetTickCount();
  1450. ULLINT ullEnd = SP::Module::Comm::RVCGetTickCount();
  1451. while (1)
  1452. {
  1453. Sleep(60000);
  1454. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1455. if (ullEnd - ullStart > 4 * 60000 - 5000)//leave 5 second for system call?
  1456. break;
  1457. }
  1458. CAutoArray<CSimpleStringA> strEntityNames;
  1459. CAutoArray<int> strEntityIdx;
  1460. CAutoArray<CEntityStartInfo> Infos;
  1461. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetAllEntityStartInfo(strEntityNames, strEntityIdx, Infos);
  1462. for (int i = 0; i < Infos.GetCount(); ++i)
  1463. {
  1464. if (m_csEntityList.IndexOf(strEntityNames[i]) != -1)
  1465. {
  1466. LogWarn(Severity_Low, Error_Debug, LOG_TRACE_ENTITY_START_TIME,
  1467. SP::Module::Util::generateConsumeTimeJson(strEntityNames[i], SP::Module::Util::formatTime(Infos[i].startTime).c_str(), GetDualTime(Infos[i].startTime, Infos[i].startEndTime)).GetData());
  1468. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("EntityStartCost")
  1469. (SP::Module::Util::generateConsumeTimeJson(strEntityNames[i], SP::Module::Util::formatTime(Infos[i].startTime).c_str(), GetDualTime(Infos[i].startTime, Infos[i].startEndTime)).GetData());
  1470. }
  1471. }
  1472. }
  1473. bool CVtmLoaderFSM::DetectHttpActive()
  1474. {
  1475. memset(m_httpCheckResult, 0, sizeof(m_httpCheckResult));
  1476. CSmartPointer<IConfigInfo> pConfigRun;
  1477. CSimpleStringA strSettingAddr(true),strAccessAuthAddr(true);
  1478. CSimpleStringA errMsg;
  1479. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, pConfigRun);
  1480. if (eErr == Error_Succeed)
  1481. {
  1482. int iTmp = 0;
  1483. if (pConfigRun->ReadConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp) == Error_Succeed && iTmp > 0)
  1484. m_iCanIgnoreAddrDetect = iTmp;
  1485. iTmp = 0;
  1486. if (pConfigRun->ReadConfigValueInt("Common", "MaxAddrDetectTime", iTmp) == Error_Succeed && iTmp > 0)
  1487. m_ullMaxAddrDetectTime = iTmp;
  1488. iTmp = 0;
  1489. if (pConfigRun->ReadConfigValueInt("Common", "AddrDetectInterval", iTmp) == Error_Succeed && iTmp > 0)
  1490. m_iDetectInterval = iTmp;
  1491. }
  1492. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErr:%d, iDetectInterval:%d", eErr, m_iDetectInterval);
  1493. CSimpleStringA csTmpAddr(true);
  1494. //集中配置探测地址
  1495. pConfigRun->ReadConfigValue("Common", "SettingDetectAddr", csTmpAddr);
  1496. if (csTmpAddr.IsNullOrEmpty())
  1497. {
  1498. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  1499. strSettingAddr = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig/rvc/detect";
  1500. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  1501. strSettingAddr = "https://accessproxy-service.paas.cmbchina.cn/centerconfig/rvc/detect";
  1502. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  1503. strSettingAddr = "https://accessproxy-service.paasuat.cmbchina.cn/centerconfig/rvc/detect";
  1504. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  1505. strSettingAddr = "https://accessproxy-service.paas.cmbchina.cn/centerconfig/rvc/detect";
  1506. #else/*本地编译等非DevOps环境编译的版本*/
  1507. strSettingAddr = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig/rvc/detect";
  1508. #endif
  1509. }
  1510. else
  1511. strSettingAddr = csTmpAddr;
  1512. csTmpAddr = "";
  1513. pConfigRun->ReadConfigValue("Common", "AccessAuthDetectAddr", strAccessAuthAddr);
  1514. //准入探测地址
  1515. if (strAccessAuthAddr.IsNullOrEmpty())
  1516. {
  1517. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  1518. strAccessAuthAddr = "https://terminalaccess.paasst.cmbchina.cn/tsas/detect";
  1519. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  1520. strAccessAuthAddr = "https://accessproxy-service.paas.cmbchina.cn/tsaccess/tsas/detect";
  1521. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  1522. strAccessAuthAddr = "https://terminalaccess.paasuat.cmbchina.cn/tsas/detect";
  1523. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  1524. strAccessAuthAddr = "https://terminalaccess.paas.cmbchina.cn/tsas/detect";
  1525. #else/*本地编译等非DevOps环境编译的版本*/
  1526. strAccessAuthAddr = "https://terminalaccess.paasst.cmbchina.cn/tsas/detect";
  1527. #endif
  1528. }
  1529. else
  1530. strAccessAuthAddr = csTmpAddr;
  1531. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CenterSetting addr:%s, strAccessAuthAddr:%s", strSettingAddr.GetData(), strAccessAuthAddr.GetData());
  1532. HttpConnCheckTask* pCSTask = new HttpConnCheckTask(this, strSettingAddr, HttpAddr_CenterSetting);
  1533. GetEntityBase()->GetFunction()->PostThreadPoolTask(pCSTask);
  1534. HttpConnCheckTask* pAATask = new HttpConnCheckTask(this, strAccessAuthAddr, HttpAddr_AccessAuth);
  1535. GetEntityBase()->GetFunction()->PostThreadPoolTask(pAATask);
  1536. ULLINT beginTick, endTick;
  1537. beginTick = SP::Module::Comm::RVCGetTickCount();
  1538. do {
  1539. Sleep(2000);
  1540. if (m_httpCheckResult[HttpAddr_CenterSetting] == HttpConnResult_OK || m_httpCheckResult[HttpAddr_AccessAuth] == HttpConnResult_OK)
  1541. return true;
  1542. else
  1543. {
  1544. endTick = SP::Module::Comm::RVCGetTickCount();
  1545. }
  1546. } while (endTick - beginTick < m_ullMaxAddrDetectTime);
  1547. if (m_iCanIgnoreAddrDetect > 0)
  1548. return true;
  1549. else
  1550. return false;
  1551. }
  1552. bool CVtmLoaderFSM::IsRootINIExist(CSimpleStringA& path)
  1553. {
  1554. CSimpleStringA csHardwareCfg(true);
  1555. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("HardwareCfg", csHardwareCfg);
  1556. if (eErr != Error_Succeed)
  1557. {
  1558. path = CSimpleStringA::Format("GetPath of HardwareCfg failed(%d)", eErr);
  1559. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get path of Run failed:%s", SpStrError(eErr));
  1560. return false;
  1561. }
  1562. path = csHardwareCfg + SPLIT_SLASH_STR + "root.ini";
  1563. #if defined(RVC_OS_WIN)
  1564. if (_access(path.GetData(), 0) == 0) {
  1565. #else
  1566. if (access(path.GetData(), F_OK) == 0) {
  1567. #endif
  1568. return true;
  1569. }
  1570. else
  1571. {
  1572. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("root.ini(%s) is not exist.", path.GetData());
  1573. return false;
  1574. }
  1575. }
  1576. bool CVtmLoaderFSM::VerifyVer()
  1577. {
  1578. CSmartPointer<IConfigInfo> pConfig;
  1579. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
  1580. int VerifyVersion = 0;
  1581. CSimpleStringA activeVer;
  1582. bool isVerEqual = false;
  1583. if (Error_Succeed != pConfig->ReadConfigValueInt("Common", "VerifyVersion", VerifyVersion) || Error_Succeed != GetEntityBase()->GetFunction()->GetRunningVersion(activeVer))
  1584. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read [Common]VerifyVersion failed");
  1585. std::string curVer = std::string(RVC_VERSION_STR);
  1586. if (curVer == activeVer.GetData())
  1587. isVerEqual = true;
  1588. if (!isVerEqual)
  1589. {
  1590. CSimpleString showMsg = CSimpleString::Format("version not equal, file version:%s, acitve verion:%s", curVer.c_str(), activeVer.GetData());
  1591. switch (VerifyVersion)
  1592. {
  1593. case 0:
  1594. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(showMsg.GetData());
  1595. break;
  1596. case 1:
  1597. m_verShowMsg = showMsg;
  1598. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&AlarmVersionErr, this, 0, NULL));
  1599. break;
  1600. case 2:
  1601. m_verShowMsg = showMsg;
  1602. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&AlarmVersionErr, this, 0, NULL));
  1603. return false;
  1604. break;
  1605. default:
  1606. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("VerifyVersion not support param:%d", VerifyVersion);
  1607. break;
  1608. }
  1609. }
  1610. return true;
  1611. }
  1612. bool CVtmLoaderFSM::GetConfig()
  1613. {
  1614. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before GetConfig terminalNo:[%s]", m_sysInfo.strTerminalID.GetData());
  1615. //拉取配置前先检查root.ini文件
  1616. CSimpleStringA csTmpRootIni("");
  1617. if (!IsRootINIExist(csTmpRootIni))
  1618. {
  1619. if (m_terminalNoFromWeb.IsNullOrEmpty())
  1620. {
  1621. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("安装页面未设置终端号,请检查(%s)", csTmpRootIni.GetData()).GetData());
  1622. return false;
  1623. }
  1624. }
  1625. else if (m_sysInfo.strTerminalID.IsNullOrEmpty())
  1626. {
  1627. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("root.ini中终端号为空,请检查(%s)", csTmpRootIni.GetData()).GetData());
  1628. return false;
  1629. }
  1630. ErrorCodeEnum eErr = Error_Succeed;
  1631. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始拉取配置");
  1632. VTMInitParam vtmInitParam(m_terminalNoFromWeb.GetData(), SpDefine::channelId, SpDefine::tokenSecret, SpDefine::CommonLaunchUrl, SpDefine::CenterConfigTotal);
  1633. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->InitCfgUrl(vtmInitParam)))
  1634. {
  1635. LogWarn(Severity_High, Error_Unexpect, VtmLoader_GetConfig_InitCfgUrl_Failed, CSimpleStringA::Format("拉取配置,初始化配置地址失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
  1636. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F01")("Get config,InitCfgUrl failed.");
  1637. LogEvent(Severity_High, Event_VtmLoader_GetConfig_Fail, "拉取配置,初始化配置地址失败");
  1638. return false;
  1639. }
  1640. else
  1641. {
  1642. CSimpleString oldToken, newToken;
  1643. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateToken(oldToken, newToken)))
  1644. {
  1645. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F02")("Get config, TryUpdateToken failed:0x%x", eErr);
  1646. LogWarn(Severity_High, Error_Unexpect, VtmLoader_GetConfig_UpdateToken_Failed, CSimpleStringA::Format("拉取配置失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
  1647. }
  1648. //update err msg list
  1649. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&errMsgListUpdate, this, 0, NULL));
  1650. //if token update failed,we can also update cfg suc
  1651. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateCfg()))
  1652. {
  1653. LogWarn(Severity_High, Error_Unexpect, VtmLoader_GetConfig_UpdateCfg_Failed, CSimpleStringA::Format("拉取配置失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
  1654. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F03")("Get config, TryUpdateCfg failed:0x%x", eErr);
  1655. LogEvent(Severity_High, Event_VtmLoader_GetConfig_Fail, "拉取配置失败");
  1656. return false;
  1657. }
  1658. }
  1659. refreshLogLevel();
  1660. //all cfg is ready, then init the entity
  1661. eErr = SubscribeEntitysEvents();
  1662. if (eErr != Error_Succeed)
  1663. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe event fail, 0x%x", eErr);
  1664. else
  1665. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe event succeed");
  1666. CSmartPointer<IConfigInfo> pConfig;
  1667. CSimpleString t_endpoint, t_topicSys, t_topicUser, t_topicBeidou, t_bussSys, t_bussUser, t_VTMWeb;
  1668. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
  1669. if (eErr == Error_Succeed && Error_Succeed == pConfig->ReadConfigValue("Common", "SendEndpoint", t_endpoint)
  1670. && Error_Succeed == pConfig->ReadConfigValue("Common", "SendSys", t_topicSys)
  1671. && Error_Succeed == pConfig->ReadConfigValue("Common", "SendUser", t_topicUser)
  1672. && Error_Succeed == pConfig->ReadConfigValue("Common", "SendBeidou", t_topicBeidou)
  1673. && Error_Succeed == pConfig->ReadConfigValue("Common", "BusinessSys", t_bussSys)
  1674. && Error_Succeed == pConfig->ReadConfigValue("Common", "BusinessUser", t_bussUser)
  1675. && Error_Succeed == pConfig->ReadConfigValue("Common", "VTMWeb", t_VTMWeb)
  1676. && 0 != t_topicSys.GetLength()
  1677. && 0 != t_topicUser.GetLength()
  1678. && 0 != t_topicBeidou.GetLength()
  1679. && 0 != t_bussSys.GetLength()
  1680. && 0 != t_bussUser.GetLength()
  1681. && 0 != t_VTMWeb.GetLength())
  1682. {
  1683. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("endpoint:%s, topicSys:%s, topicUser:%s, topicBeidou:%s, bussSys:%s, bussUser:%s, vtmWeb:%s"
  1684. , t_endpoint.GetData(), t_topicSys.GetData(), t_topicUser.GetData(), t_topicBeidou.GetData(), t_bussSys.GetData(), t_bussUser.GetData(), t_VTMWeb.GetData());
  1685. if (0 != t_endpoint.GetLength())
  1686. {
  1687. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(t_endpoint.GetData()
  1688. , t_topicSys.GetData(), t_topicUser.GetData(), t_topicBeidou.GetData(), t_bussSys.GetData(), t_bussUser.GetData(), t_VTMWeb.GetData());
  1689. }
  1690. else
  1691. LogWarn(Severity_High, ErrorCodeEnum::Error_Cancel, Event_VtmLoader_GetConfig_Suc, "endpoint is empty, do not begin send log");
  1692. }
  1693. else
  1694. {
  1695. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read endpoint and topic err, need check centersetting, use default %s-%s-%s-%s-%s-%s-%s"
  1696. , SpDefine::endpoint, SpDefine::topicSys, SpDefine::topicUser, SpDefine::topicBeidou, SpDefine::topicBussSys, SpDefine::topicBussUser, SpDefine::topicVTMWeb);
  1697. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(SpDefine::endpoint, SpDefine::topicSys, SpDefine::topicUser, SpDefine::topicBeidou,
  1698. SpDefine::topicBussSys, SpDefine::topicBussUser, SpDefine::topicVTMWeb);
  1699. }
  1700. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  1701. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("terminalNo:%s, MachineModel:%s, MachineType:%s, MachineVersion:%s, DepVersion:%s,Site:%s, Screen:%d, EnrolGPS:%f.%f, EnrolAddr:%s"
  1702. , m_sysInfo.strTerminalID.GetData(), m_sysInfo.strMachineModel.GetData(), m_sysInfo.strMachineType.GetData(), m_sysInfo.MachineVersion.ToString().GetData(),m_sysInfo.CurrDepVersion.GetData()
  1703. , m_sysInfo.strSite.GetData(), m_sysInfo.eScreen, m_sysInfo.EnrolGPS.GetLatitude(), m_sysInfo.EnrolGPS.GetLongitude(), m_sysInfo.strEnrolAddr.GetData());
  1704. int tmpSec = 0;
  1705. if (Error_Succeed == pConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "refreshTokenWaitSec", tmpSec) && tmpSec > 0)
  1706. m_refreshWaitSec = tmpSec;
  1707. int t_sec = 0;
  1708. pConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UploadLogWaitSec", t_sec);
  1709. if (t_sec > 0)
  1710. m_uploadLogInfo_waitSec = t_sec;
  1711. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)& checkUrlActive, this, 0, NULL));
  1712. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)& tokenUpdate, this, 0, NULL));
  1713. //通知Chromium实体
  1714. LogEvent(Severity_High, Event_VtmLoader_GetConfig_Suc, "Get config succeed.");
  1715. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F13")("Get config succeed.");
  1716. return true;
  1717. }
  1718. ErrorCodeEnum CVtmLoaderFSM::SubscribeEntitysEvents()
  1719. {
  1720. //want to do what?
  1721. auto rc = Error_Succeed;
  1722. /*GifutTest20250314 begin*/
  1723. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1724. rc = pFunc->RegistTerminalStateChangeEvent(dynamic_cast<ITerminalStateChangedListener*>(this->GetEntityBase()));
  1725. if (rc != Error_Succeed)
  1726. {
  1727. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("RegistTerminalStateChangeEvent failed: %s", SpStrError(rc));
  1728. }
  1729. /*GifutTest20250314 end*/
  1730. return rc;
  1731. }
  1732. int CVtmLoaderFSM::HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType)
  1733. {
  1734. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to HttpConnCheck");
  1735. ULLINT beginTick = SP::Module::Comm::RVCGetTickCount();
  1736. int httpcheckCount = 1;
  1737. bool bCheckOK = false;
  1738. while(true){
  1739. if (m_httpCheckResult[HttpAddr_CenterSetting] == HttpConnResult_OK)
  1740. {
  1741. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("check centersetting ok.");
  1742. return 0;
  1743. }
  1744. else if (m_httpCheckResult[HttpAddr_AccessAuth] == HttpConnResult_OK)
  1745. {
  1746. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("check AccessAuth ok.");
  1747. return 0;
  1748. }
  1749. #if defined(RVC_OS_LINUX)
  1750. string msg;
  1751. int curFlag = HttpProbe(csHttAddr.GetData(), msg, 5);
  1752. if (curFlag > 0 && curFlag < 400)
  1753. bCheckOK = true;
  1754. #else
  1755. bCheckOK = checkHttpActive(csHttAddr.GetData());
  1756. #endif
  1757. if (!bCheckOK)
  1758. {
  1759. LogWarn(Severity_High, Error_Unexpect, VtmLoader_ConnectDetect_Failed, CSimpleStringA::Format("尝试连接总行服务失败(%s),%d 秒后自动重试(第%d次重试)。请确认终端到总行服务网络是否正常", csHttAddr.GetData(), m_iDetectInterval/1000, httpcheckCount).GetData());
  1760. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F11").setResultCode("RTA1F06")("connect to http(s) service(%s) failed.", csHttAddr.GetData());
  1761. m_httpCheckResult[eType] = HttpConnResult_Failed;
  1762. Sleep(m_iDetectInterval);
  1763. httpcheckCount++;
  1764. CAutoArray<NetworkAdapterItem> netList;
  1765. if (SP::Module::Net::GetINETMacAddresses(netList) == Error_Succeed)
  1766. {
  1767. string tmpDns;
  1768. GetDns(tmpDns);
  1769. for (int i = 0; i < netList.GetCount(); i++) {
  1770. LogWarn(Severity_Low, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("(%d)interface:%s; ip:%s; mac:%s; %s", i, netList[i].description.c_str()
  1771. , netList[i].ip.c_str(), netList[i].mac.c_str(), tmpDns.c_str()).GetData());
  1772. }
  1773. }
  1774. }
  1775. else
  1776. {
  1777. m_httpCheckResult[eType] = HttpConnResult_OK;
  1778. if ((SP::Module::Comm::RVCGetTickCount() - beginTick) > 3000)
  1779. {
  1780. LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_ConnectDetect_Slow, CSimpleStringA::Format("第(%d)次尝试连接总行服务成功(%s),但是网络偏慢,连接花了(%d)秒,请检查网络!"
  1781. , httpcheckCount, csHttAddr.GetData(), (SP::Module::Comm::RVCGetTickCount() - beginTick)/1000).GetData());
  1782. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode("RTA1F07")("尝试连接总行服务成功,但是网络偏慢");
  1783. }
  1784. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F11")("尝试连接总行服务成功(%s)", csHttAddr.GetData());
  1785. return 0;
  1786. }
  1787. }
  1788. return -1;
  1789. }
  1790. void CVtmLoaderFSM::GetDns(string& dns)
  1791. {
  1792. dns = "";
  1793. #if defined(RVC_OS_LINUX)
  1794. FILE* stream;
  1795. char* line = NULL;
  1796. size_t len = 0;
  1797. ssize_t read;
  1798. stream = popen("cat /etc/resolv.conf", "r");
  1799. string tmpStr;
  1800. while ((read = getline(&line, &len, stream)) != -1)
  1801. {
  1802. tmpStr = line;
  1803. int pos = tmpStr.find("nameserver");
  1804. if (pos != string::npos)
  1805. {
  1806. tmpStr = tmpStr.replace(pos, strlen("nameserver"), "dns");
  1807. dns += tmpStr + ";";
  1808. }
  1809. }
  1810. int rnPos = dns.find("\n");
  1811. while (rnPos != string::npos)
  1812. {
  1813. dns.replace(rnPos, 1, " ");
  1814. rnPos = dns.find("\n");
  1815. }
  1816. #else
  1817. #endif
  1818. return;
  1819. }
  1820. void CVtmLoaderFSM::ToCheckIfInstalling()
  1821. {
  1822. //拉取配置前先检查root.ini文件
  1823. CSimpleStringA csTmpRootIni("");
  1824. if (!IsRootINIExist(csTmpRootIni))
  1825. {
  1826. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("root.ini is not exist(%s).maybe we are in installing,to wait for terminalno", csTmpRootIni.GetData()).GetData());
  1827. //oiltest
  1828. //OilTestTask* task = new OilTestTask(this);
  1829. //GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1830. while (true)
  1831. {
  1832. m_hWaitTerminalNoVar.Wait();
  1833. break;
  1834. }
  1835. }
  1836. }
  1837. void CVtmLoaderFSM::CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
  1838. {
  1839. if (ctx->Req.entityName.IsNullOrEmpty())
  1840. {
  1841. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ctx->Req.entityName is null or empty.");
  1842. ctx->Answer(Error_Param, VtmLoader_FailToStartEntity);
  1843. return;
  1844. }
  1845. if (!RefreshDeviceConfig(ctx))
  1846. {
  1847. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("RefreshDeviceConfig failed.");
  1848. ctx->Answer(Error_Unexpect);
  1849. }
  1850. CEntityStaticInfo staticInfo;
  1851. ErrorCodeEnum eErrCode = Error_Unexpect;
  1852. CSimpleStringA csEntityName = ctx->Req.entityName;
  1853. //oiltmp@20240415 to be delete after x months
  1854. if (ctx->Req.entityName.Compare("CardIssuer") == 0)
  1855. {
  1856. if (m_sysInfo.strMachineType.Compare("RVC.CardStore") == 0 || m_sysInfo.strMachineType.Compare("RVC.CardPrinter") == 0)
  1857. csEntityName = "CardIssuerStore";
  1858. else
  1859. csEntityName = "CardIssuerStand";
  1860. }
  1861. if ((eErrCode = m_pEntity->GetFunction()->GetEntityStaticInfo(csEntityName.GetData(), staticInfo)) != Error_Succeed)
  1862. {
  1863. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GetEntityStaticInfo(%s), failed:%d", ctx->Req.entityName.GetData(), eErrCode);
  1864. ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
  1865. return;
  1866. }
  1867. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("staticInfo.wEntityDevelopID:%x", staticInfo.wEntityDevelopID);
  1868. switch (staticInfo.wEntityDevelopID)
  1869. {
  1870. case 0x201:
  1871. case 0x203:
  1872. case 0x204:
  1873. case 0x206:
  1874. case 0x209:
  1875. case 0x213:
  1876. case 0x217:
  1877. case 0x220:
  1878. CheckDeviceBaseEntity(ctx, staticInfo.wEntityDevelopID);
  1879. break;
  1880. case 0x301://SIPPhone
  1881. CheckAudio(ctx);
  1882. break;
  1883. case 0x208://MediaController
  1884. CheckVideo(ctx);
  1885. break;
  1886. default:
  1887. break;
  1888. }
  1889. return;
  1890. }
  1891. void CVtmLoaderFSM::SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx)
  1892. {
  1893. if (ctx->Req.terminalNo.IsNullOrEmpty())
  1894. {
  1895. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("terminalNo is null or empty");
  1896. ctx->Answer(Error_Param);
  1897. return;
  1898. }
  1899. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(VtmLoaderService_LogCode_SaveTerminalNo)("write terminalNo[%s] to root.ini", ctx->Req.terminalNo.GetData());
  1900. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->WriteTerminalNoToRootIni(ctx->Req.terminalNo);
  1901. ctx->Answer(eErr);
  1902. }
  1903. void CVtmLoaderFSM::DealWithOldEvent(SpReqAnsContext<VtmLoaderService_DealWithOldEvent_Req, VtmLoaderService_DealWithOldEvent_Ans>::Pointer ctx)
  1904. {
  1905. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DealWithOldEvent called, %d, %s, %s, %d, %d",
  1906. ctx->Req.eventId, ctx->Req.reqStrRev1.GetData(), ctx->Req.reqStrRev2.GetData(), ctx->Req.reqIntRev1, ctx->Req.reqIntRev2);
  1907. ErrorCodeEnum eErr = ErrorCodeEnum::Error_Succeed;
  1908. switch (ctx->Req.eventId)
  1909. {
  1910. case EVENT_CONSOLE_REQ_SHUTDOWN_SHELL:
  1911. LogWarn(Severity_Low, Error_Unexpect, 0x50100215, CSimpleStringA::Format("%x, reason:%s", EVENT_CONSOLE_REQ_SHUTDOWN_SHELL, ctx->Req.reqStrRev1.GetData()));
  1912. if (RebootWayEnum::RebootWay_OS == ctx->Req.reqIntRev1)
  1913. {
  1914. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->Reboot(RebootTriggerEnum::RebootTrigger_Unknown, RebootWayEnum::RebootWay_OS);
  1915. return;
  1916. }
  1917. #if defined(RVC_OS_WIN)
  1918. do
  1919. {
  1920. STARTUPINFO si;
  1921. PROCESS_INFORMATION pi;
  1922. ZeroMemory(&si, sizeof(si));
  1923. si.cb = sizeof(si);
  1924. ZeroMemory(&pi, sizeof(pi));
  1925. GetEntityBase()->GetFunction()->FlushLogFile();
  1926. CSimpleStringA csRestart, csVerPath, csAll, csSep("\""), csBlank(" "), csScript("wscript.exe"), csReFlag("r");
  1927. csRestart = "sprestart.exe ";
  1928. ErrorCodeEnum Error = GetEntityBase()->GetFunction()->GetPath("RootVer", csVerPath);
  1929. //csVerPath +="\\spexplorerfast.vbs";
  1930. csVerPath += "\\VTM.exe";
  1931. csReFlag = "n";
  1932. csAll = csSep + csRestart + csSep + csBlank + csSep + csVerPath + csSep
  1933. + csBlank + csSep + csReFlag + csSep;
  1934. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("allpath[%s]", (LPCTSTR)csAll);
  1935. LPTSTR szCmdline = _strdup(csAll);
  1936. if (!CreateProcess(NULL, szCmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
  1937. {
  1938. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("framework shutdown from console failed, CreateProcess failed (%d).\n", GetLastError());
  1939. eErr = ErrorCodeEnum::Error_Unexpect;
  1940. break;
  1941. }
  1942. DWORD dwErr = GetLastError();
  1943. // Wait until child process exits.
  1944. WaitForSingleObject(pi.hProcess, INFINITE);
  1945. // Close process and thread handles.
  1946. CloseHandle(pi.hProcess);
  1947. CloseHandle(pi.hThread);
  1948. } while (false);
  1949. #endif
  1950. break;
  1951. case LOG_EVT_IEBROWSER_RESET_SITE_RESTART:
  1952. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->Reboot(RebootTriggerEnum::RebootTrigger_Unknown, RebootWayEnum::RebootWay_Framework);
  1953. break;
  1954. default:
  1955. break;
  1956. }
  1957. ctx->Answer(eErr);
  1958. }
  1959. bool CVtmLoaderFSM::RefreshDeviceConfig(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
  1960. {
  1961. if (ctx->Req.entityName.IsNullOrEmpty() || ctx->Req.paramNum <= 0)
  1962. {
  1963. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("param error! nothing to refresh");
  1964. return false;
  1965. }
  1966. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("entityName:%s,paramNum:%d,module.GetCount:%d",ctx->Req.entityName.GetData(),ctx->Req.paramNum,ctx->Req.module.GetCount());
  1967. if (ctx->Req.module.GetCount() < ctx->Req.paramNum || ctx->Req.name.GetCount() < ctx->Req.paramNum || ctx->Req.value.GetCount() < ctx->Req.paramNum)
  1968. {
  1969. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("param array length error! nothing to refresh");
  1970. return false;
  1971. }
  1972. for (int i = 0; i < ctx->Req.paramNum; i++)
  1973. {
  1974. MemCfgParam tmpParam("root", ctx->Req.module[i].GetData(), ctx->Req.name[i].GetData(), ctx->Req.value[i].GetData());
  1975. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("module:%s,name:%s,value:%s", ctx->Req.module[i].GetData(), ctx->Req.name[i].GetData(), ctx->Req.value[i].GetData());
  1976. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->ModifyMemCfgParam(tmpParam);
  1977. }
  1978. return true;
  1979. }
  1980. void CVtmLoaderFSM::CheckDeviceBaseEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx, WORD wEntityID)
  1981. {
  1982. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
  1983. CSmartPointer<IAsynWaitSp> spWait;
  1984. CEntityRunInfo runInfo;
  1985. CSimpleStringA csEntityName = ctx->Req.entityName;
  1986. //oiltmp@20240415 to be delete after x months
  1987. if (ctx->Req.entityName.Compare("CardIssuer") == 0)
  1988. {
  1989. if (m_sysInfo.strMachineType.Compare("RVC.CardStore") == 0 || m_sysInfo.strMachineType.Compare("RVC.CardPrinter") == 0)
  1990. csEntityName = "CardIssuerStore";
  1991. else
  1992. csEntityName = "CardIssuerStand";
  1993. }
  1994. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("csEntityName:[%s]", csEntityName.GetData());
  1995. //to check entity state
  1996. ErrorCodeEnum eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(csEntityName.GetData(), runInfo);
  1997. if (eErrCode == Error_Succeed)
  1998. {
  1999. if (runInfo.eState != EntityState_NoStart)
  2000. {
  2001. eErrCode = pFuncPrivilege->TerminateEntity(csEntityName.GetData(), spWait);
  2002. if (spWait != NULL)
  2003. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  2004. }
  2005. }
  2006. else
  2007. {
  2008. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F24")
  2009. ("GetEntityRunInfo %s failed(%d).", csEntityName.GetData(), eErrCode);
  2010. ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
  2011. return;
  2012. }
  2013. //(re)start entity
  2014. eErrCode = pFuncPrivilege->StartEntity(csEntityName.GetData(), NULL, spWait);
  2015. if (eErrCode == Error_Succeed)
  2016. {
  2017. if (spWait != NULL)
  2018. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  2019. }
  2020. else
  2021. {
  2022. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
  2023. ("StartEntity %s failed(%d).", csEntityName.GetData(), eErrCode);
  2024. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2025. return;
  2026. }
  2027. //TODO we should wait for device entity open suc?
  2028. //Sleep 2 second for simple
  2029. Sleep(2000);
  2030. int count = 0;
  2031. do
  2032. {
  2033. CEntityRunInfo runInfo;
  2034. eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(csEntityName.GetData(), runInfo);
  2035. if (eErrCode == Error_Succeed)
  2036. {
  2037. if (runInfo.eState == EntityState_Idle)
  2038. break;
  2039. else if (runInfo.eState == EntityState_Lost || runInfo.eState == EntityState_Close || runInfo.eState == EntityState_Killed)
  2040. {
  2041. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
  2042. ("entity state:%d", runInfo.eState);
  2043. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2044. return;
  2045. }
  2046. count++;
  2047. if (count > 3)
  2048. {
  2049. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
  2050. ("entity state:%d", runInfo.eState);
  2051. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2052. return;
  2053. }
  2054. Sleep(1000);
  2055. }
  2056. else
  2057. {
  2058. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
  2059. ("GetEntityRunInfo failed:%d", eErrCode);
  2060. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2061. return;
  2062. }
  2063. } while (true);
  2064. const int retryGetDevInfoInterval = 5000;//5 seconds
  2065. const int maxRetryTimes = 16;//16*5 = 80 seconds ,the web timeout setting is 90s
  2066. CClientSessionBase* pClient;
  2067. int entityState = 0;
  2068. switch (wEntityID)
  2069. {
  2070. case 0x206: //pinpad
  2071. {
  2072. PinPadService_ClientBase* pClient = new PinPadService_ClientBase(this->m_pEntity);
  2073. if (pClient != NULL)
  2074. {
  2075. eErrCode = pClient->Connect();
  2076. if (eErrCode == Error_Succeed)
  2077. {
  2078. int retryTimes = maxRetryTimes;
  2079. do {
  2080. PinPadService_GetDevInfo_Req reqQ;
  2081. PinPadService_GetDevInfo_Ans ansQ;
  2082. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2083. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2084. if (eErrCode == Error_DevNotAvailable)
  2085. {
  2086. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2087. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2088. return;
  2089. }
  2090. else if (eErrCode == Error_Succeed)
  2091. {
  2092. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2093. ctx->Answer(Error_Succeed);
  2094. return;
  2095. }
  2096. Sleep(retryGetDevInfoInterval);
  2097. retryTimes--;
  2098. } while (retryTimes > 0);
  2099. if (retryTimes == 0)
  2100. {
  2101. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2102. ("after have tried x times");
  2103. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2104. }
  2105. }
  2106. else {
  2107. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2108. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2109. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2110. }
  2111. }
  2112. else
  2113. {
  2114. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2115. ("new client failed.");
  2116. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2117. }
  2118. }
  2119. break;
  2120. case 0x201: //IDCertificate
  2121. {
  2122. IDCertService_ClientBase* pClient = new IDCertService_ClientBase(this->m_pEntity);
  2123. if (pClient != NULL)
  2124. {
  2125. eErrCode = pClient->Connect();
  2126. if (eErrCode == Error_Succeed)
  2127. {
  2128. int retryTimes = maxRetryTimes;
  2129. do {
  2130. IDCertService_GetDevInfo_Req reqQ;
  2131. IDCertService_GetDevInfo_Ans ansQ;
  2132. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2133. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2134. if (eErrCode == Error_DevNotAvailable)
  2135. {
  2136. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2137. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2138. return;
  2139. }
  2140. else if (eErrCode == Error_Succeed)
  2141. {
  2142. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2143. ctx->Answer(Error_Succeed);
  2144. return;
  2145. }
  2146. Sleep(retryGetDevInfoInterval);
  2147. retryTimes--;
  2148. } while (retryTimes > 0);
  2149. if (retryTimes == 0)
  2150. {
  2151. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2152. ("after have tried x times");
  2153. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2154. }
  2155. }
  2156. else {
  2157. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2158. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2159. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2160. }
  2161. }
  2162. else
  2163. {
  2164. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2165. ("new client failed.");
  2166. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2167. }
  2168. }
  2169. break;
  2170. case 0x204: //FingerPrint
  2171. {
  2172. FingerPrintService_ClientBase* pClient = new FingerPrintService_ClientBase(this->m_pEntity);
  2173. if (pClient != NULL)
  2174. {
  2175. eErrCode = pClient->Connect();
  2176. if (eErrCode == Error_Succeed)
  2177. {
  2178. int retryTimes = maxRetryTimes;
  2179. do {
  2180. FingerPrintService_GetDevInfo_Req reqQ;
  2181. FingerPrintService_GetDevInfo_Ans ansQ;
  2182. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2183. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2184. if (eErrCode == Error_DevNotAvailable)
  2185. {
  2186. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2187. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2188. return;
  2189. }
  2190. else if (eErrCode == Error_Succeed)
  2191. {
  2192. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2193. ctx->Answer(Error_Succeed);
  2194. return;
  2195. }
  2196. Sleep(retryGetDevInfoInterval);
  2197. retryTimes--;
  2198. } while (retryTimes > 0);
  2199. if (retryTimes == 0)
  2200. {
  2201. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2202. ("after have tried x times");
  2203. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2204. }
  2205. }
  2206. else {
  2207. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2208. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2209. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2210. }
  2211. }
  2212. else
  2213. {
  2214. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2215. ("new client failed.");
  2216. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2217. }
  2218. }
  2219. break;
  2220. case 0x203: //CardIssuerStand
  2221. case 0x220: //CardIssuerStore
  2222. {
  2223. if (m_sysInfo.strMachineType.Compare("RVC.CardStore") == 0 || m_sysInfo.strMachineType.Compare("RVC.CardPrinter") == 0)
  2224. {
  2225. CardIssuerStoreService_ClientBase* pClient = new CardIssuerStoreService_ClientBase(this->m_pEntity);
  2226. if (pClient != NULL)
  2227. {
  2228. eErrCode = pClient->Connect();
  2229. if (eErrCode == Error_Succeed)
  2230. {
  2231. int retryTimes = maxRetryTimes;
  2232. do {
  2233. CardIssuerStoreService_GetDevInfo_Req reqQ;
  2234. CardIssuerStoreService_GetDevInfo_Ans ansQ;
  2235. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2236. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2237. if (eErrCode == Error_DevNotAvailable)
  2238. {
  2239. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2240. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2241. return;
  2242. }
  2243. else if (eErrCode == Error_Succeed)
  2244. {
  2245. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2246. ctx->Answer(Error_Succeed);
  2247. return;
  2248. }
  2249. Sleep(retryGetDevInfoInterval);
  2250. retryTimes--;
  2251. } while (retryTimes > 0);
  2252. if (retryTimes == 0)
  2253. {
  2254. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2255. ("after have tried x times");
  2256. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2257. }
  2258. }
  2259. else {
  2260. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2261. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2262. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2263. }
  2264. }
  2265. else
  2266. {
  2267. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2268. ("new client failed.");
  2269. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2270. }
  2271. }
  2272. else
  2273. {
  2274. CardIssuerStandService_ClientBase* pClient = new CardIssuerStandService_ClientBase(this->m_pEntity);
  2275. if (pClient != NULL)
  2276. {
  2277. eErrCode = pClient->Connect();
  2278. if (eErrCode == Error_Succeed)
  2279. {
  2280. int retryTimes = maxRetryTimes;
  2281. do {
  2282. CardIssuerStandService_GetDevInfo_Req reqQ;
  2283. CardIssuerStandService_GetDevInfo_Ans ansQ;
  2284. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2285. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2286. if (eErrCode == Error_DevNotAvailable)
  2287. {
  2288. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2289. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2290. return;
  2291. }
  2292. else if (eErrCode == Error_Succeed)
  2293. {
  2294. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2295. ctx->Answer(Error_Succeed);
  2296. return;
  2297. }
  2298. Sleep(retryGetDevInfoInterval);
  2299. retryTimes--;
  2300. } while (retryTimes > 0);
  2301. if (retryTimes == 0)
  2302. {
  2303. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2304. ("after have tried x times");
  2305. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2306. }
  2307. }
  2308. else {
  2309. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2310. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2311. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2312. }
  2313. }
  2314. else
  2315. {
  2316. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2317. ("new client failed.");
  2318. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2319. }
  2320. }
  2321. }
  2322. break;
  2323. case 0x209: //gpio
  2324. {
  2325. GpioService_ClientBase* pClient = new GpioService_ClientBase(this->m_pEntity);
  2326. if (pClient != NULL)
  2327. {
  2328. eErrCode = pClient->Connect();
  2329. if (eErrCode == Error_Succeed)
  2330. {
  2331. int retryTimes = maxRetryTimes;
  2332. do {
  2333. GpioService_GetDevInfo_Req reqQ;
  2334. GpioService_GetDevInfo_Ans ansQ;
  2335. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2336. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2337. if (eErrCode == Error_DevNotAvailable)
  2338. {
  2339. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2340. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2341. return;
  2342. }
  2343. else if (eErrCode == Error_Succeed)
  2344. {
  2345. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2346. ctx->Answer(Error_Succeed);
  2347. return;
  2348. }
  2349. Sleep(retryGetDevInfoInterval);
  2350. retryTimes--;
  2351. } while (retryTimes > 0);
  2352. if (retryTimes == 0)
  2353. {
  2354. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2355. ("after have tried x times");
  2356. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2357. }
  2358. }
  2359. else {
  2360. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2361. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2362. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2363. }
  2364. }
  2365. else
  2366. {
  2367. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2368. ("new client failed.");
  2369. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2370. }
  2371. }
  2372. break;
  2373. case 0x213: //ContactlessCard
  2374. {
  2375. ContactlessCardService_ClientBase* pClient = new ContactlessCardService_ClientBase(this->m_pEntity);
  2376. if (pClient != NULL)
  2377. {
  2378. eErrCode = pClient->Connect();
  2379. if (eErrCode == Error_Succeed)
  2380. {
  2381. int retryTimes = maxRetryTimes;
  2382. do {
  2383. ContactlessCardService_GetDevInfo_Req reqQ;
  2384. ContactlessCardService_GetDevInfo_Ans ansQ;
  2385. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2386. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2387. if (eErrCode == Error_DevNotAvailable)
  2388. {
  2389. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2390. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2391. return;
  2392. }
  2393. else if (eErrCode == Error_Succeed)
  2394. {
  2395. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2396. ctx->Answer(Error_Succeed);
  2397. return;
  2398. }
  2399. Sleep(retryGetDevInfoInterval);
  2400. retryTimes--;
  2401. } while (retryTimes > 0);
  2402. if (retryTimes == 0)
  2403. {
  2404. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2405. ("after have tried x times");
  2406. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2407. }
  2408. }
  2409. else {
  2410. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2411. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2412. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2413. }
  2414. }
  2415. else
  2416. {
  2417. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2418. ("new client failed.");
  2419. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2420. }
  2421. }
  2422. break;
  2423. case 0x217:
  2424. {
  2425. HSPScannerService_ClientBase* pClient = new HSPScannerService_ClientBase(this->m_pEntity);
  2426. if (pClient != NULL)
  2427. {
  2428. eErrCode = pClient->Connect();
  2429. if (eErrCode == Error_Succeed)
  2430. {
  2431. int retryTimes = maxRetryTimes;
  2432. do {
  2433. HSPScannerService_GetDevInfo_Req reqQ;
  2434. HSPScannerService_GetDevInfo_Ans ansQ;
  2435. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
  2436. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  2437. if (eErrCode == Error_DevNotAvailable)
  2438. {
  2439. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")("%d", eErrCode);
  2440. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2441. return;
  2442. }
  2443. else if (eErrCode == Error_Succeed)
  2444. {
  2445. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
  2446. ctx->Answer(Error_Succeed);
  2447. return;
  2448. }
  2449. Sleep(retryGetDevInfoInterval);
  2450. retryTimes--;
  2451. } while (retryTimes > 0);
  2452. if (retryTimes == 0)
  2453. {
  2454. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
  2455. ("after have tried x times");
  2456. ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
  2457. }
  2458. }
  2459. else {
  2460. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2461. ("connect to %s failed.error code:%d", csEntityName.GetData(), eErrCode);
  2462. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2463. }
  2464. }
  2465. else
  2466. {
  2467. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
  2468. ("new client failed.");
  2469. ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
  2470. }
  2471. }
  2472. break;
  2473. default:
  2474. break;
  2475. }
  2476. return;
  2477. }
  2478. void CVtmLoaderFSM::CheckAudio(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
  2479. {
  2480. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
  2481. CSmartPointer<IAsynWaitSp> spWait;
  2482. CEntityRunInfo runInfo;
  2483. //to check entity state
  2484. ErrorCodeEnum eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
  2485. if (eErrCode == Error_Succeed)
  2486. {
  2487. if (runInfo.eState != EntityState_NoStart)
  2488. {
  2489. eErrCode = pFuncPrivilege->TerminateEntity(ctx->Req.entityName.GetData(), spWait);
  2490. if (spWait != NULL)
  2491. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  2492. }
  2493. }
  2494. else
  2495. {
  2496. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GetEntityRunInfo %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
  2497. ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
  2498. return;
  2499. }
  2500. //(re)start entity
  2501. eErrCode = pFuncPrivilege->StartEntity(ctx->Req.entityName.GetData(), NULL, spWait);
  2502. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartEntity %s eErrCode(%d).", ctx->Req.entityName.GetData(), eErrCode);
  2503. if (eErrCode == Error_Succeed)
  2504. {
  2505. if (spWait != NULL)
  2506. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  2507. }
  2508. else
  2509. {
  2510. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
  2511. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2512. return;
  2513. }
  2514. //TODO we should wait for device entity open suc?
  2515. int count = 0;
  2516. do
  2517. {
  2518. eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
  2519. if (eErrCode == Error_Succeed)
  2520. {
  2521. if (runInfo.eState == EntityState_Idle || runInfo.eState == EntityState_Lost)
  2522. {
  2523. CSimpleStringA csSoundCardState("");
  2524. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("SoundCardState", csSoundCardState);
  2525. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("eErrCode:%d csSoundCardState:%s", eErrCode, csSoundCardState.GetData());
  2526. if (eErrCode == Error_Succeed)
  2527. {
  2528. if (csSoundCardState.Compare("N") == 0)
  2529. ctx->Answer(Error_Succeed);
  2530. else if (csSoundCardState.Compare("C") == 0)
  2531. ctx->Answer(Error_Unexpect, VtmLoader_CheckAudio_CfgEmpty);
  2532. else if (csSoundCardState.Compare("B") == 0)
  2533. ctx->Answer(Error_Unexpect, VtmLoader_CheckAudio_CfgBothError);
  2534. else if (csSoundCardState.Compare("P") == 0)
  2535. ctx->Answer(Error_Unexpect, VtmLoader_CheckAudio_CfgPickupError);
  2536. else if (csSoundCardState.Compare("H") == 0)
  2537. ctx->Answer(Error_Unexpect, VtmLoader_CheckAudio_CfgHandFreeError);
  2538. return;
  2539. }
  2540. else
  2541. {
  2542. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("failed to get sysvar SoundCardState , eErrCode:%d", eErrCode);
  2543. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2544. return;
  2545. }
  2546. }
  2547. else
  2548. {
  2549. Sleep(2000);
  2550. count++;
  2551. if (count > 5)
  2552. {
  2553. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("after timeout, entity state is not we want...(Idle or Lost)");
  2554. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2555. return;
  2556. }
  2557. continue;
  2558. }
  2559. }
  2560. else
  2561. {
  2562. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("failed to GetEntityRunInfo, eErrCode:%d", eErrCode);
  2563. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2564. return;
  2565. }
  2566. } while (true);
  2567. }
  2568. void CVtmLoaderFSM::CheckVideo(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
  2569. {
  2570. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
  2571. CSmartPointer<IAsynWaitSp> spWait;
  2572. CEntityRunInfo runInfo;
  2573. //to check entity state
  2574. ErrorCodeEnum eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
  2575. if (eErrCode == Error_Succeed)
  2576. {
  2577. if (runInfo.eState != EntityState_NoStart)
  2578. {
  2579. eErrCode = pFuncPrivilege->TerminateEntity(ctx->Req.entityName.GetData(), spWait);
  2580. if (spWait != NULL)
  2581. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  2582. }
  2583. }
  2584. else
  2585. {
  2586. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GetEntityRunInfo %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
  2587. ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
  2588. return;
  2589. }
  2590. m_bMediaControllerOK = false;
  2591. //(re)start entity
  2592. eErrCode = pFuncPrivilege->StartEntity(ctx->Req.entityName.GetData(), NULL, spWait);
  2593. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartEntity %s eErrCode(%d).", ctx->Req.entityName.GetData(), eErrCode);
  2594. if (eErrCode == Error_Succeed)
  2595. {
  2596. if (spWait != NULL)
  2597. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  2598. }
  2599. else
  2600. {
  2601. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
  2602. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2603. return;
  2604. }
  2605. //TODO we should wait for device entity open suc?
  2606. int count = 0;
  2607. do
  2608. {
  2609. if (!m_bMediaControllerOK)
  2610. {
  2611. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("wait for MediaController to check video setting");
  2612. Sleep(2000);
  2613. count++;
  2614. if (count > 5)
  2615. {
  2616. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("after timeout, entity state is not right");
  2617. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2618. return;
  2619. }
  2620. continue;
  2621. }
  2622. CEntityRunInfo runInfo;
  2623. eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
  2624. if (eErrCode == Error_Succeed)
  2625. {
  2626. if (runInfo.eState == EntityState_Idle)
  2627. {
  2628. CSimpleStringA csCameraState("");
  2629. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("CameraState", csCameraState);
  2630. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("eErrCode:%d csCameraState:%s", eErrCode, csCameraState.GetData());
  2631. if (eErrCode == Error_Succeed && csCameraState.Compare("N") == 0)
  2632. {
  2633. ctx->Answer(Error_Succeed);
  2634. return;
  2635. }
  2636. else
  2637. {
  2638. ctx->Answer(Error_Unexpect, VtmLoader_CheckVideoCfgFail);
  2639. return;
  2640. }
  2641. }
  2642. else if (runInfo.eState == EntityState_Lost || runInfo.eState == EntityState_Close || runInfo.eState == EntityState_Killed)
  2643. {
  2644. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("runInfo.eState:%d", runInfo.eState);
  2645. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2646. return;
  2647. }
  2648. }
  2649. else
  2650. {
  2651. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("failed to GetEntityRunInfo, eErrCode:%d", eErrCode);
  2652. ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
  2653. return;
  2654. }
  2655. } while (true);
  2656. }
  2657. bool CVtmLoaderFSM::CheckConfigInfoInTestRoom()
  2658. {
  2659. if (m_iNoCheckMachineModel)
  2660. return true;
  2661. bool bNeedCheckOK = false;
  2662. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  2663. bNeedCheckOK = true;
  2664. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  2665. bNeedCheckOK = true;
  2666. #endif
  2667. if (bNeedCheckOK)
  2668. {
  2669. DoSpecialJobInTestRoom();
  2670. //to check MachineType
  2671. CSmartPointer<IConfigInfo> spConfigRoot;
  2672. if (GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot) != Error_Succeed)
  2673. {
  2674. return true;
  2675. }
  2676. if (m_sysInfo.strMachineType.Compare("RVC.Stand2S") != 0 && m_sysInfo.strMachineType.Compare("RVC.CardStore")
  2677. && m_sysInfo.strMachineType.Compare("RVC.CardPrinter") && m_sysInfo.strMachineType.Compare("RVC.Stand1SPlus"))
  2678. {
  2679. if (m_sysInfo.strMachineType.IsNullOrEmpty())
  2680. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("机型machineType配置为空,请检查", m_sysInfo.strMachineType.GetData()));
  2681. else
  2682. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("机型machineType(%s)不对,请检查", m_sysInfo.strMachineType.GetData()));
  2683. return false;
  2684. }
  2685. //to check Terminal App Version
  2686. CSmartPointer<IConfigInfo> spConfigCen;
  2687. if (GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen) == Error_Succeed)
  2688. {
  2689. CSimpleStringA csWinVerPrefix(""), csUosVerPrefix(""), csStaticVerPrefix("");
  2690. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), "WinVerPrefix", csWinVerPrefix);
  2691. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), "UosVerPrefix", csUosVerPrefix);
  2692. csStaticVerPrefix = CSimpleStringA::Format("%d.%d",m_sysInfo.InstallVersion.GetMajor(), m_sysInfo.InstallVersion.GetMinor());
  2693. #if defined(RVC_OS_LINUX)
  2694. if (csUosVerPrefix.IsNullOrEmpty())
  2695. return true;
  2696. else
  2697. {
  2698. CAutoArray<CSimpleStringA> arrVer = csUosVerPrefix.Split('.');
  2699. if (arrVer.GetCount() > 1)
  2700. {
  2701. int major = atoi(arrVer[0].GetData());
  2702. int minor = atoi(arrVer[1].GetData());
  2703. if (m_sysInfo.InstallVersion.GetMajor() > major || (m_sysInfo.InstallVersion.GetMajor() == major && m_sysInfo.InstallVersion.GetMinor() > minor))
  2704. {
  2705. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("current version:%s, csUosVerPrefix:%s", m_sysInfo.InstallVersion.ToString().GetData(), csUosVerPrefix.GetData());
  2706. return false;
  2707. }
  2708. }
  2709. }
  2710. #else
  2711. if (csWinVerPrefix.IsNullOrEmpty())
  2712. return true;
  2713. else
  2714. {
  2715. CAutoArray<CSimpleStringA> arrVer = csWinVerPrefix.Split('.');
  2716. if (arrVer.GetCount() > 1)
  2717. {
  2718. int major = atoi(arrVer[0].GetData());
  2719. int minor = atoi(arrVer[1].GetData());
  2720. if (m_sysInfo.InstallVersion.GetMajor() > major || (m_sysInfo.InstallVersion.GetMajor() == major && m_sysInfo.InstallVersion.GetMinor() > minor))
  2721. {
  2722. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("current version:%s, csWinVerPrefix:%s", m_sysInfo.InstallVersion.ToString().GetData(), csWinVerPrefix.GetData());
  2723. return false;
  2724. }
  2725. }
  2726. }
  2727. #endif
  2728. }
  2729. }
  2730. return true;
  2731. }
  2732. bool CVtmLoaderFSM::CheckIfNeedCopyDepFiles()
  2733. {
  2734. //check if exist root.ini
  2735. CSimpleStringA csTmpRootIni("");
  2736. if (!IsRootINIExist(csTmpRootIni))
  2737. {
  2738. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("not exist root.ini, no need copy dep files.");
  2739. return false;
  2740. }
  2741. //check if exist run/dep/depver.txt
  2742. CSimpleStringA csRun(true), csPath(true);
  2743. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("Run", csRun);
  2744. if (eErr != Error_Succeed)
  2745. {
  2746. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("get path of Run failed:%s", SpStrError(eErr));
  2747. return false;
  2748. }
  2749. csPath = csRun + SPLIT_SLASH_STR + "dep" + SPLIT_SLASH_STR + "depver.txt";
  2750. #if defined(RVC_OS_WIN)
  2751. if (_access(csPath.GetData(), 0) == 0) {
  2752. #else
  2753. if (access(csPath.GetData(), F_OK) == 0) {
  2754. #endif
  2755. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("depver.txt(%s) exist, no need to do dep copy.", csPath.GetData());
  2756. return false;
  2757. }
  2758. else
  2759. {
  2760. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("depver.txt(%s) is not exist.", csPath.GetData());
  2761. return true;
  2762. }
  2763. }
  2764. void CVtmLoaderFSM::CopyDepFilesToNewDepPath()
  2765. {
  2766. //create run/dep/0.0.0.1 directory
  2767. CSimpleStringA csRun(true), csDepBakPath(true), csPath(true);
  2768. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("Run", csRun);
  2769. if (eErr != Error_Succeed)
  2770. {
  2771. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("get path of Run failed:%s", SpStrError(eErr));
  2772. m_eDepCopyStage = DepDirInitCopy_CopyFailed;
  2773. return;
  2774. }
  2775. csPath = csRun + SPLIT_SLASH_STR + "dep" + SPLIT_SLASH_STR + "0.0.0.1";
  2776. if (!CreateDirA(csPath.GetData(), TRUE))
  2777. {
  2778. #ifdef RVC_OS_WIN
  2779. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Create default dep version dir fail: %d", GetLastError());
  2780. #else
  2781. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Create default dep version dir fail: %d", errno);
  2782. #endif
  2783. m_eDepCopyStage = DepDirInitCopy_CopyFailed;
  2784. return;
  2785. }
  2786. else
  2787. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Create default dep version dir %s suc", csPath.GetData());
  2788. eErr = GetEntityBase()->GetFunction()->GetPath("DepBak", csDepBakPath);
  2789. if (eErr != Error_Succeed)
  2790. {
  2791. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("get path of DepBak failed:%s", SpStrError(eErr));
  2792. m_eDepCopyStage = DepDirInitCopy_CopyFailed;
  2793. return;
  2794. }
  2795. //xcopy C:\sourceDir C:\destDir /E /I /Y
  2796. //cp -r /path/to/source /path/to/destination
  2797. std::string sucContent, failedContent;
  2798. CSimpleStringA strCmd;
  2799. #if defined(RVC_OS_WIN)
  2800. strCmd = CSimpleStringA::Format("cmd.exe /c xcopy %s %s /E /I /Y", csDepBakPath.GetData(), csPath.GetData());
  2801. #else
  2802. strCmd = CSimpleStringA::Format("cp -r -f %s/* %s", csDepBakPath.GetData(), csPath.GetData());
  2803. #endif //RVC_OS_WIN
  2804. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to execute:%s", strCmd.GetData());
  2805. ULONGLONG ullCopyBeginTick = SP::Module::Comm::RVCGetTickCount();
  2806. bool ret = SP::Module::Util::ShellExecute(strCmd.GetData(), sucContent, failedContent);
  2807. ULONGLONG ullCopyEndTick = SP::Module::Comm::RVCGetTickCount();
  2808. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ret:%d, sucContent:%s, failedContent:%s, costtime(ms):%d", ret, sucContent.c_str(), failedContent.c_str(), ullCopyEndTick - ullCopyBeginTick);
  2809. if (ret)
  2810. {
  2811. //更新适配器版本号文件内容
  2812. CSimpleStringA csVersion("0.0.0.1");
  2813. eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->RewriteDepVersion(csVersion, true);
  2814. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[RewriteDepVersion] %s,%s", SpStrError(eErr), csVersion.GetData());
  2815. m_eDepCopyStage = DepDirInitCopy_CopySuc;
  2816. LogWarn(Severity_Low, Error_Succeed, VtmLoader_DepDirCopySuc, CSimpleStringA::Format("%d", ullCopyEndTick - ullCopyBeginTick));
  2817. }
  2818. else
  2819. {
  2820. m_eDepCopyStage = DepDirInitCopy_CopyFailed;
  2821. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA1F08")("copy dep to new dep path failed, failedContent:%s", failedContent.c_str());
  2822. }
  2823. }
  2824. bool CVtmLoaderFSM::IfInExcludedLoadList(CSimpleStringA csEntityName)
  2825. {
  2826. if (csEntityName.IsNullOrEmpty())
  2827. return true;
  2828. for (int i = 0; i < m_arrExCludedList.GetCount(); ++i)
  2829. {
  2830. if (csEntityName.Compare(m_arrExCludedList[i], true) == 0)
  2831. return true;
  2832. }
  2833. return false;
  2834. }
  2835. void CVtmLoaderFSM::DoSpecialJobInTestRoom()
  2836. {
  2837. //special job including the following things:
  2838. //1.switch to the terminal app version you want
  2839. //2.delete other version directory you want
  2840. //3.just do it simple and straightforward
  2841. CSmartPointer<IConfigInfo> spConfigCen, spRunCfg;
  2842. if (GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen) == Error_Succeed)
  2843. {
  2844. CSimpleStringA csHaveSwitchVerTo("");
  2845. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunCfg);
  2846. if (eErr == Error_Succeed)
  2847. spRunCfg->ReadConfigValue(GetEntityBase()->GetEntityName(), "HaveSwitchVerTo", csHaveSwitchVerTo);
  2848. CSimpleStringA csSwitchVerTo("");
  2849. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), "SwitchVerTo", csSwitchVerTo);
  2850. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SwitchVerTo:[%s], HaveSwitchVerTo:[%s]", csSwitchVerTo.GetData(), csHaveSwitchVerTo.GetData());
  2851. if (csSwitchVerTo.IsNullOrEmpty() || csSwitchVerTo.Compare(csHaveSwitchVerTo) == 0)
  2852. return;
  2853. //更新终端应用版本号文件内容
  2854. CSimpleStringA csRun(true), csActiveFilePath(true);
  2855. eErr = GetEntityBase()->GetFunction()->GetPath("Run", csRun);
  2856. if (eErr != Error_Succeed)
  2857. {
  2858. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("get path of Run failed:%s", SpStrError(eErr));
  2859. return;
  2860. }
  2861. csActiveFilePath = csRun + SPLIT_SLASH_STR + "version" + SPLIT_SLASH_STR + "active.txt";
  2862. HANDLE hFile = ::CreateFileA(csActiveFilePath.GetData(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  2863. BOOL bSetSucc = FALSE;
  2864. if (hFile == INVALID_HANDLE_VALUE)
  2865. {
  2866. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("open %s failed! err=%u", csActiveFilePath, GetLastError());
  2867. return;
  2868. }
  2869. DWORD dwWrittenLen(0);
  2870. bSetSucc = WriteFile(hFile, csSwitchVerTo.GetData(), csSwitchVerTo.GetLength(), &dwWrittenLen, NULL);
  2871. FlushFileBuffers(hFile);
  2872. SetEndOfFile(hFile);
  2873. CloseHandle(hFile);
  2874. spRunCfg->WriteConfigValue(GetEntityBase()->GetEntityName(), "HaveSwitchVerTo", csSwitchVerTo.GetData());
  2875. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write version [%s] succeed", csSwitchVerTo.GetData());
  2876. #if defined(RVC_OS_LINUX)
  2877. if (bSetSucc) {
  2878. mode_t f_attrib = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH | S_IWOTH;
  2879. chmod(csActiveFilePath.GetData(), f_attrib);
  2880. }
  2881. else {
  2882. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("bSetSucc fail");
  2883. }
  2884. #endif //RVC_OS_LINUX
  2885. Sleep(10000);
  2886. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->Reboot(RebootTrigger_ManualLocal, RebootWayEnum::RebootWay_Framework);
  2887. }
  2888. }