00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <assert.h>
00025 #include <xplc/ICategoryManager.h>
00026 #include <xplc/uuidops.h>
00027 #include "moduleloader.h"
00028 #include "loader.h"
00029
00030 UUID_MAP_BEGIN(ModuleLoader)
00031 UUID_MAP_ENTRY(IObject)
00032 UUID_MAP_ENTRY(IModuleLoader)
00033 UUID_MAP_END
00034
00035 UUID_MAP_BEGIN(Module)
00036 UUID_MAP_ENTRY(IObject)
00037 UUID_MAP_ENTRY(IServiceHandler)
00038 UUID_MAP_ENTRY(IModule)
00039 UUID_MAP_END
00040
00041 IModule* ModuleLoader::loadModule(const char* modulename) {
00042 return Module::loadModule(modulename);
00043 }
00044
00045 Module* Module::loadModule(const char* modulename) {
00046 XPLC_ModuleInfo* moduleinfo = 0;
00047 void* dlh;
00048 const char* err;
00049
00050 err = loaderOpen(modulename, &dlh);
00051 if(err)
00052 return NULL;
00053
00054 err = loaderSymbol(dlh, "XPLC_Module",
00055 reinterpret_cast<void**>(&moduleinfo));
00056 if(err
00057 || !moduleinfo
00058 || moduleinfo->magic != XPLC_MODULE_MAGIC) {
00059 loaderClose(dlh);
00060 return NULL;
00061 }
00062
00063 switch(moduleinfo->version_major) {
00064 #ifdef UNSTABLE
00065 case -1:
00066
00067 break;
00068 #endif
00069 default:
00070 loaderClose(dlh);
00071 return NULL;
00072 };
00073
00074 return new Module(dlh, moduleinfo);
00075 }
00076
00077 Module::Module(void* aHandle, const XPLC_ModuleInfo* aModuleInfo):
00078 handle(aHandle),
00079 moduleinfo(aModuleInfo)
00080 {
00081 assert(moduleinfo);
00082
00083 if(moduleinfo->categories) {
00084 IServiceManager* servmgr;
00085 IObject* obj;
00086 ICategoryManager* catmgr;
00087 const XPLC_CategoryEntry* entry;
00088
00089 servmgr = XPLC_getServiceManager();
00090 assert(servmgr);
00091
00092 obj = servmgr->getObject(XPLC_categoryManager);
00093 assert(obj);
00094
00095 servmgr->release();
00096
00097 catmgr = mutate<ICategoryManager>(obj);
00098 assert(catmgr);
00099
00100 entry = moduleinfo->categories;
00101 while(entry->category != UUID_null && entry->uuid != UUID_null) {
00102 catmgr->registerComponent(entry->category, entry->uuid, entry->string);
00103
00104 ++entry;
00105 }
00106
00107 catmgr->release();
00108 }
00109 }
00110
00111 IObject* Module::getObject(const UUID& cid) {
00112 const XPLC_ComponentEntry* entry = moduleinfo->components;
00113 IObject* obj = 0;
00114
00115 if(!entry)
00116 return NULL;
00117
00118 while(!obj && entry->uuid != UUID_null) {
00119 if(entry->uuid == cid)
00120 obj = entry->getObject();
00121
00122 ++entry;
00123 }
00124
00125 return obj;
00126 }
00127
00128 Module::~Module() {
00129
00130
00131
00132
00133
00134
00135 if(handle)
00136 loaderClose(handle);
00137 }
00138