ukeytask.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #include "stdafx2.h"
  2. #include "SpBase.h"
  3. #include "ukeytask.h"
  4. extern int WINAPI gui_entry(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow, HWND *phWnd, IConsole *pConsole);
  5. #define OP_START_ENTITY 1
  6. #define OP_STOP_ENTITY 0
  7. #define OP_PAUSE_ENTITY 2
  8. #define OP_TERMINATE_ENTITY 3
  9. #define OP_CONTINUE_ENTITY 4
  10. #define OP_FIRE_ENTITY_STATE 5
  11. struct callback_entry : public IReleasable
  12. {
  13. virtual ~callback_entry() {}
  14. CSimpleStringA EntityName;
  15. union {
  16. void *pRawData;
  17. int state;
  18. };
  19. int op;
  20. ErrorCodeEnum ErrorResult;
  21. };
  22. ErrorCodeEnum UKEYTask::CloseWindow()
  23. {
  24. if (m_hWndMainFrame) {
  25. PostMessageA(m_hWndMainFrame, WM_CLOSE, -1, -1);
  26. WaitForSingleObject(m_hEventStopReady, INFINITE);
  27. return Error_Succeed;
  28. } else {
  29. return Error_NotInit;
  30. }
  31. }
  32. ErrorCodeEnum UKEYTask::WaitWindowCreated()
  33. {
  34. WaitForSingleObject(m_hEventStartReady, INFINITE);
  35. return Error_Succeed;
  36. }
  37. void UKEYTask::Process()
  38. {
  39. {
  40. m_pEntity->GetFunction()->InitLogCurrentThread();
  41. }
  42. gui_entry(ModuleBase::GetModuleBase()->GetInstance(), NULL, NULL, SW_SHOW, &m_hWndMainFrame, this);
  43. m_hWndMainFrame = NULL;
  44. }
  45. ErrorCodeEnum UKEYTask::Initialize()
  46. {
  47. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  48. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  49. if (pFuncPrivilege != NULL) {
  50. //ErrorCodeEnum Error = pFuncPrivilege->RegistEntityStateEvent(NULL, this); // NULL to register for all
  51. //if (Error == Error_Succeed) {
  52. // ResetEvent(m_hEventStartReady);
  53. // ResetEvent(m_hEventStopReady);
  54. // LOG_ASSERT(m_pSink == NULL);
  55. //}
  56. //return Error;
  57. return Error_Succeed;
  58. } else {
  59. return Error_NoPrivilege;
  60. }
  61. }
  62. ErrorCodeEnum UKEYTask::UnInitialize()
  63. {
  64. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  65. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  66. if (pFuncPrivilege != NULL) {
  67. ErrorCodeEnum Error = pFuncPrivilege->UnregistEntityStateEvent(NULL);
  68. return Error;
  69. } else {
  70. return Error_NoPrivilege;
  71. }
  72. }
  73. void UKEYTask::OnStartRead(BOOL bOk)
  74. {
  75. SetEvent(m_hEventStartReady);
  76. }
  77. void UKEYTask::OnStopReady()
  78. {
  79. SetEvent(m_hEventStopReady);
  80. }
  81. ErrorCodeEnum UKEYTask::ReqFrameworkQuit()
  82. {
  83. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  84. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  85. if (pFuncPrivilege != NULL)
  86. {
  87. return pFuncPrivilege->Reboot(RebootTrigger_ManualLocal, RebootWay_Framework);
  88. }
  89. return Error_Unexpect;
  90. }
  91. ErrorCodeEnum UKEYTask::AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData)
  92. {
  93. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  94. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  95. if (pFuncPrivilege != NULL) {
  96. CSmartPointer<IAsynWaitSp> spWait;
  97. ErrorCodeEnum Error = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  98. if (Error == Error_Succeed) {
  99. callback_entry *entry = new callback_entry();
  100. entry->pRawData = pData;
  101. entry->EntityName = entity_name;
  102. entry->ErrorResult = Error_Unexpect;
  103. entry->op = OP_START_ENTITY;
  104. spWait->SetCallback(this, entry);
  105. }
  106. return Error;
  107. } else {
  108. return Error_NoPrivilege;
  109. }
  110. }
  111. ErrorCodeEnum UKEYTask::AsyncStopEntity(const char *entity_name, void *pData)
  112. {
  113. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  114. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  115. if (pFuncPrivilege != NULL) {
  116. CSmartPointer<IAsynWaitSp> spWait;
  117. ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
  118. if (Error == Error_Succeed) {
  119. callback_entry *entry = new callback_entry();
  120. entry->pRawData = pData;
  121. entry->EntityName = entity_name;
  122. entry->ErrorResult = Error_Unexpect;
  123. entry->op = OP_STOP_ENTITY;
  124. spWait->SetCallback(this, entry);
  125. }
  126. return Error;
  127. } else {
  128. return Error_NoPrivilege;
  129. }
  130. }
  131. ErrorCodeEnum UKEYTask::GetAllEntity(CAutoArray<EntityEntry> &Entities)
  132. {
  133. CSmartPointer<IEntityFunction> spFunc = m_pEntity->GetFunction();
  134. CAutoArray<CSimpleStringA> strEntityNames;
  135. CAutoArray<WORD> wDevelopIDs;
  136. ErrorCodeEnum Error = spFunc->GetAllRegistedEntity(strEntityNames, wDevelopIDs);
  137. if (Error == Error_Succeed) {
  138. Entities.Init(strEntityNames.GetCount());
  139. for (int i = 0; i < strEntityNames.GetCount(); ++i) {
  140. Error = GetEntity(strEntityNames[i], Entities[i]);
  141. }
  142. }
  143. return Error;
  144. }
  145. ErrorCodeEnum UKEYTask::GetEntity(const char *entity_name, EntityEntry &e)
  146. {
  147. CSmartPointer<IEntityFunction> spFunc = m_pEntity->GetFunction();
  148. LOG_ASSERT(spFunc != NULL);
  149. CEntityStaticInfo StaticInfo;
  150. CEntityRunInfo RunInfo;
  151. ErrorCodeEnum Error = spFunc->GetEntityStaticInfo(entity_name, StaticInfo);
  152. if (Error == Error_Succeed) {
  153. Error = spFunc->GetEntityRunInfo(entity_name, RunInfo);
  154. if (Error == Error_Succeed) {
  155. e.Name = entity_name;
  156. e.Id = RunInfo.dwEntityInstanceID;
  157. e.ModuleName = _GetFileName(StaticInfo.strSpFileName);
  158. e.State = RunInfo.eState;
  159. e.Type = StaticInfo.bStartedByShell ? EE_AUTO : EE_MANUAL;
  160. e.Pid = (int)RunInfo.dwProcessID;
  161. e.DevelopID = (int)StaticInfo.wEntityDevelopID;
  162. }
  163. }
  164. return Error;
  165. }
  166. //ErrorCodeEnum UKEYTask::GetCustomizeStartMenuList(CAutoArray<StartMenuEntry> &StartItems)
  167. //{
  168. // CSmartPointer<IEntityFunction> spFunc = m_pEntity->GetFunction();
  169. // CSmartPointer<IConfigInfo> spConfig;
  170. // LOG_ASSERT(spFunc != NULL);
  171. // int cnt = 0;
  172. // ErrorCodeEnum Error = spFunc->OpenConfig(Config_Software, spConfig);
  173. // if (Error != Error_Succeed)
  174. // return Error;
  175. // Error = spConfig->ReadConfigValueInt("StartMenu", "Number", cnt);
  176. // if (Error != Error_Succeed)
  177. // return Error;
  178. // StartItems.Init(cnt);
  179. // for (int i = 0; i < cnt; ++i) {
  180. // char tmp[128];
  181. // CSimpleStringA strValue;
  182. // _itoa(i+1, tmp, 10);
  183. // Error = spConfig->ReadConfigValue("StartMenu", tmp, strValue);
  184. // const char *p = strValue;
  185. // if (Error != Error_Succeed || p == NULL || strValue.GetLength() == 0)
  186. // break;
  187. // int kk = 0;
  188. // while (*p && *p != ' ') {
  189. // tmp[kk++] = *p;
  190. // p++;
  191. // }
  192. // tmp[kk] = 0;
  193. // StartItems[i].strEntity = tmp;
  194. // while (*p && *p == ' ')
  195. // p++;
  196. // if (*p) {
  197. // StartItems[i].strCmdLine = p;
  198. // } else {
  199. // StartItems[i].strCmdLine = "";
  200. // }
  201. // }
  202. // return Error;
  203. //}
  204. void UKEYTask::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  205. {
  206. if (m_hWndMainFrame) {
  207. CSmartPointer<ICallbackListener> spCallback;
  208. CSmartPointer<IReleasable> pData;
  209. pAsynWaitSp->GetCallback(spCallback, pData);
  210. LOG_ASSERT(pData.GetRawPointer() != NULL);
  211. callback_entry *entry = static_cast<callback_entry*>((IReleasable*)pData.GetRawPointer());
  212. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  213. callback_entry *new_entry = new callback_entry();
  214. new_entry->EntityName = entry->EntityName;
  215. new_entry->ErrorResult = entry->ErrorResult;
  216. new_entry->op = entry->op;
  217. new_entry->state = entry->state;
  218. PostMessage(m_hWndMainFrame, WM_GUICONSOLE, 0, (LPARAM)new_entry);
  219. }
  220. }
  221. UKEYTask::UKEYTask() : m_pEntity(NULL), m_hWndMainFrame(NULL),m_hThread(NULL)
  222. {
  223. m_hEventStartReady = ::CreateEventA(NULL, TRUE, FALSE, NULL);
  224. m_hEventStopReady = ::CreateEventA(NULL, TRUE, FALSE, NULL);
  225. }
  226. UKEYTask::~UKEYTask()
  227. {
  228. CloseHandle(m_hEventStopReady);
  229. CloseHandle(m_hEventStartReady);
  230. }
  231. ErrorCodeEnum UKEYTask::Kickoff()
  232. {
  233. if (m_hThread) {
  234. return Error_Duplication;
  235. }
  236. m_hThread = (HANDLE)_beginthreadex(0, 0, &__Process, this, 0, 0);
  237. if (!m_hThread) {
  238. return Error_Resource;
  239. }
  240. return Error_Succeed;
  241. }
  242. ErrorCodeEnum UKEYTask::OutputMsg(const char *pMsg)
  243. {
  244. char *pBuf = new char[strlen(pMsg)+1];
  245. strcpy(pBuf, pMsg);
  246. PostMessage(m_hWndMainFrame, WM_SHOWDEBUGMSG, 0, (LPARAM)pBuf);
  247. return Error_Succeed;
  248. }
  249. ErrorCodeEnum UKEYTask::Close()
  250. {
  251. if (!m_hThread) {
  252. return Error_NotInit;
  253. }
  254. WaitForSingleObject(m_hThread, INFINITE);
  255. return Error_Succeed;
  256. }