CardReadAdapterFSM.cpp 107 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpHelper.h"
  4. #include "CardReadAdapterFSM.h"
  5. #include "EventCode.h"
  6. #include "ModuleMix.h"
  7. #include <algorithm>
  8. #include <map>
  9. using namespace std;
  10. //CSimpleStringA<T> ambigulous
  11. #define _ATL_NO_AUTOMATIC_NAMESPACE
  12. //#include <atltime.h>
  13. #define ReadCard_TIMEOUT 62000 //web的超时时间是65s
  14. #define ReadCard_Min_Time 12000 //Read+PreOnline
  15. unsigned long long GetTickCountRVC() {
  16. #ifdef RVC_OS_WIN
  17. return GetTickCount64();
  18. #else
  19. struct timespec ts;
  20. clock_gettime(CLOCK_MONOTONIC, &ts);
  21. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  22. #endif //RVC_OS_WIN
  23. }
  24. class CCardReadAdapterEntity;
  25. void CCardReadAdapterFSM::s0_on_entry()
  26. {
  27. LOG_FUNCTION();
  28. CSystemStaticInfo sysInfo;
  29. m_csMachineType = m_csSite = m_terminalNo = "";
  30. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  31. m_csMachineType = sysInfo.strMachineType;
  32. m_csSite = sysInfo.strSite;
  33. m_terminalNo = sysInfo.strTerminalID;
  34. m_majorVerion = sysInfo.MachineVersion.GetMajor();
  35. m_minorVerion = sysInfo.MachineVersion.GetMinor();
  36. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machineType:%s,site:%s,terminalNo:%s,machineVersion:%d.%d", (const char*)m_csMachineType, (const char*)m_csSite, (const char*)m_terminalNo
  37. , m_majorVerion, m_minorVerion);
  38. ///**TODO(Gifur@8/17/2023): 覆盖其他需要字段 */
  39. const auto terminInfo = SP::Module::Comm::GetTerminalMachineInfo(GetEntityBase());
  40. m_eMachineType = terminInfo.type;
  41. FSMEvent *pEvt;
  42. pEvt = new FSMEvent(USER_EVT_INIT);
  43. PostEventFIFO(pEvt);
  44. }
  45. void CCardReadAdapterFSM::s0_on_exit()
  46. {
  47. LOG_FUNCTION();
  48. }
  49. unsigned int CCardReadAdapterFSM::s0_on_event(FSMEvent* pEvt)
  50. {
  51. LOG_FUNCTION();
  52. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0 evt %d", pEvt->iEvt);
  53. switch (pEvt->iEvt)
  54. {
  55. case USER_EVT_INIT:
  56. {
  57. InitTask* task = new InitTask(this);
  58. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  59. pEvt->SetHandled();
  60. return 0;
  61. }
  62. break;
  63. default:
  64. break;
  65. }
  66. return 0;
  67. }
  68. //Initializing
  69. void CCardReadAdapterFSM::s1_on_entry()
  70. {
  71. LOG_FUNCTION();
  72. }
  73. void CCardReadAdapterFSM::s1_on_exit()
  74. {
  75. LOG_FUNCTION();
  76. }
  77. unsigned int CCardReadAdapterFSM::s1_on_event(FSMEvent* pEvt)
  78. {
  79. LOG_FUNCTION();
  80. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1 evt %d", pEvt->iEvt);
  81. switch (pEvt->iEvt)
  82. {
  83. case USER_EVT_INIT_FINISHED:
  84. pEvt->SetHandled();
  85. return pEvt->param1;
  86. default:
  87. break;
  88. }
  89. return 0;
  90. }
  91. //Idle
  92. void CCardReadAdapterFSM::s2_on_entry()
  93. {
  94. LOG_FUNCTION();
  95. //GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_IDLE);
  96. m_resetTimes = 0;
  97. m_testResult = Error_Succeed;
  98. m_bIssuingExit = false;
  99. m_bCancelAccept = false;
  100. m_lastS2Event = m_lastS2EvtParam1 = 0;
  101. m_busCtx.eCardProcStage = Card_ProcStage_Idle;
  102. }
  103. void CCardReadAdapterFSM::s2_on_exit()
  104. {
  105. LOG_FUNCTION();
  106. }
  107. unsigned int CCardReadAdapterFSM::s2_on_event(FSMEvent* pEvt)
  108. {
  109. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s2 evt(%d),param1:%d", pEvt->iEvt,pEvt->param1);
  110. m_lastS2Event = pEvt->iEvt;
  111. m_lastS2EvtParam1 = pEvt->param1;
  112. int ret = 0;
  113. switch (pEvt->iEvt)
  114. {
  115. case USER_EVT_READ:
  116. {
  117. //oilyang@20200426 according to MachineType ***AND MachineVersion*** to decide which Card-like entity to be called
  118. //RVC.Stand2S, RVC.CardStore
  119. // ContactlessCard:
  120. // --RVC.Stand2S
  121. // CardIssuer:
  122. // --no matter what MachineType is,just call it
  123. pEvt->SetHandled();
  124. CardReadEvent* cre = dynamic_cast<CardReadEvent*>(pEvt);
  125. bool bCardIssuer, bContactlessCard;
  126. bCardIssuer = bContactlessCard = false;
  127. if (m_eMachineType == SP::Module::Comm::RVC_Stand2S || m_eMachineType == SP::Module::Comm::RVC_Stand1SPlus)
  128. {
  129. ContactlessCardReadTask* cTask = new ContactlessCardReadTask(this);
  130. cTask->ctx = cre->ctx;
  131. if (IsTheEntity(cre->ctx->Req.module, Module_ContactlessCard) && IsContactlessCardSessionOK())
  132. {
  133. bContactlessCard = true;
  134. GetEntityBase()->GetFunction()->PostThreadPoolTask(cTask);
  135. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("ReadTask to ContactlessCard");
  136. }
  137. }
  138. //oilyang@20200426 暂时未发现这行代码的用处,可能简版?后来废弃。暂时保留,后续考虑去掉
  139. if ((cre->ctx->Req.reserved1.GetCount() == 0 || cre->ctx->Req.reserved1[0] != 1))//except for cross call
  140. {
  141. CardIssuerReadTask* iTask = new CardIssuerReadTask(this);
  142. iTask->ctx = cre->ctx;
  143. if (IsTheEntity(cre->ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK())
  144. {
  145. bCardIssuer = true;
  146. GetEntityBase()->GetFunction()->PostThreadPoolTask(iTask);
  147. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("ReadTask to CardIssuer");
  148. }
  149. if (bCardIssuer || bContactlessCard)
  150. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("ReadTask, bCardIssuer,bContactlessCard:%d,%d", bCardIssuer, bContactlessCard);
  151. else
  152. {
  153. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("ReadTask: can't find the right entity.");
  154. ret = 1;//no need to change to "Working" state
  155. cre->ctx->Answer(Error_Unexpect);
  156. }
  157. }
  158. }
  159. break;
  160. case USER_EVT_PREONLINE:
  161. {
  162. PreOnlineEvent* poe = dynamic_cast<PreOnlineEvent*>(pEvt);
  163. PreOnlineTask* task = new PreOnlineTask(this);
  164. task->ctx = poe->ctx;
  165. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  166. pEvt->SetHandled();
  167. return 0;
  168. }
  169. case USER_EVT_WRITE:
  170. {
  171. pEvt->SetHandled();
  172. CardWriteEvent* cwe = dynamic_cast<CardWriteEvent*>(pEvt);
  173. WriteTask* task = new WriteTask(this);
  174. task->ctx = cwe->ctx;
  175. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  176. return 0;
  177. }
  178. case USER_EVT_POSTONLINE:
  179. {
  180. PostOnlineEvent* poe = dynamic_cast<PostOnlineEvent*>(pEvt);
  181. PostOnlineTask* task = new PostOnlineTask(this);
  182. task->ctx = poe->ctx;
  183. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  184. pEvt->SetHandled();
  185. return 0;
  186. }
  187. case USER_EVT_EXIT:
  188. {
  189. m_busCtx.eCardFromWhich = Card_In_No_Where;
  190. pEvt->SetHandled();
  191. DoExitTask* task = new DoExitTask(this);
  192. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  193. }
  194. break;
  195. case USER_EVT_EJECT:
  196. {
  197. pEvt->SetHandled();
  198. CardEjectEvent* cee = dynamic_cast<CardEjectEvent*>(pEvt);
  199. EjectTask* task = new EjectTask(this);
  200. task->ctx = cee->ctx;
  201. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  202. }
  203. break;
  204. case USER_EVT_SET_SOME_FLAG:
  205. {
  206. pEvt->SetHandled();
  207. SetSomeFlagEvent* ssfe = dynamic_cast<SetSomeFlagEvent*>(pEvt);
  208. SetSomeFlagTask* task = new SetSomeFlagTask(this);
  209. task->ctx = ssfe->ctx;
  210. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  211. }
  212. break;
  213. case USER_EVT_GET_DEV_INFO:
  214. {
  215. pEvt->SetHandled();
  216. GetDevInfoEvent* gdie = dynamic_cast<GetDevInfoEvent*>(pEvt);
  217. GetDevInfoTask* task = new GetDevInfoTask(this);
  218. task->ctx = gdie->ctx;
  219. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  220. }
  221. break;
  222. case USER_EVT_QUERY_CARD_INFO:
  223. {
  224. pEvt->SetHandled();
  225. QueryCardInfoEvent* qcie = dynamic_cast<QueryCardInfoEvent*>(pEvt);
  226. QueryCardInfoTask* task = new QueryCardInfoTask(this);
  227. task->ctx = qcie->ctx;
  228. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  229. }
  230. break;
  231. case USER_EVT_QUIT:
  232. pEvt->SetHandled();
  233. break;
  234. case USER_EVT_ISSUE:
  235. {
  236. pEvt->SetHandled();
  237. CardIssueEvent* cee = dynamic_cast<CardIssueEvent*>(pEvt);
  238. IssueTask* task = new IssueTask(this);
  239. task->ctx = cee->ctx;
  240. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  241. }
  242. break;
  243. case USER_EVT_CAPTURE:
  244. {
  245. pEvt->SetHandled();
  246. CardCaptureEvent* cee = dynamic_cast<CardCaptureEvent*>(pEvt);
  247. CaptureTask* task = new CaptureTask(this);
  248. task->ctx = cee->ctx;
  249. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  250. }
  251. break;
  252. case USER_EVT_GET_MATERIAL:
  253. {
  254. pEvt->SetHandled();
  255. GetMaterialEvent *gme = dynamic_cast<GetMaterialEvent*>(pEvt);
  256. GetMaterialCountTask *task = new GetMaterialCountTask(this);
  257. task->ctx = gme->ctx;
  258. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  259. break;
  260. }
  261. case USER_EVT_SET_MATERIAL:
  262. {
  263. pEvt->SetHandled();
  264. SetMaterialEvent *sme = dynamic_cast<SetMaterialEvent*>(pEvt);
  265. SetMaterialCountTask *task = new SetMaterialCountTask(this);
  266. task->ctx = sme->ctx;
  267. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  268. break;
  269. }
  270. case USER_EVT_GET_SCI_INFO:
  271. {
  272. pEvt->SetHandled();
  273. GetSCIInfoEvent* gsie = dynamic_cast<GetSCIInfoEvent*>(pEvt);
  274. GetSCIInfoTask* task = new GetSCIInfoTask(this);
  275. task->ctx = gsie->ctx;
  276. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  277. }
  278. break;
  279. case USER_EVT_OPEN_SAFELOCK:
  280. {
  281. pEvt->SetHandled();
  282. OpenSafeLockEvent *osle = dynamic_cast<OpenSafeLockEvent*>(pEvt);
  283. OpenSafeLockTask* task = new OpenSafeLockTask(this);
  284. task->ctx = osle->ctx;
  285. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  286. }
  287. break;
  288. case USER_EVT_MAGTRANS_INIT:
  289. {
  290. pEvt->SetHandled();
  291. MagTransferInitEvent* mtie = dynamic_cast<MagTransferInitEvent*>(pEvt);
  292. MagTransferInitTask* task = new MagTransferInitTask(this);
  293. task->ctx = mtie->ctx;
  294. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  295. }
  296. break;
  297. case USER_EVT_QUERY_CONN_INFO:
  298. {
  299. pEvt->SetHandled();
  300. QueryConnInfoEvent* qcie = dynamic_cast<QueryConnInfoEvent*>(pEvt);
  301. QueryConnInfoTask* task = new QueryConnInfoTask(this);
  302. task->ctx = qcie->ctx;
  303. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  304. }
  305. break;
  306. case USER_EVT_SAM_IC_COMMAND:
  307. {
  308. pEvt->SetHandled();
  309. SAMICCommandEvent* samice = dynamic_cast<SAMICCommandEvent*>(pEvt);
  310. SAMICCommandTask* task = new SAMICCommandTask(this);
  311. task->ctx = samice->ctx;
  312. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  313. }
  314. break;
  315. case USER_EVT_QUERY_PRINTER_STATUS:
  316. {
  317. pEvt->SetHandled();
  318. QueryPrinterStatusEvent* samice = dynamic_cast<QueryPrinterStatusEvent*>(pEvt);
  319. QueryPrinterStatusTask* task = new QueryPrinterStatusTask(this);
  320. task->ctx = samice->ctx;
  321. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  322. }
  323. break;
  324. case USER_EVT_PRINT:
  325. {
  326. pEvt->SetHandled();
  327. PrintEvent* samice = dynamic_cast<PrintEvent*>(pEvt);
  328. PrintTask* task = new PrintTask(this);
  329. task->ctx = samice->ctx;
  330. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  331. }
  332. break;
  333. case USER_EVT_QUERY_SCILIST:
  334. {
  335. pEvt->SetHandled();
  336. QuerySCIListEvent* samice = dynamic_cast<QuerySCIListEvent*>(pEvt);
  337. QuerySCIListTask* task = new QuerySCIListTask(this);
  338. task->ctx = samice->ctx;
  339. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  340. }
  341. break;
  342. case USER_EVT_BIND_SCI:
  343. {
  344. pEvt->SetHandled();
  345. BindSCIEvent* samice = dynamic_cast<BindSCIEvent*>(pEvt);
  346. BindSCITask* task = new BindSCITask(this);
  347. task->ctx = samice->ctx;
  348. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  349. }
  350. break;
  351. case USER_EVT_PREONLINE_ON_STORE:
  352. {
  353. pEvt->SetHandled();
  354. PreOnlineOnStoreEvent* samice = dynamic_cast<PreOnlineOnStoreEvent*>(pEvt);
  355. PreOnlineOnStoreTask* task = new PreOnlineOnStoreTask(this);
  356. task->ctx = samice->ctx;
  357. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  358. }
  359. break;
  360. case USER_EVT_GET_ADD_CARD_INFO:
  361. {
  362. pEvt->SetHandled();
  363. GetAddCardInfoEvent* samice = dynamic_cast<GetAddCardInfoEvent*>(pEvt);
  364. GetAddCardInfoTask* task = new GetAddCardInfoTask(this);
  365. task->ctx = samice->ctx;
  366. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  367. }
  368. break;
  369. case USER_EVT_QUERY_CARD_INFO_ON_STORE:
  370. {
  371. pEvt->SetHandled();
  372. QueryCardInfoOnStoreEvent* samice = dynamic_cast<QueryCardInfoOnStoreEvent*>(pEvt);
  373. QueryCardInfoOnStoreTask* task = new QueryCardInfoOnStoreTask(this);
  374. task->ctx = samice->ctx;
  375. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  376. }
  377. break;
  378. case USER_EVT_CROSS_TERM_CALL:
  379. {
  380. pEvt->SetHandled();
  381. CrossTermCallEvent* ctce = dynamic_cast<CrossTermCallEvent*>(pEvt);
  382. CrossTermCallTask* task = new CrossTermCallTask(this);
  383. task->ctx = ctce->ctx;
  384. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  385. }
  386. break;
  387. case USER_EVT_PRINT_CARD_IM:
  388. {
  389. pEvt->SetHandled();
  390. PrintCardImEvent* pcie = dynamic_cast<PrintCardImEvent*>(pEvt);
  391. PrintCardImTask* task = new PrintCardImTask(this);
  392. task->ctx = pcie->ctx;
  393. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  394. }
  395. break;
  396. case USER_EVT_QUERY_CI_STATUS:
  397. {
  398. pEvt->SetHandled();
  399. QueryCIStatusEvent* qcse = dynamic_cast<QueryCIStatusEvent*>(pEvt);
  400. QueryCIStatusTask* task = new QueryCIStatusTask(this);
  401. task->ctx = qcse->ctx;
  402. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  403. }
  404. break;
  405. default:
  406. break;
  407. }
  408. return ret;
  409. }
  410. //Working
  411. void CCardReadAdapterFSM::s3_on_entry()
  412. {
  413. LOG_FUNCTION();
  414. }
  415. void CCardReadAdapterFSM::s3_on_exit()
  416. {
  417. LOG_FUNCTION();
  418. }
  419. unsigned int CCardReadAdapterFSM::s3_on_event(FSMEvent* pEvt)
  420. {
  421. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3 evt %d,%d", pEvt->iEvt,pEvt->param1);
  422. int ret = 0;
  423. switch (pEvt->iEvt)
  424. {
  425. case USER_EVT_NOTIFY_PREONLINE:
  426. {
  427. pEvt->SetHandled();
  428. NotifyPreonlineEvent* samice = dynamic_cast<NotifyPreonlineEvent*>(pEvt);
  429. NotifyPreOnlineTask* task = new NotifyPreOnlineTask(this);
  430. task->ctx = samice->ctx;
  431. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  432. }
  433. break;
  434. case USER_EVT_READ_FINISHED:
  435. {
  436. pEvt->SetHandled();
  437. ret = pEvt->param1;
  438. //if (pEvt->param1 == 0)
  439. CardReadFinishedEvent* crfe = dynamic_cast<CardReadFinishedEvent*>(pEvt);
  440. {
  441. if (m_bCancelAccept)
  442. {
  443. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("front cancel");
  444. crfe->ctx->Answer(Error_Cancel);
  445. ret = 0;
  446. }
  447. }
  448. if (pEvt->param1 == 7)//CardIssuer Timeout,need to cancel ContactlessCard insert
  449. {
  450. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuer Timeout,need to cancel ContactlessCard insert");
  451. if (IsContactlessCardSessionOK())
  452. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  453. crfe->ctx->Answer(Error_TimeOut);
  454. ret = 0;
  455. break;
  456. }
  457. else if (pEvt->param1 == 8)//ContactlessCard Timeout,need to cancel CardIssuer insert
  458. {
  459. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ContactlessCard Timeout,need to cancel CardIssuer insert");
  460. if (IsCardIssuerSessionOK()) {
  461. if (!IsCardIssuerStore()) {
  462. (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->CancelInsert();
  463. }
  464. else {
  465. (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->CancelInsert();
  466. }
  467. }
  468. crfe->ctx->Answer(Error_TimeOut);
  469. ret = 0;
  470. break;
  471. }
  472. else if (pEvt->param1 == 9)//ContactlessCard Timeout,need to cancel ContactlessCard insert
  473. {
  474. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ContactlessCard Timeout,need to cancel CardIssuer insert");
  475. if (IsContactlessCardSessionOK())
  476. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  477. crfe->ctx->Answer(Error_TimeOut);
  478. ret = 0;
  479. break;
  480. }
  481. if (m_busCtx.eCardFromWhich == Card_In_ContactlessCard)
  482. {
  483. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("as card in ContactlessCard,to cancel others");
  484. if (IsCardIssuerSessionOK()) {
  485. if (!IsCardIssuerStore()) {
  486. (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->CancelInsert();
  487. }
  488. else {
  489. (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->CancelInsert();
  490. }
  491. }
  492. }
  493. else if (m_busCtx.eCardFromWhich == Card_In_CardIssuer)
  494. {
  495. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("as card in CardIssuer,to cancel others");
  496. if (IsContactlessCardSessionOK())
  497. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  498. }
  499. return ret;
  500. }
  501. case USER_EVT_PREONLINE_FINISHED:
  502. pEvt->SetHandled();
  503. return 0;
  504. case USER_EVT_POSTONLINE_FINISHED:
  505. pEvt->SetHandled();
  506. return 0;
  507. case USER_EVT_READ_CANCEL:
  508. pEvt->SetHandled();
  509. m_bCancelAccept = true;
  510. CancelRead();
  511. break;
  512. case USER_EVT_READ_WAIT_MORE:
  513. {
  514. pEvt->SetHandled();
  515. ReadWaitMoreTask* task = new ReadWaitMoreTask(this);
  516. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  517. }
  518. break;
  519. case USER_EVT_EXIT:
  520. {
  521. m_busCtx.eCardFromWhich = Card_In_No_Where;
  522. pEvt->SetHandled();
  523. DoExitTask* task = new DoExitTask(this);
  524. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  525. }
  526. break;
  527. case USER_EVT_WRITE_FINISHED:
  528. case USER_EVT_SET_SOME_FLAG_FINISHED:
  529. case USER_EVT_GET_DEV_INFO_FINISHED:
  530. case USER_EVT_QUERY_CARD_INFO_FINISHED:
  531. case USER_EVT_GET_MATERIAL_FINISHED:
  532. case USER_EVT_SET_MATERIAL_FINISHED:
  533. case USER_EVT_GET_SCI_INFO_FINISHED:
  534. case USER_EVT_OPEN_SAFELOCK_FINISHED:
  535. case USER_EVT_MAGTRANS_INIT_FINISHED:
  536. case USER_EVT_QUERY_CONN_INFO_FINISHED:
  537. case USER_EVT_QUIT:
  538. case USER_EVT_SAM_IC_COMMAND_FINISHED:
  539. case USER_EVT_QUERY_PRINTER_STATUS_FINISHED:
  540. case USER_EVT_PRINT_FINISHED:
  541. case USER_EVT_QUERY_SCILIST_FINISHED:
  542. case USER_EVT_BIND_SCI_FINISHED:
  543. case USER_EVT_PREONLINE_ON_STORE_FINISHED:
  544. case USER_EVT_GET_ADD_CARD_INFO_FINISHED:
  545. case USER_EVT_NOTIFY_PREONLINE_FINISHED:
  546. case USER_EVT_QUERY_CARD_INFO_ON_STORE_FINISHED:
  547. case USER_EVT_CROSS_TERM_CALL_FINISHED:
  548. case USER_EVT_PRINT_CARD_IM_FINISHED:
  549. case USER_EVT_QUERY_CI_STATUS_FINISHED:
  550. case USER_EVT_EJECT_FINISHED:
  551. pEvt->SetHandled();
  552. break;
  553. default:
  554. break;
  555. }
  556. return ret;
  557. }
  558. //Failed
  559. void CCardReadAdapterFSM::s4_on_entry()
  560. {
  561. LOG_FUNCTION();
  562. m_lastS2Event = m_lastS2EvtParam1 = 0;
  563. //GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_HOLD);
  564. }
  565. void CCardReadAdapterFSM::s4_on_exit()
  566. {
  567. LOG_FUNCTION();
  568. }
  569. unsigned int CCardReadAdapterFSM::s4_on_event(FSMEvent* pEvt)
  570. {
  571. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s4 evt(%d)", pEvt->iEvt);
  572. switch (pEvt->iEvt)
  573. {
  574. case USER_EVT_EXIT:
  575. {
  576. pEvt->SetHandled();
  577. DoExitTask* task = new DoExitTask(this);
  578. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  579. }
  580. break;
  581. case USER_EVT_QUIT:
  582. {
  583. pEvt->SetHandled();
  584. return 0;
  585. }
  586. case USER_EVT_SET_SOME_FLAG:
  587. {
  588. pEvt->SetHandled();
  589. SetSomeFlagEvent* ssfe = dynamic_cast<SetSomeFlagEvent*>(pEvt);
  590. SetSomeFlagTask* task = new SetSomeFlagTask(this);
  591. task->ctx = ssfe->ctx;
  592. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  593. }
  594. break;
  595. case USER_EVT_GET_DEV_INFO:
  596. {
  597. pEvt->SetHandled();
  598. GetDevInfoEvent* gdie = dynamic_cast<GetDevInfoEvent*>(pEvt);
  599. GetDevInfoTask* task = new GetDevInfoTask(this);
  600. task->ctx = gdie->ctx;
  601. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  602. }
  603. break;
  604. case USER_EVT_QUERY_CARD_INFO:
  605. {
  606. pEvt->SetHandled();
  607. QueryCardInfoEvent* qcie = dynamic_cast<QueryCardInfoEvent*>(pEvt);
  608. QueryCardInfoTask* task = new QueryCardInfoTask(this);
  609. task->ctx = qcie->ctx;
  610. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  611. }
  612. break;
  613. default:
  614. break;
  615. }
  616. return 0;
  617. }
  618. ErrorCodeEnum CCardReadAdapterFSM::OnInit()
  619. {
  620. LOG_FUNCTION();
  621. m_lastS2Event = m_lastS2EvtParam1 = 0;
  622. m_busCtx.eCardFromWhich = Card_In_No_Where;
  623. return Error_Succeed;
  624. }
  625. ErrorCodeEnum CCardReadAdapterFSM::OnExit()
  626. {
  627. LOG_FUNCTION();
  628. FSMImpl<CCardReadAdapterFSM>::OnExit();
  629. return Error_Succeed;
  630. }
  631. int CCardReadAdapterFSM::Initial()
  632. {
  633. CheckSessionTask *pTask = new CheckSessionTask(this);
  634. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  635. ErrorCodeEnum eErr;
  636. eErr = GetEntityBase()->GetFunction()->SetSysVar("CardEntityState", "E");
  637. if (eErr != Error_Succeed)
  638. {
  639. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("SetSysVar CardEntityState failed.%d",eErr);
  640. }
  641. return 0;//oiltmp no need to connect. let function "CheckAndReconnectSession" do
  642. }
  643. int CCardReadAdapterFSM::DoWork(int type)
  644. {
  645. switch (type)
  646. {
  647. case USER_EVT_READ:
  648. {
  649. }
  650. break;
  651. default:
  652. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unkown type:%d",type);
  653. break;
  654. }
  655. return 0;
  656. }
  657. int CCardReadAdapterFSM::CardIssuerRead(SpReqAnsContext<CardReadAdapterService_Read_Req, CardReadAdapterService_Read_Ans>::Pointer ctx)
  658. {
  659. LOG_FUNCTION();
  660. if (m_bCancelAccept || (m_busCtx.eCardFromWhich == Card_In_ContactlessCard))
  661. {
  662. char msg[128];
  663. memset(msg, 0, 128);
  664. sprintf(msg, "Maybe the thread pool is wrong.CardIssuerRead,bCancel:%d,cardpos:%d", m_bCancelAccept, m_busCtx.eCardFromWhich);
  665. LogWarn(Severity_Middle, Error_NotInit, CardReadAdapter_UserErrorCode_MayBe_ThreadPool_Wrong, msg);
  666. return 3;
  667. }
  668. ErrorCodeEnum eErr = Error_Unexpect;
  669. if (IsTheEntity(ctx->Req.module,Module_CardIssuer) && IsCardIssuerSessionOK())
  670. {
  671. if (!IsCardIssuerStore()) {
  672. CardIssuerStandService_QueryCardInfo_Req qciReq;
  673. CardIssuerStandService_QueryCardInfo_Ans qciAns;
  674. bool bHasCard = false, bNeedPreOnline = false, bCardMismatch = false;
  675. DWORD dwUsrErrCode = 0;
  676. CSimpleStringA csRetStr(true);
  677. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->QueryCardInfo(qciReq, qciAns, 10000, dwUsrErrCode, csRetStr);
  678. if (eErr == Error_Succeed)
  679. {
  680. if (qciAns.position == 2)//有卡
  681. {
  682. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuer has card");
  683. bHasCard = true;
  684. //oilyang@20220817 为什么要给默认值?CardIssuer->Read失败,没有必要PreOnline
  685. //bNeedPreOnline = true;//不知道卡片类型,默认
  686. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  687. if (IsContactlessCardSessionOK())
  688. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  689. }
  690. else if (qciAns.position == 1) //CardIssuer GetDevStatus 调用异常
  691. {
  692. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer GetDevStatus failed");
  693. return 1;
  694. }
  695. else
  696. {
  697. if (m_bCancelAccept)
  698. {
  699. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("before call CardIssuer->Insert, have received cancel event");
  700. return 3;
  701. }
  702. CardIssuerStandService_Insert_Req req;
  703. CardIssuerStandService_Insert_Ans ans;
  704. req.aid = ctx->Req.aid;
  705. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to call cardissuer insert..");
  706. m_busCtx.eCardProcStage = Card_ProcStage_WaitForCard;
  707. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->Insert(req, ans, 59000, dwUsrErrCode, csRetStr);
  708. if (eErr == Error_Succeed)
  709. {
  710. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Card insert into CardIssuer.");
  711. bHasCard = true;
  712. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  713. m_busCtx.eCardProcStage = Card_ProcStage_Read;
  714. if (IsContactlessCardSessionOK())
  715. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  716. }
  717. else {
  718. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuer Insert return:%d", eErr);
  719. //oilyang@20200827 if time out, we must told front caller
  720. //AND set returned value of 0 to change FSM state
  721. if (eErr == Error_TimeOut)
  722. {
  723. return 7;
  724. }
  725. else
  726. return 1;//oilyang@20190709
  727. }
  728. }
  729. if (bHasCard)
  730. {
  731. CardIssuerStandService_Read_Req reqR;
  732. CardIssuerStandService_Read_Ans ansR;
  733. reqR.aid = ctx->Req.aid;
  734. reqR.reserved1 = ctx->Req.lightPos;
  735. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("to read ctx->Req.lightPos:%d", ctx->Req.lightPos);
  736. Sleep(100);//zjw@20190725 以防卡机状态还未跳转,这里就已经触发了Read操作
  737. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->Read(reqR, ansR, 50000, dwUsrErrCode, csRetStr);
  738. if (eErr == Error_Succeed)
  739. {
  740. ctx->Ans.track1 = ansR.track1;
  741. ctx->Ans.track2 = ansR.track2;
  742. ctx->Ans.track3 = ansR.track3;
  743. ctx->Ans.ICType = ansR.ICType;
  744. ctx->Ans.ICCardNo = ansR.ICData;
  745. ctx->Ans.status = ansR.status;
  746. ///**TODO(Gifur@8/22/2023): 增加单屏机型判断,需要诗友确认*/
  747. if (m_eMachineType == SP::Module::Comm::RVC_Stand2S || m_eMachineType == SP::Module::Comm::RVC_Stand1SPlus)
  748. ctx->Ans.cardPos = CardPos_CardIssuer_Stand2S;
  749. else
  750. ctx->Ans.cardPos = CardPos_CardIssuer_Split;
  751. ctx->Ans.t2Account = ansR.t2Account;
  752. ctx->Ans.t2Region = ansR.t2Region;
  753. ctx->Ans.t2CardSerial = ansR.t2CardSerial;
  754. ctx->Ans.t2CVC = ansR.t2CVC;
  755. ctx->Ans.t2ExpireDate = ansR.t2ExpireDate;
  756. if (ansR.ICType == 1 || ansR.ICType == 3)
  757. bNeedPreOnline = true;
  758. else
  759. bNeedPreOnline = false;
  760. }
  761. else
  762. {
  763. bNeedPreOnline = false;
  764. if (eErr == Error_DevMedia)
  765. bCardMismatch = true;
  766. }
  767. }
  768. }
  769. else {
  770. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuer QueryCardInfo failed return:%d", eErr);
  771. return 1;//oilyang@20190709
  772. }
  773. if (bHasCard && bNeedPreOnline)
  774. {
  775. CardIssuerStandService_PreOnline_Req req;
  776. CardIssuerStandService_PreOnline_Ans ans;
  777. req.businessData = ctx->Req.businessData;
  778. BroadcastReadICing(0);
  779. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to preonline");
  780. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  781. if (eErr == Error_Succeed)
  782. {
  783. ctx->Ans.result = ans.result;
  784. ctx->Ans.status = 0;
  785. //oilyang@20220613 既然前面bNeedPreOnline给默认值,这里的判断也就失去了意义
  786. //if (ctx->Ans.ICType == 1 || ctx->Ans.ICType == 3)
  787. {
  788. CardIssuerStandService_SetSomeFlag_Req ssfReq;
  789. CardIssuerStandService_SetSomeFlag_Ans ssfAns;
  790. ssfReq.IssueBusiness = 4;
  791. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->SetSomeFlag(ssfReq, ssfAns, 5000, dwUsrErrCode);
  792. if (eErr == Error_Succeed)
  793. ctx->Ans.ICCardNo = ssfAns.reserved2[0];
  794. else
  795. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuer SetSomeFlag failed return:%d", eErr);
  796. }
  797. }
  798. else
  799. {
  800. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuer PreOnline failed return:%d", eErr);
  801. ctx->Ans.result = "";
  802. ctx->Ans.status = -1;
  803. }
  804. }
  805. if (bHasCard)
  806. {
  807. if (bCardMismatch)
  808. {
  809. //oiltmp@20221202 todo Error_DevNotAvailable should be changed if we have negotiated with hangzhou vtm developer
  810. ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_Account_EAC_Mismatch, csRetStr);
  811. }
  812. else
  813. {
  814. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadCard, the final errCode:%d,status:%d,dwUsrErrCode:%d", eErr, ctx->Ans.status, dwUsrErrCode);
  815. Sleep(300);//oilyang@20230202 for hardware entity to trans FSM state
  816. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  817. }
  818. }
  819. return 0;
  820. }
  821. else {
  822. CardIssuerStoreService_QueryCardInfo_Req qciReq;
  823. CardIssuerStoreService_QueryCardInfo_Ans qciAns;
  824. bool bHasCard = false, bNeedPreOnline = false, bCardMismatch = false;
  825. DWORD dwUsrErrCode = 0;
  826. CSimpleStringA csRetStr(true);
  827. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QueryCardInfo(qciReq, qciAns, 10000, dwUsrErrCode, csRetStr);
  828. if (eErr == Error_Succeed)
  829. {
  830. if (qciAns.position == 2)//有卡
  831. {
  832. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore has card");
  833. bHasCard = true;
  834. //oilyang@20220817 为什么要给默认值?CardIssuer->Read失败,没有必要PreOnline
  835. //bNeedPreOnline = true;//不知道卡片类型,默认
  836. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  837. if (IsContactlessCardSessionOK())
  838. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  839. }
  840. else if (qciAns.position == 1) //CardIssuer GetDevStatus 调用异常
  841. {
  842. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuerStore GetDevStatus failed");
  843. return 1;
  844. }
  845. else
  846. {
  847. if (m_bCancelAccept)
  848. {
  849. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("before call CardIssuerStore->Insert, have received cancel event");
  850. return 3;
  851. }
  852. CardIssuerStoreService_Insert_Req req;
  853. CardIssuerStoreService_Insert_Ans ans;
  854. req.aid = ctx->Req.aid;
  855. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to call cardissuerStore insert..");
  856. m_busCtx.eCardProcStage = Card_ProcStage_WaitForCard;
  857. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->Insert(req, ans, 59000, dwUsrErrCode, csRetStr);
  858. if (eErr == Error_Succeed)
  859. {
  860. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Card insert into CardIssuerStore.");
  861. bHasCard = true;
  862. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  863. m_busCtx.eCardProcStage = Card_ProcStage_Read;
  864. if (IsContactlessCardSessionOK())
  865. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  866. }
  867. else {
  868. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuerStore Insert return:%d", eErr);
  869. //oilyang@20200827 if time out, we must told front caller
  870. //AND set returned value of 0 to change FSM state
  871. if (eErr == Error_TimeOut)
  872. {
  873. return 7;
  874. }
  875. else
  876. return 1;//oilyang@20190709
  877. }
  878. }
  879. if (bHasCard)
  880. {
  881. CardIssuerStoreService_Read_Req reqR;
  882. CardIssuerStoreService_Read_Ans ansR;
  883. reqR.aid = ctx->Req.aid;
  884. reqR.reserved1 = ctx->Req.lightPos;
  885. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("to read ctx->Req.lightPos:%d", ctx->Req.lightPos);
  886. Sleep(100);//zjw@20190725 以防卡机状态还未跳转,这里就已经触发了Read操作
  887. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->Read(reqR, ansR, 50000, dwUsrErrCode, csRetStr);
  888. if (eErr == Error_Succeed)
  889. {
  890. ctx->Ans.track1 = ansR.track1;
  891. ctx->Ans.track2 = ansR.track2;
  892. ctx->Ans.track3 = ansR.track3;
  893. ctx->Ans.ICType = ansR.ICType;
  894. ctx->Ans.ICCardNo = ansR.ICData;
  895. ctx->Ans.status = ansR.status;
  896. ///**TODO(Gifur@8/22/2023): 增加单屏机型判断,需要诗友确认*/
  897. if (m_eMachineType == SP::Module::Comm::RVC_Stand2S || m_eMachineType == SP::Module::Comm::RVC_Stand1SPlus)
  898. ctx->Ans.cardPos = CardPos_CardIssuer_Stand2S;
  899. else
  900. ctx->Ans.cardPos = CardPos_CardIssuer_Split;
  901. ctx->Ans.t2Account = ansR.t2Account;
  902. ctx->Ans.t2Region = ansR.t2Region;
  903. ctx->Ans.t2CardSerial = ansR.t2CardSerial;
  904. ctx->Ans.t2CVC = ansR.t2CVC;
  905. ctx->Ans.t2ExpireDate = ansR.t2ExpireDate;
  906. if (ansR.ICType == 1 || ansR.ICType == 3)
  907. bNeedPreOnline = true;
  908. else
  909. bNeedPreOnline = false;
  910. }
  911. else
  912. {
  913. bNeedPreOnline = false;
  914. if (eErr == Error_DevMedia)
  915. bCardMismatch = true;
  916. }
  917. }
  918. }
  919. else {
  920. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuerStore QueryCardInfo failed return:%d", eErr);
  921. return 1;//oilyang@20190709
  922. }
  923. if (bHasCard && bNeedPreOnline)
  924. {
  925. CardIssuerStoreService_PreOnline_Req req;
  926. CardIssuerStoreService_PreOnline_Ans ans;
  927. req.businessData = ctx->Req.businessData;
  928. BroadcastReadICing(0);
  929. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to preonline");
  930. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  931. if (eErr == Error_Succeed)
  932. {
  933. ctx->Ans.result = ans.result;
  934. ctx->Ans.status = 0;
  935. //oilyang@20220613 既然前面bNeedPreOnline给默认值,这里的判断也就失去了意义
  936. //if (ctx->Ans.ICType == 1 || ctx->Ans.ICType == 3)
  937. {
  938. CardIssuerStoreService_SetSomeFlag_Req ssfReq;
  939. CardIssuerStoreService_SetSomeFlag_Ans ssfAns;
  940. ssfReq.IssueBusiness = 4;
  941. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->SetSomeFlag(ssfReq, ssfAns, 5000, dwUsrErrCode);
  942. if (eErr == Error_Succeed)
  943. ctx->Ans.ICCardNo = ssfAns.reserved2[0];
  944. else
  945. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuerStore SetSomeFlag failed return:%d", eErr);
  946. }
  947. }
  948. else
  949. {
  950. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("CardIssuerStore PreOnline failed return:%d", eErr);
  951. ctx->Ans.result = "";
  952. ctx->Ans.status = -1;
  953. }
  954. }
  955. if (bHasCard)
  956. {
  957. if (bCardMismatch)
  958. {
  959. //oiltmp@20221202 todo Error_DevNotAvailable should be changed if we have negotiated with hangzhou vtm developer
  960. ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_Account_EAC_Mismatch, csRetStr);
  961. }
  962. else
  963. {
  964. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadCard, the final errCode:%d,status:%d,dwUsrErrCode:%d", eErr, ctx->Ans.status, dwUsrErrCode);
  965. Sleep(300);//oilyang@20230202 for hardware entity to trans FSM state
  966. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  967. }
  968. }
  969. return 0;
  970. }
  971. }
  972. return 1;
  973. }
  974. int CCardReadAdapterFSM::ContactlessCardRead(SpReqAnsContext<CardReadAdapterService_Read_Req, CardReadAdapterService_Read_Ans>::Pointer ctx)
  975. {
  976. LOG_FUNCTION();
  977. if (m_bCancelAccept || (m_busCtx.eCardFromWhich == Card_In_CardIssuer))
  978. {
  979. char msg[128];
  980. memset(msg, 0, 128);
  981. sprintf(msg, "Maybe the thread pool is wrong.ContactlessCardRead,bCancel:%d,cardpos:%d", m_bCancelAccept, m_busCtx.eCardFromWhich);
  982. //oilyang@20220917 发卡时,处于持卡状态,属于误判,然而精准的区分也不容易,暂时这么处理
  983. //LogWarn(Severity_Middle, Error_NotInit, CardReadAdapter_UserErrorCode_MayBe_ThreadPool_Wrong, msg);
  984. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(msg);
  985. return 3;
  986. }
  987. ErrorCodeEnum eErr = Error_Unexpect;
  988. DWORD elapsed = 0;
  989. DWORD dwStart = GetTickCountRVC();
  990. DWORD dwEnd = GetTickCountRVC();
  991. while(elapsed + ReadCard_Min_Time < ReadCard_TIMEOUT)
  992. {
  993. if (IsTheEntity(ctx->Req.module, Module_ContactlessCard) && IsContactlessCardSessionOK())
  994. {
  995. bool bFindCard = false;
  996. ContactlessCardService_Insert_Req req;
  997. ContactlessCardService_Insert_Ans ans;
  998. DWORD dwUserCode = 0;
  999. req.aid = ctx->Req.aid;
  1000. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to call contactless insert...");
  1001. dwEnd = GetTickCountRVC();
  1002. DWORD dwTimeout = ReadCard_TIMEOUT - (dwEnd-dwStart);
  1003. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1004. m_busCtx.eCardProcStage = Card_ProcStage_WaitForCard;
  1005. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->Insert(req, ans, dwTimeout, dwUserCode);
  1006. if (eErr == Error_Succeed)
  1007. {
  1008. ctx->Ans.track1 = ans.track1;
  1009. ctx->Ans.track2 = ans.track2;
  1010. ctx->Ans.track3 = ans.track3;
  1011. ctx->Ans.ICType = ans.ICType;
  1012. ctx->Ans.ICCardNo = ans.ICData;
  1013. ctx->Ans.status = ans.status;
  1014. ctx->Ans.cardPos = CardPos_ContactlessCard;
  1015. ctx->Ans.t2Account = ans.t2Account;
  1016. ctx->Ans.t2Region = ans.t2Region;
  1017. ctx->Ans.t2CardSerial = ans.t2CardSerial;
  1018. ctx->Ans.t2CVC = ans.t2CVC;
  1019. ctx->Ans.t2ExpireDate = ans.t2ExpireDate;
  1020. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Card in ContactlessCard.");
  1021. m_busCtx.eCardFromWhich = Card_In_ContactlessCard;
  1022. m_busCtx.eCardProcStage = Card_ProcStage_Read;
  1023. //if (IsCardIssuerSessionOK()){
  1024. // (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->CancelInsert();
  1025. //}
  1026. if (ans.ICType == 4)
  1027. {
  1028. bFindCard = true;
  1029. }else{
  1030. return 0;
  1031. }
  1032. }
  1033. else if (eErr == Error_TimeOut)
  1034. {
  1035. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ContactlessCard timeout.");
  1036. return 8;
  1037. }else if(eErr == Error_Cancel){
  1038. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ContactlessCard canceled or be canceled.");
  1039. return 1;
  1040. }
  1041. else if(eErr == Error_Interact){
  1042. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("maybe ICCommand error, need loop!!!");
  1043. dwEnd = GetTickCountRVC();
  1044. elapsed = dwEnd - dwStart;
  1045. Sleep(200);
  1046. continue;
  1047. }
  1048. else if(eErr == Error_DevNotAvailable || eErr == Error_InvalidState)//设备不可用或实体异常
  1049. {
  1050. //ctx->Answer(eErr, dwUserCode);
  1051. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("ContactlessCard read failed(%d)(%d)", eErr, dwUserCode));
  1052. return 1;
  1053. }else if(eErr == Error_Unexpect){
  1054. ctx->Answer(eErr, dwUserCode);
  1055. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("ContactlessCard read failed(%d)(%d)", eErr, dwUserCode));
  1056. return 2;
  1057. }
  1058. if (bFindCard)
  1059. {
  1060. //oilyang@20210223 add,The Entity FSM is too late to change state ,as the call coming so fast
  1061. Sleep(100);
  1062. dwEnd = GetTickCountRVC();
  1063. DWORD elapsed1 = ReadCard_TIMEOUT - (dwEnd-dwStart);
  1064. if(elapsed1 < 5000)//PreOnline较慢,预留一定时间
  1065. {
  1066. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("There is no more time to invoke PreOnline");
  1067. ctx->Ans.result = "";
  1068. return 8;
  1069. }
  1070. ContactlessCardService_PreOnline_Req req;
  1071. ContactlessCardService_PreOnline_Ans ans;
  1072. req.businessData = ctx->Req.businessData;
  1073. BroadcastReadICing(0);
  1074. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 50000);
  1075. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("ContacelssCard PreOnline result:%d", eErr));
  1076. if (eErr == Error_Succeed)
  1077. {
  1078. ctx->Ans.result = ans.result;
  1079. ctx->Ans.status = 0;
  1080. }else if(eErr == Error_Interact){
  1081. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ContacelssCard return Error_Interact, need loop.");
  1082. dwEnd = GetTickCountRVC();
  1083. elapsed = dwEnd - dwStart;
  1084. Sleep(200);
  1085. continue;
  1086. }
  1087. else
  1088. {
  1089. ctx->Ans.result = "";
  1090. ctx->Ans.status = -1;
  1091. }
  1092. ctx->Answer(eErr);
  1093. return 0;
  1094. }
  1095. //ctx->Answer(eErr);
  1096. }else{
  1097. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("can't find the corresponding Entity.req.Module:%d", ctx->Req.module));
  1098. return 0;
  1099. }
  1100. }
  1101. return 8;
  1102. }
  1103. int CCardReadAdapterFSM::IssueCard(SpReqAnsContext<CardReadAdapterService_Issue_Req, CardReadAdapterService_Issue_Ans>::Pointer ctx)
  1104. {
  1105. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK())
  1106. {
  1107. if (!IsCardIssuerStore()) {
  1108. ErrorCodeEnum eErr = Error_Unexpect;
  1109. CardIssuerStandService_IssueEx_Req req;
  1110. CardIssuerStandService_IssueEx_Ans ans;
  1111. req.hopper = ctx->Req.hopper;
  1112. req.reserved1.Copy(ctx->Req.reserved1);
  1113. req.reserved2.Copy(ctx->Req.reserved2);
  1114. DWORD dwUsrErrCode = 0;
  1115. CSimpleStringA csRetStr(true);
  1116. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->IssueEx(req, ans, 60000, dwUsrErrCode, csRetStr);
  1117. if (eErr == Error_Succeed)
  1118. {
  1119. if (ans.reserved1.GetCount() > 0)
  1120. ctx->Ans.reserved1.Copy(ans.reserved1);
  1121. if (ans.reserved2.GetCount() > 0)
  1122. ctx->Ans.reserved2.Copy(ans.reserved2);
  1123. // --Josephus at 11:09:47 201747
  1124. //oilyang@20180315 kaku
  1125. //if(m_busCtx.eCardFromWhich == Card_In_No_Where)
  1126. if (req.hopper == 99 || req.hopper == 98 || req.hopper == 89)
  1127. {
  1128. if (ans.reserved1[0] == 0 && ans.reserved1[1] == 0)
  1129. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  1130. }
  1131. else if (req.hopper == 88 || req.hopper == 87)
  1132. {
  1133. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1134. }
  1135. else
  1136. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  1137. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("req.hopper:%d Deem that CardIssuer has card after issuing succ. Set busCtx:findCard:%d,cardPos:%d"
  1138. , req.hopper, ans.reserved1[0], ans.reserved1[1]);
  1139. }
  1140. else {
  1141. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer IssueCard failed return:%d", eErr);
  1142. }
  1143. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest IssueEx retStr:%s", csRetStr.GetData());
  1144. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1145. return 0;
  1146. }
  1147. else {
  1148. ErrorCodeEnum eErr = Error_Unexpect;
  1149. CardIssuerStoreService_IssueEx_Req req;
  1150. CardIssuerStoreService_IssueEx_Ans ans;
  1151. req.hopper = ctx->Req.hopper;
  1152. req.reserved1.Copy(ctx->Req.reserved1);
  1153. req.reserved2.Copy(ctx->Req.reserved2);
  1154. DWORD dwUsrErrCode = 0;
  1155. CSimpleStringA csRetStr(true);
  1156. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->IssueEx(req, ans, 60000, dwUsrErrCode, csRetStr);
  1157. if (eErr == Error_Succeed)
  1158. {
  1159. if (ans.reserved1.GetCount() > 0)
  1160. ctx->Ans.reserved1.Copy(ans.reserved1);
  1161. if (ans.reserved2.GetCount() > 0)
  1162. ctx->Ans.reserved2.Copy(ans.reserved2);
  1163. // --Josephus at 11:09:47 201747
  1164. //oilyang@20180315 kaku
  1165. //if(m_busCtx.eCardFromWhich == Card_In_No_Where)
  1166. if (req.hopper == 99 || req.hopper == 98 || req.hopper == 89)
  1167. {
  1168. if (ans.reserved1[0] == 0 && ans.reserved1[1] == 0)
  1169. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  1170. }
  1171. else if (req.hopper == 88 || req.hopper == 87)
  1172. {
  1173. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1174. }
  1175. else
  1176. m_busCtx.eCardFromWhich = Card_In_CardIssuer;
  1177. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("req.hopper:%d Deem that CardIssuerStore has card after issuing succ. Set busCtx:findCard:%d,cardPos:%d"
  1178. , req.hopper, ans.reserved1[0], ans.reserved1[1]);
  1179. }
  1180. else {
  1181. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuerStore IssueCard failed return:%d", eErr);
  1182. }
  1183. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest IssueEx retStr:%s", csRetStr.GetData());
  1184. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1185. return 0;
  1186. }
  1187. }
  1188. else
  1189. {
  1190. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("issue card param error or connection is failed:(module)%d",ctx->Req.module);
  1191. ctx->Answer(Error_Param);
  1192. return 1;
  1193. }
  1194. }
  1195. void CCardReadAdapterFSM::CancelRead()
  1196. {
  1197. ErrorCodeEnum eErr = Error_Unexpect;
  1198. if (IsCardIssuerSessionOK())
  1199. {
  1200. if (!IsCardIssuerStore()) {
  1201. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("CardIssuer read canceled by front user.");
  1202. (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->CancelInsert();
  1203. }
  1204. else {
  1205. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("CardIssuerStore read canceled by front user.");
  1206. (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->CancelInsert();
  1207. }
  1208. }
  1209. if (IsContactlessCardSessionOK())
  1210. {
  1211. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("ContactlessCard read canceled by front user.");
  1212. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  1213. }
  1214. }
  1215. void CCardReadAdapterFSM::ReadWaitMore()
  1216. {
  1217. ErrorCodeEnum eErr = Error_Unexpect;
  1218. if (IsCardIssuerSessionOK())
  1219. {
  1220. if (!IsCardIssuerStore()) {
  1221. (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->InsertWaitMore();
  1222. }
  1223. else {
  1224. (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->InsertWaitMore();
  1225. }
  1226. }
  1227. if (IsContactlessCardSessionOK())
  1228. {
  1229. (*m_pContactless)(EntityResource::getLink().upgradeLink())->InsertWaitMore();
  1230. }
  1231. }
  1232. int CCardReadAdapterFSM::WriteTrack(SpReqAnsContext<CardReadAdapterService_WriteTrack_Req, CardReadAdapterService_WriteTrack_Ans>::Pointer ctx)
  1233. {
  1234. LOG_FUNCTION();
  1235. if (IsCardIssuerSessionOK())
  1236. {
  1237. if (!IsCardIssuerStore()) {
  1238. CardIssuerStandService_WriteTrack_Req req;
  1239. CardIssuerStandService_WriteTrack_Ans ans;
  1240. req.co = ctx->Req.co;
  1241. req.mode = ctx->Req.mode;
  1242. req.track1 = ctx->Req.track1;
  1243. req.track2 = ctx->Req.track2;
  1244. req.track3 = ctx->Req.track3;
  1245. req.reserved = ctx->Req.reserved;
  1246. ErrorCodeEnum eErr = Error_Unexpect;
  1247. DWORD dwUsrErrCode = 0;
  1248. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->WriteTrack(req, ans, 20000, dwUsrErrCode);
  1249. if (eErr != Error_Succeed)
  1250. {
  1251. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("WriteTrack failed.%d", eErr);
  1252. ctx->Answer(eErr, dwUsrErrCode);
  1253. }
  1254. else
  1255. {
  1256. ctx->Ans.result = ans.result;
  1257. ctx->Ans.reserved1 = ans.reserved1;
  1258. ctx->Ans.reserved2 = ans.reserved2;
  1259. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("Write tracks ok.");
  1260. ctx->Answer(Error_Succeed);
  1261. }
  1262. }
  1263. else {
  1264. CardIssuerStoreService_WriteTrack_Req req;
  1265. CardIssuerStoreService_WriteTrack_Ans ans;
  1266. req.co = ctx->Req.co;
  1267. req.mode = ctx->Req.mode;
  1268. req.track1 = ctx->Req.track1;
  1269. req.track2 = ctx->Req.track2;
  1270. req.track3 = ctx->Req.track3;
  1271. req.reserved = ctx->Req.reserved;
  1272. ErrorCodeEnum eErr = Error_Unexpect;
  1273. DWORD dwUsrErrCode = 0;
  1274. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->WriteTrack(req, ans, 20000, dwUsrErrCode);
  1275. if (eErr != Error_Succeed)
  1276. {
  1277. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("WriteTrack failed.%d", eErr);
  1278. ctx->Answer(eErr, dwUsrErrCode);
  1279. }
  1280. else
  1281. {
  1282. ctx->Ans.result = ans.result;
  1283. ctx->Ans.reserved1 = ans.reserved1;
  1284. ctx->Ans.reserved2 = ans.reserved2;
  1285. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("Write tracks ok.");
  1286. ctx->Answer(Error_Succeed);
  1287. }
  1288. }
  1289. }
  1290. return 0;
  1291. }
  1292. int CCardReadAdapterFSM::PreOnline(SpReqAnsContext<CardReadAdapterService_PreOnline_Req, CardReadAdapterService_PreOnline_Ans>::Pointer ctx)
  1293. {
  1294. LOG_FUNCTION();
  1295. ErrorCodeEnum eErr = Error_Unexpect;
  1296. DWORD dwUsrErrCode = 0;
  1297. CSimpleStringA csRetStr(true);
  1298. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK())
  1299. {
  1300. if (!IsCardIssuerStore()) {
  1301. CardIssuerStandService_PreOnline_Req req;
  1302. CardIssuerStandService_PreOnline_Ans ans;
  1303. req.businessData = ctx->Req.businessData;
  1304. if (!ctx->Req.reserved2[0].IsNullOrEmpty())
  1305. req.reserved1 = ctx->Req.reserved2[0];
  1306. else
  1307. req.reserved1 = "";
  1308. if (!ctx->Req.reserved2[1].IsNullOrEmpty())
  1309. req.reserved2 = ctx->Req.reserved2[1];
  1310. else
  1311. req.reserved2 = "";
  1312. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  1313. if (eErr == Error_Succeed)
  1314. {
  1315. ctx->Ans.result = ans.result;
  1316. }
  1317. else {
  1318. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PreOnline, CardIssuer PreOnline failed return:%d", eErr);
  1319. }
  1320. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1321. }
  1322. else {
  1323. CardIssuerStoreService_PreOnline_Req req;
  1324. CardIssuerStoreService_PreOnline_Ans ans;
  1325. req.businessData = ctx->Req.businessData;
  1326. if (!ctx->Req.reserved2[0].IsNullOrEmpty())
  1327. req.reserved1 = ctx->Req.reserved2[0];
  1328. else
  1329. req.reserved1 = "";
  1330. if (!ctx->Req.reserved2[1].IsNullOrEmpty())
  1331. req.reserved2 = ctx->Req.reserved2[1];
  1332. else
  1333. req.reserved2 = "";
  1334. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  1335. if (eErr == Error_Succeed)
  1336. {
  1337. ctx->Ans.result = ans.result;
  1338. }
  1339. else {
  1340. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PreOnline, CardIssuerStore PreOnline failed return:%d", eErr);
  1341. }
  1342. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1343. }
  1344. }
  1345. else if (IsTheEntity(ctx->Req.module, Module_ContactlessCard) && IsContactlessCardSessionOK() && m_busCtx.eCardFromWhich == Card_In_ContactlessCard)
  1346. {
  1347. ContactlessCardService_PreOnline_Req req;
  1348. ContactlessCardService_PreOnline_Ans ans;
  1349. req.businessData = ctx->Req.businessData;
  1350. //req.reserved1 = ctx->Req.reserved1;
  1351. //req.reserved2 = ctx->Req.reserved2;
  1352. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  1353. if (eErr == Error_Succeed)
  1354. {
  1355. ctx->Ans.result = ans.result;
  1356. }
  1357. else {
  1358. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("PreOnline, ContactlessCard PreOnline failed return:%d", eErr));
  1359. }
  1360. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1361. }
  1362. return 0;
  1363. }
  1364. int CCardReadAdapterFSM::PostOnline(SpReqAnsContext<CardReadAdapterService_PostOnline_Req, CardReadAdapterService_PostOnline_Ans>::Pointer ctx)
  1365. {
  1366. LOG_FUNCTION();
  1367. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("<PostOnline>, ctx->Req.module:%d,cardIn(Iss 1,RF 2):%d", ctx->Req.module, m_busCtx.eCardFromWhich);
  1368. ErrorCodeEnum eErr = Error_Unexpect;
  1369. DWORD dwUsrErrCode = 0;
  1370. CSimpleStringA csRetStr(true);
  1371. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK() && m_busCtx.eCardFromWhich == Card_In_CardIssuer)
  1372. {
  1373. if (!IsCardIssuerStore()) {
  1374. CardIssuerStandService_PostOnline_Req req;
  1375. CardIssuerStandService_PostOnline_Ans ans;
  1376. req.data = ctx->Req.data;
  1377. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->PostOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  1378. if (eErr == Error_Succeed)
  1379. {
  1380. ctx->Ans.result = ans.result;
  1381. }
  1382. else {
  1383. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("PostOnline, CardIssuer PostOnline failed return:%d", eErr);
  1384. }
  1385. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1386. }
  1387. else {
  1388. CardIssuerStoreService_PostOnline_Req req;
  1389. CardIssuerStoreService_PostOnline_Ans ans;
  1390. req.data = ctx->Req.data;
  1391. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->PostOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  1392. if (eErr == Error_Succeed)
  1393. {
  1394. ctx->Ans.result = ans.result;
  1395. }
  1396. else {
  1397. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("PostOnline, CardIssuerStore PostOnline failed return:%d", eErr);
  1398. }
  1399. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1400. }
  1401. }
  1402. else if (IsTheEntity(ctx->Req.module, Module_ContactlessCard) && IsContactlessCardSessionOK() && m_busCtx.eCardFromWhich == Card_In_ContactlessCard)
  1403. {
  1404. ContactlessCardService_PostOnline_Req req;
  1405. ContactlessCardService_PostOnline_Ans ans;
  1406. req.data = ctx->Req.data;
  1407. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->PostOnline(req, ans, 50000, dwUsrErrCode, csRetStr);
  1408. if (eErr == Error_Succeed)
  1409. {
  1410. ctx->Ans.result = ans.result;
  1411. }
  1412. else {
  1413. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("PostOnline, ContactlessCard PostOnline failed return:%d", eErr);
  1414. }
  1415. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1416. }
  1417. return 0;
  1418. }
  1419. int CCardReadAdapterFSM::EjectCard(SpReqAnsContext<CardReadAdapterService_Eject_Req, CardReadAdapterService_Eject_Ans>::Pointer ctx)
  1420. {
  1421. LOG_FUNCTION();
  1422. Sleep(100);//oilyang@20230202 for hardware entity to trans FSM state
  1423. ErrorCodeEnum eErr = Error_Unexpect;
  1424. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before eject card,req.module %d,card in %d", ctx->Req.module,m_busCtx.eCardFromWhich);
  1425. DWORD dwUsrErrCode = 0;
  1426. CSimpleStringA csRetStr(true);
  1427. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK() && m_busCtx.eCardFromWhich == Card_In_CardIssuer)
  1428. {
  1429. if (!IsCardIssuerStore()) {
  1430. CardIssuerStandService_Eject_Req req;
  1431. CardIssuerStandService_Eject_Ans ans;
  1432. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->Eject(req, ans, 50000, dwUsrErrCode, csRetStr);
  1433. if (eErr == Error_Succeed)
  1434. {
  1435. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1436. m_busCtx.eCardProcStage = Card_ProcStage_Eject;
  1437. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CardIssuer EjectCard suc.");
  1438. }
  1439. else {
  1440. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectCard, CardIssuer EjectCard failed return:%d", eErr);
  1441. }
  1442. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1443. }
  1444. else {
  1445. CardIssuerStoreService_Eject_Req req;
  1446. CardIssuerStoreService_Eject_Ans ans;
  1447. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->Eject(req, ans, 50000, dwUsrErrCode, csRetStr);
  1448. if (eErr == Error_Succeed)
  1449. {
  1450. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1451. m_busCtx.eCardProcStage = Card_ProcStage_Eject;
  1452. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CardIssuerStore EjectCard suc.");
  1453. }
  1454. else {
  1455. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectCard, CardIssuerStore EjectCard failed return:%d", eErr);
  1456. }
  1457. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1458. }
  1459. }
  1460. else if (IsTheEntity(ctx->Req.module, Module_ContactlessCard) && IsContactlessCardSessionOK() && m_busCtx.eCardFromWhich == Card_In_ContactlessCard)
  1461. {
  1462. ContactlessCardService_Eject_Req req;
  1463. ContactlessCardService_Eject_Ans ans;
  1464. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->Eject(req, ans, 50000, dwUsrErrCode, csRetStr);
  1465. if (eErr == Error_Succeed)
  1466. {
  1467. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1468. m_busCtx.eCardProcStage = Card_ProcStage_Eject;
  1469. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ContactlessCard EjectCard suc.");
  1470. }
  1471. else {
  1472. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectCard, ContactlessCard EjectCard failed return:%d", eErr);
  1473. }
  1474. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1475. }
  1476. else
  1477. {
  1478. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("EjectCard, nothing to do.");
  1479. ctx->Answer(Error_NotExist);
  1480. }
  1481. return 0;
  1482. }
  1483. int CCardReadAdapterFSM::CaptureCard(SpReqAnsContext<CardReadAdapterService_Capture_Req, CardReadAdapterService_Capture_Ans>::Pointer ctx)
  1484. {
  1485. LOG_FUNCTION();
  1486. Sleep(100);//oilyang@20230202 for hardware entity to trans FSM state
  1487. ErrorCodeEnum eErr = Error_Unexpect;
  1488. DWORD dwUsrErrCode = 0;
  1489. CSimpleStringA csRetStr(true);
  1490. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK() && m_busCtx.eCardFromWhich == Card_In_CardIssuer)
  1491. {
  1492. if (!IsCardIssuerStore()) {
  1493. CardIssuerStandService_Capture_Req req;
  1494. CardIssuerStandService_Capture_Ans ans;
  1495. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->Capture(req, ans, 15000, dwUsrErrCode, csRetStr);
  1496. if (eErr == Error_Succeed)
  1497. {
  1498. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuer Capture card suc.");
  1499. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1500. m_busCtx.eCardProcStage = Card_ProcStage_Capture;
  1501. }
  1502. else {
  1503. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureCard, CardIssuer Capture failed return:%d", eErr);
  1504. }
  1505. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1506. }
  1507. else {
  1508. CardIssuerStoreService_Capture_Req req;
  1509. CardIssuerStoreService_Capture_Ans ans;
  1510. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->Capture(req, ans, 15000, dwUsrErrCode, csRetStr);
  1511. if (eErr == Error_Succeed)
  1512. {
  1513. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore Capture card suc.");
  1514. m_busCtx.eCardFromWhich = Card_In_No_Where;
  1515. m_busCtx.eCardProcStage = Card_ProcStage_Capture;
  1516. }
  1517. else {
  1518. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureCard, CardIssuerStore Capture failed return:%d", eErr);
  1519. }
  1520. ctx->Answer(eErr, dwUsrErrCode, csRetStr);
  1521. }
  1522. }
  1523. else
  1524. {
  1525. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureCard, Something wrong.the module(%d),cardinwhere(%d)", ctx->Req.module, m_busCtx.eCardFromWhich);
  1526. ctx->Answer(eErr);
  1527. }
  1528. return 0;
  1529. }
  1530. int CCardReadAdapterFSM::QueryCardInfo(SpReqAnsContext<CardReadAdapterService_QueryCardInfo_Req, CardReadAdapterService_QueryCardInfo_Ans>::Pointer ctx)
  1531. {
  1532. ErrorCodeEnum eErr = Error_Unexpect;
  1533. DWORD dwUsrErrCode = 0;
  1534. ctx->Ans.CardIssuerPos = ctx->Ans.ContactlessCardPos = ctx->Ans.CardSwiperPos = 0;
  1535. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK() && m_busCtx.eCardFromWhich == Card_In_CardIssuer)
  1536. {
  1537. if (!IsCardIssuerStore()) {
  1538. CardIssuerStandService_QueryCardInfo_Req req;
  1539. CardIssuerStandService_QueryCardInfo_Ans ans;
  1540. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->QueryCardInfo(req, ans, 10000, dwUsrErrCode);
  1541. if (eErr == Error_Succeed)
  1542. {
  1543. switch (ans.position)
  1544. {
  1545. case 1:
  1546. ctx->Ans.CardIssuerPos = -1;
  1547. break;
  1548. case 2:
  1549. ctx->Ans.CardIssuerPos = 1;
  1550. break;
  1551. default:
  1552. break;
  1553. }
  1554. }
  1555. else {
  1556. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryCardInfo, CardIssuer QueryCardInfo failed return:%d", eErr);
  1557. }
  1558. }
  1559. else {
  1560. CardIssuerStoreService_QueryCardInfo_Req req;
  1561. CardIssuerStoreService_QueryCardInfo_Ans ans;
  1562. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QueryCardInfo(req, ans, 10000, dwUsrErrCode);
  1563. if (eErr == Error_Succeed)
  1564. {
  1565. switch (ans.position)
  1566. {
  1567. case 1:
  1568. ctx->Ans.CardIssuerPos = -1;
  1569. break;
  1570. case 2:
  1571. ctx->Ans.CardIssuerPos = 1;
  1572. break;
  1573. default:
  1574. break;
  1575. }
  1576. }
  1577. else {
  1578. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryCardInfo, CardIssuerStore QueryCardInfo failed return:%d", eErr);
  1579. }
  1580. }
  1581. }
  1582. if (IsTheEntity(ctx->Req.module, Module_ContactlessCard) && IsContactlessCardSessionOK() && m_busCtx.eCardFromWhich == Card_In_ContactlessCard)
  1583. {
  1584. ContactlessCardService_QueryCardInfo_Req req;
  1585. ContactlessCardService_QueryCardInfo_Ans ans;
  1586. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->QueryCardInfo(req, ans, 10000, dwUsrErrCode);
  1587. if (eErr == Error_Succeed)
  1588. {
  1589. switch (ans.position)//oiltmp to add
  1590. {
  1591. case 2:
  1592. break;
  1593. case 3:
  1594. break;
  1595. case 4:
  1596. ctx->Ans.ContactlessCardPos = 1;
  1597. break;
  1598. default:
  1599. break;
  1600. }
  1601. }
  1602. else {
  1603. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryCardInfo, ContactlessCard QueryCardInfo failed return:%d", eErr);
  1604. ctx->Ans.ContactlessCardPos = -1;
  1605. }
  1606. }
  1607. ctx->Answer(Error_Succeed);
  1608. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("<QueryCardInfo>, CardFromWhich:%d, position(CI,CC,CS) %d,%d,%d",
  1609. m_busCtx.eCardFromWhich, ctx->Ans.CardIssuerPos, ctx->Ans.ContactlessCardPos, ctx->Ans.CardSwiperPos);
  1610. return 0;
  1611. }
  1612. void CCardReadAdapterFSM::CheckAndReconnectSession()
  1613. {
  1614. ErrorCodeEnum eErr = Error_Unexpect;
  1615. int cardIssuerCount = 0, contactlessCardCount = 0;
  1616. while (1)
  1617. {
  1618. //the first time to connect or need to reconnect
  1619. //CardIssuer 分为卡机和卡库
  1620. if (!IsCardIssuerStore()) {
  1621. if ((m_pCardIssuer == NULL || (m_pCardIssuer != NULL && m_pCardIssuer->QuerySessionClosed())))
  1622. {
  1623. if (m_pCardIssuer != NULL)
  1624. {
  1625. m_pCardIssuer->GetFunction()->CloseSession();
  1626. m_pCardIssuer = NULL;
  1627. }
  1628. m_pCardIssuer = new CardIssuerStandService_ClientBase(GetEntityBase());
  1629. if (m_pCardIssuer != NULL)
  1630. {
  1631. eErr = m_pCardIssuer->Connect();
  1632. if (eErr != Error_Succeed)
  1633. {
  1634. if (cardIssuerCount % 120 == 0)//about 10 minutes can't connect to entity
  1635. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to entity CardIssuer failed.%d", eErr);
  1636. cardIssuerCount++;
  1637. m_pCardIssuer->SafeDelete();
  1638. m_pCardIssuer = NULL;
  1639. }
  1640. else
  1641. {
  1642. cardIssuerCount = 0;
  1643. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Connect to entity CardIssuer suc.");
  1644. }
  1645. }
  1646. }
  1647. }
  1648. else {
  1649. //CardIssuerStore
  1650. if ((m_pCardIssuerStore == NULL || (m_pCardIssuerStore != NULL && m_pCardIssuerStore->QuerySessionClosed())))
  1651. {
  1652. if (m_pCardIssuerStore != NULL)
  1653. {
  1654. m_pCardIssuerStore->GetFunction()->CloseSession();
  1655. m_pCardIssuerStore = NULL;
  1656. }
  1657. m_pCardIssuerStore = new CardIssuerStoreService_ClientBase(GetEntityBase());
  1658. if (m_pCardIssuerStore != NULL)
  1659. {
  1660. eErr = m_pCardIssuerStore->Connect();
  1661. if (eErr != Error_Succeed)
  1662. {
  1663. if (cardIssuerCount % 120 == 0)//about 10 minutes can't connect to entity
  1664. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to entity CardIssuerStore failed.%d", eErr);
  1665. cardIssuerCount++;
  1666. m_pCardIssuerStore->SafeDelete();
  1667. m_pCardIssuerStore = NULL;
  1668. }
  1669. else
  1670. {
  1671. cardIssuerCount = 0;
  1672. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Connect to entity CardIssuerStore suc.");
  1673. }
  1674. }
  1675. }
  1676. }
  1677. //ContactlessCard
  1678. if ((m_eMachineType != SP::Module::Comm::RVC_CardStore && m_eMachineType != SP::Module::Comm::RVC_CardPrinter)
  1679. && (m_pContactless == NULL || (m_pContactless != NULL && m_pContactless->QuerySessionClosed())))
  1680. {
  1681. if (m_pContactless != NULL)
  1682. {
  1683. m_pContactless->GetFunction()->CloseSession();
  1684. m_pContactless = NULL;
  1685. }
  1686. m_pContactless = new ContactlessCardService_ClientBase(GetEntityBase());
  1687. if (m_pContactless != NULL)
  1688. {
  1689. eErr = m_pContactless->Connect();
  1690. if (eErr != Error_Succeed)
  1691. {
  1692. if (contactlessCardCount % 120 == 0)//about 10 minutes can't connect to entity
  1693. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to entity ContactlessCard failed.%d", eErr);
  1694. contactlessCardCount++;
  1695. m_pContactless->SafeDelete();
  1696. m_pContactless = NULL;
  1697. }
  1698. else
  1699. {
  1700. contactlessCardCount = 0;
  1701. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Connect to entity ContactlessCard suc.");
  1702. }
  1703. }
  1704. }
  1705. Sleep(5000);
  1706. }
  1707. }
  1708. bool CCardReadAdapterFSM::IsCardIssuerSessionOK()
  1709. {
  1710. if (!IsCardIssuerStore()) {
  1711. if (m_pCardIssuer != NULL && !m_pCardIssuer->QuerySessionClosed()) {
  1712. return true;
  1713. }
  1714. }
  1715. else {
  1716. if (m_pCardIssuerStore != NULL && !m_pCardIssuerStore->QuerySessionClosed()) {
  1717. return true;
  1718. }
  1719. }
  1720. return false;
  1721. }
  1722. bool CCardReadAdapterFSM::IsContactlessCardSessionOK()
  1723. {
  1724. if (m_pContactless != NULL && !m_pContactless->QuerySessionClosed())
  1725. return true;
  1726. return false;
  1727. }
  1728. bool CCardReadAdapterFSM::IsTheEntity(int module,ModuleType eModule)
  1729. {
  1730. if (module == 0)
  1731. return true;
  1732. //oilyang@20180409 add req.module==99
  1733. else if (module == 99)
  1734. {
  1735. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("req.module is 99,machineType is:%s",m_csMachineType.GetData());
  1736. //oilyang@20200730 according to meeting with Ratail/Test/Hangzhou
  1737. //from guodan 20180905
  1738. //99:进卡读卡,功能集向除蓝牙发卡机之外的读卡实体发出进卡读卡指令。
  1739. if (eModule == Module_CardIssuer)
  1740. {
  1741. if (m_eMachineType == SP::Module::Comm::RVC_Stand2S
  1742. || m_eMachineType == SP::Module::Comm::RVC_CardStore
  1743. || m_eMachineType == SP::Module::Comm::RVC_CardPrinter
  1744. || m_eMachineType == SP::Module::Comm::RVC_Stand1SPlus)
  1745. return true;
  1746. else
  1747. return false;
  1748. }
  1749. else
  1750. return true;
  1751. }
  1752. else if ((module&eModule) == eModule)
  1753. return true;
  1754. else
  1755. return false;
  1756. }
  1757. int CCardReadAdapterFSM::SetSomeFlag(SpReqAnsContext<CardReadAdapterService_SetSomeFlag_Req, CardReadAdapterService_SetSomeFlag_Ans>::Pointer ctx)
  1758. {
  1759. LOG_FUNCTION();
  1760. if (IsCardIssuerSessionOK())
  1761. {
  1762. if (!IsCardIssuerStore()) {
  1763. CardIssuerStandService_SetSomeFlag_Req req;
  1764. CardIssuerStandService_SetSomeFlag_Ans ans;
  1765. req.IssueBusiness = ctx->Req.IssueBusiness;
  1766. req.reserved1.Init(ctx->Req.reserved1.GetCount());
  1767. for (int i = 0; i < ctx->Req.reserved1.GetCount(); ++i)
  1768. {
  1769. req.reserved1[i] = ctx->Req.reserved1[i];
  1770. }
  1771. ErrorCodeEnum eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->SetSomeFlag(req, ans, 10000);
  1772. if (eErr == Error_Succeed)
  1773. {
  1774. ctx->Ans.reserved1.Copy(ans.reserved1);
  1775. ctx->Ans.reserved2.Copy(ans.reserved2);
  1776. ctx->Answer(Error_Succeed);
  1777. }
  1778. else {
  1779. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuer SetSomeFlag failed return:%d", eErr);
  1780. ctx->Answer(Error_Unexpect);
  1781. }
  1782. }
  1783. else {
  1784. CardIssuerStoreService_SetSomeFlag_Req req;
  1785. CardIssuerStoreService_SetSomeFlag_Ans ans;
  1786. req.IssueBusiness = ctx->Req.IssueBusiness;
  1787. req.reserved1.Init(ctx->Req.reserved1.GetCount());
  1788. for (int i = 0; i < ctx->Req.reserved1.GetCount(); ++i)
  1789. {
  1790. req.reserved1[i] = ctx->Req.reserved1[i];
  1791. }
  1792. ErrorCodeEnum eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->SetSomeFlag(req, ans, 10000);
  1793. if (eErr == Error_Succeed)
  1794. {
  1795. ctx->Ans.reserved1.Copy(ans.reserved1);
  1796. ctx->Ans.reserved2.Copy(ans.reserved2);
  1797. ctx->Answer(Error_Succeed);
  1798. }
  1799. else {
  1800. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore SetSomeFlag failed return:%d", eErr);
  1801. ctx->Answer(Error_Unexpect);
  1802. }
  1803. }
  1804. }
  1805. else
  1806. {
  1807. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SetSomeFlag can only apply to CardIssuer.Or CardIssuer connected failed.");
  1808. ctx->Answer(Error_Unexpect);
  1809. }
  1810. return 0;
  1811. }
  1812. int CCardReadAdapterFSM::GetDevInfo(SpReqAnsContext<CardReadAdapterService_GetDevInfo_Req, CardReadAdapterService_GetDevInfo_Ans>::Pointer ctx)
  1813. {
  1814. LOG_FUNCTION();
  1815. CSimpleStringA csCIType(""), csCIModel(""), csCIVersion(""), csCCType(""), csCCModel(""), csCCVersion(""), csCSType(""), csCSModel(""), csCSVersion("");
  1816. int ciState, ccState, csState;
  1817. bool bCI(false), bCC(false), bCS(false);
  1818. ErrorCodeEnum eErr = Error_Unexpect;
  1819. int count = 0;
  1820. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK())
  1821. {
  1822. if (!IsCardIssuerStore()) {
  1823. CardIssuerStandService_GetDevInfo_Req req;
  1824. CardIssuerStandService_GetDevInfo_Ans ans;
  1825. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->GetDevInfo(req, ans, 10000);
  1826. if (eErr == Error_Succeed)
  1827. {
  1828. bCI = true;
  1829. count++;
  1830. csCIType = ans.type;
  1831. csCIModel = ans.model;
  1832. csCIVersion = ans.version;
  1833. ciState = ans.state;
  1834. }
  1835. else if (eErr == Error_DevNotAvailable || eErr == Error_NotInit)//兼容getdevinfo改造,转化打开失败异常情况
  1836. {
  1837. bCI = true;
  1838. count++;
  1839. csCIType = "";
  1840. csCIModel = "";
  1841. csCIVersion = "";
  1842. ciState = 0;
  1843. }
  1844. else {
  1845. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDevInfo, CardIssuer GetDevInfo failed return:%d", eErr);
  1846. }
  1847. }
  1848. else {
  1849. CardIssuerStoreService_GetDevInfo_Req req;
  1850. CardIssuerStoreService_GetDevInfo_Ans ans;
  1851. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->GetDevInfo(req, ans, 10000);
  1852. if (eErr == Error_Succeed)
  1853. {
  1854. bCI = true;
  1855. count++;
  1856. csCIType = ans.type;
  1857. csCIModel = ans.model;
  1858. csCIVersion = ans.version;
  1859. ciState = ans.state;
  1860. }
  1861. else if (eErr == Error_DevNotAvailable || eErr == Error_NotInit)//兼容getdevinfo改造,转化打开失败异常情况
  1862. {
  1863. bCI = true;
  1864. count++;
  1865. csCIType = "";
  1866. csCIModel = "";
  1867. csCIVersion = "";
  1868. ciState = 0;
  1869. }
  1870. else {
  1871. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDevInfo, CardIssuerStore GetDevInfo failed return:%d", eErr);
  1872. }
  1873. }
  1874. }
  1875. if (IsTheEntity(ctx->Req.module, Module_ContactlessCard) && IsContactlessCardSessionOK())
  1876. {
  1877. ContactlessCardService_GetDevInfo_Req req;
  1878. ContactlessCardService_GetDevInfo_Ans ans;
  1879. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->GetDevInfo(req, ans, 10000);
  1880. if (eErr == Error_Succeed)
  1881. {
  1882. bCC = true;
  1883. count++;
  1884. csCCType = ans.type;
  1885. csCCModel = ans.model;
  1886. csCCVersion = ans.version;
  1887. ccState = ans.state;
  1888. }
  1889. else if (eErr == Error_DevNotAvailable || eErr == Error_NotInit)//兼容getdevinfo改造,转化打开失败异常情况
  1890. {
  1891. bCC = true;
  1892. count++;
  1893. csCCType = "";
  1894. csCCModel = "";
  1895. csCCVersion = "";
  1896. ccState = 0;
  1897. }
  1898. else {
  1899. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDevInfo, ContactlessCard GetDevInfo failed return:%d", eErr);
  1900. }
  1901. }
  1902. ctx->Ans.ModuleNum = count;
  1903. ctx->Ans.ModuleSN.Init(count);
  1904. ctx->Ans.type.Init(count);
  1905. ctx->Ans.model.Init(count);
  1906. ctx->Ans.version.Init(count);
  1907. ctx->Ans.state.Init(count);
  1908. int index = 0;
  1909. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("count:%d,index:%d,%d,%d,%d",count,index,bCI,bCC,bCS);
  1910. if (bCI)
  1911. {
  1912. ctx->Ans.ModuleSN[index] = Module_CardIssuer;
  1913. ctx->Ans.type[index] = csCIType;
  1914. ctx->Ans.model[index] = csCIModel;
  1915. ctx->Ans.version[index] = csCIVersion;
  1916. ctx->Ans.state[index] = ciState;
  1917. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("CardIssuer, type:%s, model:%s, version:%s, state:%d",
  1918. csCIType.GetData(), csCIModel.GetData(), csCIVersion.GetData(), ciState);
  1919. index++;
  1920. }
  1921. if (bCC)
  1922. {
  1923. ctx->Ans.ModuleSN[index] = Module_ContactlessCard;
  1924. ctx->Ans.type[index] = csCCType;
  1925. ctx->Ans.model[index] = csCCModel;
  1926. ctx->Ans.version[index] = csCCVersion;
  1927. ctx->Ans.state[index] = ccState;
  1928. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("ContactlessCard, type:%s, model:%s, version:%s, state:%d",
  1929. csCCType.GetData(), csCCModel.GetData(), csCCVersion.GetData(), ccState);
  1930. index++;
  1931. }
  1932. ctx->Answer(Error_Succeed);
  1933. return 0;
  1934. }
  1935. int CCardReadAdapterFSM::GetMaterialCount(SpReqAnsContext<CardReadAdapterService_GetMaterialCount_Req, CardReadAdapterService_GetMaterialCount_Ans>::Pointer ctx)
  1936. {
  1937. LOG_FUNCTION();
  1938. DWORD dwUsrErrCode = 0;
  1939. if (IsCardIssuerSessionOK())
  1940. {
  1941. if (!IsCardIssuerStore()) {
  1942. CardIssuerStandService_GetMaterialCountEx_Req req;
  1943. CardIssuerStandService_GetMaterialCountEx_Ans ans;
  1944. req.GetHopper.Copy(ctx->Req.GetHopper);
  1945. req.reserved1.Copy(ctx->Req.reserved1);
  1946. req.reserved2.Copy(ctx->Req.reserved2);
  1947. ErrorCodeEnum eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->GetMaterialCountEx(req, ans, 10000, dwUsrErrCode);
  1948. if (eErr == Error_Succeed)
  1949. {
  1950. ctx->Ans.captured = ans.captured;
  1951. ctx->Ans.hasHopper.Copy(ans.hasHopper);
  1952. ctx->Ans.CardBoxNo.Copy(ans.CardBoxNo);
  1953. ctx->Ans.PsbCode.Copy(ans.PsbCode);
  1954. ctx->Ans.PsbName.Copy(ans.PsbName);
  1955. ctx->Ans.Maintainer.Copy(ans.Maintainer);
  1956. ctx->Ans.CardInit.Copy(ans.CardInit);
  1957. ctx->Ans.CardPercent.Copy(ans.CardPercent);
  1958. ctx->Ans.remains.Copy(ans.remains);
  1959. ctx->Ans.issued.Copy(ans.issued);
  1960. ctx->Ans.mixed.Copy(ans.mixed);
  1961. ctx->Ans.MaintainTime.Copy(ans.MaintainTime);
  1962. ctx->Ans.reserved1.Copy(ans.reserved1);
  1963. ctx->Ans.reserved2.Copy(ans.reserved2);
  1964. ctx->Answer(Error_Succeed);
  1965. }
  1966. else {
  1967. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetMaterialCount, CardIssuer GetMaterialCountEx failed return:%d", eErr);
  1968. ctx->Answer(Error_Unexpect, dwUsrErrCode);
  1969. }
  1970. }
  1971. else {
  1972. CardIssuerStoreService_GetMaterialCountEx_Req req;
  1973. CardIssuerStoreService_GetMaterialCountEx_Ans ans;
  1974. req.GetHopper.Copy(ctx->Req.GetHopper);
  1975. req.reserved1.Copy(ctx->Req.reserved1);
  1976. req.reserved2.Copy(ctx->Req.reserved2);
  1977. ErrorCodeEnum eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->GetMaterialCountEx(req, ans, 10000, dwUsrErrCode);
  1978. if (eErr == Error_Succeed)
  1979. {
  1980. ctx->Ans.captured = ans.captured;
  1981. ctx->Ans.hasHopper.Copy(ans.hasHopper);
  1982. ctx->Ans.CardBoxNo.Copy(ans.CardBoxNo);
  1983. ctx->Ans.PsbCode.Copy(ans.PsbCode);
  1984. ctx->Ans.PsbName.Copy(ans.PsbName);
  1985. ctx->Ans.Maintainer.Copy(ans.Maintainer);
  1986. ctx->Ans.CardInit.Copy(ans.CardInit);
  1987. ctx->Ans.CardPercent.Copy(ans.CardPercent);
  1988. ctx->Ans.remains.Copy(ans.remains);
  1989. ctx->Ans.issued.Copy(ans.issued);
  1990. ctx->Ans.mixed.Copy(ans.mixed);
  1991. ctx->Ans.MaintainTime.Copy(ans.MaintainTime);
  1992. ctx->Ans.reserved1.Copy(ans.reserved1);
  1993. ctx->Ans.reserved2.Copy(ans.reserved2);
  1994. ctx->Answer(Error_Succeed);
  1995. }
  1996. else {
  1997. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetMaterialCount, CardIssuerStore GetMaterialCountEx failed return:%d", eErr);
  1998. ctx->Answer(Error_Unexpect, dwUsrErrCode);
  1999. }
  2000. }
  2001. }
  2002. else
  2003. {
  2004. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetMaterialCountEx can only apply to CardIssuer.Or CardIssuer connected failed.");
  2005. ctx->Answer(Error_Unexpect);
  2006. }
  2007. return 0;
  2008. }
  2009. int CCardReadAdapterFSM::SetMaterialCount(SpReqAnsContext<CardReadAdapterService_SetMaterialCount_Req, CardReadAdapterService_SetMaterialCount_Ans>::Pointer ctx)
  2010. {
  2011. LOG_FUNCTION();
  2012. DWORD dwUsrErrCode = 0;
  2013. if (IsCardIssuerSessionOK())
  2014. {
  2015. if (!IsCardIssuerStore()) {
  2016. CardIssuerStandService_SetMaterialCountEx_Req req;
  2017. CardIssuerStandService_SetMaterialCountEx_Ans ans;
  2018. req.SetCaptured = ctx->Req.SetCaptured;
  2019. req.captured = ctx->Req.captured;
  2020. req.SetHopper.Copy(ctx->Req.SetHopper);
  2021. req.CardBoxNo.Copy(ctx->Req.CardBoxNo);
  2022. req.PsbCode.Copy(ctx->Req.PsbCode);
  2023. req.PsbName.Copy(ctx->Req.PsbName);
  2024. req.Maintainer.Copy(ctx->Req.Maintainer);
  2025. req.MaintainTime.Copy(ctx->Req.MaintainTime);
  2026. req.CardInit.Copy(ctx->Req.CardInit);
  2027. req.CardPercent.Copy(ctx->Req.CardPercent);
  2028. req.remains.Copy(ctx->Req.remains);
  2029. req.issued.Copy(ctx->Req.issued);
  2030. req.mixed.Copy(ctx->Req.mixed);
  2031. req.reserved1.Copy(ctx->Req.reserved1);
  2032. req.reserved2.Copy(ctx->Req.reserved2);
  2033. ErrorCodeEnum eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->SetMaterialCountEx(req, ans, 10000, dwUsrErrCode);
  2034. if (eErr == Error_Succeed)
  2035. {
  2036. ctx->Ans.reserved1.Copy(ans.reserved1);
  2037. ctx->Ans.reserved2.Copy(ans.reserved2);
  2038. ctx->Answer(Error_Succeed);
  2039. }
  2040. else {
  2041. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SetMaterialCount, CardIssuer SetMaterialCountEx failed return:%d", eErr);
  2042. ctx->Answer(Error_Unexpect, dwUsrErrCode);
  2043. }
  2044. }
  2045. else {
  2046. CardIssuerStoreService_SetMaterialCountEx_Req req;
  2047. CardIssuerStoreService_SetMaterialCountEx_Ans ans;
  2048. req.SetCaptured = ctx->Req.SetCaptured;
  2049. req.captured = ctx->Req.captured;
  2050. req.SetHopper.Copy(ctx->Req.SetHopper);
  2051. req.CardBoxNo.Copy(ctx->Req.CardBoxNo);
  2052. req.PsbCode.Copy(ctx->Req.PsbCode);
  2053. req.PsbName.Copy(ctx->Req.PsbName);
  2054. req.Maintainer.Copy(ctx->Req.Maintainer);
  2055. req.MaintainTime.Copy(ctx->Req.MaintainTime);
  2056. req.CardInit.Copy(ctx->Req.CardInit);
  2057. req.CardPercent.Copy(ctx->Req.CardPercent);
  2058. req.remains.Copy(ctx->Req.remains);
  2059. req.issued.Copy(ctx->Req.issued);
  2060. req.mixed.Copy(ctx->Req.mixed);
  2061. req.reserved1.Copy(ctx->Req.reserved1);
  2062. req.reserved2.Copy(ctx->Req.reserved2);
  2063. ErrorCodeEnum eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->SetMaterialCountEx(req, ans, 10000, dwUsrErrCode);
  2064. if (eErr == Error_Succeed)
  2065. {
  2066. ctx->Ans.reserved1.Copy(ans.reserved1);
  2067. ctx->Ans.reserved2.Copy(ans.reserved2);
  2068. ctx->Answer(Error_Succeed);
  2069. }
  2070. else {
  2071. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SetMaterialCount, CardIssuerStore SetMaterialCountEx failed return:%d", eErr);
  2072. ctx->Answer(Error_Unexpect, dwUsrErrCode);
  2073. }
  2074. }
  2075. }
  2076. else
  2077. {
  2078. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SetMaterialCountEx can only apply to CardIssuer.Or CardIssuer connected failed.");
  2079. ctx->Answer(Error_Unexpect);
  2080. }
  2081. return 0;
  2082. }
  2083. int CCardReadAdapterFSM::GetSCIInfo(SpReqAnsContext<CardReadAdapterService_GetSCIInfo_Req, CardReadAdapterService_GetSCIInfo_Ans>::Pointer ctx)
  2084. {
  2085. if (IsCardIssuerSessionOK())
  2086. {
  2087. if (!IsCardIssuerStore()) {
  2088. ErrorCodeEnum eErr = Error_Unexpect;
  2089. CardIssuerStandService_GetSCIInfo_Req req;
  2090. CardIssuerStandService_GetSCIInfo_Ans ans;
  2091. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->GetSCIInfo(req, ans, 15000);
  2092. if (eErr == Error_Succeed)
  2093. {
  2094. ctx->Ans.connected = ans.connected;
  2095. ctx->Ans.DevSN = ans.DevSN;
  2096. ctx->Ans.reserved1.Copy(ans.reserved1);
  2097. ctx->Ans.reserved2.Copy(ans.reserved2);
  2098. }
  2099. else {
  2100. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetSCIInfo, CardIssuer GetSCIInfo failed return:%d", eErr);
  2101. }
  2102. ctx->Answer(eErr);
  2103. }
  2104. else {
  2105. ErrorCodeEnum eErr = Error_Unexpect;
  2106. CardIssuerStoreService_GetSCIInfo_Req req;
  2107. CardIssuerStoreService_GetSCIInfo_Ans ans;
  2108. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->GetSCIInfo(req, ans, 15000);
  2109. if (eErr == Error_Succeed)
  2110. {
  2111. ctx->Ans.connected = ans.connected;
  2112. ctx->Ans.DevSN = ans.DevSN;
  2113. ctx->Ans.reserved1.Copy(ans.reserved1);
  2114. ctx->Ans.reserved2.Copy(ans.reserved2);
  2115. }
  2116. else {
  2117. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetSCIInfo, CardIssuerStore GetSCIInfo failed return:%d", eErr);
  2118. }
  2119. ctx->Answer(eErr);
  2120. }
  2121. }
  2122. else
  2123. {
  2124. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Entity CardIssuer is not ok.");
  2125. ctx->Answer(Error_Unexpect);
  2126. }
  2127. return 0;
  2128. }
  2129. int CCardReadAdapterFSM::OpenSafeLock(SpReqAnsContext<CardReadAdapterService_OpenSafeLock_Req, CardReadAdapterService_OpenSafeLock_Ans>::Pointer ctx)
  2130. {
  2131. LOG_FUNCTION();
  2132. if (IsCardIssuerSessionOK())
  2133. {
  2134. if (!IsCardIssuerStore()) {
  2135. ErrorCodeEnum eErr = Error_Unexpect;
  2136. CardIssuerStandService_OpenSafeLock_Req req;
  2137. CardIssuerStandService_OpenSafeLock_Ans ans;
  2138. req.reserved1.Copy(ctx->Req.reserved1);
  2139. req.reserved2.Copy(ctx->Req.reserved2);
  2140. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->OpenSafeLock(req, ans, 15000);
  2141. if (eErr == Error_Succeed)
  2142. {
  2143. ctx->Ans.reserved1.Copy(ans.reserved1);
  2144. ctx->Ans.reserved2.Copy(ans.reserved2);
  2145. }
  2146. else {
  2147. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("OpenSafeLock, CardIssuer OpenSafeLock failed return:%d", eErr);
  2148. }
  2149. ctx->Answer(eErr);
  2150. }
  2151. else {
  2152. ErrorCodeEnum eErr = Error_Unexpect;
  2153. CardIssuerStoreService_OpenSafeLock_Req req;
  2154. CardIssuerStoreService_OpenSafeLock_Ans ans;
  2155. req.reserved1.Copy(ctx->Req.reserved1);
  2156. req.reserved2.Copy(ctx->Req.reserved2);
  2157. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->OpenSafeLock(req, ans, 15000);
  2158. if (eErr == Error_Succeed)
  2159. {
  2160. ctx->Ans.reserved1.Copy(ans.reserved1);
  2161. ctx->Ans.reserved2.Copy(ans.reserved2);
  2162. }
  2163. else {
  2164. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("OpenSafeLock, CardIssuerStore OpenSafeLock failed return:%d", eErr);
  2165. }
  2166. ctx->Answer(eErr);
  2167. }
  2168. }
  2169. else
  2170. {
  2171. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Entity CardIssuer is not ok.");
  2172. ctx->Answer(Error_Unexpect);
  2173. }
  2174. return 0;
  2175. }
  2176. int CCardReadAdapterFSM::MagTransferInit(SpReqAnsContext<CardReadAdapterService_MagTransferInit_Req, CardReadAdapterService_MagTransferInit_Ans>::Pointer ctx)
  2177. {
  2178. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Entity CardSwiper is not ok.");
  2179. ctx->Answer(Error_Unexpect);
  2180. return 0;
  2181. }
  2182. int CCardReadAdapterFSM::QueryConnInfo(SpReqAnsContext<CardReadAdapterService_QueryConnInfo_Req, CardReadAdapterService_QueryConnInfo_Ans>::Pointer ctx)
  2183. {
  2184. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Entity CardSwiper is not ok.");
  2185. ctx->Answer(Error_Unexpect);
  2186. return 0;
  2187. }
  2188. void CCardReadAdapterFSM::DoExit()
  2189. {
  2190. ErrorCodeEnum eErr = Error_Unexpect;
  2191. if (IsCardIssuerSessionOK())
  2192. {
  2193. if (!IsCardIssuerStore()) {
  2194. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->Exit();
  2195. }
  2196. else {
  2197. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->Exit();
  2198. }
  2199. }
  2200. if (IsContactlessCardSessionOK())
  2201. {
  2202. eErr = (*m_pContactless)(EntityResource::getLink().upgradeLink())->Exit();
  2203. }
  2204. }
  2205. void CCardReadAdapterFSM::BroadcastReadICing(int status)
  2206. {
  2207. ReadICing evt;
  2208. evt.status = status;
  2209. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("BroadcastReadICing, status:%d", status);
  2210. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(ReadICing), SP_MSG_SIG_OF(ReadICing), evt);
  2211. }
  2212. int CCardReadAdapterFSM::SAMICCommand(SpReqAnsContext<CardReadAdapterService_SAMICCommand_Req, CardReadAdapterService_SAMICCommand_Ans>::Pointer ctx)
  2213. {
  2214. if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK())
  2215. {
  2216. if (!IsCardIssuerStore()) {
  2217. ErrorCodeEnum eErr = Error_Unexpect;
  2218. CardIssuerStandService_SAMICCommand_Req req;
  2219. CardIssuerStandService_SAMICCommand_Ans ans;
  2220. req.cmdType = ctx->Req.cmdType;
  2221. req.param1.Copy(ctx->Req.param1);
  2222. req.param2.Copy(ctx->Req.param2);
  2223. req.reserved1.Copy(ctx->Req.reserved1);
  2224. req.reserved2.Copy(ctx->Req.reserved2);
  2225. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->SAMICCommand(req, ans, 50000);
  2226. if (eErr == Error_Succeed)
  2227. {
  2228. ctx->Ans.ret1.Copy(ans.ret1);
  2229. ctx->Ans.ret2.Copy(ans.ret2);
  2230. ctx->Ans.reserved1.Copy(ans.reserved1);
  2231. ctx->Ans.reserved2.Copy(ans.reserved2);
  2232. }
  2233. else {
  2234. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SAMICCommand, CardIssuer SAMICCommand failed return:%d", eErr);
  2235. }
  2236. ctx->Answer(eErr);
  2237. return 0;
  2238. }
  2239. else {
  2240. ErrorCodeEnum eErr = Error_Unexpect;
  2241. CardIssuerStoreService_SAMICCommand_Req req;
  2242. CardIssuerStoreService_SAMICCommand_Ans ans;
  2243. req.cmdType = ctx->Req.cmdType;
  2244. req.param1.Copy(ctx->Req.param1);
  2245. req.param2.Copy(ctx->Req.param2);
  2246. req.reserved1.Copy(ctx->Req.reserved1);
  2247. req.reserved2.Copy(ctx->Req.reserved2);
  2248. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->SAMICCommand(req, ans, 50000);
  2249. if (eErr == Error_Succeed)
  2250. {
  2251. ctx->Ans.ret1.Copy(ans.ret1);
  2252. ctx->Ans.ret2.Copy(ans.ret2);
  2253. ctx->Ans.reserved1.Copy(ans.reserved1);
  2254. ctx->Ans.reserved2.Copy(ans.reserved2);
  2255. }
  2256. else {
  2257. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SAMICCommand, CardIssuerStore SAMICCommand failed return:%d", eErr);
  2258. }
  2259. ctx->Answer(eErr);
  2260. return 0;
  2261. }
  2262. }
  2263. else
  2264. {
  2265. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SAMICCommand param error or connection is failed:(module)%d", ctx->Req.module);
  2266. ctx->Answer(Error_Param);
  2267. return 1;
  2268. }
  2269. }
  2270. int CCardReadAdapterFSM::QueryPrinterStatus(SpReqAnsContext<CardReadAdapterService_QueryPrinterStatus_Req, CardReadAdapterService_QueryPrinterStatus_Ans>::Pointer ctx)
  2271. {
  2272. LOG_FUNCTION();
  2273. if (IsCardIssuerSessionOK())
  2274. {
  2275. if (!IsCardIssuerStore()) {
  2276. ErrorCodeEnum eErr = Error_Unexpect;
  2277. CardIssuerStandService_QueryPrinterStatus_Req req;
  2278. CardIssuerStandService_QueryPrinterStatus_Ans ans;
  2279. req.param1.Copy(ctx->Req.param1);
  2280. req.param2.Copy(ctx->Req.param2);
  2281. req.reserved1.Copy(ctx->Req.reserved1);
  2282. req.reserved2.Copy(ctx->Req.reserved2);
  2283. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->QueryPrinterStatus(req, ans, 20000);
  2284. if (eErr == Error_Succeed)
  2285. {
  2286. ctx->Ans.ret1.Copy(ans.ret1);
  2287. ctx->Ans.ret2.Copy(ans.ret2);
  2288. ctx->Ans.reserved1.Copy(ans.reserved1);
  2289. ctx->Ans.reserved2.Copy(ans.reserved2);
  2290. }
  2291. else {
  2292. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryPrinterStatus, CardIssuer QueryPrinterStatus failed return:%d", eErr);
  2293. }
  2294. ctx->Answer(eErr);
  2295. return 0;
  2296. }
  2297. else {
  2298. ErrorCodeEnum eErr = Error_Unexpect;
  2299. CardIssuerStoreService_QueryPrinterStatus_Req req;
  2300. CardIssuerStoreService_QueryPrinterStatus_Ans ans;
  2301. req.param1.Copy(ctx->Req.param1);
  2302. req.param2.Copy(ctx->Req.param2);
  2303. req.reserved1.Copy(ctx->Req.reserved1);
  2304. req.reserved2.Copy(ctx->Req.reserved2);
  2305. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QueryPrinterStatus(req, ans, 20000);
  2306. if (eErr == Error_Succeed)
  2307. {
  2308. ctx->Ans.ret1.Copy(ans.ret1);
  2309. ctx->Ans.ret2.Copy(ans.ret2);
  2310. ctx->Ans.reserved1.Copy(ans.reserved1);
  2311. ctx->Ans.reserved2.Copy(ans.reserved2);
  2312. }
  2313. else {
  2314. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryPrinterStatus, CardIssuerStore QueryPrinterStatus failed return:%d", eErr);
  2315. }
  2316. ctx->Answer(eErr);
  2317. return 0;
  2318. }
  2319. }
  2320. else
  2321. {
  2322. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer session is not ok.");
  2323. ctx->Answer(Error_Param);
  2324. return 1;
  2325. }
  2326. }
  2327. int CCardReadAdapterFSM::Print(SpReqAnsContext<CardReadAdapterService_Print_Req, CardReadAdapterService_Print_Ans>::Pointer ctx)
  2328. {
  2329. LOG_FUNCTION();
  2330. if (IsCardIssuerSessionOK())
  2331. {
  2332. if (!IsCardIssuerStore()) {
  2333. ErrorCodeEnum eErr = Error_Unexpect;
  2334. CardIssuerStandService_Print_Req req;
  2335. CardIssuerStandService_Print_Ans ans;
  2336. req.data1 = ctx->Req.data1;
  2337. req.data2 = ctx->Req.data2;
  2338. req.data3 = ctx->Req.data3;
  2339. req.data4 = ctx->Req.data4;
  2340. req.data5 = ctx->Req.data5;
  2341. req.data6 = ctx->Req.data6;
  2342. req.reserved1.Copy(ctx->Req.reserved1);
  2343. req.reserved2.Copy(ctx->Req.reserved2);
  2344. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->Print(req, ans, 50000);
  2345. if (eErr == Error_Succeed)
  2346. {
  2347. ctx->Ans.reserved1.Copy(ans.reserved1);
  2348. ctx->Ans.reserved2.Copy(ans.reserved2);
  2349. }
  2350. else {
  2351. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Print, CardIssuer Print failed return:%d", eErr);
  2352. }
  2353. ctx->Answer(eErr);
  2354. return 0;
  2355. }
  2356. else {
  2357. ErrorCodeEnum eErr = Error_Unexpect;
  2358. CardIssuerStoreService_Print_Req req;
  2359. CardIssuerStoreService_Print_Ans ans;
  2360. req.data1 = ctx->Req.data1;
  2361. req.data2 = ctx->Req.data2;
  2362. req.data3 = ctx->Req.data3;
  2363. req.data4 = ctx->Req.data4;
  2364. req.data5 = ctx->Req.data5;
  2365. req.data6 = ctx->Req.data6;
  2366. req.reserved1.Copy(ctx->Req.reserved1);
  2367. req.reserved2.Copy(ctx->Req.reserved2);
  2368. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->Print(req, ans, 50000);
  2369. if (eErr == Error_Succeed)
  2370. {
  2371. ctx->Ans.reserved1.Copy(ans.reserved1);
  2372. ctx->Ans.reserved2.Copy(ans.reserved2);
  2373. }
  2374. else {
  2375. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Print, CardIssuerStore Print failed return:%d", eErr);
  2376. }
  2377. ctx->Answer(eErr);
  2378. return 0;
  2379. }
  2380. }
  2381. else
  2382. {
  2383. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer session is not ok.");
  2384. ctx->Answer(Error_Param);
  2385. return 1;
  2386. }
  2387. }
  2388. int CCardReadAdapterFSM::QuerySCIList(SpReqAnsContext<CardReadAdapterService_QuerySCIList_Req, CardReadAdapterService_QuerySCIList_Ans>::Pointer ctx)
  2389. {
  2390. LOG_FUNCTION();
  2391. DWORD dwUsrErrCode = 0;
  2392. if (IsCardIssuerSessionOK())
  2393. {
  2394. if (!IsCardIssuerStore()) {
  2395. ErrorCodeEnum eErr = Error_Unexpect;
  2396. CardIssuerStandService_QuerySCIList_Req req;
  2397. CardIssuerStandService_QuerySCIList_Ans ans;
  2398. req.reserved1.Copy(ctx->Req.reserved1);
  2399. req.reserved2.Copy(ctx->Req.reserved2);
  2400. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->QuerySCIList(req, ans, 50000, dwUsrErrCode);
  2401. if (eErr == Error_Succeed)
  2402. {
  2403. ctx->Ans.sciNo.Copy(ans.sciNo);
  2404. ctx->Ans.arrMateriel.Copy(ans.arrMateriel);
  2405. ctx->Ans.CardGroove.Copy(ans.CardGroove);
  2406. ctx->Ans.CardBoxNo.Copy(ans.CardBoxNo);
  2407. ctx->Ans.PsbCode.Copy(ans.PsbCode);
  2408. ctx->Ans.PsbName.Copy(ans.PsbName);
  2409. ctx->Ans.CardInit.Copy(ans.CardInit);
  2410. ctx->Ans.CardRemains.Copy(ans.CardRemains);
  2411. ctx->Ans.CardIssued.Copy(ans.CardIssued);
  2412. ctx->Ans.CardMixed.Copy(ans.CardMixed);
  2413. ctx->Ans.CardPercent.Copy(ans.CardPercent);
  2414. ctx->Ans.Maintainer.Copy(ans.Maintainer);
  2415. ctx->Ans.MaintainTime.Copy(ans.MaintainTime);
  2416. ctx->Ans.UpdateTime.Copy(ans.UpdateTime);
  2417. ctx->Ans.reserved1.Copy(ans.reserved1);
  2418. ctx->Ans.reserved2.Copy(ans.reserved2);
  2419. }
  2420. else {
  2421. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QuerySCIList, CardIssuer QuerySCIList failed return:%d", eErr);
  2422. }
  2423. ctx->Answer(eErr, dwUsrErrCode);
  2424. return 0;
  2425. }
  2426. else {
  2427. ErrorCodeEnum eErr = Error_Unexpect;
  2428. CardIssuerStoreService_QuerySCIList_Req req;
  2429. CardIssuerStoreService_QuerySCIList_Ans ans;
  2430. req.reserved1.Copy(ctx->Req.reserved1);
  2431. req.reserved2.Copy(ctx->Req.reserved2);
  2432. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QuerySCIList(req, ans, 50000, dwUsrErrCode);
  2433. if (eErr == Error_Succeed)
  2434. {
  2435. ctx->Ans.sciNo.Copy(ans.sciNo);
  2436. ctx->Ans.arrMateriel.Copy(ans.arrMateriel);
  2437. ctx->Ans.CardGroove.Copy(ans.CardGroove);
  2438. ctx->Ans.CardBoxNo.Copy(ans.CardBoxNo);
  2439. ctx->Ans.PsbCode.Copy(ans.PsbCode);
  2440. ctx->Ans.PsbName.Copy(ans.PsbName);
  2441. ctx->Ans.CardInit.Copy(ans.CardInit);
  2442. ctx->Ans.CardRemains.Copy(ans.CardRemains);
  2443. ctx->Ans.CardIssued.Copy(ans.CardIssued);
  2444. ctx->Ans.CardMixed.Copy(ans.CardMixed);
  2445. ctx->Ans.CardPercent.Copy(ans.CardPercent);
  2446. ctx->Ans.Maintainer.Copy(ans.Maintainer);
  2447. ctx->Ans.MaintainTime.Copy(ans.MaintainTime);
  2448. ctx->Ans.UpdateTime.Copy(ans.UpdateTime);
  2449. ctx->Ans.reserved1.Copy(ans.reserved1);
  2450. ctx->Ans.reserved2.Copy(ans.reserved2);
  2451. }
  2452. else {
  2453. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QuerySCIList, CardIssuerStore QuerySCIList failed return:%d", eErr);
  2454. }
  2455. ctx->Answer(eErr, dwUsrErrCode);
  2456. return 0;
  2457. }
  2458. }
  2459. else
  2460. {
  2461. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer session is not ok.");
  2462. ctx->Answer(Error_Param);
  2463. return 1;
  2464. }
  2465. }
  2466. int CCardReadAdapterFSM::BindSCI(SpReqAnsContext<CardReadAdapterService_BindSCI_Req, CardReadAdapterService_BindSCI_Ans>::Pointer ctx)
  2467. {
  2468. LOG_FUNCTION();
  2469. DWORD dwUsrErrCode = 0;
  2470. if (IsCardIssuerSessionOK())
  2471. {
  2472. if (!IsCardIssuerStore()) {
  2473. ErrorCodeEnum eErr = Error_Unexpect;
  2474. CardIssuerStandService_BindSCI_Req req;
  2475. CardIssuerStandService_BindSCI_Ans ans;
  2476. req.type = ctx->Req.type;
  2477. req.sciNo = ctx->Req.sciNo;
  2478. req.reserved1.Copy(ctx->Req.reserved1);
  2479. req.reserved2.Copy(ctx->Req.reserved2);
  2480. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->BindSCI(req, ans, 50000, dwUsrErrCode);
  2481. if (eErr == Error_Succeed)
  2482. {
  2483. ctx->Ans.reserved1.Copy(ans.reserved1);
  2484. ctx->Ans.reserved2.Copy(ans.reserved2);
  2485. }
  2486. else {
  2487. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("BindSCI, CardIssuer BindSCI failed return:%d", eErr);
  2488. }
  2489. ctx->Answer(eErr, dwUsrErrCode);
  2490. return 0;
  2491. }
  2492. else {
  2493. ErrorCodeEnum eErr = Error_Unexpect;
  2494. CardIssuerStoreService_BindSCI_Req req;
  2495. CardIssuerStoreService_BindSCI_Ans ans;
  2496. req.type = ctx->Req.type;
  2497. req.sciNo = ctx->Req.sciNo;
  2498. req.reserved1.Copy(ctx->Req.reserved1);
  2499. req.reserved2.Copy(ctx->Req.reserved2);
  2500. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->BindSCI(req, ans, 50000, dwUsrErrCode);
  2501. if (eErr == Error_Succeed)
  2502. {
  2503. ctx->Ans.reserved1.Copy(ans.reserved1);
  2504. ctx->Ans.reserved2.Copy(ans.reserved2);
  2505. }
  2506. else {
  2507. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("BindSCI, CardIssuerStore BindSCI failed return:%d", eErr);
  2508. }
  2509. ctx->Answer(eErr, dwUsrErrCode);
  2510. return 0;
  2511. }
  2512. }
  2513. else
  2514. {
  2515. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer session is not ok.");
  2516. ctx->Answer(Error_Param);
  2517. return 1;
  2518. }
  2519. }
  2520. int CCardReadAdapterFSM::PreOnlineOnStore(SpReqAnsContext<CardReadAdapterService_PreOnlineOnStore_Req, CardReadAdapterService_PreOnlineOnStore_Ans>::Pointer ctx)
  2521. {
  2522. LOG_FUNCTION();
  2523. //oilyang@20230525 to call heartbeat directly
  2524. if (!CheckHBSessionOrToConnect())
  2525. {
  2526. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("While calling to PreOnlineOnStore, connect to HeartBeat failed.");
  2527. ctx->Answer(Error_DevNotAvailable);
  2528. return 0;
  2529. }
  2530. m_crossCtx = ctx;
  2531. ErrorCodeEnum eErr = Error_Unexpect;
  2532. CSimpleStringA errMsg(true);
  2533. m_ullCrossStart = GetTickCountRVC();
  2534. if (m_pHBClient != NULL)
  2535. {
  2536. HeartBeatService_CardActive_Req req;
  2537. HeartBeatService_CardActive_Ans ans;
  2538. req.type = 0;
  2539. req.account = ctx->Req.account;
  2540. req.term = ctx->Req.termNo;
  2541. req.data = ctx->Req.businessData;
  2542. req.slot = ctx->Req.slot;
  2543. errMsg = CSimpleStringA::Format("<PreOnlineOnStore>, send CardActive, termNo:%s, slot:%d", req.term.GetData(), req.slot);
  2544. LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_PreOnline_Send_CardActive, errMsg.GetData());
  2545. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220327")("to call heartbeat CardActive");
  2546. eErr = (*m_pHBClient)(EntityResource::getLink().upgradeLink())->CardActive(req, ans, 6000);
  2547. if (eErr == Error_Succeed)
  2548. {
  2549. m_bCardActiveNotify = false;
  2550. WaitCardActiveTask* pTask = new WaitCardActiveTask(this);
  2551. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  2552. }
  2553. else
  2554. {
  2555. errMsg = CSimpleStringA::Format("CardActive Result(termNo:%s, slot:%d):%d(0x%x)", req.term.GetData(), req.slot, eErr, eErr);
  2556. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_PreOnline_Recv_CardActive, errMsg.GetData());
  2557. }
  2558. }
  2559. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("have send heartbeat CardActive");
  2560. return 1;//维持s3状态,直到收到返回或超时
  2561. }
  2562. int CCardReadAdapterFSM::NotifyPreonline(SpReqAnsContext<CardReadAdapterService_NotifyPreonline_Req, CardReadAdapterService_NotifyPreonline_Ans>::Pointer ctx)
  2563. {
  2564. LOG_FUNCTION();
  2565. UINT64 crossEnd = GetTickCountRVC();
  2566. //? ? ? 为什么是110s,重试?从生产实际来看,在25s到40s之间,大部分在30s左右,需要和前端(65s)一致,改成60s oilyang@20221019
  2567. //in 110 second
  2568. if (m_crossCtx != NULL)
  2569. {
  2570. if ((crossEnd - m_ullCrossStart) < 60 * 1000)
  2571. {
  2572. m_bCardActiveNotify = true;
  2573. m_crossCtx->Ans.cardPos = ctx->Req.cardPos;
  2574. m_crossCtx->Ans.findCard = ctx->Req.findCard;
  2575. m_crossCtx->Ans.result = ctx->Req.data;
  2576. CSimpleStringA outParam = CSimpleStringA::Format("NotifyPreOnline, cardPos:%d, findCard:%d, errCode:%d, userErrCode:%d", ctx->Req.cardPos, ctx->Req.findCard, ctx->Req.errCode, ctx->Req.reserved1[0]);
  2577. LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreOnline_ParamInfo, outParam.GetData());
  2578. //oilyang@20230629
  2579. //compare with the "ctx->Req.errCode" or "ctx->Req.reserved1[0]" which is stand for UserErrorCode from CardStore
  2580. if (ctx->Req.errCode == Error_Duplication || ctx->Req.reserved1[0] == CardReadAdapter_UserErrorCode_CardIssuer_Is_Working
  2581. || ctx->Req.reserved1[0] == CardIssuer_UserErrorCode_CardActive_CardStore_Issuing
  2582. || ctx->Req.reserved1[0] == CardIssuerStore_UserErrorCode_CardActive_CardStore_Issuing)
  2583. {
  2584. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Q")("卡库正在使用中");
  2585. LogWarn(Severity_Low, Error_Unexpect, CardReadAdapter_UserErrorCode_CardIssuer_Is_Working, "卡库正在使用中");
  2586. m_crossCtx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DupCallPreOnline_WhileInWorking);
  2587. }
  2588. else if (ctx->Req.errCode == Error_TimeOut)//CardStore process cost too long!
  2589. {
  2590. //DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230W")("跨机时卡库处理耗时过长");
  2591. //LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardStore_Reply_TooLong, "跨机时卡库处理耗时过长");
  2592. m_crossCtx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_CardStore_Reply_TooLong);
  2593. }
  2594. else if (ctx->Req.errCode == Error_NotExist)//heartbeat service can't find the dest terminal
  2595. {
  2596. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Y")("跨机时卡库不在线");
  2597. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine, "跨机时卡库不在线");
  2598. m_crossCtx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine);
  2599. }
  2600. else if (ctx->Req.reserved1[0] == CardIssuer_UserErrorCode_DevOpen_Failed || ctx->Req.reserved1[0] == CardIssuerStore_UserErrorCode_DevOpen_Failed)
  2601. {
  2602. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2311")("卡库卡机未成功打开");
  2603. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_DevOpen_Failed, "卡库卡机未成功打开");
  2604. m_crossCtx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
  2605. }
  2606. else
  2607. {
  2608. if (ctx->Req.errCode != Error_Succeed)
  2609. {
  2610. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327")("卡库异常:Req.errCode:%d, userErrCode:%d(0x%x)", ctx->Req.errCode, ctx->Req.reserved1[0], ctx->Req.reserved1[0]);
  2611. LogWarn(Severity_Middle, Error_Unexpect, CardReadAdapter_UserErrorCode_CardActive_Unexpect,
  2612. CSimpleStringA::Format("卡库异常:Req.errCode:%d, userErrCode:%d(0x%x)", ctx->Req.errCode, ctx->Req.reserved1[0], ctx->Req.reserved1[0]));
  2613. }
  2614. m_crossCtx->Answer((ErrorCodeEnum)ctx->Req.errCode, MapErrorCodeWhileCallStore(ctx->Req.reserved1[0]));
  2615. }
  2616. }
  2617. else {
  2618. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2312")("超时后,才收到卡库返回");
  2619. LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreonline_Wait_TooLong, "CardStore return after timeout.");
  2620. }
  2621. m_crossCtx = NULL;
  2622. }
  2623. ctx->Answer(Error_Succeed);
  2624. return 0;
  2625. }
  2626. int CCardReadAdapterFSM::QueryCardInfoOnStore(SpReqAnsContext<CardReadAdapterService_QueryCardInfoOnStore_Req, CardReadAdapterService_QueryCardInfoOnStore_Ans>::Pointer ctx)
  2627. {
  2628. LOG_FUNCTION();
  2629. if (IsCardIssuerSessionOK())
  2630. {
  2631. if (!IsCardIssuerStore()) {
  2632. DWORD dwUserErrorCode = 0;
  2633. ErrorCodeEnum eErr = Error_Unexpect;
  2634. CardIssuerStandService_QueryCardInfoOnStore_Req req;
  2635. CardIssuerStandService_QueryCardInfoOnStore_Ans ans;
  2636. req.reserved1.Copy(ctx->Req.reserved1);
  2637. req.reserved2.Copy(ctx->Req.reserved2);
  2638. req.reserved3.Copy(ctx->Req.reserved3);
  2639. req.reserved4.Copy(ctx->Req.reserved4);
  2640. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->QueryCardInfoOnStore(req, ans, INT_MAX / 2 - 5000, dwUserErrorCode);
  2641. if (eErr == Error_Succeed)
  2642. {
  2643. ctx->Ans.cardPos = ans.cardPos;
  2644. ctx->Ans.findCard = ans.findCard;
  2645. ctx->Ans.reserved1.Copy(ans.reserved1);
  2646. ctx->Ans.reserved2.Copy(ans.reserved2);
  2647. ctx->Ans.reserved3.Copy(ans.reserved3);
  2648. ctx->Ans.reserved4.Copy(ans.reserved4);
  2649. ctx->Answer(Error_Succeed);
  2650. }
  2651. else {
  2652. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryCardInfoOnStore, CardIssuer QueryCardInfoOnStore failed return:%d", eErr);
  2653. ctx->Answer(eErr, dwUserErrorCode);
  2654. }
  2655. }
  2656. else {
  2657. DWORD dwUserErrorCode = 0;
  2658. ErrorCodeEnum eErr = Error_Unexpect;
  2659. CardIssuerStoreService_QueryCardInfoOnStore_Req req;
  2660. CardIssuerStoreService_QueryCardInfoOnStore_Ans ans;
  2661. req.reserved1.Copy(ctx->Req.reserved1);
  2662. req.reserved2.Copy(ctx->Req.reserved2);
  2663. req.reserved3.Copy(ctx->Req.reserved3);
  2664. req.reserved4.Copy(ctx->Req.reserved4);
  2665. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QueryCardInfoOnStore(req, ans, INT_MAX / 2 - 5000, dwUserErrorCode);
  2666. if (eErr == Error_Succeed)
  2667. {
  2668. ctx->Ans.cardPos = ans.cardPos;
  2669. ctx->Ans.findCard = ans.findCard;
  2670. ctx->Ans.reserved1.Copy(ans.reserved1);
  2671. ctx->Ans.reserved2.Copy(ans.reserved2);
  2672. ctx->Ans.reserved3.Copy(ans.reserved3);
  2673. ctx->Ans.reserved4.Copy(ans.reserved4);
  2674. ctx->Answer(Error_Succeed);
  2675. }
  2676. else {
  2677. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryCardInfoOnStore, CardIssuerStore QueryCardInfoOnStore failed return:%d", eErr);
  2678. ctx->Answer(eErr, dwUserErrorCode);
  2679. }
  2680. }
  2681. }
  2682. else
  2683. {
  2684. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Entity CardIssuer is not ok.");
  2685. ctx->Answer(Error_DevNotAvailable, CardReadAdapter_UserErrorCode_PreOnline_CardIssuer_Not_Ok);
  2686. }
  2687. return 0;
  2688. }
  2689. int CCardReadAdapterFSM::GetAddCardInfo(SpReqAnsContext<CardReadAdapterService_GetAddCardInfo_Req, CardReadAdapterService_GetAddCardInfo_Ans>::Pointer ctx)
  2690. {
  2691. LOG_FUNCTION();
  2692. if (IsCardIssuerSessionOK())
  2693. {
  2694. if (!IsCardIssuerStore()) {
  2695. DWORD dwUserErrorCode = 0;
  2696. ErrorCodeEnum eErr = Error_Unexpect;
  2697. CardIssuerStandService_GetAddCardInfo_Req req;
  2698. CardIssuerStandService_GetAddCardInfo_Ans ans;
  2699. req.isSync = ctx->Req.isSync;
  2700. req.reserved1.Copy(ctx->Req.reserved1);
  2701. req.reserved2.Copy(ctx->Req.reserved2);
  2702. req.reserved3.Copy(ctx->Req.reserved3);
  2703. req.reserved4.Copy(ctx->Req.reserved4);
  2704. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->GetAddCardInfo(req, ans, 10000, dwUserErrorCode);
  2705. if (eErr == Error_Succeed)
  2706. {
  2707. ctx->Ans.account = ans.account;
  2708. ctx->Ans.cardSerial = ans.cardSerial;
  2709. ctx->Ans.count = ans.count;
  2710. ctx->Ans.slot = ans.slot;
  2711. ctx->Ans.reserved1.Copy(ans.reserved1);
  2712. ctx->Ans.reserved2.Copy(ans.reserved2);
  2713. ctx->Ans.reserved3.Copy(ans.reserved3);
  2714. ctx->Ans.reserved4.Copy(ans.reserved4);
  2715. ctx->Answer(Error_Succeed);
  2716. }
  2717. else {
  2718. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetAddCardInfo, CardIssuer GetAddCardInfo failed return:%d,%x", eErr, dwUserErrorCode);
  2719. ctx->Answer(eErr, dwUserErrorCode);
  2720. }
  2721. }
  2722. else {
  2723. DWORD dwUserErrorCode = 0;
  2724. ErrorCodeEnum eErr = Error_Unexpect;
  2725. CardIssuerStoreService_GetAddCardInfo_Req req;
  2726. CardIssuerStoreService_GetAddCardInfo_Ans ans;
  2727. req.isSync = ctx->Req.isSync;
  2728. req.reserved1.Copy(ctx->Req.reserved1);
  2729. req.reserved2.Copy(ctx->Req.reserved2);
  2730. req.reserved3.Copy(ctx->Req.reserved3);
  2731. req.reserved4.Copy(ctx->Req.reserved4);
  2732. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->GetAddCardInfo(req, ans, 10000, dwUserErrorCode);
  2733. if (eErr == Error_Succeed)
  2734. {
  2735. ctx->Ans.account = ans.account;
  2736. ctx->Ans.cardSerial = ans.cardSerial;
  2737. ctx->Ans.count = ans.count;
  2738. ctx->Ans.slot = ans.slot;
  2739. ctx->Ans.reserved1.Copy(ans.reserved1);
  2740. ctx->Ans.reserved2.Copy(ans.reserved2);
  2741. ctx->Ans.reserved3.Copy(ans.reserved3);
  2742. ctx->Ans.reserved4.Copy(ans.reserved4);
  2743. ctx->Answer(Error_Succeed);
  2744. }
  2745. else {
  2746. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetAddCardInfo, CardIssuerStore GetAddCardInfo failed return:%d,%x", eErr, dwUserErrorCode);
  2747. ctx->Answer(eErr, dwUserErrorCode);
  2748. }
  2749. }
  2750. }
  2751. else
  2752. {
  2753. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Entity CardIssuer is not ok.");
  2754. ctx->Answer(Error_DevNotAvailable, CardReadAdapter_UserErrorCode_PreOnline_CardIssuer_Not_Ok);
  2755. }
  2756. return 0;
  2757. }
  2758. int CCardReadAdapterFSM::Test1(SpReqAnsContext<CardReadAdapterService_Test1_Req, CardReadAdapterService_Test1_Ans>::Pointer ctx)
  2759. {
  2760. LOG_FUNCTION();
  2761. ctx->Answer(Error_Succeed);
  2762. return 0;
  2763. }
  2764. int CCardReadAdapterFSM::Test2(SpReqAnsContext<CardReadAdapterService_Test2_Req, CardReadAdapterService_Test2_Ans>::Pointer ctx)
  2765. {
  2766. LOG_FUNCTION();
  2767. ctx->Answer(Error_Succeed);
  2768. return 0;
  2769. }
  2770. void CCardReadAdapterFSM::SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  2771. {
  2772. //for simple
  2773. pTransactionContext->SendAnswer(m_testResult);
  2774. }
  2775. int CCardReadAdapterFSM::CrossTermCall(SpReqAnsContext<CardReadAdapterService_CrossTermCall_Req, CardReadAdapterService_CrossTermCall_Ans>::Pointer cctx)
  2776. {
  2777. ErrorCodeEnum eErr = Error_Deprecated;
  2778. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("CrossTermCall,type:%x", cctx->Req.type);
  2779. cctx->Answer((ErrorCodeEnum)eErr);
  2780. return 0;
  2781. }
  2782. void CCardReadAdapterFSM::CrossTermInvokeInfo(SpOnewayCallContext<CardReadAdapterService_CrossTermInvokeInfo_Info>::Pointer ctx)
  2783. {
  2784. LOG_FUNCTION();
  2785. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("entity sn:%x,type:%d,errcode:%x", ctx->Info.nEntityID, ctx->Info.type, ctx->Info.result);
  2786. }
  2787. int CCardReadAdapterFSM::LocalCallHeartBeat(int method, CBlob &bbSend,bool bTwoWay)
  2788. {
  2789. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("method id(type):%d", method);
  2790. HeartBeatService_ClientBase* pClient = new HeartBeatService_ClientBase(GetEntityBase());
  2791. if (pClient == NULL)
  2792. {
  2793. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create HeartBeat client failed.GetLastError:%d", GetLastError());
  2794. return -1;
  2795. }
  2796. ErrorCodeEnum eErr = Error_Unexpect;
  2797. eErr = pClient->Connect();
  2798. if (eErr != Error_Succeed)
  2799. {
  2800. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("client connect to HeartBeat failed:%x", eErr);
  2801. return -1;
  2802. }
  2803. HeartBeatService_CrossTermCall_Req req;
  2804. HeartBeatService_CrossTermCall_Ans ans;
  2805. req.nEntityID = 0x21b;
  2806. req.isTwoWay = bTwoWay;
  2807. req.fromTerminalNo = m_terminalNo;
  2808. GetAttachedTerminal(req.toTerminalNo);
  2809. //req.toTerminalNo = "7717715004";
  2810. req.param1 = "";
  2811. req.param2 = "";
  2812. req.paramX = bbSend;
  2813. req.type = method;
  2814. eErr = (*pClient)(EntityResource::getLink().upgradeLink())->CrossTermCall(req, ans, 20000);
  2815. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermCall to HeartBeat from %s to %s, result:%x",
  2816. req.fromTerminalNo.GetData(), req.toTerminalNo.GetData(), eErr);
  2817. return 0;
  2818. }
  2819. bool CCardReadAdapterFSM::GetAttachedTerminal(CSimpleStringA &csTerm)
  2820. {
  2821. return (Error_Succeed == GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm));
  2822. }
  2823. void CCardReadAdapterFSM::CancelReadForEntity(ModuleType eModule)
  2824. {
  2825. LOG_FUNCTION();
  2826. if (IsTheEntity(eModule, Module_CardIssuer) && IsCardIssuerSessionOK())
  2827. {
  2828. if (!IsCardIssuerStore()) {
  2829. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Set cancel read by ContactlessCard flag of CardIssuer.");
  2830. CardIssuerStandService_SetSomeFlag_Req req;
  2831. CardIssuerStandService_SetSomeFlag_Ans ans;
  2832. req.IssueBusiness = 3;
  2833. (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->SetSomeFlag(req, ans, 5000);
  2834. (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->CancelInsert();
  2835. }
  2836. else {
  2837. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Set cancel read by ContactlessCard flag of CardIssuer.");
  2838. CardIssuerStoreService_SetSomeFlag_Req req;
  2839. CardIssuerStoreService_SetSomeFlag_Ans ans;
  2840. req.IssueBusiness = 3;
  2841. (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->SetSomeFlag(req, ans, 5000);
  2842. (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->CancelInsert();
  2843. }
  2844. }
  2845. if (IsTheEntity(eModule, Module_ContactlessCard) && IsContactlessCardSessionOK())
  2846. {
  2847. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Cancel read by CardSwiper of ContactlessCard.");
  2848. (*m_pContactless)(EntityResource::getLink().upgradeLink())->CancelInsert();
  2849. }
  2850. }
  2851. int CCardReadAdapterFSM::PrintCardIm(SpReqAnsContext<CardReadAdapterService_PrintCardImmediately_Req, CardReadAdapterService_PrintCardImmediately_Ans>::Pointer ctx)
  2852. {
  2853. LOG_FUNCTION();
  2854. if (IsCardIssuerSessionOK())
  2855. {
  2856. if (!IsCardIssuerStore()) {
  2857. ErrorCodeEnum eErr = Error_Unexpect;
  2858. CardIssuerStandService_PrintCardImmediately_Req req;
  2859. CardIssuerStandService_PrintCardImmediately_Ans ans;
  2860. req.formFile = ctx->Req.formFile;
  2861. req.printData = ctx->Req.printData;
  2862. req.reserved1.Copy(ctx->Req.reserved1);
  2863. req.reserved2.Copy(ctx->Req.reserved2);
  2864. req.reserved3.Copy(ctx->Req.reserved3);
  2865. req.reserved4.Copy(ctx->Req.reserved4);
  2866. int timeout = 60000;
  2867. if (ctx->Req.reserved1.GetCount() > 0 && ctx->Req.reserved1[0] > 50000 && ctx->Req.reserved1[0] < 200000)
  2868. timeout = ctx->Req.reserved1[0];
  2869. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PrintCardIm, timeout:%d", timeout);
  2870. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->PrintCardImmediately(req, ans, timeout);
  2871. if (eErr == Error_Succeed)
  2872. {
  2873. ctx->Ans.ret = ans.ret;
  2874. ctx->Ans.reserved1.Copy(ans.reserved1);
  2875. ctx->Ans.reserved2.Copy(ans.reserved2);
  2876. ctx->Ans.reserved3.Copy(ans.reserved3);
  2877. ctx->Ans.reserved4.Copy(ans.reserved4);
  2878. }
  2879. else {
  2880. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PrintCardImmediately, CardIssuer PrintCardImmediately failed return:%d", eErr);
  2881. }
  2882. ctx->Answer(eErr);
  2883. return 0;
  2884. }
  2885. else {
  2886. ErrorCodeEnum eErr = Error_Unexpect;
  2887. CardIssuerStoreService_PrintCardImmediately_Req req;
  2888. CardIssuerStoreService_PrintCardImmediately_Ans ans;
  2889. req.formFile = ctx->Req.formFile;
  2890. req.printData = ctx->Req.printData;
  2891. req.reserved1.Copy(ctx->Req.reserved1);
  2892. req.reserved2.Copy(ctx->Req.reserved2);
  2893. req.reserved3.Copy(ctx->Req.reserved3);
  2894. req.reserved4.Copy(ctx->Req.reserved4);
  2895. int timeout = 60000;
  2896. if (ctx->Req.reserved1.GetCount() > 0 && ctx->Req.reserved1[0] > 50000 && ctx->Req.reserved1[0] < 200000)
  2897. timeout = ctx->Req.reserved1[0];
  2898. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PrintCardIm, timeout:%d", timeout);
  2899. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->PrintCardImmediately(req, ans, timeout);
  2900. if (eErr == Error_Succeed)
  2901. {
  2902. ctx->Ans.ret = ans.ret;
  2903. ctx->Ans.reserved1.Copy(ans.reserved1);
  2904. ctx->Ans.reserved2.Copy(ans.reserved2);
  2905. ctx->Ans.reserved3.Copy(ans.reserved3);
  2906. ctx->Ans.reserved4.Copy(ans.reserved4);
  2907. }
  2908. else {
  2909. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PrintCardImmediately, CardIssuerStore PrintCardImmediately failed return:%d", eErr);
  2910. }
  2911. ctx->Answer(eErr);
  2912. return 0;
  2913. }
  2914. }
  2915. else
  2916. {
  2917. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer session is not ok.");
  2918. ctx->Answer(Error_Param);
  2919. return 1;
  2920. }
  2921. }
  2922. int CCardReadAdapterFSM::QueryCIStatus(SpReqAnsContext<CardReadAdapterService_QueryCIStatus_Req, CardReadAdapterService_QueryCIStatus_Ans>::Pointer ctx)
  2923. {
  2924. if (IsCardIssuerSessionOK())
  2925. {
  2926. if (!IsCardIssuerStore()) {
  2927. ErrorCodeEnum eErr = Error_Unexpect;
  2928. CardIssuerStandService_QueryCIStatus_Req req;
  2929. CardIssuerStandService_QueryCIStatus_Ans ans;
  2930. req.reserved1.Copy(ctx->Req.reserved1);
  2931. req.reserved2.Copy(ctx->Req.reserved2);
  2932. req.reserved3.Copy(ctx->Req.reserved3);
  2933. req.reserved4.Copy(ctx->Req.reserved4);
  2934. DWORD dwUsrErrCode = 0;
  2935. eErr = (*m_pCardIssuer)(EntityResource::getLink().upgradeLink())->QueryCIStatus(req, ans, 5000, dwUsrErrCode);
  2936. if (eErr == Error_Succeed)
  2937. {
  2938. if (ans.reserved1.GetCount() > 0)
  2939. ctx->Ans.reserved1.Copy(ans.reserved1);
  2940. if (ans.reserved2.GetCount() > 0)
  2941. ctx->Ans.reserved2.Copy(ans.reserved2);
  2942. if (ans.reserved3.GetCount() > 0)
  2943. ctx->Ans.reserved3.Copy(ans.reserved3);
  2944. if (ans.reserved4.GetCount() > 0)
  2945. ctx->Ans.reserved4.Copy(ans.reserved4);
  2946. ctx->Ans.retainBin = ans.retainBin;
  2947. if (ans.hopperNo.GetCount() > 0)
  2948. {
  2949. ctx->Ans.hopperNo.Copy(ans.hopperNo);
  2950. ctx->Ans.hopperStatus.Copy(ans.hopperStatus);
  2951. }
  2952. }
  2953. else {
  2954. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer QueryCIStatus failed return:%d", eErr));
  2955. }
  2956. ctx->Answer(eErr, dwUsrErrCode);
  2957. return 0;
  2958. }
  2959. else {
  2960. ErrorCodeEnum eErr = Error_Unexpect;
  2961. CardIssuerStoreService_QueryCIStatus_Req req;
  2962. CardIssuerStoreService_QueryCIStatus_Ans ans;
  2963. req.reserved1.Copy(ctx->Req.reserved1);
  2964. req.reserved2.Copy(ctx->Req.reserved2);
  2965. req.reserved3.Copy(ctx->Req.reserved3);
  2966. req.reserved4.Copy(ctx->Req.reserved4);
  2967. DWORD dwUsrErrCode = 0;
  2968. eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QueryCIStatus(req, ans, 5000, dwUsrErrCode);
  2969. if (eErr == Error_Succeed)
  2970. {
  2971. if (ans.reserved1.GetCount() > 0)
  2972. ctx->Ans.reserved1.Copy(ans.reserved1);
  2973. if (ans.reserved2.GetCount() > 0)
  2974. ctx->Ans.reserved2.Copy(ans.reserved2);
  2975. if (ans.reserved3.GetCount() > 0)
  2976. ctx->Ans.reserved3.Copy(ans.reserved3);
  2977. if (ans.reserved4.GetCount() > 0)
  2978. ctx->Ans.reserved4.Copy(ans.reserved4);
  2979. ctx->Ans.retainBin = ans.retainBin;
  2980. if (ans.hopperNo.GetCount() > 0)
  2981. {
  2982. ctx->Ans.hopperNo.Copy(ans.hopperNo);
  2983. ctx->Ans.hopperStatus.Copy(ans.hopperStatus);
  2984. }
  2985. }
  2986. else {
  2987. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuerStore QueryCIStatus failed return:%d", eErr));
  2988. }
  2989. ctx->Answer(eErr, dwUsrErrCode);
  2990. return 0;
  2991. }
  2992. }
  2993. return 0;
  2994. }
  2995. void CCardReadAdapterFSM::WaitCardActive()
  2996. {
  2997. while (1)
  2998. {
  2999. if (m_bCardActiveNotify)
  3000. break;
  3001. UINT64 crossEnd = GetTickCountRVC();
  3002. if ((crossEnd - m_ullCrossStart) < 62 * 1000)
  3003. Sleep(1000);
  3004. else {
  3005. if (m_crossCtx != NULL)
  3006. {
  3007. FSMEvent* e = new FSMEvent(USER_EVT_PREONLINE_ON_STORE_FINISHED);
  3008. PostEventFIFO(e);
  3009. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2R03")("跨机激活未收到返回,请确认卡库或服务是否正常");
  3010. m_crossCtx->Answer(Error_TimeOut, CardReadAdapter_UserErrorCode_HBService_No_Return);
  3011. LogError(Severity_Middle, Error_Unexpect, CardReadAdapter_UserErrorCode_HBService_No_Return, "CardActive havn't return in 60s");
  3012. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("record for HealthManager test 1792 to kill CardIsser");
  3013. break;
  3014. }
  3015. }
  3016. }
  3017. }
  3018. bool CCardReadAdapterFSM::CheckHBSessionOrToConnect()
  3019. {
  3020. if (m_pHBClient != NULL && !m_pHBClient->QuerySessionClosed())
  3021. return true;
  3022. else
  3023. {
  3024. ErrorCodeEnum eErr = Error_Unexpect;
  3025. m_pHBClient = new HeartBeatService_ClientBase(GetEntityBase());
  3026. if (m_pHBClient != NULL) {
  3027. eErr = m_pHBClient->Connect();
  3028. if (eErr != Error_Succeed)
  3029. {
  3030. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to HeartBeat failed:%d(0x%x)", eErr, eErr);
  3031. return false;
  3032. }
  3033. else
  3034. {
  3035. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to HeartBeat suc.");
  3036. return true;
  3037. }
  3038. }
  3039. else
  3040. return false;
  3041. }
  3042. }