moduleManager.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2013 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #ifndef _MODULE_MANAGER_H
  23. #define _MODULE_MANAGER_H
  24. #ifndef _SIMBASE_H_
  25. #include "console/simBase.h"
  26. #endif
  27. #ifndef _TVECTOR_H_
  28. #include "core/util/tvector.h"
  29. #endif
  30. #ifndef _TDICTIONARY_H_
  31. #include "core/util/tDictionary.h"
  32. #endif
  33. #ifndef _TAML_H_
  34. #include "persistence/taml/taml.h"
  35. #endif
  36. #ifndef _MODULE_DEFINITION_H
  37. #include "moduleDefinition.h"
  38. #endif
  39. //-----------------------------------------------------------------------------
  40. #define MODULE_MANAGER_MERGE_FILE "module.merge"
  41. #define MODULE_MANAGER_MODULE_DEFINITION_EXTENSION "module.taml"
  42. //-----------------------------------------------------------------------------
  43. /// @ingroup moduleGroup
  44. /// @see moduleGroup
  45. class ModuleManager : public SimObject
  46. {
  47. private:
  48. typedef SimObject Parent;
  49. public:
  50. /// Module definitions.
  51. typedef Vector<ModuleDefinition*> typeModuleDefinitionVector;
  52. typedef Vector<const ModuleDefinition*> typeConstModuleDefinitionVector;
  53. protected:
  54. static S32 moduleDependencySort(ModuleDefinition* const* a, ModuleDefinition* const* b);
  55. private:
  56. /// Database locking.
  57. struct LockDatabase
  58. {
  59. public:
  60. LockDatabase( ModuleManager* pManager ) :
  61. mpManager( pManager )
  62. {
  63. mpManager->mDatabaseLocks++;
  64. }
  65. ~LockDatabase()
  66. {
  67. mpManager->mDatabaseLocks--;
  68. // Sanity!
  69. AssertFatal( mpManager->mDatabaseLocks >= 0, "Module Manager: Cannot unlock database as it is already unlocked." );
  70. }
  71. private:
  72. ModuleManager* mpManager;
  73. };
  74. /// Loaded module entry.
  75. struct ModuleLoadEntry
  76. {
  77. ModuleLoadEntry( ModuleDefinition* pModuleDefinition, const bool strictVersionId ) :
  78. mpModuleDefinition( pModuleDefinition ),
  79. mStrictVersionId( strictVersionId )
  80. {
  81. }
  82. ModuleLoadEntry()
  83. {
  84. mpModuleDefinition = NULL;
  85. mStrictVersionId = false;
  86. }
  87. ModuleDefinition* mpModuleDefinition;
  88. bool mStrictVersionId;
  89. };
  90. /// Module loading.
  91. typedef Vector<StringTableEntry> typeModuleIdVector;
  92. typedef Vector<StringTableEntry> typeGroupVector;
  93. typedef HashMap<StringTableEntry, typeModuleIdVector*> typeGroupModuleHash;
  94. typedef Vector<ModuleLoadEntry> typeModuleLoadEntryVector;
  95. typeGroupModuleHash mGroupModules;
  96. typeGroupVector mGroupsLoaded;
  97. typeModuleLoadEntryVector mModulesLoaded;
  98. /// Miscellaneous.
  99. bool mEnforceDependencies;
  100. bool mEchoInfo;
  101. S32 mDatabaseLocks;
  102. char mModuleExtension[256];
  103. Taml mTaml;
  104. SimSet mNotificationListeners;
  105. bool mIgnoreLoadedGroups;
  106. // Module definition entry.
  107. struct ModuleDefinitionEntry : public typeModuleDefinitionVector
  108. {
  109. public:
  110. ModuleDefinitionEntry( StringTableEntry moduleId, StringTableEntry moduleGroup, StringTableEntry moduleType ) :
  111. mModuleId( moduleId ),
  112. mModuleGroup( moduleGroup ),
  113. mModuleType( moduleType )
  114. {
  115. }
  116. const StringTableEntry mModuleId;
  117. const StringTableEntry mModuleGroup;
  118. const StringTableEntry mModuleType;
  119. };
  120. /// Module databases.
  121. typedef HashMap<StringTableEntry, ModuleDefinitionEntry*> typeModuleIdDatabaseHash;
  122. typeModuleIdDatabaseHash mModuleIdDatabase;
  123. public:
  124. ModuleManager();
  125. virtual ~ModuleManager() {}
  126. /// SimObject overrides
  127. virtual bool onAdd();
  128. virtual void onRemove();
  129. virtual void onDeleteNotify( SimObject *object );
  130. static void initPersistFields();
  131. /// Declare Console Object.
  132. DECLARE_CONOBJECT( ModuleManager );
  133. /// Module definitions.
  134. bool setModuleExtension( const char* pExtension );
  135. /// Module discovery.
  136. bool scanModules( const char* pPath, const bool rootOnly = false );
  137. /// Module unregister.
  138. bool registerModule(const char* pModulePath, const char* pModuleFile);
  139. bool unregisterModule( const char* pModuleId, const U32 versionId );
  140. /// Module (un)loading.
  141. bool loadModuleGroup( const char* pModuleGroup );
  142. bool unloadModuleGroup( const char* pModuleGroup );
  143. bool loadModuleExplicit( const char* pModuleId, const U32 versionId = 0 );
  144. bool unloadModuleExplicit( const char* pModuleId );
  145. /// Module type enumeration.
  146. ModuleDefinition* findModule( const char* pModuleId, const U32 versionId );
  147. ModuleDefinition* findModuleByFilePath(StringTableEntry filePath);
  148. ModuleDefinition* findLoadedModule( const char* pModuleId );
  149. void findModules( const bool loadedOnly, typeModuleDefinitionVector& moduleDefinitions );
  150. void findModuleTypes( const char* pModuleType, const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
  151. /// Module synchronization.
  152. StringTableEntry copyModule( ModuleDefinition* pSourceModuleDefinition, const char* pTargetModuleId, const char* pTargetPath, const bool useVersionPathing );
  153. bool synchronizeDependencies( ModuleDefinition* pRootModuleDefinition, const char* pTargetDependencyPath );
  154. /// Editing modules
  155. bool renameModule(ModuleDefinition* pSourceModuleDefinition, const char* pNewModuleName);
  156. /// Module updates.
  157. inline bool isModuleMergeAvailable( void ) const { return Platform::isFile( getModuleMergeFilePath() ); }
  158. bool canMergeModules( const char* pMergeSourcePath );
  159. bool mergeModules( const char* pMergeTargetPath, const bool removeMergeDefinition, const bool registerNewModules );
  160. /// Module notifications.
  161. void addListener( SimObject* pListener );
  162. void removeListener( SimObject* pListener );
  163. void setIgnoreLoadedGroups(bool doIgnore) { mIgnoreLoadedGroups = doIgnore; }
  164. private:
  165. void clearDatabase( void );
  166. bool removeModuleDefinition( ModuleDefinition* pModuleDefinition );
  167. void raiseModulePreLoadNotifications( ModuleDefinition* pModuleDefinition );
  168. void raiseModulePostLoadNotifications( ModuleDefinition* pModuleDefinition );
  169. void raiseModulePreUnloadNotifications( ModuleDefinition* pModuleDefinition );
  170. void raiseModulePostUnloadNotifications( ModuleDefinition* pModuleDefinition );
  171. ModuleDefinitionEntry* findModuleId( StringTableEntry moduleId );
  172. ModuleDefinitionEntry::iterator findModuleDefinition( StringTableEntry moduleId, const U32 versionId );
  173. bool resolveModuleDependencies( StringTableEntry moduleId, const U32 versionId, StringTableEntry moduleGroup, bool synchronizedOnly, typeModuleLoadEntryVector& moduleResolvingQueue, typeModuleLoadEntryVector& moduleReadyQueue );
  174. ModuleLoadEntry* findModuleResolving( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleResolvingQueue );
  175. ModuleLoadEntry* findModuleReady( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleReadyQueue );
  176. typeModuleLoadEntryVector::iterator findModuleLoaded( StringTableEntry moduleId, const U32 versionId = 0 );
  177. typeGroupVector::iterator findGroupLoaded( StringTableEntry moduleGroup );
  178. StringTableEntry getModuleMergeFilePath( void ) const;
  179. };
  180. //-----------------------------------------------------------------------------
  181. extern ModuleManager ModuleDatabase;
  182. #endif // _MODULE_MANAGER_H