00001 #ifndef __CMS_ROUTING_H__
00002 #define __CMS_ROUTING_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "XProtocol/YProtocol.hh"
00034
00035 class XrdCmsRouting
00036 {
00037 public:
00038
00039 enum {isInvalid = 0x00,
00040 isSync = 0x02,
00041 Forward = 0x04,
00042 noArgs = 0x08,
00043 Delayable = 0x10,
00044 Repliable = 0x20,
00045 AsyncQ0 = 0x40,
00046 AsyncQ1 = 0x80
00047 };
00048
00049 struct theRouting {int reqCode; int reqOpts;};
00050
00051 inline int getRoute(int reqCode)
00052 {return reqCode < XrdCms::kYR_MaxReq
00053 ? valVec[reqCode] : isInvalid;
00054 }
00055
00056 XrdCmsRouting(theRouting *initP)
00057 {memset(valVec, 0, sizeof(valVec));
00058 do {valVec[initP->reqCode] = initP->reqOpts;
00059 } while((++initP)->reqCode);
00060 }
00061 ~XrdCmsRouting() {}
00062
00063 private:
00064 int valVec[XrdCms::kYR_MaxReq];
00065 };
00066
00067
00068
00069
00070
00071 class XrdCmsNode;
00072 class XrdCmsRRData;
00073
00074 class XrdCmsRouter
00075 {
00076 public:
00077
00078 typedef const char *(XrdCmsNode::*NodeMethod_t)(XrdCmsRRData &);
00079
00080 struct theRoute {int reqCode; const char *reqName; NodeMethod_t reqMeth;};
00081
00082 inline NodeMethod_t getMethod(int Code)
00083 {return Code < XrdCms::kYR_MaxReq
00084 ? methVec[Code] : (NodeMethod_t)0;
00085 }
00086
00087 inline const char *getName(int Code)
00088 {return Code < XrdCms::kYR_MaxReq && nameVec[Code]
00089 ? nameVec[Code] : "?";
00090 }
00091
00092 XrdCmsRouter(theRoute *initP)
00093 {memset(methVec, 0, sizeof(methVec));
00094 do {nameVec[initP->reqCode] = initP->reqName;
00095 methVec[initP->reqCode] = initP->reqMeth;
00096 } while((++initP)->reqCode);
00097 }
00098 ~XrdCmsRouter() {}
00099
00100 private:
00101
00102 const char *nameVec [XrdCms::kYR_MaxReq];
00103 NodeMethod_t methVec [XrdCms::kYR_MaxReq];
00104 };
00105
00106 namespace XrdCms
00107 {
00108 extern XrdCmsRouter Router;
00109 extern XrdCmsRouting manVOps;
00110 extern XrdCmsRouting rdrVOps;
00111 extern XrdCmsRouting rspVOps;
00112 extern XrdCmsRouting srvVOps;
00113 extern XrdCmsRouting supVOps;
00114 }
00115 #endif