moduleManager.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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 "sim/simBase.h"
  26. #endif
  27. #ifndef _VECTOR_H_
  28. #include "collection/vector.h"
  29. #endif
  30. #ifndef _HASHTABLE_H_
  31. #include "collection/hashTable.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. ModuleDefinition* mpModuleDefinition;
  81. bool mStrictVersionId;
  82. };
  83. /// Module loading.
  84. typedef Vector<StringTableEntry> typeModuleIdVector;
  85. typedef Vector<StringTableEntry> typeGroupVector;
  86. typedef HashMap<StringTableEntry, typeModuleIdVector*> typeGroupModuleHash;
  87. typedef Vector<ModuleLoadEntry> typeModuleLoadEntryVector;
  88. typeGroupModuleHash mGroupModules;
  89. typeGroupVector mGroupsLoaded;
  90. typeModuleLoadEntryVector mModulesLoaded;
  91. /// Miscellaneous.
  92. bool mEnforceDependencies;
  93. bool mEchoInfo;
  94. S32 mDatabaseLocks;
  95. char mModuleExtension[256];
  96. Taml mTaml;
  97. SimSet mNotificationListeners;
  98. // Module definition entry.
  99. struct ModuleDefinitionEntry : public typeModuleDefinitionVector
  100. {
  101. public:
  102. ModuleDefinitionEntry( StringTableEntry moduleId, StringTableEntry moduleGroup, StringTableEntry moduleType ) :
  103. mModuleId( moduleId ),
  104. mModuleGroup( moduleGroup ),
  105. mModuleType( moduleType )
  106. {
  107. }
  108. const StringTableEntry mModuleId;
  109. const StringTableEntry mModuleGroup;
  110. const StringTableEntry mModuleType;
  111. };
  112. /// Module databases.
  113. typedef HashMap<StringTableEntry, ModuleDefinitionEntry*> typeModuleIdDatabaseHash;
  114. typeModuleIdDatabaseHash mModuleIdDatabase;
  115. public:
  116. ModuleManager();
  117. virtual ~ModuleManager() {}
  118. /// SimObject overrides
  119. virtual bool onAdd();
  120. virtual void onRemove();
  121. virtual void onDeleteNotify( SimObject *object );
  122. static void initPersistFields();
  123. /// Declare Console Object.
  124. DECLARE_CONOBJECT( ModuleManager );
  125. /// Module definitions.
  126. bool setModuleExtension( const char* pExtension );
  127. /// Module discovery.
  128. bool scanModules( const char* pPath, const bool rootOnly = false );
  129. /// Module unregister.
  130. bool unregisterModule( const char* pModuleId, const U32 versionId );
  131. /// Module (un)loading.
  132. bool loadModuleGroup( const char* pModuleGroup );
  133. bool unloadModuleGroup( const char* pModuleGroup );
  134. bool loadModuleExplicit( const char* pModuleId, const U32 versionId = 0 );
  135. bool unloadModuleExplicit( const char* pModuleId );
  136. /// Module type enumeration.
  137. ModuleDefinition* findModule( const char* pModuleId, const U32 versionId );
  138. ModuleDefinition* findLoadedModule( const char* pModuleId );
  139. void findModules( const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
  140. void findModuleTypes( const char* pModuleType, const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
  141. /// Module synchronization.
  142. StringTableEntry copyModule( ModuleDefinition* pSourceModuleDefinition, const char* pTargetModuleId, const char* pTargetPath, const bool useVersionPathing );
  143. bool synchronizeDependencies( ModuleDefinition* pRootModuleDefinition, const char* pTargetDependencyPath );
  144. /// Module updates.
  145. inline bool isModuleMergeAvailable( void ) const { return Platform::isFile( getModuleMergeFilePath() ); }
  146. bool canMergeModules( const char* pMergeSourcePath );
  147. bool mergeModules( const char* pMergeTargetPath, const bool removeMergeDefinition, const bool registerNewModules );
  148. /// Module notifications.
  149. void addListener( SimObject* pListener );
  150. void removeListener( SimObject* pListener );
  151. void clearDatabase( void );
  152. private:
  153. bool removeModuleDefinition( ModuleDefinition* pModuleDefinition );
  154. bool registerModule( const char* pModulePath, const char* pModuleFile );
  155. void raiseModulePreLoadNotifications( ModuleDefinition* pModuleDefinition );
  156. void raiseModulePostLoadNotifications( ModuleDefinition* pModuleDefinition );
  157. void raiseModulePreUnloadNotifications( ModuleDefinition* pModuleDefinition );
  158. void raiseModulePostUnloadNotifications( ModuleDefinition* pModuleDefinition );
  159. ModuleDefinitionEntry* findModuleId( StringTableEntry moduleId );
  160. ModuleDefinitionEntry::iterator findModuleDefinition( StringTableEntry moduleId, const U32 versionId );
  161. bool resolveModuleDependencies( StringTableEntry moduleId, const U32 versionId, StringTableEntry moduleGroup, bool synchronizedOnly, typeModuleLoadEntryVector& moduleResolvingQueue, typeModuleLoadEntryVector& moduleReadyQueue );
  162. ModuleLoadEntry* findModuleResolving( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleResolvingQueue );
  163. ModuleLoadEntry* findModuleReady( StringTableEntry moduleId, typeModuleLoadEntryVector& moduleReadyQueue );
  164. typeModuleLoadEntryVector::iterator findModuleLoaded( StringTableEntry moduleId, const U32 versionId = 0 );
  165. typeGroupVector::iterator findGroupLoaded( StringTableEntry moduleGroup );
  166. StringTableEntry getModuleMergeFilePath( void ) const;
  167. };
  168. //-----------------------------------------------------------------------------
  169. extern ModuleManager ModuleDatabase;
  170. #endif // _MODULE_MANAGER_H