moduleManager.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. private:
  54. /// Database locking.
  55. struct LockDatabase
  56. {
  57. public:
  58. LockDatabase( ModuleManager* pManager ) :
  59. mpManager( pManager )
  60. {
  61. mpManager->mDatabaseLocks++;
  62. }
  63. ~LockDatabase()
  64. {
  65. mpManager->mDatabaseLocks--;
  66. // Sanity!
  67. AssertFatal( mpManager->mDatabaseLocks >= 0, "Module Manager: Cannot unlock database as it is already unlocked." );
  68. }
  69. private:
  70. ModuleManager* mpManager;
  71. };
  72. /// Loaded module entry.
  73. struct ModuleLoadEntry
  74. {
  75. ModuleLoadEntry( ModuleDefinition* pModuleDefinition, const bool strictVersionId ) :
  76. mpModuleDefinition( pModuleDefinition ),
  77. mStrictVersionId( strictVersionId )
  78. {
  79. }
  80. ModuleLoadEntry()
  81. {
  82. mpModuleDefinition = NULL;
  83. mStrictVersionId = false;
  84. }
  85. ModuleDefinition* mpModuleDefinition;
  86. bool mStrictVersionId;
  87. };
  88. /// Module loading.
  89. typedef Vector<StringTableEntry> typeModuleIdVector;
  90. typedef Vector<StringTableEntry> typeGroupVector;
  91. typedef HashMap<StringTableEntry, typeModuleIdVector*> typeGroupModuleHash;
  92. typedef Vector<ModuleLoadEntry> typeModuleLoadEntryVector;
  93. typeGroupModuleHash mGroupModules;
  94. typeGroupVector mGroupsLoaded;
  95. typeModuleLoadEntryVector mModulesLoaded;
  96. /// Miscellaneous.
  97. bool mEnforceDependencies;
  98. bool mEchoInfo;
  99. S32 mDatabaseLocks;
  100. char mModuleExtension[256];
  101. Taml mTaml;
  102. SimSet mNotificationListeners;
  103. bool mIgnoreLoadedGroups;
  104. // Module definition entry.
  105. struct ModuleDefinitionEntry : public typeModuleDefinitionVector
  106. {
  107. public:
  108. ModuleDefinitionEntry( StringTableEntry moduleId, StringTableEntry moduleGroup, StringTableEntry moduleType ) :
  109. mModuleId( moduleId ),
  110. mModuleGroup( moduleGroup ),
  111. mModuleType( moduleType )
  112. {
  113. }
  114. const StringTableEntry mModuleId;
  115. const StringTableEntry mModuleGroup;
  116. const StringTableEntry mModuleType;
  117. };
  118. /// Module databases.
  119. typedef HashMap<StringTableEntry, ModuleDefinitionEntry*> typeModuleIdDatabaseHash;
  120. typeModuleIdDatabaseHash mModuleIdDatabase;
  121. public:
  122. ModuleManager();
  123. virtual ~ModuleManager() {}
  124. /// SimObject overrides
  125. virtual bool onAdd();
  126. virtual void onRemove();
  127. virtual void onDeleteNotify( SimObject *object );
  128. static void initPersistFields();
  129. /// Declare Console Object.
  130. DECLARE_CONOBJECT( ModuleManager );
  131. /// Module definitions.
  132. bool setModuleExtension( const char* pExtension );
  133. /// Module discovery.
  134. bool scanModules( const char* pPath, const bool rootOnly = false );
  135. /// Module unregister.
  136. bool registerModule(const char* pModulePath, const char* pModuleFile);
  137. bool unregisterModule( const char* pModuleId, const U32 versionId );
  138. /// Module (un)loading.
  139. bool loadModuleGroup( const char* pModuleGroup );
  140. bool unloadModuleGroup( const char* pModuleGroup );
  141. bool loadModuleExplicit( const char* pModuleId, const U32 versionId = 0 );
  142. bool unloadModuleExplicit( const char* pModuleId );
  143. /// Module type enumeration.
  144. ModuleDefinition* findModule( const char* pModuleId, const U32 versionId );
  145. ModuleDefinition* findModuleByFilePath(StringTableEntry filePath);
  146. ModuleDefinition* findLoadedModule( const char* pModuleId );
  147. void findModules( const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
  148. void findModuleTypes( const char* pModuleType, const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
  149. /// Module synchronization.
  150. StringTableEntry copyModule( ModuleDefinition* pSourceModuleDefinition, const char* pTargetModuleId, const char* pTargetPath, const bool useVersionPathing );
  151. bool synchronizeDependencies( ModuleDefinition* pRootModuleDefinition, const char* pTargetDependencyPath );
  152. /// Editing modules
  153. bool renameModule(ModuleDefinition* pSourceModuleDefinition, const char* pNewModuleName);
  154. /// Module updates.
  155. inline bool isModuleMergeAvailable( void ) const { return Platform::isFile( getModuleMergeFilePath() ); }
  156. bool canMergeModules( const char* pMergeSourcePath );
  157. bool mergeModules( const char* pMergeTargetPath, const bool removeMergeDefinition, const bool registerNewModules );
  158. /// Module notifications.
  159. void addListener( SimObject* pListener );
  160. void removeListener( SimObject* pListener );
  161. void setIgnoreLoadedGroups(bool doIgnore) { mIgnoreLoadedGroups = doIgnore; }
  162. private:
  163. void clearDatabase( void );
  164. bool removeModuleDefinition( ModuleDefinition* pModuleDefinition );
  165. void raiseModulePreLoadNotifications( ModuleDefinition* pModuleDefinition );
  166. void raiseModulePostLoadNotifications( ModuleDefinition* pModuleDefinition );
  167. void raiseModulePreUnloadNotifications( ModuleDefinition* pModuleDefinition );
  168. void raiseModulePostUnloadNotifications( ModuleDefinition* pModuleDefinition );
  169. ModuleDefinitionEntry* findModuleId( StringTableEntry moduleId );
  170. ModuleDefinitionEntry::iterator findModuleDefinition( StringTableEntry moduleId, const U32 versionId );
  171. bool resolveModuleDependencies( StringTableEntry moduleId, const U32 versionId, StringTableEntry moduleGroup, bool synchronizedOnly, typeModuleLoadEntryVector& moduleResolvingQueue, typeModuleLoadEntryVector& moduleReadyQueue );
  172. ModuleLoadEntry* findModuleResolving( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleResolvingQueue );
  173. ModuleLoadEntry* findModuleReady( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleReadyQueue );
  174. typeModuleLoadEntryVector::iterator findModuleLoaded( StringTableEntry moduleId, const U32 versionId = 0 );
  175. typeGroupVector::iterator findGroupLoaded( StringTableEntry moduleGroup );
  176. StringTableEntry getModuleMergeFilePath( void ) const;
  177. };
  178. //-----------------------------------------------------------------------------
  179. extern ModuleManager ModuleDatabase;
  180. #endif // _MODULE_MANAGER_H