00001
00002 #ifndef __UPF_MANAGER_H__
00003 #define __UPF_MANAGER_H__
00004
00005 #ifdef HAVE_CONFIG_H
00006 #include "config.h"
00007 #endif
00008 #include "upf/upf.h"
00009 #include "upf/ILoader.h"
00010
00011 #include <list>
00012
00013 namespace upf { namespace impl {
00014
00015 using namespace std;
00016
00017 class Manager : public IManager
00018 {
00019 public:
00020 Manager();
00021 virtual ~Manager();
00022
00023 void _initClass();
00024
00025 bool registerClass(IClassInfo *classinfo);
00026 Ptr<IObject> createInstance(CID classID);
00027 CIDsList enumInterfaceImplementations(const IID& iface);
00028 void addModulesPath(const string& path);
00029
00030 Ptr<IClassInfo> getClassInfo(CID classID);
00031 Ptr<IInterfaceInfo> getInterfaceInfo(const IID& iid);
00032
00033 CID classname2cid(const char *classname);
00034
00035 void addIIDMappings(const IIDMappingData& m);
00036
00037 private:
00038 void addLoader(ILoader *loader);
00039 void loadClasses(ILoader *loader, const string& path);
00040
00041 struct ClassInfoData
00042 {
00043 Ptr<IClassInfo> classInfo;
00044 Ptr<IClassFactory> factory;
00045 };
00046
00047 typedef best_map_type<CID, ClassInfoData> ClassesTbl;
00048 typedef StringHash<CID> ClassnamesTbl;
00049 typedef IIDHash<string> IIDsTbl;
00050 typedef list< Ptr<ILoader> > LoadersList;
00051
00052 ClassesTbl m_classes;
00053 ClassnamesTbl m_classnames;
00054 IIDsTbl m_iids;
00055
00056 list<string> m_modulesPaths;
00057 LoadersList m_loaders;
00058
00059 UPF_DECLARE_CLASS(Manager)
00060 };
00061
00062
00063 } }
00064
00065 #endif