00001 #ifndef __ARC_MCCLOADER_H__
00002 #define __ARC_MCCLOADER_H__
00003
00004 #include <string>
00005 #include <map>
00006 #include <arc/ArcConfig.h>
00007
00008 #include <arc/message/MCC.h>
00009 #include <arc/message/Service.h>
00010 #include <arc/message/Plexer.h>
00011 #include <arc/message/SecHandler.h>
00012
00013 #include <arc/loader/Plugin.h>
00014 #include <arc/loader/Loader.h>
00015
00016 namespace Arc {
00017
00018
00019 class mcc_connectors_t;
00020 class plexer_connectors_t;
00021
00022 class ChainContext;
00023
00025
00046 class MCCLoader: public Loader {
00047 friend class ChainContext;
00048 public:
00049 typedef std::map<std::string, MCC*> mcc_container_t;
00050 typedef std::map<std::string, Service*> service_container_t;
00051 typedef std::map<std::string, ArcSec::SecHandler*> sechandler_container_t;
00052 typedef std::map<std::string, Plexer*> plexer_container_t;
00053
00054 private:
00055 bool valid_;
00056
00058 mcc_container_t mccs_;
00059
00061 mcc_container_t mccs_exposed_;
00062
00064 service_container_t services_;
00065
00067 sechandler_container_t sechandlers_;
00068
00070 plexer_container_t plexers_;
00071
00078 bool make_elements(Config& cfg, int level = 0,
00079 mcc_connectors_t *mcc_connectors = NULL,
00080 plexer_connectors_t *plexer_connectors = NULL);
00081 MCC* make_component(Config& cfg, XMLNode cn,
00082 mcc_connectors_t *mcc_connectors = NULL);
00083
00084 ChainContext* context_;
00085
00086 public:
00087 MCCLoader():valid_(false) {};
00090 MCCLoader(Config& cfg);
00092 ~MCCLoader();
00096 MCC* operator[](const std::string& id);
00097 MCC* operator[](const char* id) { return operator[](std::string(id)); };
00098
00099 operator bool(void) { return valid_; };
00100 bool operator!(void) { return !valid_; };
00101
00102 bool ReloadElement(Config& cfg);
00103 };
00104
00106
00110 class ChainContext {
00111 friend class MCCLoader;
00112 private:
00113 MCCLoader& loader_;
00114 ChainContext(MCCLoader& loader) : loader_(loader) {};
00115 ~ChainContext() {};
00116 public:
00118 operator PluginsFactory*() { return loader_.factory_; };
00119 };
00120
00121 }
00122
00123 #endif