moduleManager.h 8.1 KB

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