SpBase.h 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733
  1. #ifndef _RVC_SPBASE_H_
  2. #define _RVC_SPBASE_H_
  3. #pragma once
  4. #include "PlatformDef.h"
  5. #if defined(__cplusplus)
  6. #ifdef SPABASE_LINKED_AS_STATIC_LIBRARY
  7. #define SPBASE_API
  8. #define EXPORT_DECLARE(retType) retType
  9. #else //SPABASE_LINKED_AS_STATIC_LIBRARY
  10. #ifdef RVC_OS_WIN
  11. #ifdef SPBASE_EXPORTS
  12. #ifndef SPBASE_API
  13. #define SPBASE_API __declspec(dllexport)
  14. #endif
  15. #else
  16. #ifndef SPBASE_API
  17. #define SPBASE_API __declspec(dllimport)
  18. #endif
  19. #endif
  20. #define EXPORT_DECLARE(retType) __declspec(dllexport) retType
  21. # elif ( defined(__GNUC__) && __GNUC__ >= 4 )
  22. #define SPBASE_API __attribute__((visibility("default")))
  23. #define EXPORT_DECLARE(retType) __attribute__((visibility("default"))) retType
  24. #else // RVC_OS_WIN
  25. #define SPBASE_API
  26. #define EXPORT_DECLARE(retType) retType
  27. #endif // RVC_OS_WIN
  28. #endif //SPABASE_LINKED_AS_STATIC_LIBRARY
  29. #endif // __cplusplus
  30. #ifdef RVC_OS_WIN
  31. #ifndef u__int64_t
  32. #define u__int64_t unsigned __int64
  33. #endif //u__int64_t
  34. #endif
  35. #include <time.h> // for time_t
  36. #ifdef RVC_OS_WIN
  37. #include<wtypes.h>
  38. #else
  39. #include <winpr/library.h>
  40. #include <winpr/synch.h>
  41. #endif // RVC_OS_WIN
  42. #if defined(__cplusplus)
  43. #include "SmartPointer.h"
  44. #include "SimpleString.h"
  45. #include "AutoArray.h"
  46. #endif // __cplusplus
  47. #include "ErrorCode.h"
  48. #include "httpTrace_define.hpp"
  49. #ifndef MODULE_VERSION_FULL
  50. #define MODULE_VERSION_FULL "0.0.0"
  51. #endif
  52. /** define the log message type */
  53. enum LogTypeEnum
  54. {
  55. Log_Ignore=0, // ignore
  56. Log_Event=1, // Run time event
  57. Log_Warning=2, // Warning
  58. Log_Error=3, // Error notify
  59. Log_Debug=4, // debug alert ec.Assert
  60. Log_Fatal = 5 // Fatal notify
  61. };
  62. /** define the framework internal behavior log */
  63. enum DebugLevelEnum
  64. {
  65. Debug_None = 0, // ignore
  66. Debug_Low,
  67. Debug_Middle,
  68. Debug_High,
  69. };
  70. /** The log message level */
  71. enum SeverityLevelEnum
  72. {
  73. Severity_None=0, // ignore
  74. Severity_Low,
  75. Severity_Middle,
  76. Severity_High
  77. };
  78. enum NotifyLevelEnum
  79. {
  80. Notify_None = 0, // ignore
  81. Notify_Info,
  82. Notify_Warn,
  83. Notify_Error
  84. };
  85. enum InstallStateEnum
  86. {
  87. Install_Active, // A
  88. Install_Pending, // I
  89. Install_SetToStart, // S
  90. Install_FailRun, // F
  91. Install_RollBack, // R
  92. Install_Upgraded, // U
  93. Install_Cancelled, // C
  94. Install_WaitConfirm, // W
  95. Install_Installed, // D, only used to LightPack
  96. };
  97. /* terminal machine type*/
  98. enum MachineTypeEnum
  99. {
  100. RVC_Unknown = 0,
  101. RVC_Stand2S,
  102. RVC_Stand1SPlus,
  103. RVC_CardStore,
  104. RVC_CardPrinter
  105. };
  106. /** terminal application boot state*/
  107. enum AppBootStateEnum
  108. {
  109. AppBootState_Init = 0, /** the begin(init) state*/
  110. AppBootState_StartEntity, /** begin to start entity*/
  111. AppBootState_CallAccessAuth, /** begin to call Regist*/
  112. AppBootState_FirstEnterMainPage, /** the first time received enter main page message*/
  113. };
  114. /** entity state */
  115. enum EntityStateEnum
  116. {
  117. EntityState_NoStart=0, //no start before
  118. EntityState_Starting, //Entity is doing initial
  119. EntityState_Idle, //after started succeed,and have no work
  120. EntityState_Busy, //Doing Request-Answer,timing,and Pausing or coninuing work
  121. // have no see assignment anywhere [4/21/2020 17:38 Gifur]
  122. EntityState_Pause, //Pause state
  123. EntityState_UnLoading, //doing cleanning after trigger close
  124. EntityState_Lost, //Entity block not respond or exception
  125. EntityState_Close, //After close,start before
  126. EntityState_Killed, //The entity terminated as block state
  127. EntityState_Passed, //The entity pass all test case
  128. EntityState_Failed // The entity fail to pass the test case.
  129. };
  130. enum EntityCloseCauseEnum
  131. {
  132. CloseCause_Self=0, //Trigger close byte self
  133. CloseCause_Other, //another entity terminate the entity
  134. CloseCause_Lost, //The entity is Lost state, has to be released
  135. CloseCause_Dragged, //The same sp entity enter lost state,and has to be dragged to close
  136. CloseCause_ShellQuit, //shell end it as shell quit
  137. CloseCause_Crash,
  138. };
  139. /** session state */
  140. enum SessionStateEnum
  141. {
  142. SessionState_NotInit=0,
  143. SessionState_Live,
  144. SessionState_Pause,
  145. SessionState_Close,
  146. };
  147. /** reboot trigger reason code */
  148. enum RebootTriggerEnum
  149. {
  150. RebootTrigger_Unknown=0, //not alloc in api call.only not log for unknown reason so far
  151. RebootTrigger_Period, //daily or weekly
  152. RebootTrigger_FrameUpgrade, //reboot by update module,not reboot os
  153. RebootTrigger_OSUpgrade, //relate to outside the framework update, reboot os
  154. RebootTrigger_RollBack, //roll back to history version
  155. RebootTrigger_FailLoad, //load fail when framework start
  156. RebootTrigger_Resource, //reboot by health manager
  157. RebootTrigger_RunExcepition, //Exception lead to restart
  158. RebootTrigger_RunDead, //System is out of control in running ec watch dog reset or system dead
  159. RebootTrigger_Attacked, //framework is changed or invaded
  160. RebootTrigger_Powerdown, //Out side power is interrupt
  161. RebootTrigger_Repaired, //Framework has did some repair job in SafeLoad|Fault state and restart try to recover running
  162. RebootTrigger_ManualLocal, //reboot by local maintain
  163. RebootTrigger_ManualRemove, //reboot by remote maintain
  164. RebootTrigger_Unsubscribe, //The life of machine is over,and will not connect to backstage again
  165. RebootTrigger_DeadForever, //As some reason such as test failed, we want Framework dead and not reboot. TODO: let the Gardian know.
  166. RebootTrigger_DeviceAdapterUpgrade,
  167. RebootTrigger_ThirdPartyUpgrade, //第三方升级(体系外升级)
  168. };
  169. enum RebootWayEnum
  170. {
  171. RebootWay_Unknown=0, //If not log,only mark unknown
  172. RebootWay_Framework, //restart framework not os
  173. RebootWay_OS, //restart os not power
  174. RebootWay_Power, //restart os and power
  175. };
  176. enum EntityTestEnum
  177. {
  178. Test_ShakeHand=0,
  179. Test_Examine, //no use at current time, even in selfcheck entity, they defined it but never call it.
  180. Test_Reset,
  181. };
  182. enum ConfigTypeEnum
  183. {
  184. Config_Hardware, //Read only, for read entity hardware file
  185. Config_Software, //Read and write
  186. Config_Run, //Read and write. create in run time can't be upgrade or conver
  187. Config_Shell, //Read only, for read shell.ini file
  188. Config_Root, //Read only, for read root.ini file
  189. Config_CenterSetting, //Read only
  190. Config_Cache //Read and write, store at runcfg/Global.ini
  191. };
  192. enum ScreenEnum
  193. {
  194. Screen_Operation=0, //just has a single Operation Screen
  195. Screen_OpAndInfo=1, //has double screen Operation screen and information screen
  196. Screen_OpAndMaintain=8, //has Operation screen and Maintain screen
  197. Screen_OpAndInfoAndMaintain=9, //has 3 screen Operation screen and information screen and Maintain screen
  198. };
  199. enum EntityPriorityEnum
  200. {
  201. Priority_Low,
  202. Priority_Below_Normal,
  203. Priority_Normal,
  204. Priority_Above_Normal,
  205. Priority_High,
  206. Priority_Highest,
  207. Priority_Unknown
  208. };
  209. #if defined(__cplusplus)
  210. /** for sp-software and acm machine version type */
  211. class CVersion
  212. {
  213. private:
  214. union
  215. {
  216. u__int64_t m_nVersion64;
  217. struct//Intel CPU byte order,otherwise ,need to redefine
  218. {
  219. WORD m_nBuild;
  220. WORD m_nRevision;
  221. union
  222. {
  223. DWORD m_nVersion32;
  224. struct
  225. {
  226. WORD m_nMinor;
  227. WORD m_nMajor;
  228. };
  229. };
  230. };
  231. };
  232. public:
  233. inline WORD GetMajor(){return m_nMajor;}
  234. inline WORD GetMinor(){return m_nMinor;}
  235. inline WORD GetRevision(){return m_nRevision;}
  236. inline WORD GetBuild(){return m_nBuild;}
  237. inline u__int64_t GetVersion64(){return m_nVersion64;}
  238. inline DWORD GetVersion32(){return m_nVersion32;}
  239. inline CSimpleStringA ToString(){return CSimpleStringA::Format("%d.%d.%d.%d",m_nMajor,m_nMinor,m_nRevision,m_nBuild);}
  240. inline bool operator ==(CVersion &Version){return m_nVersion64==Version.m_nVersion64;}
  241. inline bool operator !=(CVersion &Version){return m_nVersion64!=Version.m_nVersion64;}
  242. inline bool operator <(CVersion &Version){return m_nVersion64<Version.m_nVersion64;}
  243. inline bool operator >(CVersion &Version){return m_nVersion64>Version.m_nVersion64;}
  244. inline bool operator <=(CVersion &Version){return m_nVersion64<=Version.m_nVersion64;}
  245. inline bool operator >=(CVersion &Version){return m_nVersion64>=Version.m_nVersion64;}
  246. inline bool IsCompatible(CVersion &Version){return m_nVersion32==Version.m_nVersion32;}
  247. inline bool IsUpgrade(CVersion &Version){return m_nVersion32>Version.m_nVersion32;}
  248. inline CVersion &operator=(const CVersion &Version){m_nVersion64=Version.m_nVersion64;return *this;}
  249. inline CVersion(WORD nMajor,WORD nMinor):m_nMajor(nMajor),m_nMinor(nMinor),m_nRevision(0),m_nBuild(0){}
  250. inline CVersion(WORD nMajor,WORD nMinor,WORD nRevision,WORD nBulid):m_nMajor(nMajor),m_nMinor(nMinor),m_nRevision(nRevision),m_nBuild(nBulid){}
  251. inline CVersion(const CVersion &Version):m_nVersion64(Version.m_nVersion64){}
  252. inline CVersion() : m_nVersion64(0) {}
  253. inline CVersion(__int64 nVersion) : m_nVersion64(nVersion){}
  254. inline bool IsValid(){return m_nVersion64 >0;}
  255. };
  256. SPBASE_API void GetLibVersion(CVersion& version);
  257. SPBASE_API LPCSTR GetLibBuildDate();
  258. class SPBASE_API CSmallDateTime
  259. {
  260. /** 单位是秒 [Gifur@2022324]*/
  261. DWORD m_nTimeTicks;
  262. public:
  263. static CSmallDateTime BeginTime;
  264. static CSmallDateTime EndTime;
  265. static CSmallDateTime GetNow();
  266. inline CSmallDateTime(DWORD nTimeTicks = 0):m_nTimeTicks(nTimeTicks){}
  267. inline CSmallDateTime(const CSmallDateTime &DateTime):m_nTimeTicks(DateTime.m_nTimeTicks){}
  268. inline operator DWORD () const{return m_nTimeTicks;}
  269. inline const CSmallDateTime & operator =(const CSmallDateTime &DateTime){m_nTimeTicks=DateTime.m_nTimeTicks;return *this;}
  270. inline bool operator ==(const CSmallDateTime &DateTime){return m_nTimeTicks==DateTime.m_nTimeTicks;}
  271. inline bool operator !=(const CSmallDateTime &DateTime){return m_nTimeTicks!=DateTime.m_nTimeTicks;}
  272. inline bool operator <(const CSmallDateTime &DateTime){return m_nTimeTicks<DateTime.m_nTimeTicks;}
  273. inline bool operator >(const CSmallDateTime &DateTime){return m_nTimeTicks>DateTime.m_nTimeTicks;}
  274. inline bool operator <=(const CSmallDateTime &DateTime){return m_nTimeTicks<=DateTime.m_nTimeTicks;}
  275. inline bool operator >=(const CSmallDateTime &DateTime){return m_nTimeTicks>=DateTime.m_nTimeTicks;}
  276. __time64_t GetTime64();
  277. /** format string: YYYY-MM-DD hh:mm:ss*/
  278. CSimpleStringA ToTimeString();
  279. SYSTEMTIME ToSystemTime();
  280. void FromSystemTime(const SYSTEMTIME &st);
  281. };
  282. class SPBASE_API CUUID
  283. {
  284. #ifdef RVC_OS_WIN
  285. #if (!defined(SPABASE_LINKED_AS_STATIC_LIBRARY) && !defined(SPBASE_EXPORTS))
  286. protected:
  287. #else
  288. public:
  289. #endif
  290. #else
  291. public:
  292. #endif //RVC_OS_WIN
  293. union//Intel CPU byte order,otherwise the need to redefine
  294. {
  295. u__int64_t m_nUUID64;
  296. struct
  297. {
  298. WORD m_nAppID; //the id of the server
  299. WORD m_nDsn; //inner a Second serial
  300. DWORD m_nTimeTicks;
  301. };
  302. };
  303. static WORD m_gAppID;
  304. public:
  305. inline CUUID(const CUUID &UUID):m_nUUID64(UUID.m_nUUID64){}
  306. inline CUUID(u__int64_t nUUID64 = 0):m_nUUID64(nUUID64){}
  307. inline CSmallDateTime GetTime(){return m_nTimeTicks;}
  308. inline operator u__int64_t () const{return m_nUUID64;}
  309. inline const CUUID & operator =(const CUUID &UUID){m_nUUID64=UUID.m_nUUID64;return *this;}
  310. inline bool operator ==(const CUUID &UUID){return m_nUUID64==UUID.m_nUUID64;}
  311. inline bool operator !=(const CUUID &UUID){return m_nUUID64!=UUID.m_nUUID64;}
  312. inline bool operator <(const CUUID &UUID){return m_nUUID64<UUID.m_nUUID64;}
  313. inline bool operator >(const CUUID &UUID){return m_nUUID64>UUID.m_nUUID64;}
  314. inline bool operator <=(const CUUID &UUID){return m_nUUID64<=UUID.m_nUUID64;}
  315. inline bool operator >=(const CUUID &UUID){return m_nUUID64>=UUID.m_nUUID64;}
  316. inline DWORD GetAppID() const {return m_nAppID;}
  317. inline CSimpleStringA ToString() const { return CSimpleStringA::Format("%016llX", m_nUUID64); }
  318. static CUUID Create(const CUUID &LastUUID);
  319. static CUUID Create(const CUUID& LastUUID, const CSmallDateTime& DateTime);
  320. };
  321. /** for GPS, for longitude, east is +, west is -, for latitude, north is +, south is - */
  322. /* e.g. N22:33:09 convert to float is 22.5525 */
  323. class SPBASE_API CSphereVector
  324. {
  325. private:
  326. float m_fLongitude;
  327. float m_fLatitude;
  328. public:
  329. inline float GetLongitude(){return m_fLongitude;}
  330. inline float GetLatitude(){return m_fLatitude;}
  331. inline CSphereVector(float fLongitude,float fLatitude):m_fLongitude(fLongitude),m_fLatitude(fLatitude){}
  332. inline CSphereVector() : m_fLatitude(0), m_fLongitude(0) {}
  333. /*将浮点型的经度转成度分秒表示法,第4个字节表示经度方向,负浮点数表示西部,返回'W',正浮点数表示东部,返回 'E'*/
  334. void GetBinaryLongitude(BYTE longitude[4]);
  335. /*将浮点型的纬度转成度分秒表示法,第4个字节表示纬度方向,负浮点数表示南部,返回'S',正浮点数表示北部,返回 'N'*/
  336. void GetBinaryLatitude(BYTE latitude[4]);
  337. };
  338. struct CInstallInfo
  339. {
  340. CInstallInfo() :PreviousInstallVersion(), InstallVersion(), tmSwithOverDate(), InstallPack(true), InstallState(Install_Active){}
  341. CVersion PreviousInstallVersion;
  342. CVersion InstallVersion;
  343. CSmallDateTime tmSwithOverDate;
  344. CSimpleStringA InstallPack;
  345. InstallStateEnum InstallState;
  346. };
  347. struct CLightPackInfo
  348. {
  349. CSimpleStringA strPackName;
  350. CSmallDateTime tmInstalledDate;
  351. InstallStateEnum State;
  352. };
  353. #define LINKINFO_BUSSID_LEN 32
  354. #define LINKINFO_TRACEID_LEN 32
  355. #define LINKINFO_SPANID_LEN 16
  356. #define LINKINFO_PARENTSPANID_LEN 16
  357. SPBASE_API CSimpleStringA uuid4_generateStr(int len);
  358. struct linkContext {
  359. CSimpleStringA bussinessId;
  360. CSimpleStringA traceId;
  361. CSimpleStringA spanId;
  362. CSimpleStringA parentSpanId;
  363. CSimpleStringA timestamp; // 新增的 timestamp 字段
  364. linkContext() : bussinessId(true), traceId(true), spanId(true), parentSpanId(true) {
  365. updateTimestamp(); // 初始化时生成时间戳
  366. }
  367. linkContext(CSimpleStringA t_bussinessId, CSimpleStringA t_traceId, CSimpleStringA t_spanId, CSimpleStringA t_parentSpanId)
  368. : bussinessId(t_bussinessId), traceId(t_traceId), spanId(t_spanId), parentSpanId(t_parentSpanId) {
  369. updateTimestamp(); // 初始化时生成时间戳
  370. }
  371. void Init(const char* t_bussId, const char* t_traceId, const char* t_spanId, const char* t_parentSpanId) {
  372. if (t_bussId && t_traceId && t_spanId && t_parentSpanId) {
  373. char copy_bussId[LINKINFO_BUSSID_LEN + 1], copy_traceId[LINKINFO_TRACEID_LEN + 1];
  374. char copy_spanId[LINKINFO_SPANID_LEN + 1], copy_parentSpanId[LINKINFO_PARENTSPANID_LEN + 1];
  375. memset(copy_bussId, 0, sizeof(copy_bussId));
  376. memset(copy_traceId, 0, sizeof(copy_traceId));
  377. memset(copy_spanId, 0, sizeof(copy_spanId));
  378. memset(copy_parentSpanId, 0, sizeof(copy_parentSpanId));
  379. memcpy(copy_bussId, t_bussId, LINKINFO_BUSSID_LEN);
  380. memcpy(copy_traceId, t_traceId, LINKINFO_TRACEID_LEN);
  381. memcpy(copy_spanId, t_spanId, LINKINFO_SPANID_LEN);
  382. memcpy(copy_parentSpanId, t_parentSpanId, LINKINFO_PARENTSPANID_LEN);
  383. bussinessId = copy_bussId;
  384. traceId = copy_traceId;
  385. spanId = copy_spanId;
  386. parentSpanId = copy_parentSpanId;
  387. updateTimestamp(); // 初始化时生成时间戳
  388. }
  389. }
  390. void updateTimestamp()
  391. {
  392. time_t timestamp_seconds = time(NULL);
  393. // 将时间戳转换为字符串
  394. timestamp = CSimpleStringA::Format("%ld", timestamp_seconds);
  395. }
  396. HttpClientTraceLink convertToHttpClientTraceLink()
  397. {
  398. HttpClientTraceLink traceLink;
  399. memset(&traceLink, 0, sizeof(traceLink)); // 初始化结构体
  400. // 复制字段数据
  401. strncpy(traceLink.X_B3_BusinessId, bussinessId.GetData(), sizeof(traceLink.X_B3_BusinessId) - 1);
  402. strncpy(traceLink.X_B3_TraceId, traceId.GetData(), sizeof(traceLink.X_B3_TraceId) - 1);
  403. strncpy(traceLink.X_B3_SpanId, spanId.GetData(), sizeof(traceLink.X_B3_SpanId) - 1);
  404. strncpy(traceLink.X_B3_ParentSpanId, parentSpanId.GetData(), sizeof(traceLink.X_B3_ParentSpanId) - 1);
  405. strncpy(traceLink.X_B3_Timestamp, timestamp.GetData(), sizeof(traceLink.X_B3_Timestamp) - 1);
  406. return traceLink; // 返回结构体副本
  407. }
  408. linkContext& operator=(const linkContext& tmp) {
  409. bussinessId = tmp.bussinessId;
  410. traceId = tmp.traceId;
  411. spanId = tmp.spanId;
  412. parentSpanId = tmp.parentSpanId;
  413. timestamp = tmp.timestamp;
  414. return *this;
  415. }
  416. void clear() {
  417. bussinessId = "";
  418. traceId = "";
  419. spanId = "";
  420. parentSpanId = "";
  421. timestamp = "";
  422. }
  423. linkContext upgradeLink() const {
  424. if (bussinessId.GetLength() == 0 || traceId.GetLength() == 0)
  425. return *this;
  426. else
  427. return linkContext(bussinessId, traceId, uuid4_generateStr(LINKINFO_SPANID_LEN), spanId);
  428. }
  429. linkContext upgradeLinkAndSave() {
  430. if (bussinessId.GetLength() == 0 || traceId.GetLength() == 0)
  431. return *this;
  432. else {
  433. parentSpanId = spanId;
  434. spanId = uuid4_generateStr(LINKINFO_SPANID_LEN);
  435. updateTimestamp(); // 更新时生成时间戳
  436. return *this;
  437. }
  438. }
  439. bool checkEmpty() const {
  440. return (bussinessId.GetLength() == 0 || traceId.GetLength() == 0);
  441. }
  442. void AutoGenerate() {
  443. bussinessId = "LR0402VTMAutoGen";
  444. traceId = uuid4_generateStr(LINKINFO_TRACEID_LEN);
  445. spanId = uuid4_generateStr(LINKINFO_SPANID_LEN);
  446. parentSpanId = "0";
  447. updateTimestamp(); // 自动生成时生成时间戳
  448. }
  449. void AutoGenerate(CSimpleString t_bussinessId) {
  450. bussinessId = t_bussinessId;
  451. traceId = uuid4_generateStr(LINKINFO_TRACEID_LEN);
  452. spanId = uuid4_generateStr(LINKINFO_SPANID_LEN);
  453. parentSpanId = "0";
  454. updateTimestamp(); // 自动生成时生成时间戳
  455. }
  456. };
  457. /** acm machine info, information filled at installation, at root.ini */
  458. struct CSystemStaticInfo : public CInstallInfo
  459. {
  460. CSystemStaticInfo() :
  461. strTerminalID(true),
  462. strMachineType(true),
  463. eScreen(ScreenEnum::Screen_Operation), // 设置一个默认值
  464. nTotalRunCount(0), // 初始化为 0 或其他适当的默认值
  465. nTodayRunCount(0), // 初始化为 0 或其他适当的默认值
  466. tmCreateDate(), // 使用默认构造函数初始化 SmallDateTime
  467. tmCurrentTime(), // 使用默认构造函数初始化 SmallDateTime
  468. strSite(true),
  469. EnrolGPS(),
  470. strEnrolAddr(true),
  471. strManufacturer(true),
  472. strMachineModel(true),
  473. strMachineSN(true),
  474. CurrDepVersion(true)
  475. {
  476. // 在构造函数中进行额外的初始化工作,如果需要的话
  477. }
  478. CSimpleStringA strTerminalID;
  479. CSimpleStringA strMachineType;
  480. CVersion MachineVersion;
  481. ScreenEnum eScreen;
  482. CVersion LatterInstallVersion; // 0 version for none
  483. CAutoArray<CLightPackInfo> LightPackInfos;
  484. WORD nTotalRunCount;
  485. WORD nTodayRunCount;
  486. CSmallDateTime tmCreateDate;
  487. CSmallDateTime tmCurrentTime;
  488. CSimpleStringA strSite;
  489. CSphereVector EnrolGPS;
  490. CSimpleStringA strEnrolAddr;
  491. CSimpleStringA strManufacturer;
  492. CSimpleStringA strMachineModel;
  493. CSimpleStringA strMachineSN;
  494. CSimpleStringA CurrDepVersion;
  495. };
  496. /** map to spshell launch options.*/
  497. enum SystemBootOptionEnum
  498. {
  499. BootOption_Default = 0,
  500. BootOption_Test = 1, /** mapping to sp_cfg::sp_cfg_start_args_t::test_mode & 1 */
  501. BootOption_Entity = (1 << 1), /** mapping to sp_cfg::sp_cfg_start_args_t::start_entities flag */
  502. BootOption_Debug = (1 << 2), /** mapping to sp_cfg::sp_cfg_start_args_t::debug_mode */
  503. BootOption_Benchmark = (1 << 3), /** mapping to sp_cfg::sp_cfg_start_args_t::test_mode & 2*/
  504. BootOption_RootPrivilege = (1 << 4), /** run as root privilege*/
  505. BootOption_ST = (1 << 5), /** run as st mode, mapping to sp_cfg::sp_cfg_start_args_t::test_mode & 4*/
  506. BootOption_UAT = (1 << 6) /** run as uat mode,mapping to sp_cfg::sp_cfg_start_args_t::test_mode & 8*/
  507. };
  508. /** acm system startup info */
  509. struct CSystemRunInfo
  510. {
  511. CSmallDateTime tmStart;
  512. DebugLevelEnum eDebugLevel;
  513. AppBootStateEnum eAppBootState;
  514. DWORD dwBootOption;
  515. BOOL autoTest;
  516. CAutoArray<CSimpleStringA> strRunningEntityNames;
  517. bool bBasicCfgWork;
  518. bool bErrCfgWork;
  519. };
  520. /** boot info */
  521. struct CBootInfo
  522. {
  523. CVersion InstallVersion;
  524. CSmallDateTime tmStart; //the system start run time
  525. CSmallDateTime tmReboot; //The trigger reboot time and It is end of run from StartTime
  526. RebootTriggerEnum eTriggerReason;
  527. RebootWayEnum eWay;
  528. WORD wSameReasonTime;
  529. WORD wSameWayTime;
  530. };
  531. /** sp module info */
  532. struct CSpInfo
  533. {
  534. CSimpleStringA strAuthor;
  535. CSimpleStringA strCompany;
  536. CVersion SoftwareVersion;
  537. CAutoArray<CSimpleStringA> strEntitys;
  538. };
  539. /** entity configuration data */
  540. struct CEntityStaticInfo
  541. {
  542. WORD wEntityDevelopID;
  543. bool bStartedByShell; //config start by shell or not(other Entity)
  544. bool bHasPrivilege; //can support IEntityFunctionPrivilege interface
  545. bool bIndispensable; //must be start and work correct else framework will fall into "Fault" state
  546. CSimpleStringA strSpFileName;
  547. CVersion version;
  548. };
  549. /** entity session info */
  550. struct CEntitySessionInfo
  551. {
  552. CSimpleStringA strCallerEntity;
  553. CSimpleStringA strServiceEntity;
  554. CSmallDateTime tmStart;
  555. SessionStateEnum eState;
  556. CSmallDateTime tmBeginState;
  557. };
  558. struct CEntityStartInfo
  559. {
  560. /** 应用当前实体的启动次数*/
  561. int startTimes;
  562. /** 收到启动实体的时间戳,第一次有效*/
  563. SYSTEMTIME startTime;
  564. /** 完成加载实体模块的时间戳,第一次有效,不判断是否加载失败*/
  565. SYSTEMTIME InitEndTime;
  566. /** 完成启动实体模块时间戳,第一次有效,不判断是否启动失败*/
  567. SYSTEMTIME startEndTime;
  568. };
  569. struct CEntityLastErrorInfo
  570. {
  571. ErrorCodeEnum eSysCode;
  572. DWORD dwUserCode;
  573. CSimpleStringA strErrMsg;
  574. };
  575. /** entity running info */
  576. struct CEntityRunInfo
  577. {
  578. DWORD dwEntityInstanceID;
  579. CSmallDateTime tmFirstStart; //The Entity first started after framework start
  580. CSmallDateTime tmLastStart; //The nearest started of this entity instance
  581. bool bService;
  582. EntityStateEnum eState;
  583. CSmallDateTime tmBeginCurrentState;
  584. DebugLevelEnum eDebugLevel;
  585. DWORD dwUserState; //Self define state
  586. DWORD dwProcessID; //Process ID of os
  587. };
  588. /** entity log info */
  589. struct CEntityLogInfo
  590. {
  591. CSimpleStringA strLogPath;
  592. };
  593. struct BroadcastSubscribeInfo
  594. {
  595. CUUID SubID;
  596. CSimpleStringA strListener; // from entity's name
  597. CSimpleStringA strParam;
  598. };
  599. struct IReleasable
  600. {
  601. virtual ~IReleasable(){};
  602. };
  603. /**
  604. * entity timer for user, the timer will initialize when user call IEntityFunction::SetTimer,
  605. * until user call KillTimer
  606. * note: nTimerID is application defined value in Entity Scope !!!
  607. */
  608. struct ITimerListener
  609. {
  610. virtual void OnTimeout(DWORD dwTimerID) = 0;
  611. };
  612. /** subcribe-public pattern, sys variable used for tracking system-level events */
  613. struct ISysVarListener
  614. {
  615. virtual void OnSysVarEvent(const char *pszKey,
  616. const char *pszValue,const char *pszOldValue,const char *pszEntityName)=0;
  617. };
  618. struct ITerminalStateChangedListener
  619. {
  620. virtual void OnStateChanged(AppBootStateEnum oldState, AppBootStateEnum curState, const char* triggerEntity) = 0;
  621. };
  622. struct IBroadcastListener
  623. {
  624. virtual void OnBroadcastEvent(CUUID SubID, const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer) = 0;
  625. };
  626. struct IEntityLifeListener
  627. {
  628. /* if pszTriggerEntity=null mean created by shell*/
  629. virtual void OnCreated(const char* pszEntityName, ErrorCodeEnum eOnStartErrorCode, const char* pszCallerEntity) = 0;
  630. /*Call after the entity has close or killed, eOnCloseErrorCode notic if the entity do OnClose normally and resource has beed release*/
  631. virtual void OnClosed(const char* pszEntityName, EntityCloseCauseEnum eCloseCause, ErrorCodeEnum eOnCloseErrorCode, const char* pszCallerEntity) = 0;
  632. /*1 case is entity raise exception and catch by framework,but not mean the entity will close,2 case is the entity is enter lost state*/
  633. virtual void OnException(const char* pszEntityName, const char* pszFunctionName, EntityStateEnum eState, EntityStateEnum eLastState, ErrorCodeEnum eErrorCode) = 0;
  634. };
  635. struct IEntityStateListener
  636. {
  637. virtual void OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState) = 0;
  638. virtual void OnUserStateHook(const char* pszEntityName, DWORD dwState, DWORD dwLastState) = 0;
  639. virtual void OnCeateConnection(const char* pszCallerEntity, const char* pszServiceEntity) = 0;
  640. virtual void OnCloseConnection(const char* pszCallerEntity, const char* pszServiceEntity) = 0;
  641. };
  642. /** log hooker */
  643. struct ILogListener
  644. {
  645. virtual void OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  646. const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  647. const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo) = 0;
  648. };
  649. struct IConfigInfo
  650. {
  651. virtual ConfigTypeEnum GetConfigType() = 0;
  652. virtual bool storageInMem() = 0;
  653. /** read/write config via shell */
  654. virtual ErrorCodeEnum ReadConfigValue(const char* pszSection, const char* pszKey, CSimpleStringA& strValue) = 0;
  655. virtual ErrorCodeEnum ReadConfigValueInt(const char* pszSection, const char* pszKey, int& iValue) = 0;
  656. /** only can write self's section, pValue=NULL for delete */
  657. virtual ErrorCodeEnum WriteConfigValue(const char* pszSection, const char* pszKey, const char* pszValue) = 0;
  658. virtual ErrorCodeEnum WriteConfigValueInt(const char* pszSection, const char* pszKey, int iValue) = 0;
  659. /** read all key-value pairs */
  660. virtual ErrorCodeEnum ReadAllKeys(const char* pszSection, CAutoArray<CSimpleStringA>& strKeys) = 0;
  661. /** get all section values */
  662. virtual ErrorCodeEnum ReadAllSections(CAutoArray<CSimpleStringA>& strSections) = 0;
  663. /** write hex int values, ig: "keyName=0x4F3D012A" */
  664. virtual ErrorCodeEnum WriteConfigValueHexInt(const char* pszSection, const char* pszKey, UINT64 nValue) = 0;
  665. virtual ErrorCodeEnum ReadConfigValueHexInt(const char* pszSection, const char* pszKey, UINT64& nValue) = 0;
  666. };
  667. struct IAsynWaitSp;
  668. /** invoked when receive answer from remote */
  669. struct ICallbackListener
  670. {
  671. virtual void OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp) = 0;
  672. };
  673. struct IEntityPersistObject;
  674. /** object serialize mechanism, reader interface */
  675. struct IEntityPersistStreamRead
  676. {
  677. virtual ErrorCodeEnum Get(const char* pszKey, CSimpleStringA& strValue) = 0;
  678. virtual ErrorCodeEnum Get(const char* pszKey, ULONGLONG& qwValue) = 0;
  679. virtual ErrorCodeEnum Get(const char* pszKey, DWORD& dwValue) = 0;
  680. virtual ErrorCodeEnum Get(const char* pszKey, WORD& wValue) = 0;
  681. virtual ErrorCodeEnum Get(const char* pszKey, BYTE& cValue) = 0;
  682. virtual ErrorCodeEnum Get(const char* pszKey, FLOAT& fValue) = 0;
  683. virtual ErrorCodeEnum Get(const char* pszKey, DOUBLE& fValue) = 0;
  684. virtual ErrorCodeEnum Get(const char* pszKey, IEntityPersistObject* pValue) = 0;
  685. virtual ErrorCodeEnum GetArray(const char* pszKey, CAutoArray<CSimpleStringA>& strValues) = 0;
  686. virtual ErrorCodeEnum GetArray(const char* pszKey, CAutoArray<ULONGLONG>& qwValues) = 0;
  687. virtual ErrorCodeEnum GetArray(const char* pszKey, CAutoArray<DWORD>& dwValues) = 0;
  688. virtual ErrorCodeEnum GetArray(const char* pszKey, CAutoArray<WORD>& wValues) = 0;
  689. virtual ErrorCodeEnum GetArray(const char* pszKey, CAutoArray<BYTE>& cValues) = 0;
  690. virtual ErrorCodeEnum GetArray(const char* pszKey, CAutoArray<FLOAT>& fValues) = 0;
  691. virtual ErrorCodeEnum GetArray(const char* pszKey, CAutoArray<DOUBLE>& fValues) = 0;
  692. };
  693. /** object serialize mechanism, writer interface */
  694. struct IEntityPersistStreamWrite
  695. {
  696. virtual ErrorCodeEnum Set(const char* pszKey, const char* pszValue) = 0;
  697. virtual ErrorCodeEnum Set(const char* pszKey, const ULONGLONG qwValue) = 0;
  698. virtual ErrorCodeEnum Set(const char* pszKey, const DWORD dwValue) = 0;
  699. virtual ErrorCodeEnum Set(const char* pszKey, const WORD wValue) = 0;
  700. virtual ErrorCodeEnum Set(const char* pszKey, const BYTE cValue) = 0;
  701. virtual ErrorCodeEnum Set(const char* pszKey, const FLOAT fValue) = 0;
  702. virtual ErrorCodeEnum Set(const char* pszKey, const DOUBLE fValue) = 0;
  703. virtual ErrorCodeEnum Set(const char* pszKey, const IEntityPersistObject* pValue) = 0;
  704. virtual ErrorCodeEnum SetArray(const char* pszKey, const CAutoArray<CSimpleStringA>& strValues) = 0;
  705. virtual ErrorCodeEnum SetArray(const char* pszKey, const CAutoArray<ULONGLONG>& qwValues) = 0;
  706. virtual ErrorCodeEnum SetArray(const char* pszKey, const CAutoArray<DWORD>& dwValues) = 0;
  707. virtual ErrorCodeEnum SetArray(const char* pszKey, const CAutoArray<WORD>& wValues) = 0;
  708. virtual ErrorCodeEnum SetArray(const char* pszKey, const CAutoArray<BYTE>& cValues) = 0;
  709. virtual ErrorCodeEnum SetArray(const char* pszKey, const CAutoArray<FLOAT>& fValues) = 0;
  710. virtual ErrorCodeEnum SetArray(const char* pszKey, const CAutoArray<DOUBLE>& fValues) = 0;
  711. };
  712. /** object serialize mechanism, user-defined object need to inherits from this */
  713. struct IEntityPersistObject
  714. {
  715. virtual ErrorCodeEnum OnRead(CSmartPointer<IEntityPersistStreamRead> pStream) = 0;
  716. virtual ErrorCodeEnum OnWrite(CSmartPointer<IEntityPersistStreamWrite> pStream) const = 0;
  717. };
  718. /** task interface */
  719. struct ITaskSp
  720. {
  721. ITaskSp() : m_ref_cnt(1) {}
  722. virtual ~ITaskSp() {}
  723. virtual void IncRef() { InterlockedIncrement(&m_ref_cnt); }
  724. virtual void DecRef() { if (0 == InterlockedDecrement(&m_ref_cnt)) { delete this; } }
  725. virtual void Process() = 0;
  726. private:
  727. LONG m_ref_cnt;
  728. };
  729. class CClientSessionBase;
  730. class CServerSessionBase;
  731. struct IEntityFunctionPrivilege;
  732. //typedef int (*postLink)(const char *bussinessId, const char *traceId, const char *spanId, const char *parentSpanId);
  733. /** normal entity service */
  734. struct IEntityFunction
  735. {
  736. virtual ~IEntityFunction() {}
  737. /** get Machine Type, the outStrMachine out param will store the MachineType String if not nulll */
  738. virtual MachineTypeEnum GetMachineType(CSimpleStringA* outStrMachine = NULL) = 0;
  739. /** get CSystemStaticInfo information */
  740. virtual ErrorCodeEnum GetSystemStaticInfo(CSystemStaticInfo& Info) = 0;
  741. virtual ErrorCodeEnum GetInstallInfo(CVersion Version, CInstallInfo& Info) = 0; //include latter/current/history version
  742. /**
  743. * get path define in Root.ini,
  744. * pszKey : "Data", "Rec", "Temp", "SysLog", "InterLog","UploadVideo","UploadPhoto","Downloads","Upgraded","LatterInstall","Run","SysRoot","CenterSetting"
  745. */
  746. virtual ErrorCodeEnum GetPath(const char* pszKey, CSimpleStringA& strPath) = 0;
  747. /** get system running info */
  748. virtual ErrorCodeEnum GetSystemRunInfo(CSystemRunInfo& Info) = 0;
  749. /** get busy entity number and startup entity number */
  750. virtual ErrorCodeEnum GetEntityBusyRate(WORD& nBusyEntity, WORD& nAllEntity) = 0;
  751. /** get reboot info,if BeforeThisTime=CSmallDateTime::BeginTime,then return last time boot info,else return the start time before BeforeThisTime record*/
  752. virtual ErrorCodeEnum GetRebootInfo(CSmallDateTime BeforeThisTime, CBootInfo& Info) = 0;
  753. /** get all sp entity module file name without full path */
  754. virtual ErrorCodeEnum GetAllRegistSpFile(CAutoArray<CSimpleStringA>& strSpNames) = 0;
  755. /** get sp file info */
  756. virtual ErrorCodeEnum GetSpFileInfo(const char* pszSpName, CSpInfo& Info) = 0;
  757. /** get all registered entity name */
  758. virtual ErrorCodeEnum GetAllRegistedEntity(CAutoArray<CSimpleStringA>& strEntityNames, CAutoArray<WORD>& wEntityDevelopIDs) = 0;
  759. virtual ErrorCodeEnum GetAllStartedEntity(CAutoArray<CSimpleStringA>& strEntityNames, CAutoArray<DWORD>& dwEntityInstanceIDs) = 0;
  760. /** get the entity of the current process running info */
  761. virtual ErrorCodeEnum GetSelfEntityRunInfo(CEntityRunInfo& Info) = 0;
  762. /** get entity config info */
  763. virtual ErrorCodeEnum GetEntityStaticInfo(const char* pszEntityName, CEntityStaticInfo& Info) = 0;
  764. //virtual ErrorCodeEnum GetEntityStaticInfo(WORD wEntityDevelopID,CEntityStaticInfo &Info)=0;
  765. /** get entity state via shell */
  766. virtual ErrorCodeEnum GetEntityRunInfo(const char* pszEntityName, CEntityRunInfo& Info) = 0;
  767. /** get entity all session info */
  768. virtual ErrorCodeEnum GetEntitySessionInfo(const char* pszEntityName, CAutoArray<CEntitySessionInfo>& Infos) = 0;
  769. /** get entity name from instance entity ID */
  770. virtual ErrorCodeEnum GetEntityName(DWORD dwEntityInstanceID, CSimpleStringA& strName) = 0;
  771. /** get entity name from develop entity ID */
  772. virtual ErrorCodeEnum GetEntityName(WORD wEntityDevelopID, CSimpleStringA& strName) = 0;
  773. /** ini file reader/writer utility */
  774. virtual ErrorCodeEnum OpenConfig(ConfigTypeEnum eConfigType, CSmartPointer<IConfigInfo>& pConfigInfo, bool forceFile = false) = 0;
  775. /** Set self define state enum for out side notice */
  776. virtual ErrorCodeEnum SetUserDefineState(DWORD dwState) = 0;
  777. virtual DWORD GetUserDefineState() = 0;
  778. /** only the entity has been set in shell.ini can change the value*/
  779. virtual ErrorCodeEnum SetSysVar(const char* pszKey, const char* pszValue, bool bPersist = false) = 0;
  780. /** get sys variable value */
  781. virtual ErrorCodeEnum GetSysVar(const char* pszKey, CSimpleStringA& strValue) = 0;
  782. virtual ErrorCodeEnum GetAllEntityStartInfo(CAutoArray<CSimpleStringA>& strEntityNames, CAutoArray<int>& strEntityIdx, CAutoArray<CEntityStartInfo>& Infos) = 0;
  783. /** get entity log path via shell */
  784. virtual ErrorCodeEnum GetEntityLogPath(const char* pszEntityName, CEntityLogInfo& Info) = 0;
  785. virtual WORD GetDevID() = 0;
  786. /**
  787. * install sys variable
  788. * @param pszKey the sys var key you want subscribe
  789. * @param pListener user callback interface
  790. * @param dwSysEventID user defined ID, must be unique in entity scope
  791. */
  792. virtual ErrorCodeEnum RegistSysVarEvent(const char* pszKey, ISysVarListener* pListener) = 0;
  793. /*if pszKey=NULL mean unregist all keys event*/
  794. virtual ErrorCodeEnum UnregistSysVarEvent(const char *pszKey)=0;
  795. /*!
  796. * @brief
  797. * @param pListener the sub class boject pointer inherit ITerminalStateChangedListener and implement
  798. * OnStateChanged interface.
  799. * @return : Error_Succeed if regist successfully, other means failure.
  800. */
  801. virtual ErrorCodeEnum RegistTerminalStateChangeEvent(ITerminalStateChangedListener* pListener) = 0;
  802. /*!
  803. * @brief
  804. * @return : Error_Succeed if unregist successfully
  805. */
  806. virtual ErrorCodeEnum UnregistTerminalStateChangeEvent() = 0;
  807. /**
  808. * every entity can broadcast messages, user entity can subscribe an entity's broadcast messages
  809. */
  810. virtual ErrorCodeEnum SendBroadcast(DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer) = 0;
  811. virtual ErrorCodeEnum GetBroadcastReceivers(CAutoArray<BroadcastSubscribeInfo>& Subscribers) = 0;
  812. virtual ErrorCodeEnum SubscribeBroadcast(const char* pszRemoteEntity, const char* pszParam, IBroadcastListener* pListener, CUUID& SubscribeID) = 0;
  813. virtual ErrorCodeEnum UnsubscribeBroadcast(CUUID SubscribeID) = 0;
  814. virtual ErrorCodeEnum UnsubscribeBroadcast(const char* pszRemoteEntity) = 0;
  815. /**
  816. * subscribe log via shell
  817. * @param listener user's specific callback, null to cancel
  818. * @param eLevel will get log more(or equal) importance than eLevel,
  819. * @param pszEntityName if not null will get log only for that "pszEntityName" appoint one
  820. * @param eSysError Error_IgnoreAll means accept any sys error
  821. * @param dwUserCode -2 means accept any user code, -1 means accept log which has user code(nonzero)
  822. * @param bIgnoreMessage if true then pszMessage will not be send to save bandwidth
  823. */
  824. virtual ErrorCodeEnum SubscribeLog(CUUID& SubscribeID, ILogListener* pListener, LogTypeEnum eLogType = Log_Ignore, SeverityLevelEnum eLevel = Severity_None,
  825. ErrorCodeEnum eSysError = Error_IgnoreAll, DWORD dwUserCode = 0, const char* pszEntityName = NULL, bool bIgnoreMessage = true) = 0;
  826. virtual ErrorCodeEnum UnsubscribeLog(CUUID SubscribeID) = 0;
  827. /** force shell to dump a log file */
  828. virtual ErrorCodeEnum FlushLogFile() = 0;
  829. /**
  830. * do async connect to remote entity service, after connected, then pClientSession->Onconnected will call
  831. * note: if return succeed, pClientSession will delete by system via OnDestroy
  832. * if return failed, pCilentSession need delete by user
  833. */
  834. virtual ErrorCodeEnum ConnectRemoteEntity(CClientSessionBase* pClientSession,
  835. const char* pszRemoteEntity,
  836. const char* pszParam,
  837. CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  838. /**redirect as bridged mode*/
  839. virtual ErrorCodeEnum RedirectSession(CClientSessionBase* pClientSession) = 0;
  840. /**redirect when accepted*/
  841. virtual ErrorCodeEnum RedirectSession(const char* pszSuggestEntity) = 0;
  842. /** redirect subscribe broadcast */
  843. virtual ErrorCodeEnum RedirectSubscribBroadcast(CUUID SubID, const char* pszSugguestEntity) = 0;
  844. /**
  845. * if entity want to close self, call this function to notify shell service,
  846. * then shell service will issue close command
  847. */
  848. virtual ErrorCodeEnum PostQuit() = 0;
  849. /**
  850. * Reload itself entity
  851. */
  852. virtual ErrorCodeEnum PostReload() = 0;
  853. virtual ErrorCodeEnum SetSelfPriority(EntityPriorityEnum nPriority) = 0;
  854. virtual ErrorCodeEnum GetSelfPriority(EntityPriorityEnum& nPriority) = 0;
  855. /**
  856. * timer functions, setup an periodic timer
  857. * @param nTimerID user defined ID, must unique in entity scope
  858. * @param pListener user override callback
  859. * @param dwInterval timer interval
  860. */
  861. virtual ErrorCodeEnum SetTimer(DWORD dwTimerID, ITimerListener* pListener, DWORD dwInterval) = 0;
  862. virtual ErrorCodeEnum SetTimerData(DWORD dwTimerID, IReleasable* pData) = 0;
  863. virtual ErrorCodeEnum GetTimerData(DWORD dwTimerID, CSmartPointer<IReleasable>& pData) = 0;
  864. /*if dwTimerID=0 mean kill all Timer*/
  865. virtual ErrorCodeEnum KillTimer(DWORD dwTimerID) = 0;
  866. virtual ErrorCodeEnum ResetTimer(DWORD dwTimerID, DWORD dwInterval) = 0;
  867. virtual ErrorCodeEnum GetTimerInterval(DWORD dwTimerID, DWORD& dwInterval) = 0;
  868. /** query whether this entity has privilege ? */
  869. virtual bool HasPrivilege() = 0;
  870. /** get privilege pointer */
  871. virtual CSmartPointer<IEntityFunctionPrivilege> GetPrivilegeFunction() = 0;
  872. /** setup log for current thread(for user created thread) */
  873. virtual ErrorCodeEnum InitLogCurrentThread() = 0;
  874. /**
  875. * start tcp bridge server at ip:port
  876. * note: mainly for silverlight usage
  877. * currently: silverlight only can use port range (4502-4506)
  878. * we provide silverlight policy server(tcp 943) at spshell.exe
  879. */
  880. virtual ErrorCodeEnum StartTcpBridgeServer(unsigned short port) = 0;
  881. virtual ErrorCodeEnum StopTcpBridgeServer() = 0;
  882. //virtual void SetPostLinkFun(postLink cur) = 0;
  883. /**
  884. * post Task to entity's thread
  885. * FIFO(first in first out) queue tail, LIFO(last in first out)
  886. * queue head
  887. */
  888. virtual ErrorCodeEnum PostEntityTaskFIFO(ITaskSp* pTask) = 0;
  889. virtual ErrorCodeEnum PostEntityTaskLIFO(ITaskSp* pTask) = 0;
  890. /**
  891. * post task to thread pool
  892. */
  893. virtual ErrorCodeEnum PostThreadPoolTask(ITaskSp* pTask) = 0;
  894. /** request framework to delay closing */
  895. virtual ErrorCodeEnum RequestCloseDelay(WORD nSecond) = 0;
  896. /** log along with params */
  897. virtual void SendLog(const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, DWORD dwUserEventCode, CAutoArray<DWORD> Param, const char* pszMessage = NULL) = 0;
  898. /*verify file code signature, if pass, strErrInfo is sign cert hash, else verify error info*/
  899. virtual ErrorCodeEnum VerifySignature(const char* pszSignedFile, CSimpleStringA& strErrInfo) = 0;
  900. /*show fatal error info when framework startup*/
  901. virtual ErrorCodeEnum ShowFatalError(const char *pszMsg, SeverityLevelEnum eLevel = Severity_None) = 0;
  902. /*show important startup info when framework startup*/
  903. virtual ErrorCodeEnum ShowStartupInfo(const char *pszMsg) = 0;
  904. virtual ErrorCodeEnum GetEntityLastError(const char* pszEntityName, CEntityLastErrorInfo& errInfo) = 0;
  905. virtual void ResetEntityLastError() = 0;
  906. virtual ErrorCodeEnum GetToken(CSimpleString& channelId, CSimpleString& token) = 0;
  907. virtual ErrorCodeEnum SetNewPathToFirewall(CSimpleString& pszPath, int maxWaitMs = 30000) = 0;
  908. /* GetRunningVersion
  909. currently return version in active.txt, may be it will return the version from micro sever latter.
  910. */
  911. virtual ErrorCodeEnum GetRunningVersion(CSimpleString& ver) = 0;
  912. /*Get current Dep version from txt directly*/
  913. virtual ErrorCodeEnum GetRunningDepVersion(CSimpleString& ver) = 0;
  914. virtual ErrorCodeEnum GetVTMErrMsg(DWORD dwUserCode, CSimpleStringA& strDescription, CSimpleStringA& strVTMCode) = 0;
  915. /* return "" if failed to convert(can't find the mapped code) */
  916. virtual CSimpleStringA UserCodeToRTACode(DWORD dwUserCode) = 0;
  917. };
  918. class VTMInitParam{
  919. public:
  920. CSimpleString terminalNo;
  921. CSimpleString channelId;
  922. CSimpleString tokenSecret;
  923. CSimpleString CommonLaunchUrl;
  924. CSimpleString CenterConfigTotal;
  925. VTMInitParam(const char *terminal, const char* channel, const char* token,
  926. const char* launchUrl, const char* configTotal)
  927. : terminalNo(terminal), channelId(channel), tokenSecret(token),
  928. CommonLaunchUrl(launchUrl), CenterConfigTotal(configTotal) {}
  929. };
  930. class MemCfgParam {
  931. public:
  932. CSimpleString configType; //"centersetting", "root", "shell"
  933. CSimpleString module;
  934. CSimpleString name;
  935. CSimpleString value;
  936. MemCfgParam(const char* type, const char* mod, const char* n, const char* val)
  937. : configType(type), module(mod), name(n), value(val) {}
  938. };
  939. /** normal entity no need to use this interface, use for update, health management, etc. */
  940. struct IEntityFunctionPrivilege
  941. {
  942. virtual ~IEntityFunctionPrivilege() {}
  943. /*upate terminal current state*/
  944. virtual ErrorCodeEnum RefreshAppBootState(AppBootStateEnum eState) = 0;
  945. /** start a remote entity,if restart itself only been call in OnClose event,will ignore pAsynWaitSp,and will not wait*/
  946. virtual ErrorCodeEnum StartEntity(const char* pszEntityName, const char* pszCmdLine, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  947. /** close entity ,not use consultative mechanism */
  948. virtual ErrorCodeEnum StopEntity(const char* pszEntityName, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  949. /** require entity close and can use the consultative mechanisms */
  950. virtual ErrorCodeEnum CloseEntity(const char* pszEntityName, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  951. /** terminate entity forcefully */
  952. virtual ErrorCodeEnum TerminateEntity(const char* pszEntityName, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  953. /** pause entity */
  954. virtual ErrorCodeEnum PauseEntity(const char* pszEntityName, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  955. /** continue entity from paused state */
  956. virtual ErrorCodeEnum ContinueEntity(const char* pszEntityName, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  957. /** test whether entity state ok, a simple health-checking mechanism */
  958. virtual ErrorCodeEnum TestEntity(const char* pszEntityName, EntityTestEnum eTestType, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;
  959. /** register entity life event */
  960. virtual ErrorCodeEnum RegistEntityLifeEvent(IEntityLifeListener* pListener) = 0;
  961. virtual ErrorCodeEnum UnregistLiftEvent() = 0;
  962. /** register entity state event, when entity state changes, callback will be invoked */
  963. virtual ErrorCodeEnum RegistEntityStateEvent(const char* pszEntityName, IEntityStateListener* pListener) = 0;
  964. /*If pszEntityName=NULL mean unregist all entity event*/
  965. virtual ErrorCodeEnum UnregistEntityStateEvent(const char *pszEntityName)=0;
  966. virtual ErrorCodeEnum GetSpecifiedEntityState(const char* pszEntityName, EntityStateEnum &eEntityState, DWORD& dwUserState) = 0;
  967. /** trigger reboot framework/machine */
  968. virtual ErrorCodeEnum Reboot(RebootTriggerEnum eTriggerReason, RebootWayEnum eWay) = 0;
  969. /** show blue full-screen title, for example for system error, privilege */
  970. virtual ErrorCodeEnum DisplayBlueScreen(const char* pszTitle) = 0;
  971. /** hide blue screen */
  972. virtual ErrorCodeEnum UndisplayBlueScreen() = 0;
  973. /** show system running output console, including all entity's syslog */
  974. virtual ErrorCodeEnum ShowOuputConsole() = 0;
  975. /**close output console */
  976. virtual ErrorCodeEnum CloseOuputConsole() = 0;
  977. /*Sets the scheduling priority of the process specified by entity name*/
  978. virtual ErrorCodeEnum SetEntityPriority(const char* pszEntityName, EntityPriorityEnum nPriority) = 0;
  979. virtual ErrorCodeEnum GetEntityPriority(const char* pszEntityName, EntityPriorityEnum& nPriority) = 0;
  980. /*begin log sender*/
  981. virtual ErrorCodeEnum BeginLogSend(const char* endpoint, const char* topicSys, const char* topicUser, const char* topicBeidou
  982. , const char* bussSys, const char* bussUser, const char* vtmWeb) = 0;
  983. /*update token*/
  984. virtual ErrorCodeEnum SetHttpToken(const char* channelId, const char* token) = 0;
  985. virtual void GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
  986. unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
  987. unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
  988. unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err,
  989. unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum) = 0;
  990. //replace params with VTMInitParam; if one param in VTMInitParam equals to "", it will not replace to old value
  991. virtual ErrorCodeEnum InitCfgUrl(VTMInitParam &info) = 0;
  992. virtual ErrorCodeEnum TryUpdateCfg() = 0;
  993. virtual ErrorCodeEnum TryUpdateCenterCfg(bool& isUpdate, bool& isReset, CSimpleString& version) = 0;
  994. virtual ErrorCodeEnum TryUpdateToken(CSimpleString& oldToken, CSimpleString& newToken) = 0;
  995. virtual ErrorCodeEnum GetToken(CSimpleString& curToken) = 0;
  996. virtual ErrorCodeEnum WriteTerminalNoToRootIni(CSimpleString terminalNo) = 0;
  997. virtual ErrorCodeEnum ModifyMemCfgParam(MemCfgParam& info) = 0;
  998. virtual ErrorCodeEnum TryUpdateVTMERRMSG() = 0;
  999. virtual ErrorCodeEnum GetVTMErrMsgArr(CAutoArray<CSimpleStringA>& strErrorCodeArr,
  1000. CAutoArray<CSimpleStringA>& strDescriptionArr, CAutoArray<CSimpleStringA>& strRemarkArr) = 0;
  1001. /*
  1002. * strVersion, the text to be written to depver.txt, which just like: 1.2.3.4
  1003. bRefresh, true: update the GetPath('Dep') synchronously
  1004. */
  1005. virtual ErrorCodeEnum RewriteDepVersion(const CSimpleStringA& strVersion, bool bRefresh) = 0;
  1006. };
  1007. /**
  1008. * service entity side transaction, we define call in two types:
  1009. * 1) one way call, client send one way call packet, need no reply from server side
  1010. * 2) two way call, client send request and server response
  1011. * A transaction is a call context hosted by server entity, when one client
  1012. * issues a call, at server entity side, compose a Transaction context object.
  1013. */
  1014. struct ITransactionContext
  1015. {
  1016. virtual ~ITransactionContext() {};
  1017. /** decide whether client call is one way call */
  1018. virtual bool IsOneWayCall() = 0;
  1019. /** get request sequence id */
  1020. virtual DWORD GetRequestID() = 0;
  1021. /** get client buffer */
  1022. virtual ErrorCodeEnum GetReceiveBuffer(DWORD& dwMessageID, DWORD& dwMessageSignature, CAutoBuffer& Buffer) = 0;
  1023. /** send out response to client, only use in two way call scenario */
  1024. virtual ErrorCodeEnum SendAnswer(CAutoBuffer Buffer, bool bEnd = true) = 0;
  1025. /** send out response to client without buffer, this is the simplist case for the above one
  1026. * 20160914: support return custom error: @dwUserError
  1027. */
  1028. virtual ErrorCodeEnum SendAnswer(ErrorCodeEnum eErrorCode, DWORD dwUserError = 0, CSimpleString str = "") = 0;
  1029. /** set response expired timeout value, in milliseconds */
  1030. virtual ErrorCodeEnum SetExpireTime(DWORD dwMS) = 0;
  1031. /** get this run process expire time left value, in milliseconds */
  1032. virtual ErrorCodeEnum GetExpireTime(DWORD& dwWholeTime, DWORD& dwLeftTime) = 0;
  1033. virtual ErrorCodeEnum GetLinkContext(linkContext& curLink) = 0;
  1034. };
  1035. /** The Module entity must implement the interface */
  1036. class CEntityBase
  1037. {
  1038. public:
  1039. CEntityBase():m_pEntityFunction(nullptr) {}
  1040. virtual ~CEntityBase() { if(m_pEntityFunction != nullptr) delete m_pEntityFunction; }
  1041. /** get entity service function */
  1042. virtual CSmartPointer<IEntityFunction> GetFunction() { return m_pEntityFunction; }
  1043. #ifdef RVC_OS_WIN
  1044. #if (!defined(SPABASE_LINKED_AS_STATIC_LIBRARY) && !defined(SPBASE_EXPORTS))
  1045. protected:
  1046. #endif
  1047. #endif //RVC_OS_WIN
  1048. /**
  1049. * invoked when entity is being start, when starting operation finished user must call FinishStart
  1050. * so the starting operation has prepared, then spbase.dll invokes OnStart
  1051. */
  1052. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext) { pTransactionContext->SendAnswer(Error_Succeed); }
  1053. virtual void OnStarted() {}
  1054. /** invoked when entity pause */
  1055. virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext) { pTransactionContext->SendAnswer(Error_Succeed); }
  1056. virtual void OnPaused() {}
  1057. /** invoked when entity continue */
  1058. virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext) { pTransactionContext->SendAnswer(Error_Succeed); }
  1059. virtual void OnContinued() {}
  1060. /** invoked when entity will be closed*/
  1061. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext) { pTransactionContext->SendAnswer(Error_Succeed); }
  1062. /** user override this, so it is able to extend some complicated health-checking method */
  1063. virtual void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext) { pTransactionContext->SendAnswer(Error_Succeed); }
  1064. /*!
  1065. * [Gifur@2020519]
  1066. * override OnSelfTest with speicified EntityTestEnum::Test_Examine
  1067. */
  1068. virtual void OnExam(CSmartPointer<ITransactionContext> pTransactionContext) { pTransactionContext->SendAnswer(Error_NotImpl); }
  1069. /** invoked when incoming new connection user can RedirectSession in OnNewSession*/
  1070. virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/){return NULL;}
  1071. /**
  1072. * if you want to redirection please override this function
  1073. * and invoke IEntityFunciton::RedirectSubscribeBroadcast
  1074. */
  1075. virtual void OnBroadcastSubscribe(CUUID /*SubID*/, const char* /*pszFromEntityName*/, const char* /*pszParam*/) { }
  1076. public:
  1077. /** get this entity name */
  1078. virtual const char* GetEntityName()const = 0;
  1079. /** get this entity version*/
  1080. virtual const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  1081. /** is this entity hosts service ? */
  1082. virtual bool IsService()const{return false;}
  1083. #ifdef RVC_OS_WIN
  1084. #if (!defined(SPABASE_LINKED_AS_STATIC_LIBRARY) && !defined(SPBASE_EXPORTS))
  1085. private:
  1086. #endif
  1087. #endif //RVC_OS_WIN
  1088. /** dont access directly because of inner usage */
  1089. IEntityFunction* m_pEntityFunction;
  1090. };
  1091. /** server session service */
  1092. struct IServerSessionFunction
  1093. {
  1094. virtual ~IServerSessionFunction() {}
  1095. /** get client entity name */
  1096. virtual const char* GetRemoteEntityName() = 0;
  1097. /** get current state of this session */
  1098. virtual SessionStateEnum GetCurrentState() = 0;
  1099. /** close session */
  1100. virtual ErrorCodeEnum CloseSession() = 0;
  1101. };
  1102. /** server service stub, service entity must inherits and implements from here */
  1103. class CServerSessionBase
  1104. {
  1105. public:
  1106. CServerSessionBase() {}
  1107. virtual ~CServerSessionBase() { delete m_pSessionFunction; }
  1108. /** get function pointer */
  1109. CSmartPointer<IServerSessionFunction> GetFunction() { return m_pSessionFunction; }
  1110. #ifdef RVC_OS_WIN
  1111. #if (!defined(SPABASE_LINKED_AS_STATIC_LIBRARY) && !defined(SPBASE_EXPORTS))
  1112. protected:
  1113. #endif
  1114. #endif //RVC_OS_WIN
  1115. /** invoked when receives request from client */
  1116. virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext) = 0;
  1117. /** invoked when peer closed or network failed */
  1118. virtual void OnClose(ErrorCodeEnum eErrorCode) {}
  1119. /** The same client entity can recall a function before the last call return */
  1120. virtual bool IsSessionOverlap() { return true; }
  1121. /** server message id is overlapped ? */
  1122. virtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool& bOverlap) = 0;
  1123. /** is exclusive ? */
  1124. virtual bool IsExclusive() { return false; }
  1125. #ifdef RVC_OS_WIN
  1126. #if (!defined(SPABASE_LINKED_AS_STATIC_LIBRARY) && !defined(SPBASE_EXPORTS))
  1127. private:
  1128. #endif
  1129. #endif //RVC_OS_WIN
  1130. /** dont access directly because of inner usage */
  1131. IServerSessionFunction* m_pSessionFunction;
  1132. };
  1133. /**
  1134. * design for supporting async request, each request in client side is named a async wait sp
  1135. * note: for two way call only
  1136. */
  1137. struct IAsynWaitSp :public IReleasable
  1138. {
  1139. /**Get Caller function name string */
  1140. virtual const char* GetFuctionName() = 0;
  1141. virtual ErrorCodeEnum GetExpireTime(DWORD& dwWholeTime, DWORD& dwLeftTime) = 0;
  1142. /** wait for remote to answer */
  1143. virtual ErrorCodeEnum WaitAnswer(DWORD dwTimeout = INFINITE) = 0;
  1144. /** cancel the pending call */
  1145. virtual ErrorCodeEnum CancelWait() = 0;
  1146. /** decide whether operation is doing */
  1147. virtual bool IsPending() = 0;
  1148. /** get request message id */
  1149. virtual DWORD GetMessageID() = 0;
  1150. /**
  1151. * when request has finished, call this method to fetch remote buffer
  1152. * @param ReceivedBuffer get service side sent out buffer, can be zero length
  1153. * @param bEnd the last response message received, this indicator support multiple return responses
  1154. */
  1155. virtual ErrorCodeEnum AsyncGetAnswer(CAutoBuffer& ReceiveBuffer, bool& bEnd) = 0;
  1156. /**just get the result code */
  1157. virtual ErrorCodeEnum AsyncGetAnswer()=0;
  1158. virtual ErrorCodeEnum AsyncGetAnswer(DWORD& dwUserError) = 0;
  1159. /**get the result code and user code*/
  1160. virtual ErrorCodeEnum AsyncGetAnswer(DWORD& dwUserError, CSimpleString& str) = 0;
  1161. virtual CSmartPointer<IReleasable> GetCallContext() = 0;
  1162. virtual bool GetCallback(CSmartPointer<ICallbackListener>& pCallback, CSmartPointer<IReleasable>& pContext) = 0;
  1163. /** set callback on, default is off(blocking). The context object inherit IReleasable and must rewrite deconstruction to release temp object*/
  1164. virtual void SetCallback(ICallbackListener* pCallback, IReleasable* pContext = NULL) = 0;
  1165. /** wait for remote to answer
  1166. * @param dwUserError entity custom error code
  1167. */
  1168. virtual ErrorCodeEnum WaitAnswer(DWORD& dwUserError, CSimpleString& str, DWORD dwTimeout) = 0;
  1169. /**
  1170. * when request has finished, call this method to fetch remote buffer
  1171. * @param ReceivedBuffer get service side sent out buffer, can be zero length
  1172. * @param bEnd the last response message received, this indicator support multiple return responses
  1173. * @param dwUserError entity custom error code
  1174. */
  1175. virtual ErrorCodeEnum AsyncGetAnswer(CAutoBuffer& ReceiveBuffer, bool& bEnd, DWORD& dwUserError, CSimpleString& str) = 0;
  1176. };
  1177. /** wait for multi IAsynWaitSp */
  1178. SPBASE_API ErrorCodeEnum WaitMultiAnswers(CAutoArray<IAsynWaitSp*> arrAsynWaits, DWORD& dwRetIndex, bool bWaitAll = false, DWORD dwTimeOut = 0);
  1179. /** client session */
  1180. struct IClientSessionFunction :public IReleasable
  1181. {
  1182. /** one way call with buffer */
  1183. virtual ErrorCodeEnum OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer) = 0;
  1184. /** one way call */
  1185. virtual ErrorCodeEnum OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature) = 0;
  1186. //one way withContext
  1187. virtual ErrorCodeEnum OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer, linkContext& pContext) = 0;
  1188. virtual ErrorCodeEnum OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature, linkContext& pContext) = 0;
  1189. /**
  1190. * two way call with buffer
  1191. * @param nMessageID [in] application defined message id
  1192. * @param Buffer [in] application defined buffer data
  1193. * @param pAsynWaitSp [out], required
  1194. * @param dwTimeOut [in],option,default used system 's timeout constant
  1195. */
  1196. virtual ErrorCodeEnum AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer, CSmartPointer<IAsynWaitSp>& pAsynWaitSp, DWORD dwTimeOut = 0, DWORD dwReqId = -1) = 0;
  1197. //with linkContext
  1198. virtual ErrorCodeEnum AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer, CSmartPointer<IAsynWaitSp>& pAsynWaitSp, linkContext& pContext, DWORD dwTimeOut = 0, DWORD dwReqId = -1) = 0;
  1199. virtual ErrorCodeEnum AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CSmartPointer<IAsynWaitSp>& pAsynWaitSp, linkContext& pContext, DWORD dwTimeOut = 0, DWORD dwReqId = -1) = 0;
  1200. /** call without buffer */
  1201. virtual ErrorCodeEnum AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CSmartPointer<IAsynWaitSp>& pAsynWaitSp, DWORD dwTimeOut = 0, DWORD dwReqId = -1) = 0;
  1202. /** get peer entity name */
  1203. virtual const char* GetRemoteEntityName() = 0;
  1204. /** get current state */
  1205. virtual SessionStateEnum GetCurrentState() = 0;
  1206. /** close session */
  1207. virtual ErrorCodeEnum CloseSession() = 0;
  1208. };
  1209. /** client must implement this */
  1210. class SPBASE_API CClientSessionBase
  1211. {
  1212. public:
  1213. CClientSessionBase() : m_pSessionFunction(NULL) {}
  1214. virtual ~CClientSessionBase();
  1215. CSmartPointer<IClientSessionFunction> GetFunction() { return m_pSessionFunction; }
  1216. /** invoked when connected ok, in async mode */
  1217. virtual void OnConnectSucceed() {}
  1218. /** invoked when peer closed or network failed */
  1219. virtual void OnClose(ErrorCodeEnum /*eErrorCode*/) {}
  1220. /** invoke when delete the object */
  1221. virtual void OnDestroy() { delete this; }
  1222. #ifdef RVC_OS_WIN
  1223. #if (!defined(SPABASE_LINKED_AS_STATIC_LIBRARY) && !defined(SPBASE_EXPORTS))
  1224. private:
  1225. #else
  1226. public:
  1227. #endif
  1228. #else
  1229. public:
  1230. #endif //RVC_OS_WIN
  1231. IClientSessionFunction* m_pSessionFunction;
  1232. };
  1233. /** user module must inherit from ModuleBase */
  1234. class SPBASE_API ModuleBase
  1235. {
  1236. public:
  1237. ModuleBase();
  1238. virtual ~ModuleBase();
  1239. virtual ErrorCodeEnum Init();
  1240. virtual ErrorCodeEnum Exit();
  1241. virtual BOOL DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved);
  1242. HINSTANCE GetInstance() { return m_hInstance; }
  1243. static ModuleBase* GetModuleBase();
  1244. protected:
  1245. /** register your entity via this method to framework */
  1246. ErrorCodeEnum RegistEntity(CEntityBase *pEntity);
  1247. ErrorCodeEnum UnregistEntity(CEntityBase *pEntity);
  1248. ErrorCodeEnum GetRegistEntity(const char *pszEntityName,CSmartPointer<CEntityBase> &pEntity);
  1249. #ifdef RVC_OS_WIN
  1250. #if (!defined(SPABASE_LINKED_AS_STATIC_LIBRARY) && !defined(SPBASE_EXPORTS))
  1251. protected:
  1252. #else
  1253. public:
  1254. #endif
  1255. #else
  1256. public:
  1257. #endif //RVC_OS_WIN
  1258. int m_nEntityCount;
  1259. CEntityBase* m_pEntityArray[32];
  1260. static ModuleBase* s_pModuleInst;
  1261. HINSTANCE m_hInstance;
  1262. };
  1263. #define SP_BEGIN_ENTITY_MAP() \
  1264. class SpEntityModuleStub : public ModuleBase \
  1265. { \
  1266. public: \
  1267. SpEntityModuleStub() \
  1268. {
  1269. #define SP_ENTITY(cls) \
  1270. m_pEntityArray[m_nEntityCount++] = dynamic_cast<CEntityBase*>(new cls());
  1271. #ifdef RVC_OS_WIN
  1272. #define SP_END_ENTITY_MAP() \
  1273. } \
  1274. }; \
  1275. SpEntityModuleStub g_ModuleInst; \
  1276. extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) \
  1277. { \
  1278. return g_ModuleInst.DllMain(hInstance, dwReason, lpReserved); \
  1279. }
  1280. #else // RVC_OS_WIN
  1281. #define SP_END_ENTITY_MAP() \
  1282. } \
  1283. }; \
  1284. SpEntityModuleStub g_ModuleInst; \
  1285. extern "C" void __attribute__((constructor)) SoMain() {\
  1286. g_ModuleInst.DllMain(NULL, DLL_PROCESS_ATTACH, NULL); \
  1287. }
  1288. /*
  1289. extern "C" void __attribute__((constructor)) SoEnd() {
  1290. DllMain(NULL, DLL_PROCESS_DETACH, NULL);
  1291. }
  1292. */
  1293. #endif // RVC_OS_WIN
  1294. #include "log_define.h"
  1295. class SPBASE_API DbgToBeidou {
  1296. public:
  1297. DbgToBeidou(const linkContext& t_context, CSimpleStringA t_Api);//link, //当前调用的API
  1298. ~DbgToBeidou();
  1299. DbgToBeidou& setHost(CSimpleStringA t_host);//请求链接地址
  1300. DbgToBeidou& setReturnCode(CSimpleStringA t_returncode);
  1301. DbgToBeidou& setResponseTime(CSimpleStringA t_responseTime);
  1302. DbgToBeidou& setCallStack(CSimpleStringA t_callStack);//调用堆栈,格式("callStack":[{“xxx”:"xx","xxxx":sdfs}])
  1303. DbgToBeidou& setDbStack(CSimpleStringA t_dbStack);//格式("dbStack":[{“xxxxx”:"xxdfsdfs","xxddddxx":sdsddsdfs}])
  1304. DbgToBeidou& setTags(CSimpleStringA t_Tags);
  1305. DbgToBeidou& set_deployUnitId(CSimpleString t_deployUnitId);
  1306. DbgToBeidou& set_serviceUnitId(CSimpleString t_serviceUnitId);
  1307. DbgToBeidou& withLogProducer(void* t_logProducer);
  1308. void operator () () const;
  1309. private:
  1310. class Beidou_private;
  1311. Beidou_private* const m_priPtr;
  1312. char CharZero[2];
  1313. private:
  1314. DbgToBeidou(const DbgToBeidou&) : m_priPtr(NULL) {};
  1315. const DbgToBeidou& operator=(const DbgToBeidou&) { return *this; };
  1316. };
  1317. /*
  1318. #define PROCESS_LINK_CONTEXT(linkName) \
  1319. linkContext linkContextVar; \
  1320. linkContextVar.AutoGenerate(linkName); \
  1321. DbgWithLink(LOG_LEVEL_E::LOG_LEVEL_DEBUG, LOG_TYPE_E::LOG_TYPE_SYSTEM)("linkContextVar, bussinessId:%s, traceId:%s, spanId:%s, parentSpanId:%s", linkContextVar.bussinessId.GetData(), linkContextVar.traceId.GetData(), linkContextVar.spanId.GetData(), linkContextVar.parentSpanId.GetData()); \
  1322. DbgToBeidou(linkContextVar, __FUNCTION__)(); \
  1323. linkContextVar.upgradeLinkAndSave(); \
  1324. DbgWithLink(LOG_LEVEL_E::LOG_LEVEL_DEBUG, LOG_TYPE_E::LOG_TYPE_SYSTEM)("update linkContextVar, bussinessId:%s, traceId:%s, spanId:%s, parentSpanId:%s", linkContextVar.bussinessId.GetData(), linkContextVar.traceId.GetData(), linkContextVar.spanId.GetData(), linkContextVar.parentSpanId.GetData()); \
  1325. HttpClientTraceLink nextLink = linkContextVar.convertToHttpClientTraceLink();
  1326. */
  1327. #define PROCESS_LINK_CONTEXT(linkName) \
  1328. linkContext linkContextVar; \
  1329. linkContextVar.AutoGenerate(linkName); \
  1330. DbgToBeidou(linkContextVar, __FUNCTION__)(); \
  1331. linkContextVar.upgradeLinkAndSave(); \
  1332. HttpClientTraceLink nextLink = linkContextVar.convertToHttpClientTraceLink();
  1333. class SPBASE_API DbgWithLink {
  1334. public:
  1335. DbgWithLink(LOG_LEVEL_E t_level, LOG_TYPE_E t_type);
  1336. ~DbgWithLink();
  1337. //用户、系统日志均必填,交易处理结果代码,0表示处理成功,其他表示失败,可为系统本身的错误码,也可为后台系统返回的错误码
  1338. DbgWithLink& setResultCode(CSimpleStringA t_ResultCode);
  1339. //用户、系统日志均必填,业务跟踪ID, 32字节长度的字符串,唯一识别每笔请求
  1340. DbgWithLink& setTraceID(CSimpleStringA t_TraceID);
  1341. //用户、系统日志LOG_LEVEL_WARN以上必填
  1342. //交易处理结果信息,包括成功与失败信息,可为系统本身的成功/失败信息,也可为后台系统返回的成功/失败信息.
  1343. DbgWithLink& setResultMsg(CSimpleStringA t_ResultMsg);
  1344. //用户日志必填,日志码
  1345. //终端中标识各个交易如读卡、读取身份证等。如果终端由于客观原因无法识别交易场景,则可字段由上游传入。
  1346. DbgWithLink& setLogCode(CSimpleStringA t_LogCode);
  1347. DbgWithLink& setAPI(CSimpleStringA t_API);//用户日志必填,请求路径/接口名称.
  1348. DbgWithLink& setBussID(CSimpleStringA t_BussID);//用户日志必填,请求业务ID
  1349. DbgWithLink& setTipMsg(CSimpleStringA t_TipMsg);//用户日志LOG_LEVEL_WARN以上必填,直接向客户展示的报错信息.
  1350. DbgWithLink& setSourceType(CSimpleStringA t_SourceType);//系统日志LOG_LEVEL_FATAL必填,异常来源类型
  1351. DbgWithLink& setBeginTime(long t_BeginTime);//用户日志必填, 请求发送/接收时间
  1352. DbgWithLink& setEndTime(long t_EndTime);//用户日志必填, 响应接收 / 应答时间
  1353. DbgWithLink& setCostTime(long t_costTime);//消耗时间,自定义字段,单位ms
  1354. DbgWithLink& setVtmCode(CSimpleStringA t_VtmCode);//VtmCode,记录原告警
  1355. DbgWithLink& withLogProducer(void* t_logProducer);
  1356. DbgWithLink& withExtendLog(bool t_doLog);//是否log到文件中,并行阶段需要log到文件
  1357. void operator () (const char* str, ...) const;
  1358. void operator () () const;
  1359. private:
  1360. class Link_private;
  1361. Link_private* const m_priPtr;
  1362. private:
  1363. DbgWithLink(const DbgWithLink&) : m_priPtr(NULL) {};
  1364. const DbgWithLink& operator=(const DbgWithLink&) { return *this; };
  1365. };
  1366. class SPBASE_API EntityResource {
  1367. public:
  1368. static void setLink(const linkContext& cur);
  1369. static const linkContext& getLink();
  1370. static void clearLink();
  1371. static void setSaveFile(int t_saveFile) { m_saveFile = t_saveFile; };
  1372. static int getSaveFile() { return m_saveFile; };
  1373. private:
  1374. static linkContext m_link;
  1375. static int m_saveFile;
  1376. };
  1377. //创建日志存储模块,通常由sphost自动创建,不需要实体创建, CmptId, CmptName一般使用默认值
  1378. SPBASE_API void* create_log_producer_storage(CSimpleStringA entityName, CSimpleStringA item, CSimpleStringA filePath, CSimpleStringA CmptId, CSimpleString CmptName);
  1379. SPBASE_API void destroy_log_producer_storage(void* obj);
  1380. //创建日志上传模块,通常由spshell自动创建,然后上传
  1381. SPBASE_API void* create_log_producer_send(CSimpleStringA endpoint, CSimpleStringA topicSys, CSimpleStringA topicUser, CSimpleStringA topicBeidou, CSimpleStringA bussinessSys, CSimpleStringA bussinessUser, CSimpleStringA topicVTMWeb,
  1382. CSimpleStringA terminalNo, CSimpleStringA sn, CSimpleStringA filePath, int sendWaitTime);
  1383. SPBASE_API void destroy_log_producer_send();
  1384. //创建实体日志默认上传模块, SpShell 和 SpRun 中调用,内部调用 create_log_producer_storage
  1385. SPBASE_API bool create_log_producer_default(CSimpleStringA entityName, int idx);
  1386. SPBASE_API void destroy_log_producer_default();
  1387. SPBASE_API void load_debugLevelInCentersetting(const char* fileName);
  1388. SPBASE_API bool refreshLogLevel();
  1389. SPBASE_API int getCurLogLevel();
  1390. SPBASE_API int getReduceSpbaseLog();
  1391. SPBASE_API void setReduceSpbaseLog(int isNor);
  1392. SPBASE_API void setTestLogMode();
  1393. SPBASE_API int SendTestLog_loki(const char* app, const char* env, const char* body);
  1394. SPBASE_API ErrorCodeEnum GetAllEntityIdx(CAutoArray<CSimpleStringA>& strEntityNames, CAutoArray<WORD>& wEntityDevelopIDs);
  1395. /** log via shell */
  1396. SPBASE_API void LogEvent(const SeverityLevelEnum eLevel,DWORD dwUserEventCode,const char *pszMessage);
  1397. SPBASE_API void LogError(const SeverityLevelEnum eLevel, ErrorCodeEnum dwSysErrorCode,DWORD dwUserErrorCode,const char *pszMessage);
  1398. SPBASE_API void LogWarn(const SeverityLevelEnum eLevel, ErrorCodeEnum dwSysErrorCode,DWORD dwUserErrorCode, const char *pszMessage);
  1399. SPBASE_API void LogFatal(const SeverityLevelEnum eLevel, ErrorCodeEnum dwSysErrorCode, DWORD dwUserErrorCode, const char* pszMessage);
  1400. SPBASE_API void LogAssert(const char *pszMessage,const char *pszSourceFile,const int nLine);
  1401. SPBASE_API void LogTrace(const char *pszMessage,const char *pszSourceFile,const int nLine);
  1402. SPBASE_API void LogEvent(const SeverityLevelEnum eLevel, DWORD dwUserEventCode, const char* pszMessage, const linkContext& t_context);
  1403. SPBASE_API void LogError(const SeverityLevelEnum eLevel, ErrorCodeEnum dwSysErrorCode, DWORD dwUserErrorCode, const char* pszMessage, const linkContext& t_context);
  1404. SPBASE_API void LogWarn(const SeverityLevelEnum eLevel, ErrorCodeEnum dwSysErrorCode, DWORD dwUserErrorCode, const char* pszMessage, const linkContext& t_context);
  1405. SPBASE_API void LogFatal(const SeverityLevelEnum eLevel, ErrorCodeEnum dwSysErrorCode, DWORD dwUserErrorCode, const char* pszMessage, const linkContext& t_context);
  1406. SPBASE_API void LogAssert(const char* pszMessage, const char* pszSourceFile, const int nLine, const linkContext& t_context);
  1407. SPBASE_API void LogTrace(const char* pszMessage, const char* pszSourceFile, const int nLine, const linkContext& t_context);
  1408. SPBASE_API CSimpleStringA GetSysErrMsg(DWORD nErrCode);
  1409. extern "C" SPBASE_API const char *_GetFileName(const char *pszFilePath);
  1410. /*
  1411. 基于当前mod中包含有restful模块,需要把数据从framework中传递到librestful,会比较困难
  1412. (1)实际上大部分实体都没有加载restful模块,所以难以进行显示调用进行初始化。
  1413. (2)初始化的时机难以把握,因为使用restful的位置各不相同
  1414. (3)目前有大致5个实体有用到librestfulSDK,采用回调函数传参的方式,把token功能传入到mod的librestfulSDK中。
  1415. (4)此方式为临时方案,使用策略模式,封装了算法SpGetToken(),通过函数传递的方式将该策略注入到类HttpClientRequestConfig中
  1416. */
  1417. #define MAX_TOKEN_LEN 256
  1418. SPBASE_API void SpGetToken(char* channelId, char* token, char* terminalno, char* reserve1);
  1419. #ifdef RVC_OS_WIN //TODO: duplicate ?
  1420. #define LOG_TRACE(pMsg, ...) \
  1421. LogTrace(CSimpleStringA::Format(pMsg, __VA_ARGS__), _GetFileName(__FILE__), __LINE__)
  1422. #else
  1423. #define LOG_TRACE(pMsg, ...) \
  1424. LogTrace(CSimpleStringA::Format(pMsg, ##__VA_ARGS__), _GetFileName(__FILE__), __LINE__)
  1425. #endif //RVC_OS_WIN
  1426. //TODO: to remove [Gifur@2025730]
  1427. extern "C" SPBASE_API void Dbg(const char *str, ...);
  1428. extern "C" SPBASE_API void vDbg(const char *str, va_list list);
  1429. extern "C" SPBASE_API const char* SpStrError(ErrorCodeEnum errorCode);
  1430. struct CScopeLog
  1431. {
  1432. CScopeLog(const char* pszMsg, const char* pszFile, int nFileLine)
  1433. : m_pszMsg(pszMsg), m_pszFile(pszFile), m_nFileLine(nFileLine)
  1434. {
  1435. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Enter %s, file: {%s}, line: {%d}", m_pszMsg, m_pszFile, m_nFileLine);
  1436. }
  1437. ~CScopeLog() { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Leave %s, file: {%s} ,line: {%d}", m_pszMsg, m_pszFile, m_nFileLine); }
  1438. const char* m_pszMsg;
  1439. const char* m_pszFile;
  1440. int m_nFileLine;
  1441. };
  1442. #define LOG_FUNCTION() CScopeLog __FunctionScopeLog(__FUNCTION__, _GetFileName(__FILE__), __LINE__)
  1443. //TODO:
  1444. /** It is used out of the Entity class members */
  1445. #if ( (defined(_DEBUG) && defined(_MSC_VER)) )
  1446. #define LOG_ASSERT(f) do{if(!(f) && (1 == _CrtDbgReport(_CRT_ASSERT, _GetFileName(__FILE__), __LINE__, NULL, #f))) {_CrtDbgBreak(); LogAssert(#f,_GetFileName(__FILE__), __LINE__);}} while (0)
  1447. #define LOG_ASSERT_MSG(f,pMsg, ...) do{if(!(f) && (1 == _CrtDbgReport(_CRT_ASSERT, _GetFileName(__FILE__), __LINE__, NULL, CSimpleStringA::Format(pMsg, __VA_ARGS__)))) _CrtDbgBreak(); LogAssert(pMsg,_GetFileName(__FILE__), __LINE__);} while (0)
  1448. #else//( (defined(_DEBUG) && defined(_MSC_VER)))
  1449. #define LOG_ASSERT(f) if(!(f)) LogAssert(#f,_GetFileName(__FILE__), __LINE__)
  1450. #define LOG_ASSERT_MSG(f,pMsg, ...) do{ if(!(f)) LogAssert(CSimpleStringA::Format(pMsg, ##__VA_ARGS__),_GetFileName(__FILE__), __LINE__);} while (0)
  1451. #endif// ( (defined(_DEBUG) && defined(_MSC_VER)) )
  1452. #endif // __cplusplus
  1453. #endif //_RVC_SPBASE_H_