moduleManager.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. // Module definition entry.
  104. struct ModuleDefinitionEntry : public typeModuleDefinitionVector
  105. {
  106. public:
  107. ModuleDefinitionEntry( StringTableEntry moduleId, StringTableEntry moduleGroup, StringTableEntry moduleType ) :
  108. mModuleId( moduleId ),
  109. mModuleGroup( moduleGroup ),
  110. mModuleType( moduleType )
  111. {
  112. }
  113. const StringTableEntry mModuleId;
  114. const StringTableEntry mModuleGroup;
  115. const StringTableEntry mModuleType;
  116. };
  117. /// Module databases.
  118. typedef HashMap<StringTableEntry, ModuleDefinitionEntry*> typeModuleIdDatabaseHash;
  119. typeModuleIdDatabaseHash mModuleIdDatabase;
  120. public:
  121. ModuleManager();
  122. virtual ~ModuleManager() {}
  123. /// SimObject overrides
  124. virtual bool onAdd();
  125. virtual void onRemove();
  126. virtual void onDeleteNotify( SimObject *object );
  127. static void initPersistFields();
  128. /// Declare Console Object.
  129. DECLARE_CONOBJECT( ModuleManager );
  130. /// Module definitions.
  131. bool setModuleExtension( const char* pExtension );
  132. /// Module discovery.
  133. bool scanModules( const char* pPath, const bool rootOnly = false );
  134. /// Module unregister.
  135. bool unregisterModule( const char* pModuleId, const U32 versionId );
  136. /// Module (un)loading.
  137. bool loadModuleGroup( const char* pModuleGroup );
  138. bool unloadModuleGroup( const char* pModuleGroup );
  139. bool loadModuleExplicit( const char* pModuleId, const U32 versionId = 0 );
  140. bool unloadModuleExplicit( const char* pModuleId );
  141. /// Module type enumeration.
  142. ModuleDefinition* findModule( const char* pModuleId, const U32 versionId );
  143. ModuleDefinition* findLoadedModule( const char* pModuleId );
  144. void findModules( const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
  145. void findModuleTypes( const char* pModuleType, const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
  146. /// Module synchronization.
  147. StringTableEntry copyModule( ModuleDefinition* pSourceModuleDefinition, const char* pTargetModuleId, const char* pTargetPath, const bool useVersionPathing );
  148. bool synchronizeDependencies( ModuleDefinition* pRootModuleDefinition, const char* pTargetDependencyPath );
  149. /// Module updates.
  150. inline bool isModuleMergeAvailable( void ) const { return Platform::isFile( getModuleMergeFilePath() ); }
  151. bool canMergeModules( const char* pMergeSourcePath );
  152. bool mergeModules( const char* pMergeTargetPath, const bool removeMergeDefinition, const bool registerNewModules );
  153. /// Module notifications.
  154. void addListener( SimObject* pListener );
  155. void removeListener( SimObject* pListener );
  156. private:
  157. void clearDatabase( void );
  158. bool removeModuleDefinition( ModuleDefinition* pModuleDefinition );
  159. bool registerModule( const char* pModulePath, const char* pModuleFile );
  160. void raiseModulePreLoadNotifications( ModuleDefinition* pModuleDefinition );
  161. void raiseModulePostLoadNotifications( ModuleDefinition* pModuleDefinition );
  162. void raiseModulePreUnloadNotifications( ModuleDefinition* pModuleDefinition );
  163. void raiseModulePostUnloadNotifications( ModuleDefinition* pModuleDefinition );
  164. ModuleDefinitionEntry* findModuleId( StringTableEntry moduleId );
  165. ModuleDefinitionEntry::iterator findModuleDefinition( StringTableEntry moduleId, const U32 versionId );
  166. bool resolveModuleDependencies( StringTableEntry moduleId, const U32 versionId, StringTableEntry moduleGroup, bool synchronizedOnly, typeModuleLoadEntryVector& moduleResolvingQueue, typeModuleLoadEntryVector& moduleReadyQueue );
  167. ModuleLoadEntry* findModuleResolving( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleResolvingQueue );
  168. ModuleLoadEntry* findModuleReady( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleReadyQueue );
  169. typeModuleLoadEntryVector::iterator findModuleLoaded( StringTableEntry moduleId, const U32 versionId = 0 );
  170. typeGroupVector::iterator findGroupLoaded( StringTableEntry moduleGroup );
  171. StringTableEntry getModuleMergeFilePath( void ) const;
  172. };
  173. //-----------------------------------------------------------------------------
  174. extern ModuleManager ModuleDatabase;
  175. #endif // _MODULE_MANAGER_H