00001 #ifndef __ARC_MCC_H__
00002 #define __ARC_MCC_H__
00003
00004 #include <list>
00005 #include <map>
00006 #include <arc/ArcConfig.h>
00007 #include <arc/Logger.h>
00008 #include <arc/message/SecHandler.h>
00009 #include <arc/loader/Plugin.h>
00010 #include <arc/message/Message.h>
00011 #include <arc/message/MCC_Status.h>
00012
00013 namespace Arc {
00014
00016
00019 class MCCInterface: public Plugin {
00020 public:
00021 MCCInterface(PluginArgument* arg):Plugin(arg) {};
00036 virtual MCC_Status process(Message& request,
00037 Message& response) = 0;
00038 virtual ~MCCInterface() {};
00039 };
00040
00042
00045 class MCC
00046 : public MCCInterface {
00047 protected:
00051 std::map<std::string, MCCInterface *> next_;
00052 MCCInterface *Next(const std::string& label = "");
00053
00058 std::map<std::string, std::list<ArcSec::SecHandler *> > sechandlers_;
00059
00066 bool ProcessSecHandlers(Message& message,
00067 const std::string& label = "") const;
00068
00070
00072 static Logger logger;
00073
00074 public:
00076 MCC(Config *, PluginArgument* arg):MCCInterface(arg) {}
00077
00078 virtual ~MCC() {}
00079
00084 virtual void Next(MCCInterface *next, const std::string& label = "");
00085
00096 virtual void AddSecHandler(Config *cfg,
00097 ArcSec::SecHandler *sechandler,
00098 const std::string& label = "");
00099
00101 virtual void Unlink();
00102
00104 virtual MCC_Status process(Message& ,
00105 Message& ) {
00106 return MCC_Status();
00107 }
00108 };
00109
00110 class MCCConfig
00111 : public BaseConfig {
00112 public:
00113 MCCConfig()
00114 : BaseConfig() {}
00115 virtual ~MCCConfig() {}
00116 virtual XMLNode MakeConfig(XMLNode cfg) const;
00117 };
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 #define MCCPluginKind ("HED:MCC")
00131
00132 class ChainContext;
00133
00134 class MCCPluginArgument: public PluginArgument {
00135 private:
00136 Config* config_;
00137 ChainContext* context_;
00138 public:
00139 MCCPluginArgument(Config* config,ChainContext* context):config_(config),context_(context) { };
00140 virtual ~MCCPluginArgument(void) { };
00141 operator Config* (void) { return config_; };
00142 operator ChainContext* (void) { return context_; };
00143 };
00144
00145 }
00146
00147 #endif