SpEntity.cpp 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpTimer.h"
  4. #include "SpMisc.h"
  5. #include "SpBinaryPersistStream.h"
  6. #include "SpEntity.h"
  7. #include "SpModule.h"
  8. #include "SpAsyncWait.h"
  9. #include "SpClientSessionFunction.h"
  10. #include "SpServerSessionFunction.h"
  11. #include "sp_iom.h"
  12. #include "sp_svc.h"
  13. #include "sp_dbg_export.h"
  14. #include "sp_log.h"
  15. #include "sp_var.h"
  16. #include "sp_def.h"
  17. #include "sp_cfg.h"
  18. #include "sp_env.h"
  19. #include "sp_btr.h"
  20. #include "memutil.h"
  21. #include "strutil.h"
  22. #include "fileutil.h"
  23. #include "shm_array.h"
  24. #include "def.h"
  25. #ifdef _WIN32
  26. #include "CodeSignVerify.h"
  27. #include "sp_checkEntity.h"
  28. #endif //_WIN32
  29. static void var_callback(sp_var_listener_t *listener,
  30. const char *key,
  31. const char *oldstr,
  32. const char *newstr,
  33. int client_id,
  34. void *user_data)
  35. {
  36. ISysVarListener *pListener = (ISysVarListener *)user_data;
  37. SpEntity *pEntity = (SpEntity*)sp_var_listener_get_tag(listener);
  38. #ifdef _WIN32
  39. SetthreadGroup(GetCurrentThreadId(), pEntity->get_cfg_ent()->name);
  40. getEntityResource()->m_Entity = pEntity;
  41. #else
  42. GetSpModule()->SetThreadEntity(pEntity);
  43. #endif //_WIN32
  44. sp_env_t *env = sp_get_env();
  45. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, client_id);
  46. if (ent) {
  47. pListener->OnSysVarEvent(key, newstr, oldstr, ent->cfg->name);
  48. }
  49. else {
  50. sp_dbg_warn("cannot found the entity by id: %d", client_id);
  51. }
  52. }
  53. static void bcm_callback(sp_bcm_listener_t *listener,
  54. int from_client_id,
  55. int message_id,
  56. int message_sig,
  57. const void *buf,
  58. int len,
  59. void *user_data)
  60. {
  61. IBroadcastListener *pListener = (IBroadcastListener *)user_data;
  62. SpEntity *pEntity = (SpEntity*)sp_bcm_listener_get_tag(listener);
  63. sp_uid_t uid;
  64. #ifdef _WIN32
  65. SetthreadGroup(GetCurrentThreadId(), pEntity->get_cfg_ent()->name);
  66. getEntityResource()->m_Entity = pEntity;
  67. #else
  68. GetSpModule()->SetThreadEntity(pEntity);
  69. #endif //_WIN32
  70. sp_bcm_listener_get_uid(listener, &uid);
  71. sp_env_t *env = sp_get_env();
  72. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, from_client_id);
  73. if (ent) {
  74. CAutoBuffer Buf;
  75. Buf.Init(len);
  76. if (len > 0) {
  77. memcpy(&Buf[0], buf, len);
  78. }
  79. pListener->OnBroadcastEvent(CUUID(uid), ent->cfg->name, (DWORD)message_id, (DWORD)message_sig, Buf);
  80. }
  81. }
  82. static void on_log(void *inst,
  83. int nsub,
  84. u__int64_t *sub,
  85. int client_id,
  86. int log_epid,
  87. int client_instance_id,
  88. u__int64_t log_id,
  89. u__int64_t prev_rsn,
  90. u__int64_t curr_rsn,
  91. int original_rsn_type,
  92. int rsn_depth,
  93. unsigned int log_time,
  94. int log_type,
  95. int log_severity,
  96. int log_sys_error,
  97. int log_usr_error,
  98. int param_cnt,
  99. int *params,
  100. const char *msg,
  101. void *user_data)
  102. {
  103. try
  104. {
  105. ILogListener *pListener = (ILogListener *)user_data;
  106. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(sp_get_env()->mod_mgr, client_id);
  107. if (ent) {
  108. int i;
  109. CAutoArray<DWORD> arr;
  110. arr.Init(param_cnt);
  111. for (i = 0; i < param_cnt; ++i) {
  112. arr[i] = (DWORD)params[i];
  113. }
  114. CAutoArray<CUUID> subIDs;
  115. subIDs.Init(nsub);
  116. CUUID *pSub = (CUUID*)sub;
  117. for (i = 0; i < nsub; i++)
  118. subIDs[i] = pSub[i];
  119. pListener->OnLog(subIDs,
  120. CUUID(log_id), (LogTypeEnum)log_type, (SeverityLevelEnum)log_severity, log_sys_error, log_usr_error,
  121. ent->instance_id, ent->cfg->devel_id,
  122. arr, ent->cfg->name, ent->mod->cfg->name, msg);
  123. }
  124. }
  125. catch (const std::exception&)
  126. {
  127. }
  128. }
  129. static void task_callback(threadpool_t *threadpool, void *arg, param_size_t param1, param_size_t param2)
  130. {
  131. ITaskSp *pTask = (ITaskSp*)arg;
  132. SpEntity *pEntity = (SpEntity*)param1;
  133. //Dbg("task_callback pTask = %08x", pTask);
  134. #ifdef _WIN32
  135. SetthreadGroup(GetCurrentThreadId(), pEntity->GetEntityBase()->GetEntityName());
  136. try {
  137. getEntityResource()->m_Entity = pEntity;
  138. pTask->Process();
  139. pTask->DecRef();
  140. }
  141. catch (...) {
  142. }
  143. #else
  144. GetSpModule()->SetThreadEntity(pEntity);
  145. #endif //_WIN32
  146. }
  147. static void tpool_log(threadpool_t *threadpool, const char* str)
  148. {
  149. sp_dbg_debug(str);
  150. }
  151. static ErrorCodeEnum GetEntityStaticInfo(CEntityStaticInfo &Info, sp_entity_t *ent)
  152. {
  153. sp_env_t *env = sp_get_env();
  154. if (ent) {
  155. bool bStartedByShell = false;
  156. for (int i = 0; i < env->cfg->shell_ini->arr_startlist->nelts; ++i) {
  157. sp_cfg_shell_entity_t * tmp_ent = ARRAY_IDX(env->cfg->shell_ini->arr_startlist, i, sp_cfg_shell_entity_t*);
  158. if (tmp_ent->idx == ent->cfg->idx) {
  159. bStartedByShell = true;
  160. break;
  161. }
  162. }
  163. Info.wEntityDevelopID = ent->cfg->devel_id;
  164. Info.strSpFileName = ent->mod->cfg->name;
  165. Info.bStartedByShell = bStartedByShell;
  166. Info.bIndispensable = true;
  167. Info.bHasPrivilege = !!ent->cfg->privilege;
  168. } else {
  169. return Error_NotExist;
  170. }
  171. return Error_Succeed;
  172. }
  173. SpEntity::SpEntity(SpModule *pModule, sp_entity_t *ent, sp_cfg_shell_entity_t *cfg_ent, CEntityBase *pEntityBase)
  174. : m_pModule(pModule), m_pEntityBase(pEntityBase), m_pTimerList(NULL), m_svc(NULL), m_var_client(NULL), m_log_client(NULL),
  175. m_ent(ent), m_cfg_ent(cfg_ent), m_tbs(NULL), m_bcm_client(NULL), m_arr_any_var(NULL), m_arr_bcm_listener(NULL), m_log_mgr(NULL)
  176. {
  177. m_ent->service_flag = m_pEntityBase->IsService() ? 1 : 0;
  178. memset(&m_arr_var[0], 0, sizeof(m_arr_var));
  179. }
  180. SpEntity::~SpEntity()
  181. {
  182. Dbg("run ~SpEntity()");
  183. #ifdef _WIN32
  184. getEntityResource()->m_Entity = NULL;
  185. #endif //_WIN32
  186. }
  187. ErrorCodeEnum SpEntity::Init()
  188. {
  189. sp_mod_entity_stub_cb cb;
  190. int rc;
  191. threadpool_t *threadpool;
  192. rc = sp_svc_create(m_pModule->get_iom(), 0, m_ent->cfg->idx,m_ent->cfg->devel_id, &m_svc); //threadpool
  193. if (rc != 0) {
  194. sp_dbg_warn("create svc failed!");
  195. return SpTranslateError(rc);
  196. }
  197. sp_dbg_info("create svc ok!");
  198. threadpool = sp_svc_get_threadpool(m_svc);
  199. threadpool_set_thread_decorator(threadpool, &SpEntity::__on_thread_init, &SpEntity::__on_thread_term, this); //Entity thread
  200. threadpool_create(&m_tpool);
  201. threadpool_set_log(m_tpool, &tpool_log);
  202. threadpool_set_thread_decorator(m_tpool, &SpEntity::__on_thread_init, &SpEntity::__on_thread_term, this);
  203. threadpool_start(m_tpool, 0, 64, 5*60*1000, 0);
  204. #ifdef _WIN32
  205. setModuleAliasName(GetEntityBase()->GetEntityName());
  206. #endif //_WIN32
  207. rc = sp_svc_start(m_svc);
  208. if (rc != 0) {
  209. sp_dbg_warn("start svc failed!");
  210. return SpTranslateError(rc);
  211. }
  212. sp_dbg_info("start svc ok!");
  213. m_pTimerList = SpTimerListCreate(this);
  214. if (!m_pTimerList) {
  215. sp_dbg_warn("create timer list failed!");
  216. return Error_Unexpect;
  217. }
  218. cb.on_entity_prestart = &SpEntity::__on_entity_prestart;
  219. cb.on_entity_stop = &SpEntity::__on_entity_stop;
  220. cb.on_entity_prepause = &SpEntity::__on_entity_prepause;
  221. cb.on_entity_test = &SpEntity::__on_entity_test;
  222. cb.on_entity_precontinue = &SpEntity::__on_entity_precontinue;
  223. cb.on_entity_redirect_subscribe = &SpEntity::__on_entity_redirect_subscribe;
  224. cb.user_data = this;
  225. rc = sp_mod_entity_stub_create(&cb, m_svc, &m_stub); //add a workItem mod_entity_on_pkt
  226. if (rc != 0) {
  227. sp_dbg_warn("create entity stub failed!");
  228. return SpTranslateError(rc);
  229. }
  230. sp_dbg_info("start entity stub ok!");
  231. sp_rpc_client_mgr_callback mgr_cb = {SpEntity::__on_rpc_request, NULL, this};
  232. rc = sp_rpc_client_mgr_create(m_svc, &mgr_cb, &m_rpc_mgr); //Init variable m_rpc_mgr, callback handle
  233. if (rc != 0) {
  234. sp_dbg_warn("create rpc client mgr failed!");
  235. return SpTranslateError(rc);
  236. }
  237. rc = sp_rpc_client_mgr_start(m_rpc_mgr); //add workItem mgr_on_pkt and mgr_on_sys
  238. if (rc != 0) {
  239. sp_dbg_warn("start rpc client mgr failed!");
  240. return SpTranslateError(rc);
  241. }
  242. sp_dbg_info("start rpc client ok!");
  243. sp_ses_mgr_callback_t ses_mgr_cb = {0};
  244. ses_mgr_cb.on_accept = &__on_accept;
  245. ses_mgr_cb.on_destroy = NULL;
  246. ses_mgr_cb.user_data = this;
  247. rc = sp_ses_mgr_create(m_svc, &ses_mgr_cb, &m_ses_mgr); //Init variable m_ses_mgr
  248. if (rc != 0) {
  249. sp_dbg_warn("create ses mgr failed!");
  250. return SpTranslateError(rc);
  251. }
  252. rc = sp_ses_mgr_start(m_ses_mgr); //add workItem mgr_on_pkt and mgr_on_sys
  253. if (rc != 0) {
  254. sp_dbg_warn("start ses mgr failed!");
  255. return SpTranslateError(rc);
  256. }
  257. sp_dbg_info("start ses mgr ok!");
  258. rc = sp_log_client_create(m_svc, m_pModule->get_iom(), &m_log_client);
  259. if (rc != 0) {
  260. sp_dbg_warn("create log client failed!");
  261. return SpTranslateError(rc);
  262. }
  263. sp_dbg_info("start entity log client ok!");
  264. rc = sp_var_client_create(m_svc, &m_var_client);
  265. if (rc != 0) {
  266. sp_dbg_warn("create var client failed!");
  267. return SpTranslateError(rc);
  268. }
  269. sp_dbg_info("create var client ok!");
  270. rc = sp_bcm_client_create(m_svc, &m_bcm_client);
  271. if (rc != 0) {
  272. sp_dbg_warn("create bcm client failed!");
  273. return SpTranslateError(rc);
  274. }
  275. sp_dbg_warn("create bcm client ok!");
  276. rc = sp_log_listener_mgr_create(m_svc, on_log, &m_log_mgr);
  277. if (rc == 0) {
  278. rc = sp_log_listener_mgr_start(m_log_mgr);
  279. if (rc != 0) {
  280. sp_dbg_warn("create log mgr failed!");
  281. return SpTranslateError(rc);
  282. }
  283. }
  284. sp_dbg_warn("create log mgr ok!");
  285. m_arr_bcm_listener = array_make(0, sizeof(sp_bcm_listener_t*));
  286. return SpTranslateError(rc);
  287. }
  288. void SpEntity::Term()
  289. {
  290. SpTimerListStopAll(m_pTimerList);
  291. }
  292. void SpEntity::on_entity_prestart(int trigger_entity_id, int argc, char *argv[])
  293. {
  294. CAutoArray<CSimpleStringA> Args;
  295. Args.Init(argc);
  296. CSmartPointer<ITransactionContext> pTransactionContext;
  297. pTransactionContext.Attach(new SpMUITransactionContext(this, SpMUITransactionContext::OP_START));
  298. for (int i = 0; i < argc; ++i)
  299. Args[i] = argv[i];
  300. m_pEntityBase->OnPreStart(Args, pTransactionContext);
  301. }
  302. void SpEntity::on_entity_stop(int trigger_entity_id, int cause_code)
  303. {
  304. CSmartPointer<ITransactionContext> pTransactionContext;
  305. pTransactionContext.Attach(new SpMUITransactionContext(this, SpMUITransactionContext::OP_CLOSE));
  306. m_pEntityBase->OnPreClose((EntityCloseCauseEnum)cause_code, pTransactionContext);
  307. }
  308. void SpEntity::on_entity_prepause(int trigger_entity_id)
  309. {
  310. CSmartPointer<ITransactionContext> pTransactionContext;
  311. pTransactionContext.Attach(new SpMUITransactionContext(this, SpMUITransactionContext::OP_PAUSE));
  312. m_pEntityBase->OnPrePause(pTransactionContext);
  313. }
  314. void SpEntity::on_entity_precontinue(int trigger_entity_id)
  315. {
  316. CSmartPointer<ITransactionContext> pTransactionContext;
  317. pTransactionContext.Attach(new SpMUITransactionContext(this, SpMUITransactionContext::OP_CONTINUE));
  318. m_pEntityBase->OnPreContinue(pTransactionContext);
  319. }
  320. void SpEntity::on_entity_test(int trigger_entity_id, int test_type)
  321. {
  322. CSmartPointer<ITransactionContext> pTransactionContext;
  323. pTransactionContext.Attach(new SpMUITransactionContext(this, SpMUITransactionContext::OP_SELFTEST));
  324. m_pEntityBase->OnSelfTest((EntityTestEnum)test_type, pTransactionContext);
  325. }
  326. void SpEntity::on_entity_redirect_subscribe(sp_uid_t *uid, int from_entity_id, const char *param)
  327. {
  328. CUUID id(*uid);
  329. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(sp_get_env()->mod_mgr, from_entity_id);
  330. if (ent) {
  331. m_pEntityBase->OnBroadcastSubscribe(id, ent->cfg->name, param);
  332. }
  333. }
  334. void SpEntity::__on_entity_prestart(sp_mod_entity_stub_t *, int trigger_entity_id, int argc, char *argv[], void *user_data)
  335. {
  336. sp_dbg_debug("==> %s", __FUNCTION__);
  337. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  338. pThis->on_entity_prestart(trigger_entity_id, argc, argv);
  339. sp_dbg_debug("<== %s", __FUNCTION__);
  340. }
  341. void SpEntity::__on_entity_stop(sp_mod_entity_stub_t *, int trigger_entity_id, int cause_code, void *user_data)
  342. {
  343. Dbg("stop Entity");
  344. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  345. pThis->on_entity_stop(trigger_entity_id, cause_code);
  346. }
  347. void SpEntity::__on_entity_prepause(sp_mod_entity_stub_t *, int trigger_entity_id, void *user_data)
  348. {
  349. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  350. pThis->on_entity_prepause(trigger_entity_id);
  351. }
  352. void SpEntity::__on_entity_precontinue(sp_mod_entity_stub_t *, int trigger_entity_id, void *user_data)
  353. {
  354. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  355. pThis->on_entity_precontinue(trigger_entity_id);
  356. }
  357. void SpEntity::__on_entity_test(sp_mod_entity_stub_t *, int trigger_entity_id, int test_type, void *user_data)
  358. {
  359. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  360. pThis->on_entity_test(trigger_entity_id, test_type);
  361. }
  362. void SpEntity::__on_entity_redirect_subscribe(sp_mod_entity_stub_t *, sp_uid_t *uid, int from_entity_id, const char *param, void *user_data)
  363. {
  364. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  365. pThis->on_entity_redirect_subscribe(uid, from_entity_id, param);
  366. }
  367. int SpEntity::__on_accept(sp_ses_mgr_t *mgr, int epid, int svc_id, int conn_id, iobuffer_t **conn_pkt, int *redirect_entity_id, void *user_data)
  368. {
  369. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  370. return pThis->on_accept(epid, svc_id, conn_id, conn_pkt, redirect_entity_id);
  371. }
  372. int SpEntity::on_accept(int epid, int svc_id, int conn_id, iobuffer_t **conn_pkt, int *redirect_entity_id)
  373. {
  374. sp_env_t *env = sp_get_env();
  375. ErrorCodeEnum Error = Error_Succeed;
  376. if (!m_pEntityBase->IsService()) {
  377. sp_dbg_warn("current entity is no registed as service type, please confirm it at code scope.");
  378. return Error_Bug;
  379. }
  380. sp_entity_t *remote_ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, svc_id);
  381. if (!remote_ent) {
  382. sp_dbg_error("cannot recognize the customer entity: %d!", svc_id);
  383. return Error_Bug;
  384. }
  385. char *pszParam = NULL;
  386. CServerSessionBase *pServerSessionBase = NULL;
  387. iobuffer_format_read(*conn_pkt, "s", &pszParam);
  388. try {
  389. m_redirect_entity_cache = NULL; // user can set entity_cache value in OnNewSession by invoking RedirectSession method
  390. pServerSessionBase = m_pEntityBase->OnNewSession(remote_ent->cfg->name, pszParam);
  391. } catch (...) {
  392. Error = Error_Exception;
  393. }
  394. toolkit_free(pszParam);
  395. if (pServerSessionBase)
  396. {
  397. SpServerSessionFunction *pServerSessionFunction = new SpServerSessionFunction(this, pServerSessionBase, epid, svc_id, conn_id);
  398. pServerSessionBase->m_pSessionFunction = pServerSessionFunction;
  399. Error = pServerSessionFunction->Begin();
  400. if (Error != Error_Succeed)
  401. {
  402. delete pServerSessionBase; // this will also delete pServerSessionFunction
  403. }
  404. }
  405. else
  406. {
  407. if (m_redirect_entity_cache)
  408. {
  409. *redirect_entity_id = m_redirect_entity_cache->cfg->idx;
  410. Error = Error_Redirect;
  411. }
  412. else
  413. {
  414. Error = Error_NotImpl;
  415. }
  416. }
  417. return Error;
  418. }
  419. void SpEntity::on_thread_init()
  420. {
  421. #ifdef _WIN32
  422. SetthreadGroup(GetCurrentThreadId(), this->get_cfg_ent()->name);
  423. getEntityResource()->m_Entity = this;
  424. #else
  425. m_pModule->SetThreadEntity(this);
  426. #endif //_WIN32
  427. }
  428. void SpEntity::on_thread_term()
  429. {
  430. #ifdef _WIN32
  431. SetthreadGroup(GetCurrentThreadId(), this->get_cfg_ent()->name);
  432. getEntityResource()->m_Entity = NULL;
  433. #else
  434. m_pModule->SetThreadEntity(NULL);
  435. #endif //_WIN32
  436. }
  437. void SpEntity::__on_thread_init(threadpool_t *, void *arg)
  438. {
  439. SpEntity *pThis = static_cast<SpEntity*>(arg);
  440. pThis->on_thread_init();
  441. sp_dbg_debug("thread init, thread id:%d", GetCurrentThreadId());
  442. }
  443. void SpEntity::__on_thread_term(threadpool_t *, void *arg)
  444. {
  445. SpEntity *pThis = static_cast<SpEntity*>(arg);
  446. pThis->on_thread_term();
  447. sp_dbg_debug("thread term, thread id:%d", GetCurrentThreadId());
  448. }
  449. ErrorCodeEnum SpEntity::SetTimer(DWORD nTimerID, ITimerListener *pListener, DWORD dwInterval)
  450. {
  451. ErrorCodeEnum Error = Error_Succeed;
  452. if (!pListener)
  453. return Error_Param;
  454. SpTimerListLock(m_pTimerList);
  455. if (SpTimerListFind(m_pTimerList, nTimerID)) {
  456. sp_dbg_warn("timer id %d already in use!", nTimerID);
  457. Error = Error_AlreadyExist;
  458. } else {
  459. SpTimer *pTimer = SpTimerCreate(m_pTimerList, nTimerID, dwInterval, pListener);
  460. if (pTimer) {
  461. SpTimerListAdd(m_pTimerList, pTimer);
  462. Error = SpTimerStart(pTimer);
  463. if (Error) {
  464. SpTimerListRemove(m_pTimerList, pTimer);
  465. SpTimerDestroy(pTimer);
  466. sp_dbg_warn("start timer %d failed: %d!", nTimerID, Error);
  467. } else {
  468. sp_dbg_info("timer %d added! interval = %d", nTimerID, dwInterval);
  469. }
  470. } else {
  471. Error = Error_Unexpect;
  472. }
  473. }
  474. SpTimerListUnlock(m_pTimerList);
  475. return Error;
  476. }
  477. ErrorCodeEnum SpEntity::SetTimerData(DWORD dwTimerID, IReleasable *pData)
  478. {
  479. ErrorCodeEnum Error = Error_Succeed;
  480. SpTimerListLock(m_pTimerList);
  481. SpTimer *pTimer = SpTimerListFind(m_pTimerList, dwTimerID);
  482. if (pTimer) {
  483. SpTimerSetUserData(pTimer, pData);
  484. } else {
  485. sp_dbg_warn("timer %d not found!", dwTimerID);
  486. Error = Error_NotExist;
  487. }
  488. SpTimerListUnlock(m_pTimerList);
  489. return Error;
  490. }
  491. ErrorCodeEnum SpEntity::GetTimerData(DWORD dwTimerID, CSmartPointer<IReleasable> &pData)
  492. {
  493. ErrorCodeEnum Error = Error_Succeed;
  494. SpTimerListLock(m_pTimerList);
  495. SpTimer *pTimer = SpTimerListFind(m_pTimerList, dwTimerID);
  496. if (pTimer) {
  497. SpTimerGetUserData(pTimer, pData);
  498. } else {
  499. sp_dbg_warn("timer %d not found!", dwTimerID);
  500. Error = Error_NotExist;
  501. }
  502. SpTimerListUnlock(m_pTimerList);
  503. return Error;
  504. }
  505. ErrorCodeEnum SpEntity::KillTimer(DWORD nTimerID)
  506. {
  507. ErrorCodeEnum Error = Error_Succeed;
  508. SpTimerListLock(m_pTimerList);
  509. SpTimer *pTimer = SpTimerListFind(m_pTimerList, nTimerID);
  510. if (pTimer) {
  511. sp_dbg_info("timer %d killed!", nTimerID);
  512. SpTimerListRemove(m_pTimerList, pTimer);
  513. SpTimerStop(pTimer);
  514. SpTimerDestroy(pTimer);
  515. } else {
  516. sp_dbg_warn("timer %d has not set!", nTimerID);
  517. Error = Error_NotExist;
  518. }
  519. SpTimerListUnlock(m_pTimerList);
  520. return Error;
  521. }
  522. ErrorCodeEnum SpEntity::ResetTimer(DWORD nTimerID, DWORD dwInterval)
  523. {
  524. ErrorCodeEnum Error = Error_Succeed;
  525. SpTimerListLock(m_pTimerList);
  526. SpTimer *pTimer = SpTimerListFind(m_pTimerList, nTimerID);
  527. if (pTimer) {
  528. SpTimerSetInterval(pTimer, dwInterval);
  529. } else {
  530. sp_dbg_warn("timer %d has not set!", nTimerID);
  531. Error = Error_NotExist;
  532. }
  533. SpTimerListUnlock(m_pTimerList);
  534. return Error;
  535. }
  536. ErrorCodeEnum SpEntity::GetTimerInterval(DWORD nTimerID, DWORD &dwInterval)
  537. {
  538. ErrorCodeEnum Error = Error_Succeed;
  539. SpTimerListLock(m_pTimerList);
  540. SpTimer *pTimer = SpTimerListFind(m_pTimerList, nTimerID);
  541. if (pTimer) {
  542. dwInterval = SpTimerGetInterval(pTimer);
  543. } else {
  544. sp_dbg_warn("timer %d has not set!", nTimerID);
  545. Error = Error_NotExist;
  546. }
  547. SpTimerListUnlock(m_pTimerList);
  548. return Error;
  549. }
  550. ErrorCodeEnum SpEntity::ReadPersistObject(const char *pszClass, const char *pszKey, IEntityPersistObject *pInstance)
  551. {
  552. sp_env_t *env = sp_get_env();
  553. sp_pst_tree_t *tree;
  554. int rc;
  555. if (!pszClass || !pszKey || !pInstance)
  556. return Error_Param;
  557. rc = sp_pst_tree_load(env->dir->obj_path, m_ent->cfg->name, pszClass, pszKey, &tree);
  558. if (rc == 0) {
  559. sp_pst_elem_t *root = sp_pst_tree_get_root(tree);
  560. CSmartPointer<IEntityPersistStreamRead> pStream;
  561. pStream.Attach(new SpBinaryPersistStream(SpBinaryPersistStream::Read, root));
  562. rc = (int)pInstance->OnRead(pStream);
  563. sp_pst_tree_destroy(tree);
  564. }
  565. return SpTranslateError(rc);
  566. }
  567. ErrorCodeEnum SpEntity::WritePersistObject(const char *pszClass, const char *pszKey, const IEntityPersistObject *pInstance)
  568. {
  569. sp_env_t *env = sp_get_env();
  570. sp_pst_elem_t *root;
  571. int rc;
  572. if (!pszClass || !pszKey || !pInstance)
  573. return Error_Param;
  574. root = sp_pst_elem_create(NULL, pszKey);
  575. CSmartPointer<IEntityPersistStreamWrite> pStream;
  576. pStream.Attach(new SpBinaryPersistStream(SpBinaryPersistStream::Write, root));
  577. rc = (int)pInstance->OnWrite(pStream);
  578. if (rc == 0) {
  579. sp_pst_tree_t *tree;
  580. sp_pst_tree_create(&tree);
  581. sp_pst_tree_set_root(tree, root);
  582. rc = sp_pst_tree_save(env->dir->obj_path, m_ent->cfg->name, pszClass, pszKey, tree);
  583. sp_pst_tree_destroy(tree);
  584. } else {
  585. sp_pst_elem_destroy(root);
  586. }
  587. return SpTranslateError(rc);
  588. }
  589. ErrorCodeEnum SpEntity::ReadNumOfPersistObject(const char *pszClassName,DWORD &nNum)
  590. {
  591. if (!pszClassName)
  592. return Error_Param;
  593. sp_env_t *env = sp_get_env();
  594. int cnt;
  595. int rc = sp_pst_get_object_count(env->dir->obj_path, m_ent->cfg->name, pszClassName, &cnt);
  596. if (rc == 0)
  597. //nNum = (DWORD)rc; // {bug}
  598. nNum = (DWORD)cnt;
  599. return SpTranslateError(rc);
  600. }
  601. ErrorCodeEnum SpEntity::GetPersistClassObjectKeys(const char *pszClassName, CAutoArray<CSimpleStringA> &strKeys)
  602. {
  603. if (!pszClassName)
  604. return Error_Param;
  605. sp_env_t *env = sp_get_env();
  606. array_header_t *arr = sp_pst_get_object_keys(env->dir->obj_path, m_ent->cfg->name, pszClassName);
  607. if (arr) {
  608. strKeys.Init(arr->nelts);
  609. for (int i = 0; i < arr->nelts; ++i)
  610. strKeys[i] = ARRAY_IDX(arr, i, char*);
  611. array_free2(arr);
  612. } else {
  613. strKeys.Init(0);
  614. }
  615. return Error_Succeed;
  616. }
  617. ErrorCodeEnum SpEntity::DeleteKeyOfPersistObject(const char *pszClassName,const char *pszKey)
  618. {
  619. if (!pszClassName || !pszKey)
  620. return Error_Param;
  621. sp_env_t *env = sp_get_env();
  622. int rc = sp_pst_delete_object(env->dir->obj_path, m_ent->cfg->name, pszClassName, pszKey);
  623. return SpTranslateError(rc);
  624. }
  625. ErrorCodeEnum SpEntity::EnumKeyOfPersistObject(const char *pszClass,CSimpleStringA &strKey,DWORD &handle)
  626. {
  627. if (!pszClass)
  628. return Error_Param;
  629. int rc = 0;
  630. sp_env_t *env = sp_get_env();
  631. struct HelperIterator {
  632. array_header_t *arr;
  633. int Current;
  634. } * pIterator = NULL;
  635. if (handle == 0) {
  636. pIterator = new HelperIterator();
  637. pIterator->arr = sp_pst_get_object_keys(env->dir->obj_path, m_ent->cfg->name, pszClass);
  638. if (!pIterator->arr) {
  639. delete pIterator;
  640. return Error_NotExist;
  641. }
  642. pIterator->Current = 0;
  643. //TODO: x64 environment, depend on how to use the out-param
  644. handle = (uintptr_t)(static_cast<void*>(pIterator));
  645. //Handle = (DWORD)pIterator;
  646. } else {
  647. pIterator = (HelperIterator *)handle;
  648. }
  649. if (pIterator->Current < pIterator->arr->nelts) {
  650. strKey = ARRAY_IDX(pIterator->arr, pIterator->Current, char*);
  651. pIterator->Current++;
  652. } else {
  653. if (pIterator->arr)
  654. array_free2(pIterator->arr);
  655. delete pIterator;
  656. handle = 0; // zero handle
  657. rc = Error_NotExist;// the end
  658. }
  659. return SpTranslateError(rc);
  660. }
  661. ErrorCodeEnum SpEntity::CleanAllOfPersistObject(const char *pszClass)
  662. {
  663. if (!pszClass)
  664. return Error_Param;
  665. sp_env_t *env = sp_get_env();
  666. int rc = sp_pst_delete_class_objects(env->dir->obj_path, m_ent->cfg->name, pszClass);
  667. return SpTranslateError(rc);
  668. }
  669. ErrorCodeEnum SpEntity::SubscribeLog(CUUID &SubscribeID, ILogListener *pListener,LogTypeEnum eLogType,SeverityLevelEnum eLevel,
  670. ErrorCodeEnum eSysError,DWORD dwUserCode,const char *pszEntityName,bool bIgnoreMessage)
  671. {
  672. _ASSERT(pListener);
  673. sp_entity_t *ent = NULL;
  674. if (pszEntityName) {
  675. ent = sp_mod_mgr_find_entity_by_name(sp_get_env()->mod_mgr, pszEntityName);
  676. if (!ent) {
  677. sp_dbg_error("SubscribeLog failed! Entity %s not exist!", pszEntityName);
  678. return Error_NotExist;
  679. }
  680. }
  681. unsigned int listen_id = 0;
  682. int rc = sp_log_listener_mgr_subscribe(m_log_mgr, &listen_id, pListener, !!bIgnoreMessage,
  683. eLogType, ent ? ent->cfg->idx : -1, eLevel, eSysError, dwUserCode);
  684. if (rc == 0) {
  685. SubscribeID = listen_id;
  686. }
  687. return SpTranslateError(rc);
  688. }
  689. ErrorCodeEnum SpEntity::UnsubscribeLog(CUUID SubscribeID)
  690. {
  691. unsigned int listen_id = (unsigned int)SubscribeID;
  692. int rc = sp_log_listener_mgr_unsubscribe(m_log_mgr, listen_id);
  693. return SpTranslateError(rc);
  694. }
  695. ErrorCodeEnum SpEntity::FlushLogFile()
  696. {
  697. return LogFlush();
  698. }
  699. ErrorCodeEnum SpEntity::SetSysVar(const char *pszKey,const char *pszValue, bool bPersist)
  700. {
  701. int rc;
  702. _ASSERT(pszValue); // pszValue can be null, use for delete
  703. rc = sp_var_client_set((sp_var_client_t*)m_var_client, pszKey, pszValue, bPersist ? 1 : 0);
  704. return SpTranslateError(rc);
  705. }
  706. ErrorCodeEnum SpEntity::GetSysVar(const char *pszKey,CSimpleStringA &strValue)
  707. {
  708. sp_var_client_t* client = (sp_var_client_t*)m_var_client;
  709. int slen = 0;
  710. int rc;
  711. _ASSERT(pszKey);
  712. rc = sp_var_client_lock(client);
  713. if (rc == 0) {
  714. rc = sp_var_client_get(client, pszKey, NULL, &slen);
  715. if (rc == Error_TooSmallBuffer) {
  716. CSimpleStringA strTmp('\0', slen);
  717. rc = sp_var_client_get((sp_var_client_t*)m_var_client, pszKey, &strTmp[0], &slen);
  718. if (rc == 0)
  719. strValue = strTmp;
  720. }
  721. sp_var_client_unlock(client);
  722. }
  723. return SpTranslateError(rc);
  724. }
  725. ErrorCodeEnum SpEntity::RegistSysVarEvent(const char *pszKey,ISysVarListener *pListener)
  726. {
  727. int rc = 0;
  728. if (!pszKey || !pListener)
  729. return Error_Param;
  730. sp_env_t *env = sp_get_env();
  731. sp_var_listener_t **pp_var;
  732. if (strcmp(pszKey, "*") != 0) {
  733. sp_cfg_shell_sysevent_t *sysevent = sp_cfg_get_sysevent(env->cfg, pszKey);
  734. if (!sysevent)
  735. return Error_NotExist;
  736. if (m_arr_var[sysevent->idx])
  737. return Error_Duplication;
  738. pp_var = &m_arr_var[sysevent->idx];
  739. } else {
  740. if (m_arr_any_var)
  741. return Error_Duplication;
  742. pp_var = &m_arr_any_var;
  743. }
  744. sp_var_listener_t *listener;
  745. sp_var_listener_create(m_svc, pszKey, &var_callback, pListener, &listener);
  746. sp_var_listener_set_tag(listener, this);
  747. rc = sp_var_listener_subscribe(listener);
  748. if (rc == 0) {
  749. *pp_var = listener;
  750. } else {
  751. sp_var_listener_destroy(listener);
  752. }
  753. return SpTranslateError(rc);
  754. }
  755. ErrorCodeEnum SpEntity::UnregistSysVarEvent(const char *pszKey)
  756. {
  757. if (!pszKey)
  758. return Error_Param;
  759. int rc = 0;
  760. if (strcmp(pszKey, "*") != 0) {
  761. sp_env_t *env = sp_get_env();
  762. sp_cfg_shell_sysevent_t *sysevent = sp_cfg_get_sysevent(env->cfg, pszKey);
  763. if (!sysevent)
  764. return Error_NotExist;
  765. sp_var_listener_t *listener = m_arr_var[sysevent->idx];
  766. if (listener) {
  767. int rc;
  768. rc = sp_var_listener_unsubscribe(listener);
  769. if (rc == 0) {
  770. sp_var_listener_destroy(listener);
  771. m_arr_var[sysevent->idx] = NULL;
  772. }
  773. } else {
  774. rc = Error_NotInit;
  775. }
  776. } else {
  777. if (m_arr_any_var != NULL)
  778. {
  779. rc = sp_var_listener_unsubscribe(m_arr_any_var);
  780. if (rc == 0)
  781. {
  782. sp_var_listener_destroy(m_arr_any_var);
  783. m_arr_any_var = NULL;
  784. }
  785. }
  786. }
  787. return SpTranslateError(rc);
  788. }
  789. ErrorCodeEnum SpEntity::SendBroadcast(DWORD dwMessageId, DWORD dwMessageSignature,CAutoBuffer Buffer)
  790. {
  791. int rc;
  792. iobuffer_t *pkt = iobuffer_create(-1, Buffer.GetCount());
  793. iobuffer_write(pkt, IOBUF_T_BUF, &Buffer[0], Buffer.GetCount());
  794. rc = sp_bcm_client_bcast(m_bcm_client, dwMessageId, dwMessageSignature, &pkt);
  795. if (pkt)
  796. iobuffer_dec_ref(pkt);
  797. return SpTranslateError(rc);
  798. }
  799. ErrorCodeEnum SpEntity::GetBroadcastReceivers(CAutoArray<BroadcastSubscribeInfo> &Subscribers)
  800. {
  801. ErrorCodeEnum Error;
  802. iobuffer_t *req_pkt = iobuffer_create(-1, -1);
  803. iobuffer_t *ans_pkt = NULL;
  804. Error = AskShell(SHELL_CMD_REQ_GET_BCAST_RECEIVER, &req_pkt, &ans_pkt);
  805. if (Error == Error_Succeed) {
  806. sp_env_t *env = sp_get_env();
  807. int size;
  808. iobuffer_read(ans_pkt, IOBUF_T_I4, &size, NULL);
  809. Subscribers.Init(size);
  810. for (int i = 0; i < size; ++i) {
  811. int ent_id;
  812. sp_uid_t uid;
  813. char *param = NULL;
  814. iobuffer_format_read(ans_pkt, "84s", &uid, &ent_id, &param);
  815. Subscribers[i].SubID = CUUID(uid);
  816. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, ent_id);
  817. Subscribers[i].strListener = ent->cfg->name;
  818. Subscribers[i].strParam = param;
  819. toolkit_free(param);
  820. }
  821. }
  822. if (req_pkt)
  823. iobuffer_dec_ref(req_pkt);
  824. if (ans_pkt)
  825. iobuffer_dec_ref(ans_pkt);
  826. return Error;
  827. }
  828. ErrorCodeEnum SpEntity::SubscribeBroadcast(const char *pszRemoteEntity, const char *pszParam, IBroadcastListener *pListener, CUUID &SubscribeID)
  829. {
  830. if (pszParam == NULL)
  831. pszParam = "";
  832. if (pListener == NULL)
  833. return Error_Param;
  834. sp_entity_t *remote_ent = sp_mod_mgr_find_entity_by_name(sp_get_env()->mod_mgr, pszRemoteEntity);
  835. if (remote_ent) {
  836. int rc;
  837. sp_uid_t uid;
  838. sp_bcm_listener_t *listener;
  839. sp_bcm_listener_cb cb = {0};
  840. cb.on_destroy = NULL;
  841. cb.on_message = &bcm_callback;
  842. cb.on_message_raw = NULL;
  843. cb.user_data = pListener;
  844. rc = sp_bcm_listener_create(m_svc, remote_ent->cfg->idx, pszParam, &cb, &listener);
  845. if (rc == 0) {
  846. rc = sp_bcm_listener_subscribe(listener, &uid);
  847. }
  848. if (rc != 0) {
  849. return SpTranslateError(rc);
  850. }
  851. SubscribeID = CUUID(uid);
  852. sp_bcm_listener_set_tag(listener, this);
  853. ARRAY_PUSH(m_arr_bcm_listener, sp_bcm_listener_t*) = listener;
  854. } else {
  855. return Error_NotExist;
  856. }
  857. return Error_Succeed;
  858. }
  859. ErrorCodeEnum SpEntity::UnsubscribeBroadcast(CUUID SubscribeID)
  860. {
  861. sp_bcm_listener_t *listener = NULL;
  862. int i;
  863. for (i = 0; i < m_arr_bcm_listener->nelts; ++i) {
  864. listener = ARRAY_IDX(m_arr_bcm_listener, i, sp_bcm_listener_t*);
  865. sp_uid_t uid;
  866. sp_bcm_listener_get_uid(listener, &uid);
  867. if (uid == SubscribeID.m_nUUID64) {
  868. ARRAY_DEL(m_arr_bcm_listener, i, sp_bcm_listener_t*);
  869. break;
  870. }
  871. }
  872. if (listener) {
  873. sp_bcm_listener_unsubscribe(listener);
  874. sp_bcm_listener_destroy(listener);
  875. return Error_Succeed;
  876. } else {
  877. return Error_NotExist;
  878. }
  879. }
  880. ErrorCodeEnum SpEntity::UnsubscribeBroadcast(const char *pszRemoteEntity)
  881. {
  882. if (pszRemoteEntity == NULL)
  883. return Error_Param;
  884. sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(sp_get_env()->mod_mgr, pszRemoteEntity);
  885. if (!ent)
  886. return Error_NotExist;
  887. sp_bcm_listener_t *listener = NULL;
  888. int i;
  889. for (i = m_arr_bcm_listener->nelts-1; i >= 0; --i) {
  890. listener = ARRAY_IDX(m_arr_bcm_listener, i, sp_bcm_listener_t*);
  891. if (ent->cfg->idx == sp_bcm_listener_get_target_entity_id(listener)) {
  892. ARRAY_DEL(m_arr_bcm_listener, i, sp_bcm_listener_t*);
  893. sp_bcm_listener_unsubscribe(listener);
  894. sp_bcm_listener_destroy(listener);
  895. }
  896. }
  897. return Error_Succeed;
  898. }
  899. ErrorCodeEnum SpEntity::LogMessage( const LogTypeEnum LogType, const SeverityLevelEnum Level, DWORD dwSysErrorCode, DWORD dwUserErrorCode, const char *pMessage )
  900. {
  901. // xkm@20160726: 校验 dwUserErrorCode 是否合法
  902. int nDevID = m_ent->cfg->devel_id;
  903. if (dwUserErrorCode!=0 && ((dwUserErrorCode >> 20) & nDevID) != nDevID)
  904. {
  905. sp_dbg_warn("[InvalidUserCode] devID: 0x%x, userCode: 0x%x", nDevID, dwUserErrorCode);
  906. }
  907. auto rc = sp_log_client_log(m_log_client, LogType, Level, (int)dwSysErrorCode, (int)dwUserErrorCode, 0, 0, pMessage);
  908. if (rc != 0) {
  909. sp_dbg_warn("log message failed! raw msg: %s", pMessage);
  910. }
  911. else if(dwUserErrorCode != 0) {
  912. sp_dbg_info("userCode: 0x%x send", dwUserErrorCode);
  913. }
  914. return SpTranslateError(rc);
  915. }
  916. ErrorCodeEnum SpEntity::LogMessage(const LogTypeEnum LogType, const SeverityLevelEnum Level, DWORD iSysErrorCode, DWORD iUserErrorCode, CAutoArray<DWORD> Param, const char *pMessage)
  917. {
  918. // xkm@20160726: 校验 iUserErrorCode 是否合法
  919. int nDevID = m_ent->cfg->devel_id;
  920. if (iUserErrorCode != 0 && ((iUserErrorCode >> 20) & nDevID) != nDevID)
  921. {
  922. sp_dbg_warn("[InvalidUserCode] devID: 0x%x, userCode: 0x%x", nDevID, iUserErrorCode);
  923. }
  924. int rc;
  925. sp_log_client_t *client = (sp_log_client_t*)m_log_client;
  926. rc = sp_log_client_log(client, LogType, Level, (int)iSysErrorCode, (int)iUserErrorCode, (int)Param.GetCount(), (int*)&Param[0], pMessage);
  927. if (rc != 0) {
  928. sp_dbg_warn("log message failed! raw msg: %s", pMessage);
  929. }
  930. return SpTranslateError(rc);
  931. }
  932. ErrorCodeEnum SpEntity::LogFlush()
  933. {
  934. int rc;
  935. sp_log_client_t *client = (sp_log_client_t*)m_log_client;
  936. rc = sp_log_client_flush(client);
  937. if (rc != 0) {
  938. sp_dbg_warn("flush log message failed!");
  939. }
  940. return SpTranslateError(rc);
  941. }
  942. ErrorCodeEnum SpEntity::OpenConfig(ConfigTypeEnum eConfigType,CSmartPointer<IConfigInfo> &spConfigInfo)
  943. {
  944. IConfigInfo *pConfigInfo = new SpIniConfig(this, eConfigType);
  945. spConfigInfo.Attach(pConfigInfo);
  946. return Error_Succeed;
  947. }
  948. ErrorCodeEnum SpEntity::SetUserDefineState(DWORD dwState)
  949. {
  950. sp_env_t *env = sp_get_env();
  951. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  952. //sp_mod_mgr_lock(mod_mgr);
  953. DWORD dwOldState = m_ent->user_state;
  954. m_ent->user_state = dwState;
  955. //sp_mod_mgr_unlock(mod_mgr);
  956. // send state chage event to shell
  957. if (dwOldState != dwState)
  958. sp_mod_entity_stub_report_user_state_change(m_stub, dwOldState, dwState);
  959. return Error_Succeed;
  960. }
  961. ErrorCodeEnum SpEntity::GetSystemStaticInfo(CSystemStaticInfo &Info)
  962. {
  963. sp_env_t *env = sp_get_env();
  964. sp_cfg_t *cfg = env->cfg;
  965. sp_cfg_root_ini_t *root_ini = cfg->root_ini;
  966. sp_cfg_install_ini_t *install_ini = cfg->install_ini;
  967. //char tmp[MAX_PATH];
  968. //char *pdir;
  969. //int major, minor;
  970. int i;
  971. sp_cfg_version_info_t *version_info;
  972. memset(&Info, 0, sizeof(Info));
  973. Info.strTerminalID = CSimpleStringA(root_ini->terminal_no);
  974. Info.strMachineType = CSimpleStringA(root_ini->machine_type);
  975. //Info.strMachineModel = CSimpleStringA(root_ini->machine_model);
  976. Info.MachineVersion = CVersion(root_ini->machine_version.major, root_ini->machine_version.minor, root_ini->machine_version.revision, root_ini->machine_version.build);
  977. Info.LatterInstallVersion = CVersion(install_ini->latter_install_version.major, install_ini->latter_install_version.minor, install_ini->latter_install_version.revision, install_ini->latter_install_version.build);
  978. if (install_ini->arr_light_pack->nelts > 0) {
  979. Info.LightPackInfos.Init(install_ini->arr_light_pack->nelts);
  980. }
  981. for (i = 0; i < install_ini->arr_light_pack->nelts; ++i) {
  982. sp_cfg_pack_info_t *pack = ARRAY_IDX(install_ini->arr_light_pack, i, sp_cfg_pack_info_t*);
  983. Info.LightPackInfos[i].strPackName = pack->name;
  984. Info.LightPackInfos[i].State = (InstallStateEnum)pack->state;
  985. Info.LightPackInfos[i].tmInstalledDate = CSmallDateTime(pack->install_time);
  986. }
  987. Info.nTotalRunCount = install_ini->total_run_count;
  988. Info.nTodayRunCount = install_ini->today_run_count;
  989. Info.tmCreateDate = install_ini->install_time;
  990. Info.tmCurrentTime = install_ini->current_startup_time;
  991. Info.strSite = root_ini->site;
  992. Info.eScreen = (ScreenEnum)root_ini->screen;
  993. Info.strEnrolAddr = root_ini->enroll_address;
  994. Info.EnrolGPS = CSphereVector(root_ini->enroll_gps_x, root_ini->enroll_gps_y);
  995. version_info = sp_cfg_find_previous_version_info(cfg, &install_ini->install_version);
  996. if (version_info) {
  997. Info.PreviousInstallVersion = CVersion(version_info->version.major, version_info->version.minor, version_info->version.revision, version_info->version.build);
  998. } else {
  999. Info.PreviousInstallVersion = CVersion(0, 0, 0, 0);
  1000. }
  1001. version_info = sp_cfg_find_version_info(cfg, &install_ini->install_version);
  1002. if (version_info)
  1003. {
  1004. Info.InstallVersion = CVersion(install_ini->install_version.major, install_ini->install_version.minor, install_ini->install_version.revision, install_ini->install_version.build);
  1005. Info.tmSwithOverDate = version_info->switch_time;
  1006. Info.InstallPack = version_info->install_pack;
  1007. Info.InstallState = (InstallStateEnum)version_info->install_state;
  1008. }
  1009. return Error_Succeed;
  1010. }
  1011. ErrorCodeEnum SpEntity::GetInstallInfo(CVersion Version,CInstallInfo &Info)
  1012. {
  1013. sp_env_t *env = sp_get_env();
  1014. sp_cfg_t *cfg = env->cfg;
  1015. /*sp_cfg_root_ini_t *root_ini = cfg->root_ini;
  1016. sp_cfg_install_ini_t *install_ini = cfg->install_ini;*/
  1017. sp_cfg_version_info_t *version_info;
  1018. sp_version_t ver = {Version.GetMajor(), Version.GetMinor(), Version.GetRevision(), Version.GetBuild()};
  1019. version_info = sp_cfg_find_version_info(cfg, &ver);
  1020. if (version_info) {
  1021. Info.InstallPack = version_info->install_pack;
  1022. Info.InstallState = (InstallStateEnum)version_info->install_state;
  1023. Info.InstallVersion = Version;
  1024. Info.PreviousInstallVersion = CVersion(version_info->previous_version.major,
  1025. version_info->previous_version.minor,
  1026. version_info->previous_version.revision,
  1027. version_info->previous_version.build);
  1028. Info.tmSwithOverDate = version_info->switch_time;
  1029. } else {
  1030. return Error_NotExist;
  1031. }
  1032. return Error_Succeed;
  1033. }
  1034. bool SpEntity::IsPackInstalled(const char *pPackName)
  1035. {
  1036. if (pPackName && strlen(pPackName) > 0)
  1037. {
  1038. sp_env_t *env = sp_get_env();
  1039. sp_cfg_t *cfg = env->cfg;
  1040. sp_cfg_root_ini_t *root_ini = cfg->root_ini;
  1041. sp_cfg_install_ini_t *install_ini = cfg->install_ini;
  1042. // 先查询当前版本的轻量安装历史
  1043. if (strstr(install_ini->light_packs, pPackName) != NULL)
  1044. {
  1045. for(int i=0; i<install_ini->arr_light_pack->nelts; i++)
  1046. {
  1047. sp_cfg_pack_info_t *pack = ARRAY_IDX(install_ini->arr_light_pack, i, sp_cfg_pack_info_t*);
  1048. if (pack && pack->name && _stricmp(pack->name, pPackName) == 0)
  1049. return true;
  1050. }
  1051. }
  1052. // 查询历史版本安装包
  1053. for(int i=0; i<install_ini->arr_version->nelts; i++)
  1054. {
  1055. sp_cfg_version_info_t *ver_info = ARRAY_IDX(cfg->install_ini->arr_version, i, sp_cfg_version_info_t*);
  1056. if (strstr(ver_info->install_pack, pPackName) != NULL)
  1057. return true;
  1058. }
  1059. }
  1060. return false;
  1061. }
  1062. const char *SpEntity::GetCenterSettingNameBySite()
  1063. {
  1064. CSystemStaticInfo info;
  1065. GetSystemStaticInfo(info);
  1066. if ((stricmp(info.strSite, "CMB.LIB") == 0)
  1067. || (stricmp(info.strSite, "CMB.SSB") == 0))
  1068. {
  1069. return "CenterSetting.LAN.ini";
  1070. }
  1071. else if ((stricmp(info.strSite, "CMB.LSS") == 0)
  1072. || (stricmp(info.strSite, "CMB.FLB") == 0)
  1073. || (stricmp(info.strSite, "CMB.OSB") == 0)
  1074. || (stricmp(info.strSite, "CMB.SMM") == 0))
  1075. {
  1076. return "CenterSetting.DMZ.ini";
  1077. }
  1078. else
  1079. {
  1080. return "CenterSetting.DMZ.ini";
  1081. }
  1082. }
  1083. ErrorCodeEnum SpEntity::GetPath(const char *pszKey,CSimpleStringA &strPath)
  1084. {
  1085. sp_env_t *env = sp_get_env();
  1086. ErrorCodeEnum Error = Error_Succeed;
  1087. if (!pszKey)
  1088. return Error_Null;
  1089. if (_stricmp(pszKey, "Root") == 0) {
  1090. strPath = env->dir->root_path;
  1091. } else if (_stricmp(pszKey, "RootVer") == 0) {
  1092. strPath = env->dir->root_ver_path;
  1093. } else if (_stricmp(pszKey, "Data") == 0) {
  1094. strPath = CSimpleStringA(env->dir->obj_path);
  1095. } else if (_stricmp(pszKey, "Bin") == 0) {
  1096. strPath = CSimpleStringA(env->dir->bin_path);
  1097. } else if (_stricmp(pszKey, "Cfg") == 0 || _stricmp(pszKey, "Etc") == 0) {
  1098. strPath = CSimpleStringA(env->dir->cfg_path);
  1099. } else if (_stricmp(pszKey, "Rec") == 0) {
  1100. strPath = CSimpleStringA(env->cfg->root_ini->ref_localvideo_path);
  1101. } else if (_stricmp(pszKey, "Temp") == 0 || _stricmp(pszKey, "Tmp") == 0) {
  1102. strPath = CSimpleStringA(env->cfg->root_ini->ref_tmp_path);
  1103. } else if (_stricmp(pszKey, "SysLog") == 0) {
  1104. strPath = CSimpleStringA(env->cfg->root_ini->ref_syslog_path);
  1105. } else if (_stricmp(pszKey, "InterLog") == 0) {
  1106. strPath = CSimpleStringA(env->cfg->root_ini->ref_intlog_path);
  1107. } else if (_stricmp(pszKey, "Base") == 0 || _stricmp(pszKey, "BaseDir") == 0) {
  1108. strPath = CSimpleStringA(env->dir->base_path);
  1109. } else if (_stricmp(pszKey, "SysRoot") == 0) {
  1110. strPath = CSimpleStringA(env->cfg->root_ini->ref_sysroot_path);
  1111. } else if (_stricmp(pszKey, "Photo") == 0 || _stricmp(pszKey, "UploadPhoto") == 0) {
  1112. strPath = CSimpleStringA(env->cfg->root_ini->ref_uploadphoto_path);
  1113. } else if (_stricmp(pszKey, "Download") == 0 || _stricmp(pszKey, "Downloads") == 0) {
  1114. strPath = CSimpleStringA(env->cfg->root_ini->ref_downloads_path);
  1115. } else if (_stricmp(pszKey, "Upgraded") == 0){
  1116. strPath = CSimpleStringA(env->cfg->root_ini->ref_upgraded_path);
  1117. } else if (_stricmp(pszKey, "Ad") == 0) {
  1118. strPath = CSimpleStringA(env->cfg->root_ini->ref_addata_path);
  1119. } else if (_stricmp(pszKey, "UploadPhoto") == 0) {
  1120. strPath = CSimpleStringA(env->cfg->root_ini->ref_uploadphoto_path);
  1121. } else if (_stricmp(pszKey, "UploadVideo") == 0) {
  1122. strPath = CSimpleStringA(env->cfg->root_ini->ref_uploadvideo_path);
  1123. } else if (_stricmp(pszKey, "Dbg") == 0) {
  1124. strPath = CSimpleStringA(env->dir->dbg_path);
  1125. } else if (_stricmp(pszKey, "Slv") == 0) {
  1126. strPath = CSimpleStringA(env->dir->slv_path);
  1127. } else if (_stricmp(pszKey, "Dep") == 0) {
  1128. strPath = CSimpleStringA(env->dir->dep_path);
  1129. } else if (_stricmp(pszKey, "Ad0") == 0) {
  1130. strPath = CSimpleStringA(env->dir->ad0_path);
  1131. //} else if (_stricmp(pszKey, "CenterSetting") == 0) {
  1132. // strPath = CSimpleStringA(env->cfg->root_ini->ref_centersetting_path);
  1133. } else if (_stricmp(pszKey, "Dmp") == 0 || _stricmp(pszKey, "Dump") == 0) {
  1134. strPath = CSimpleStringA(env->dir->dmp_path);
  1135. } else if (_stricmp(pszKey, "RunInfo") == 0){
  1136. strPath = CSimpleStringA(env->dir->root_runinfo_path);
  1137. } else if (_stricmp(pszKey, "HardwareCfg") ==0){
  1138. strPath = CSimpleStringA(env->dir->root_hardwarecfg_path);
  1139. } else if (_stricmp(pszKey, "CenterSetting") == 0) {
  1140. // return centersetting name by current site
  1141. strPath = CSimpleStringA(env->dir->cfg_path);
  1142. strPath += SPLIT_SLASH_STR;
  1143. strPath += GetCenterSettingNameBySite();
  1144. }
  1145. else {
  1146. char *path = sp_cfg_get_path(env->cfg, pszKey);
  1147. if (path) {
  1148. strPath = path;
  1149. } else {
  1150. Error = Error_Param;
  1151. }
  1152. }
  1153. return Error;
  1154. }
  1155. ErrorCodeEnum SpEntity::GetSystemRunInfo(CSystemRunInfo &Info)
  1156. {
  1157. sp_env_t *env = sp_get_env();
  1158. sp_cfg_t *cfg = env->cfg;
  1159. Info.eDebugLevel = (DebugLevelEnum)cfg->shell_ini->shell_debug_level;
  1160. Info.tmStart = cfg->run_info->startup_time;
  1161. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  1162. sp_mod_t *pos;
  1163. array_header_t *arr = array_make(16, sizeof(char*));
  1164. list_for_each_entry(pos, sp_mod_mgr_get_module_list_head(mod_mgr), sp_mod_t, entry) {
  1165. if (pos->state) {
  1166. sp_entity_t *ent;
  1167. list_for_each_entry(ent, &pos->entity_list, sp_entity_t, entry) {
  1168. int state = ent->state;
  1169. if (state == EntityState_Idle || state == EntityState_Busy || state == EntityState_Pause) {
  1170. ARRAY_PUSH(arr, char*) = ent->cfg->name;
  1171. }
  1172. }
  1173. }
  1174. }
  1175. Info.strRunningEntityNames.Init(arr->nelts);
  1176. for (int i = 0; i < arr->nelts; ++i) {
  1177. Info.strRunningEntityNames[i] = CSimpleStringA(ARRAY_IDX(arr, i, char*));
  1178. }
  1179. array_free(arr);
  1180. return Error_Succeed;
  1181. }
  1182. ErrorCodeEnum SpEntity::GetEntityBusyRate(WORD &nBusyEntity,WORD &nAllEntity)
  1183. {
  1184. sp_env_t *env = sp_get_env();
  1185. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  1186. int nAll(0), nBusy(0);
  1187. sp_mod_t *mod;
  1188. list_for_each_entry(mod, sp_mod_mgr_get_module_list_head(mod_mgr), sp_mod_t, entry)
  1189. {
  1190. if (mod->state)
  1191. {
  1192. sp_entity_t *ent;
  1193. list_for_each_entry(ent, &mod->entity_list, sp_entity_t, entry)
  1194. {
  1195. int state = ent->state;
  1196. if (state == EntityState_Idle || state == EntityState_Busy || state == EntityState_Pause)
  1197. nAll++;
  1198. if (state == EntityState_Busy)
  1199. nBusy++;
  1200. }
  1201. }
  1202. nBusyEntity = nBusy;
  1203. nAllEntity = nAll;
  1204. }
  1205. return Error_Succeed;
  1206. }
  1207. ErrorCodeEnum SpEntity::GetRebootInfo(CSmallDateTime BeforeThisTime, CBootInfo &Info)
  1208. {
  1209. CSimpleStringA strPath;
  1210. auto rc = GetPath("RunInfo", strPath);
  1211. if (rc != Error_Succeed)
  1212. return rc;
  1213. strPath += SPLIT_SLASH_STR "BootLog";
  1214. sp_env_t *env = sp_get_env();
  1215. auto pRec = sp_btr_get_rec_before(strPath, env->btr_ctx, BeforeThisTime);
  1216. if (pRec == NULL)
  1217. return Error_NotExist;
  1218. Info.tmStart = pRec->tm_start;
  1219. Info.tmReboot = pRec->tm_shutdown;
  1220. Info.InstallVersion = CVersion(pRec->version.major, pRec->version.minor, pRec->version.revision, pRec->version.build);
  1221. Info.eTriggerReason = (RebootTriggerEnum)pRec->shutdown_reason;
  1222. Info.eWay = (RebootWayEnum)pRec->shutdown_way;
  1223. Info.wSameReasonTime = pRec->shutdown_reason_cnt;
  1224. Info.wSameWayTime = pRec->shutdown_way_cnt;
  1225. delete pRec;
  1226. return Error_Succeed;
  1227. }
  1228. ErrorCodeEnum SpEntity::GetAllRegistSpFile(CAutoArray<CSimpleStringA> &Names)
  1229. {
  1230. sp_env_t *env = sp_get_env();
  1231. sp_cfg_t *cfg = env->cfg;
  1232. array_header_t *arr_module = cfg->shell_ini->arr_module;
  1233. Names.Init(arr_module->nelts);
  1234. for (int i = 0; i < arr_module->nelts; ++i) {
  1235. sp_cfg_shell_module_t* mod = ARRAY_IDX(arr_module, i, sp_cfg_shell_module_t*);
  1236. Names[i] = mod->name;
  1237. }
  1238. return Error_Succeed;
  1239. }
  1240. ErrorCodeEnum SpEntity::GetSpFileInfo(const char *pszSpName,CSpInfo &Info)
  1241. {
  1242. if (!pszSpName)
  1243. return Error_Null;
  1244. sp_env_t *env = sp_get_env();
  1245. sp_cfg_t *cfg = env->cfg;
  1246. sp_cfg_shell_module_t *cfg_mod = sp_cfg_get_module_by_name(cfg, pszSpName);
  1247. if (!cfg_mod)
  1248. return Error_NotExist;
  1249. Info.strAuthor = cfg_mod->author;
  1250. Info.strCompany = cfg_mod->company;
  1251. Info.SoftwareVersion = CVersion((WORD)cfg_mod->version.major,
  1252. (WORD)cfg_mod->version.minor,
  1253. (WORD)cfg_mod->version.revision,
  1254. (WORD)cfg_mod->version.build);
  1255. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  1256. sp_mod_t *mod = sp_mod_mgr_find_module_by_name(mod_mgr, pszSpName);
  1257. if (!mod)
  1258. return Error_NotExist;
  1259. sp_entity_t *ent;
  1260. int cnt = 0;
  1261. list_for_each_entry(ent, &mod->entity_list, sp_entity_t, entry) {
  1262. cnt++;
  1263. }
  1264. Info.strEntitys.Init(cnt);
  1265. int i = 0;
  1266. list_for_each_entry(ent, &mod->entity_list, sp_entity_t, entry) {
  1267. Info.strEntitys[i++] = ent->cfg->name;
  1268. }
  1269. return Error_Succeed;
  1270. }
  1271. ErrorCodeEnum SpEntity::GetAllRegistedEntity(CAutoArray<CSimpleStringA> &strEntityNames, CAutoArray<WORD> &wEntityDevelopIDs)
  1272. {
  1273. sp_env_t *env = sp_get_env();
  1274. sp_cfg_t *cfg = env->cfg;
  1275. array_header_t *arr_entity = cfg->shell_ini->arr_entity;
  1276. strEntityNames.Init(arr_entity->nelts-1);
  1277. wEntityDevelopIDs.Init(arr_entity->nelts-1);
  1278. for (int i = 1; i < arr_entity->nelts; ++i) { // from index 1, because zero for special entity, ie. spshell entity
  1279. sp_cfg_shell_entity_t *ent = ARRAY_IDX(arr_entity, i, sp_cfg_shell_entity_t*);
  1280. strEntityNames[i-1] = ent->name;
  1281. wEntityDevelopIDs[i-1] = ent->devel_id;
  1282. }
  1283. return Error_Succeed;
  1284. }
  1285. ErrorCodeEnum SpEntity::GetAllStartedEntity(CAutoArray<CSimpleStringA> &strEntityNames, CAutoArray<DWORD> &dwEntityInstanceIDs)
  1286. {
  1287. sp_env_t *env = sp_get_env();
  1288. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  1289. sp_mod_t *pos;
  1290. int i;
  1291. array_header_t *arr = array_make(16, sizeof(sp_entity_t*));
  1292. list_for_each_entry(pos, sp_mod_mgr_get_module_list_head(mod_mgr), sp_mod_t, entry) {
  1293. if (pos->state) {
  1294. sp_entity_t *ent;
  1295. list_for_each_entry(ent, &pos->entity_list, sp_entity_t, entry) {
  1296. int state = ent->state;
  1297. if (state == EntityState_Idle || state == EntityState_Busy || state == EntityState_Pause) {
  1298. ARRAY_PUSH(arr, sp_entity_t*) = ent;
  1299. }
  1300. }
  1301. }
  1302. }
  1303. strEntityNames.Init(arr->nelts);
  1304. dwEntityInstanceIDs.Init(arr->nelts);
  1305. for (i = 0; i < arr->nelts; ++i) {
  1306. sp_entity_t *ent = ARRAY_IDX(arr, i, sp_entity_t*);
  1307. strEntityNames[i] = ent->cfg->name;
  1308. dwEntityInstanceIDs[i] = ent->instance_id;
  1309. }
  1310. // {bug} forget array_free(arr)
  1311. array_free(arr);
  1312. return Error_Succeed;
  1313. }
  1314. ErrorCodeEnum SpEntity::GetSelfEntityRunInfo(CEntityRunInfo &Info)
  1315. {
  1316. return GetEntityRunInfo(m_ent->cfg->name, Info);
  1317. }
  1318. ErrorCodeEnum SpEntity::GetEntityStaticInfo(const char *pszEntityName,CEntityStaticInfo &Info)
  1319. {
  1320. if (!pszEntityName)
  1321. return Error_Null;
  1322. sp_env_t *env = sp_get_env();
  1323. sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, pszEntityName);
  1324. return ::GetEntityStaticInfo(Info, ent);
  1325. }
  1326. ErrorCodeEnum SpEntity::GetEntityStaticInfo(WORD wEntitySerialNO,CEntityStaticInfo &Info)
  1327. {
  1328. sp_env_t *env = sp_get_env();
  1329. sp_entity_t *ent = sp_mod_mgr_find_entity_by_devel_id(env->mod_mgr, wEntitySerialNO);
  1330. return ::GetEntityStaticInfo(Info, ent);
  1331. }
  1332. ErrorCodeEnum SpEntity::GetEntityRunInfo(const char *pszEntityName, CEntityRunInfo &Info)
  1333. {
  1334. sp_env_t *env = sp_get_env();
  1335. if (!pszEntityName)
  1336. return Error_Null;
  1337. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  1338. sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(mod_mgr, pszEntityName);
  1339. if (!ent)
  1340. return Error_NotExist;
  1341. Info.dwEntityInstanceID = (DWORD)ent->instance_id;
  1342. Info.tmFirstStart = ent->first_start_time;
  1343. Info.tmLastStart = ent->last_start_time;
  1344. Info.bService = !!ent->service_flag;
  1345. Info.eState = (EntityStateEnum)ent->state;
  1346. Info.tmBeginCurrentState = ent->state_start_time;
  1347. Info.dwProcessID = (DWORD)ent->mod->process.pid;
  1348. Info.eDebugLevel = (DebugLevelEnum)ent->cfg->debug_level;
  1349. Info.dwUserState = (DWORD)ent->user_state;
  1350. return Error_Succeed;
  1351. }
  1352. ErrorCodeEnum SpEntity::GetEntityName(WORD wEntityDevelopID, CSimpleStringA &strName)
  1353. {
  1354. sp_env_t *env = sp_get_env();
  1355. sp_entity_t *ent = sp_mod_mgr_find_entity_by_devel_id(env->mod_mgr, wEntityDevelopID);
  1356. if (ent) {
  1357. strName = ent->cfg->name;
  1358. } else {
  1359. return Error_NotExist;
  1360. }
  1361. return Error_Succeed;
  1362. }
  1363. ErrorCodeEnum SpEntity::GetEntityName(DWORD dwEntityInstanceID, CSimpleStringA &strName)
  1364. {
  1365. assert(dwEntityInstanceID != 0);
  1366. sp_env_t *env = sp_get_env();
  1367. sp_entity_t *ent = sp_mod_mgr_find_entity_by_inst_id(env->mod_mgr, dwEntityInstanceID);
  1368. if (ent) {
  1369. strName = ent->cfg->name;
  1370. } else {
  1371. return Error_NotExist;
  1372. }
  1373. return Error_Succeed;
  1374. }
  1375. ErrorCodeEnum SpEntity::GetModuleName(DWORD nModuleID, CSimpleStringA &strName)
  1376. {
  1377. if (nModuleID != SP_INVALID_MOD_ID) {
  1378. sp_env_t *env = sp_get_env();
  1379. sp_mod_t *mod = sp_mod_mgr_find_module_by_idx(env->mod_mgr, nModuleID);
  1380. if (mod) {
  1381. strName = mod->cfg->name;
  1382. return Error_Succeed;
  1383. } else {
  1384. return Error_NotExist;
  1385. }
  1386. }
  1387. return Error_Param;
  1388. }
  1389. ErrorCodeEnum SpEntity::GetEntitySessionInfo(const char *pszEntityName, CAutoArray<CEntitySessionInfo> &Infos)
  1390. {
  1391. iobuffer_t *req_pkt = iobuffer_create(-1, -1);
  1392. iobuffer_t *ans_pkt = NULL;
  1393. auto rc = AskEntityByRPC(pszEntityName, ENTITY_CMD_REQ_QUERY_ENTITY_SESSIONS, &req_pkt, &ans_pkt);
  1394. if (rc == Error_Succeed)
  1395. {
  1396. int nCount(0);
  1397. iobuffer_read(ans_pkt, IOBUF_T_I4, &nCount, NULL);
  1398. auto pCfg = sp_get_env()->cfg;
  1399. Infos.Init(nCount);
  1400. for (int i = 0; i < nCount; ++i)
  1401. {
  1402. int nFromSvcID, nToSvcID, nBeginTime, nState, nStateBeginTime;
  1403. iobuffer_format_read(ans_pkt, "44444", &nFromSvcID, &nToSvcID, &nBeginTime, &nState, &nStateBeginTime);
  1404. Infos[i].strCallerEntity = sp_cfg_get_entity_by_idx(pCfg, nFromSvcID)->name;
  1405. Infos[i].strServiceEntity = sp_cfg_get_entity_by_idx(pCfg, nToSvcID)->name;
  1406. Infos[i].tmStart = CSmallDateTime(nBeginTime);
  1407. Infos[i].eState = (SessionStateEnum)nState;
  1408. Infos[i].tmBeginState = CSmallDateTime(nStateBeginTime);
  1409. }
  1410. }
  1411. if (req_pkt)
  1412. iobuffer_dec_ref(req_pkt);
  1413. if (ans_pkt)
  1414. iobuffer_dec_ref(ans_pkt);
  1415. return rc;
  1416. }
  1417. bool SpEntity::HasPrivilege()
  1418. {
  1419. return !!m_cfg_ent->privilege;
  1420. }
  1421. CSmartPointer<IEntityFunctionPrivilege> SpEntity::GetPrivilegeFunction()
  1422. {
  1423. return NULL;
  1424. }
  1425. ErrorCodeEnum SpEntity::PostQuit()
  1426. {
  1427. ErrorCodeEnum Error;
  1428. iobuffer_t *pkt = iobuffer_create(-1, -1);
  1429. int v = m_ent->cfg->idx;
  1430. iobuffer_write(pkt, IOBUF_T_I4, &v, 0);
  1431. Dbg("Pre PostQuit...");
  1432. Error = PostInfoShell(SHELL_CMD_INFO_ENTITY_QUIT, &pkt);
  1433. if (pkt)
  1434. iobuffer_dec_ref(pkt);
  1435. return Error;
  1436. }
  1437. ErrorCodeEnum SpEntity::PostReload()
  1438. {
  1439. ErrorCodeEnum Error;
  1440. iobuffer_t *pkt = iobuffer_create(-1, -1);
  1441. int v = m_ent->cfg->idx;
  1442. iobuffer_write(pkt, IOBUF_T_I4, &v, 0);
  1443. Dbg("Pre PostReload...");
  1444. Error = PostInfoShell(SHELL_CMD_INFO_ENTITY_RELOAD, &pkt);
  1445. if (pkt)
  1446. iobuffer_dec_ref(pkt);
  1447. return Error;
  1448. }
  1449. ErrorCodeEnum SpEntity::PostEntityTaskFIFO(ITaskSp *pTask)
  1450. {
  1451. threadpool_t *threadpool = sp_svc_get_threadpool(m_svc);
  1452. int rc;
  1453. rc = threadpool_post_workitem_fifo2(threadpool, NULL, &task_callback, pTask, (param_size_t)((intptr_t)this), 0);
  1454. return rc == 0 ? Error_Succeed : Error_Unexpect;
  1455. }
  1456. ErrorCodeEnum SpEntity::PostEntityTaskLIFO(ITaskSp *pTask)
  1457. {
  1458. threadpool_t *threadpool = sp_svc_get_threadpool(m_svc);
  1459. int rc;
  1460. rc = threadpool_post_workitem_lifo2(threadpool, NULL, &task_callback, pTask, (param_size_t)((intptr_t)this), 0);
  1461. return rc == 0 ? Error_Succeed : Error_Unexpect;
  1462. }
  1463. ErrorCodeEnum SpEntity::PostThreadPoolTask(ITaskSp *pTask)
  1464. {
  1465. int rc = threadpool_post_workitem_fifo2(m_tpool, NULL, &task_callback, pTask, (param_size_t)((intptr_t)this), 0);
  1466. return rc == 0 ? Error_Succeed : Error_Unexpect;
  1467. }
  1468. ErrorCodeEnum SpEntity::StartTcpBridgeServer(unsigned short port)
  1469. {
  1470. if (port >4506 || port < 4502)
  1471. return Error_Duplication;
  1472. #ifdef _DEBUG
  1473. const char *ip = "0.0.0.0";
  1474. #else
  1475. const char *ip = "127.0.0.1";
  1476. #endif
  1477. if (m_tbs)
  1478. return Error_Duplication;
  1479. int rc = sp_tbs_create(m_ses_mgr, ip, port, &m_tbs);
  1480. if (rc == 0) {
  1481. rc = sp_tbs_start(m_tbs);
  1482. if (rc != 0) {
  1483. sp_tbs_destroy(m_tbs);
  1484. m_tbs = NULL;
  1485. }
  1486. }
  1487. return SpTranslateError(rc);
  1488. }
  1489. ErrorCodeEnum SpEntity::StopTcpBridgeServer()
  1490. {
  1491. if (m_tbs) {
  1492. sp_tbs_stop(m_tbs);
  1493. sp_tbs_destroy(m_tbs);
  1494. m_tbs = NULL;
  1495. return Error_Succeed;
  1496. } else {
  1497. return Error_NotInit;
  1498. }
  1499. }
  1500. ErrorCodeEnum SpEntity::RequestCloseDelay(WORD nSecond)
  1501. {
  1502. return Error_NotImpl;
  1503. }
  1504. void SpEntity::SendLog(const LogTypeEnum eLogType,const SeverityLevelEnum eLevel,DWORD dwUserEventCode,CAutoArray<DWORD> Param,const char *pszMessage)
  1505. {
  1506. LogMessage(eLogType, eLevel, 0, dwUserEventCode, Param, pszMessage);
  1507. }
  1508. ErrorCodeEnum SpEntity::VerifySignature(const char *pszSignedFile, CSimpleStringA &strErrInfo)
  1509. {
  1510. #ifdef _WIN32
  1511. CCodeSignVerify verify;
  1512. CSignInfo signInfo;
  1513. if (!verify.VerifySignature(pszSignedFile, signInfo)) {
  1514. strErrInfo = verify.GetErrorMsg();
  1515. return Error_FailVerify;
  1516. }
  1517. // xkm@20140905: check cer file's hash is consistent with spbase's hash
  1518. sp_env_t* env = sp_get_env();
  1519. assert(env != NULL);
  1520. auto pShellCfg = env->cfg->shell_ini;
  1521. if (pShellCfg->spbase_sign_cert_hash != NULL
  1522. && stricmp(pShellCfg->spbase_sign_cert_hash, signInfo.strSignCertHash) != 0) {
  1523. strErrInfo = "signing certificate is not authorized certificate.";
  1524. return Error_FailVerify;
  1525. }
  1526. strErrInfo = signInfo.strSignCertHash;
  1527. #else
  1528. strErrInfo = "TODO: not implement VerifySignature current times.";
  1529. #endif //_WIN32
  1530. return Error_Succeed;
  1531. }
  1532. ErrorCodeEnum SpEntity::ShowFatalError(const char *pszMsg)
  1533. {
  1534. LogError(Severity_High, Error_Unrecover, 0, pszMsg);
  1535. ErrorCodeEnum Error;
  1536. iobuffer_t *pkt = iobuffer_create(-1, -1);
  1537. iobuffer_write(pkt, IOBUF_T_STR, pszMsg, -1);
  1538. //int nBlueScreen = 1;
  1539. //iobuffer_write(pkt, IOBUF_T_I4, &nBlueScreen, 0);
  1540. Error = PostInfoShell(SHELL_CMD_INFO_FATAL_ERROR_DISPLAY, &pkt);
  1541. if (pkt)
  1542. iobuffer_dec_ref(pkt);
  1543. return Error;
  1544. }
  1545. ErrorCodeEnum SpEntity::ShowStartupInfo(const char *pszMsg)
  1546. {
  1547. LogEvent(Severity_High, 0, pszMsg);
  1548. ErrorCodeEnum Error;
  1549. iobuffer_t *pkt = iobuffer_create(-1, -1);
  1550. iobuffer_write(pkt, IOBUF_T_STR, pszMsg, -1);
  1551. Error = PostInfoShell(SHELL_CMD_INFO_STARTUP_INFO_DISPLAY, &pkt);
  1552. if (pkt)
  1553. iobuffer_dec_ref(pkt);
  1554. return Error;
  1555. }
  1556. ErrorCodeEnum SpEntity::InitLogCurrentThread()
  1557. {
  1558. #ifdef _WIN32
  1559. SetthreadGroup(GetCurrentThreadId(), get_cfg_ent()->name);
  1560. getEntityResource()->m_Entity = this;
  1561. #else
  1562. GetSpModule()->SetThreadEntity(this);
  1563. #endif //_WIN32
  1564. return Error_Succeed;
  1565. }
  1566. ErrorCodeEnum SpEntity::ConnectRemoteEntity(CClientSessionBase *pClientSession,
  1567. const char *pszRemoteEntity,
  1568. const char *pszParam,
  1569. CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  1570. {
  1571. ErrorCodeEnum Error;
  1572. if (!pClientSession || !pszRemoteEntity)
  1573. return Error_Param;
  1574. if (pClientSession->m_pSessionFunction)
  1575. return Error_Param;
  1576. SpClientSessionFunction *pFunction = new SpClientSessionFunction(this, pClientSession, pszRemoteEntity);
  1577. Error = pFunction->Begin(pszParam);
  1578. if (Error == Error_Succeed) {
  1579. pClientSession->m_pSessionFunction = pFunction;
  1580. pAsynWaitSp.Attach(pFunction, pFunction->GetRefCountPtr());
  1581. } else {
  1582. pFunction->DecrementRef();
  1583. }
  1584. Dbg("connect to %s %s", pszRemoteEntity, Error_Succeed == Error ? "success" : "fail");
  1585. return Error;
  1586. }
  1587. ErrorCodeEnum SpEntity::RedirectSession(CClientSessionBase *pClientSession)
  1588. {
  1589. return Error_NotImpl;
  1590. }
  1591. ErrorCodeEnum SpEntity::RedirectSession(const char *pszSuggestEntity)
  1592. {
  1593. if (pszSuggestEntity) {
  1594. sp_env_t *env = sp_get_env();
  1595. sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, pszSuggestEntity);
  1596. if (ent) {
  1597. m_redirect_entity_cache = ent;
  1598. return Error_Succeed;
  1599. } else {
  1600. sp_dbg_warn("RedirectSession failed, cannot find entity %s", pszSuggestEntity);
  1601. return Error_Param;
  1602. }
  1603. }
  1604. return Error_Param;
  1605. }
  1606. ErrorCodeEnum SpEntity::RedirectSubscribBroadcast(CUUID SubID, const char *pszSugguestEntity)
  1607. {
  1608. if (pszSugguestEntity) {
  1609. sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(sp_get_env()->mod_mgr, pszSugguestEntity);
  1610. if (ent) {
  1611. sp_uid_t uid = SubID.m_nUUID64;
  1612. sp_mod_entity_stub_finish_redirect_subscribe(m_stub, &uid, ent->cfg->idx);
  1613. } else {
  1614. return Error_NotExist;
  1615. }
  1616. } else {
  1617. return Error_Param;
  1618. }
  1619. return Error_Succeed;
  1620. }
  1621. ErrorCodeEnum SpEntity::AskShell(int call_type, iobuffer_t **req_pkt, iobuffer_t **ans_pkt)
  1622. {
  1623. ErrorCodeEnum Error;
  1624. iobuffer_t *r_pkt = NULL;
  1625. if (!req_pkt || !*req_pkt || !ans_pkt)
  1626. return Error_Param;
  1627. if (*ans_pkt)
  1628. return Error_Param; // must be null so can return pkt
  1629. SpAsyncWaitRPC *pAsyncWait = new SpAsyncWaitRPC(this, req_pkt, call_type);
  1630. Error = pAsyncWait->Begin();
  1631. if (Error == Error_Succeed)
  1632. {
  1633. Error = pAsyncWait->WaitAnswer(INFINITE);
  1634. if (Error == Error_Succeed)
  1635. {
  1636. CAutoBuffer AnsBuf;
  1637. bool bEnd;
  1638. Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
  1639. if (Error == Error_Succeed)
  1640. {
  1641. iobuffer_t *pkt = iobuffer_create(-1, AnsBuf.GetCount());
  1642. iobuffer_write(pkt, IOBUF_T_BUF, &AnsBuf[0], AnsBuf.GetCount());
  1643. *ans_pkt = pkt;
  1644. }
  1645. }
  1646. }
  1647. pAsyncWait->DecrementRef(); // xkm@20150115
  1648. return Error;
  1649. }
  1650. ErrorCodeEnum SpEntity::AskEntityByRPC(const char *pszEntityName, int call_type, iobuffer_t **req_pkt, iobuffer_t **ans_pkt)
  1651. {
  1652. ErrorCodeEnum Error;
  1653. iobuffer_t *r_pkt = NULL;
  1654. if (!req_pkt || !*req_pkt || !ans_pkt)
  1655. return Error_Param;
  1656. if (*ans_pkt)
  1657. return Error_Param; // must be null so can return pkt
  1658. SpAsyncWaitRPC *pAsyncWait = new SpAsyncWaitRPC(this, req_pkt, call_type);
  1659. Error = pAsyncWait->Begin(pszEntityName);
  1660. if (Error == Error_Succeed)
  1661. {
  1662. Error = pAsyncWait->WaitAnswer(INFINITE);
  1663. if (Error == Error_Succeed)
  1664. {
  1665. CAutoBuffer AnsBuf;
  1666. bool bEnd;
  1667. Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
  1668. if (Error == Error_Succeed) {
  1669. iobuffer_t *pkt = iobuffer_create(-1, AnsBuf.GetCount());
  1670. iobuffer_write(pkt, IOBUF_T_BUF, &AnsBuf[0], AnsBuf.GetCount());
  1671. *ans_pkt = pkt;
  1672. }
  1673. }
  1674. }
  1675. pAsyncWait->DecrementRef(); // xkm@20150115
  1676. return Error;
  1677. }
  1678. void SpEntity::__on_rpc_request(sp_rpc_client_mgr_t *mgr, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t **req_pkt, void *user_data)
  1679. {
  1680. SpEntity *pThis = static_cast<SpEntity*>(user_data);
  1681. Dbg("on_rpc_req(), calltype: %d", call_type);
  1682. if (call_type == ENTITY_CMD_REQ_QUERY_ENTITY_SESSIONS)
  1683. {
  1684. pThis->OnQueryEntitySessions(epid, svc_id, rpc_id);
  1685. }
  1686. }
  1687. void SpEntity::OnQueryEntitySessions(int epid, int svc_id, int rpc_id)
  1688. {
  1689. int rc;
  1690. int nCount(0);
  1691. int nResult(0);
  1692. sp_ses_info_t* ret = sp_ses_mgr_get_ses_info(m_ses_mgr, &nCount);
  1693. iobuffer_t *ans_pkt = iobuffer_create(-1, -1);
  1694. iobuffer_write(ans_pkt, IOBUF_T_I4, &nResult, 0);
  1695. iobuffer_write(ans_pkt, IOBUF_T_I4, &nCount, 0);
  1696. for(int i=0; i<nCount; i++)
  1697. {
  1698. iobuffer_write(ans_pkt, IOBUF_T_I4, &ret[i].from_svc_id, 0);
  1699. iobuffer_write(ans_pkt, IOBUF_T_I4, &ret[i].to_svc_id, 0);
  1700. iobuffer_write(ans_pkt, IOBUF_T_I4, &ret[i].begin_time, 0);
  1701. iobuffer_write(ans_pkt, IOBUF_T_I4, &ret[i].state, 0);
  1702. iobuffer_write(ans_pkt, IOBUF_T_I4, &ret[i].state_begin_time, 0);
  1703. }
  1704. if (ret != NULL)
  1705. free(ret);
  1706. rc = sp_rpc_client_mgr_send_answer(m_rpc_mgr, epid, svc_id, rpc_id, &ans_pkt);
  1707. if (rc != 0) {
  1708. sp_dbg_warn("send rpc answer failed!");
  1709. }
  1710. if (ans_pkt) {
  1711. iobuffer_dec_ref(ans_pkt);
  1712. }
  1713. }
  1714. ErrorCodeEnum SpEntity::PostInfoShell(int call_type, iobuffer_t **info_pkt)
  1715. {
  1716. int rc;
  1717. rc = sp_rpc_client_mgr_one_way_call(get_rpc_mgr(),
  1718. SP_SHELL_MOD_ID,
  1719. SP_SHELL_SVC_ID,
  1720. call_type,
  1721. info_pkt);
  1722. return SpTranslateError(rc);
  1723. }
  1724. void SpEntity::FinishStart(ErrorCodeEnum Error)
  1725. {
  1726. sp_mod_entity_stub_finish_start(m_stub, Error);
  1727. if (Error == Error_Succeed) {
  1728. m_pEntityBase->OnStarted();
  1729. }
  1730. }
  1731. void SpEntity::FinishClose(ErrorCodeEnum Error)
  1732. {
  1733. sp_mod_entity_stub_finish_stop(m_stub, Error);
  1734. if (Error == Error_Succeed) {
  1735. Term();
  1736. }
  1737. }
  1738. void SpEntity::FinishPause(ErrorCodeEnum Error)
  1739. {
  1740. sp_mod_entity_stub_finish_pause(m_stub, Error);
  1741. if (Error == Error_Succeed) {
  1742. m_pEntityBase->OnPaused();
  1743. }
  1744. }
  1745. void SpEntity::FinishContinue(ErrorCodeEnum Error)
  1746. {
  1747. sp_mod_entity_stub_finish_continue(m_stub, Error);
  1748. if (Error == Error_Succeed) {
  1749. m_pEntityBase->OnContinued();
  1750. }
  1751. }
  1752. void SpEntity::FinishSelfTest(ErrorCodeEnum Error)
  1753. {
  1754. sp_mod_entity_stub_finish_test(m_stub, Error);
  1755. }