CoreMain.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. #include "..\..\common_h\coremanager.h"
  2. #include "core.h"
  3. #include "MemoryManager.h"
  4. //-------------------------------------------------------------------------------------------------
  5. ICore * api = null;
  6. StormEngine_Declarator * StormEngine_Declarator::first = null;
  7. CoreSystemLogReciver * reciver = null;
  8. extern MemoryManager memoryManager;
  9. //-------------------------------------------------------------------------------------------------
  10. __forceinline void * _cdecl operator new(size_t size, const char * fileName, long fileLine, const char * coreCreate)
  11. {
  12. Assert(strcmp(coreCreate, "CoreCreate") == 0);
  13. api = (ICore *)memoryManager.Reallocate(null, (dword)size, fileName, fileLine);
  14. return api;
  15. }
  16. __forceinline void _cdecl operator delete(void * ptr, const char * fileName, long fileLine, const char * coreCreate)
  17. {
  18. Assert(false);
  19. return memoryManager.Free(ptr, fileName, fileLine);
  20. }
  21. class CoreManagerImp : public CoreManager
  22. {
  23. public:
  24. virtual ~CoreManagerImp()
  25. {
  26. };
  27. //Создать
  28. virtual void CreateCore(CoreSystemLogReciver * _reciver, const char * coreModuleNameForSkip)
  29. {
  30. if(!api)
  31. {
  32. reciver = _reciver;
  33. new(_FL_, "CoreCreate") Core(coreModuleNameForSkip);
  34. Assert(api);
  35. }
  36. };
  37. //Удалить
  38. virtual void DeleteCore()
  39. {
  40. if(api)
  41. {
  42. //Удаляем ядро
  43. ((Core *)api)->~Core();
  44. memoryManager.Free(api, _FL_);
  45. api = null;
  46. //Освобождаем оставшиюся память и выводим сообщения
  47. memoryManager.ReleaseMemory(true);
  48. }
  49. };
  50. //Загрузить модули быстрого старта
  51. virtual bool LoadQuickStartModules(const char * quickModules)
  52. {
  53. if(api)
  54. {
  55. return ((Core *)api)->LoadQuickStartModules(quickModules);
  56. }
  57. return false;
  58. }
  59. //Загрузить модули невошедшие в список быстрого старта
  60. virtual void LoadModules()
  61. {
  62. if(api)
  63. {
  64. ((Core *)api)->LoadModules();
  65. }
  66. }
  67. //Обновить
  68. virtual void FrameUpdate()
  69. {
  70. if(api)
  71. {
  72. ((Core *)api)->Update();
  73. }
  74. };
  75. //Получить указатель
  76. virtual ICore * GetCore()
  77. {
  78. return api;
  79. };
  80. //Активно ли ядро
  81. virtual void SetActive(bool isActive)
  82. {
  83. ((Core *)api)->SetActive(isActive);
  84. }
  85. //Завершить работу приложения
  86. virtual bool IsExit()
  87. {
  88. if(api)
  89. {
  90. return ((Core *)api)->IsExit();
  91. }
  92. return true;
  93. }
  94. //Создать зарегистрированные сервисы (повторно созданные не создаёт)
  95. virtual bool CreateAllServices()
  96. {
  97. if(!api) return false;
  98. return ((Core *)api)->CreateAllServices();
  99. }
  100. //Создать сервис
  101. virtual bool CreateCoreService(const char * service_name)
  102. {
  103. return api->GetService(service_name) != null;
  104. }
  105. //Создать объект
  106. virtual bool CreateObject(const char * className)
  107. {
  108. if(!api) return false;
  109. return api->CreateObject(className) != null;
  110. }
  111. //Установить числовую целочисленную переменную
  112. virtual void SetVarInt(const char * name, long v)
  113. {
  114. if(api) api->Storage().SetLong(name, v);
  115. }
  116. //Получить числовую целочисленную переменную
  117. virtual long GetVarInt(const char * name, long def, bool * res)
  118. {
  119. if(!api)
  120. {
  121. if(res) *res = false;
  122. return def;
  123. }
  124. return api->Storage().GetLong(name, def, res);
  125. }
  126. //Установить числовую переменную
  127. virtual void SetVarDouble(const char * name, double v)
  128. {
  129. if(api) api->Storage().SetFloat(name, (float)v);
  130. }
  131. //Получить числовую переменную
  132. virtual double GetVarDouble(const char * name, double def, bool * res)
  133. {
  134. if(!api)
  135. {
  136. if(res) *res = false;
  137. return def;
  138. }
  139. return api->Storage().GetFloat(name, (float)def, res);
  140. }
  141. //Утановить строковую переменную
  142. virtual void SetVarString(const char * name, const char * v)
  143. {
  144. if(api) api->Storage().SetString(name, v);
  145. }
  146. //Получить строковую переменную
  147. virtual const char * GetVarString(const char * name, const char * def, bool * res)
  148. {
  149. if(!api)
  150. {
  151. if(res) *res = false;
  152. return def;
  153. }
  154. return api->Storage().GetString(name, def, res);
  155. }
  156. CoreState TranslateState(CoreManagerCoreState state)
  157. {
  158. switch(state)
  159. {
  160. case cmcorestate_trace: return corestate_trace;
  161. case cmcorestate_debugkeys: return corestate_debugkeys;
  162. case cmcorestate_memcheck: return corestate_memcheck;
  163. case cmcorestate_panicmemcheck: return corestate_panicmemcheck;
  164. case cmcorestate_memorypools: return corestate_mempools;
  165. case cmcorestate_mtmanual: return corestate_mtmanual;
  166. case cmcorestate_lorestimer: return corestate_lorestimer;
  167. case cmcorestate_fixedfps: return corestate_fixedfps;
  168. }
  169. return corestate_none;
  170. }
  171. //Включить-выключить стейт ядра
  172. virtual void SetState(CoreManagerCoreState state, long value)
  173. {
  174. if(!api) return;
  175. api->ExecuteCoreCommand(CoreCommand_StateOp(ccid_setstate, TranslateState(state), value));
  176. }
  177. //Получить стейт ядра
  178. virtual long GetState(CoreManagerCoreState state)
  179. {
  180. if(!api) return false;
  181. CoreCommand_StateOp cmd(ccid_getstate, TranslateState(state), false);
  182. api->ExecuteCoreCommand(cmd);
  183. return cmd.value;
  184. }
  185. //Добавить сообщение в буфер сообщений ядра (при количестве параметров == 0 сообщение пропускается)
  186. virtual void AddSystemMessage(const char * id, const void * data, unsigned long size)
  187. {
  188. if(api)
  189. {
  190. ((Core *)api)->AddSystemMessage(id, (const unsigned char *)data, size);
  191. }
  192. }
  193. //Вывести сообщение в системный лог
  194. virtual void _cdecl Trace(const char * format, ...)
  195. {
  196. CoreLogOutData(format, (&format) + 1);
  197. }
  198. };
  199. //------------------------------------------------------------------------------------------------
  200. //Вывод в лог
  201. //------------------------------------------------------------------------------------------------
  202. char coreLogOutDataBuffer[16384];
  203. bool core_isEnableTrace = true; //Разрешён ли вывод в лог
  204. void CoreLogOutData(const char * format, const void * data)
  205. {
  206. if(api) ((Core *)api)->SetWatchDog();
  207. if(!reciver || !core_isEnableTrace) return;
  208. crt_vsnprintf(coreLogOutDataBuffer, ARRSIZE(coreLogOutDataBuffer) - 4, format, (va_list)data);
  209. coreLogOutDataBuffer[ARRSIZE(coreLogOutDataBuffer) - 4] = 0;
  210. crt_strcat(coreLogOutDataBuffer, 16383, "\r\n");
  211. reciver->Out(coreLogOutDataBuffer);
  212. }
  213. //Мэнеджер ядра
  214. CoreManagerImp coreManager;
  215. //------------------------------------------------------------------------------------------------
  216. //Экспорк в dll
  217. //------------------------------------------------------------------------------------------------
  218. #ifdef _USRDLL
  219. extern "C"
  220. {
  221. void __declspec(dllexport) _cdecl StormEngine_GetCoreManager(CoreManager * & pointerToCoreManager)
  222. {
  223. pointerToCoreManager = &coreManager;
  224. }
  225. };
  226. #else
  227. CoreManager * _cdecl StormEngine_GetCoreManager()
  228. {
  229. return &coreManager;
  230. }
  231. #endif