00001 /* 00002 * XrdClMetalinkRedirector.hh 00003 * 00004 * Created on: May 2, 2016 00005 * Author: simonm 00006 */ 00007 00008 #ifndef SRC_XRDCL_XRDCLMETALINKREDIRECTOR_HH_ 00009 #define SRC_XRDCL_XRDCLMETALINKREDIRECTOR_HH_ 00010 00011 #include "XrdCl/XrdClMessageUtils.hh" 00012 #include "XrdCl/XrdClRedirectorRegistry.hh" 00013 00014 #include <string> 00015 #include <list> 00016 #include <map> 00017 00018 00019 class XrdOucFileInfo; 00020 00021 namespace XrdCl 00022 { 00023 00024 class File; 00025 class Message; 00026 00027 //---------------------------------------------------------------------------- 00030 //---------------------------------------------------------------------------- 00031 class MetalinkRedirector : public VirtualRedirector 00032 { 00033 friend class MetalinkOpenHandler; 00034 friend class MetalinkReadHandler; 00035 00036 public: 00037 //---------------------------------------------------------------------------- 00041 //---------------------------------------------------------------------------- 00042 MetalinkRedirector( const std::string &url ); 00043 00044 //---------------------------------------------------------------------------- 00046 //---------------------------------------------------------------------------- 00047 virtual ~MetalinkRedirector(); 00048 00049 //---------------------------------------------------------------------------- 00051 //---------------------------------------------------------------------------- 00052 XRootDStatus Load( ResponseHandler *userHandler ); 00053 00054 //---------------------------------------------------------------------------- 00058 //---------------------------------------------------------------------------- 00059 XRootDStatus HandleRequest( const Message *msg, IncomingMsgHandler *handler ); 00060 00061 //---------------------------------------------------------------------------- 00063 //---------------------------------------------------------------------------- 00064 std::string GetTargetName() const 00065 { 00066 return pTarget; 00067 } 00068 00069 //---------------------------------------------------------------------------- 00072 //---------------------------------------------------------------------------- 00073 std::string GetCheckSum( const std::string &type ) const 00074 { 00075 CksumMap::const_iterator it = pChecksums.find( type ); 00076 if( it == pChecksums.end() ) return std::string(); 00077 return type + ":" + it->second; 00078 } 00079 00080 //---------------------------------------------------------------------------- 00083 //---------------------------------------------------------------------------- 00084 long long GetSize() const 00085 { 00086 return pFileSize; 00087 } 00088 00089 //---------------------------------------------------------------------------- 00091 //---------------------------------------------------------------------------- 00092 const std::vector<std::string>& GetReplicas() 00093 { 00094 return pReplicas; 00095 } 00096 00097 //---------------------------------------------------------------------------- 00099 //---------------------------------------------------------------------------- 00100 virtual int Count( Message *req ) const; 00101 00102 private: 00103 00104 //---------------------------------------------------------------------------- 00109 //---------------------------------------------------------------------------- 00110 XRootDStatus HandleRequestImpl( const Message *msg, IncomingMsgHandler *handler ); 00111 00112 //---------------------------------------------------------------------------- 00115 //---------------------------------------------------------------------------- 00116 XRootDStatus Parse( const std::string &metalink ); 00117 00118 //---------------------------------------------------------------------------- 00123 //---------------------------------------------------------------------------- 00124 void FinalizeInitialization( const XRootDStatus &status = XRootDStatus() ); 00125 00126 //---------------------------------------------------------------------------- 00128 //---------------------------------------------------------------------------- 00129 Message* GetResponse( const Message *msg ) const; 00130 00131 //---------------------------------------------------------------------------- 00133 //---------------------------------------------------------------------------- 00134 Message* GetErrorMsg( const Message *msg, const std::string &errMsg, XErrorCode code ) const; 00135 00136 //---------------------------------------------------------------------------- 00138 //---------------------------------------------------------------------------- 00139 void InitCksum( XrdOucFileInfo **fileInfos ); 00140 00141 //---------------------------------------------------------------------------- 00143 //---------------------------------------------------------------------------- 00144 void InitReplicas( XrdOucFileInfo **fileInfos ); 00145 00146 //---------------------------------------------------------------------------- 00148 //---------------------------------------------------------------------------- 00149 XRootDStatus GetReplica( const Message *msg, std::string &replica ) const; 00150 00151 //---------------------------------------------------------------------------- 00153 //---------------------------------------------------------------------------- 00154 XRootDStatus GetCgiInfo( const Message *msg, const std::string &key, std::string &out ) const; 00155 00156 typedef std::list< std::pair<const Message*, IncomingMsgHandler*> > RedirectList; 00157 typedef std::map<std::string, std::string> CksumMap; 00158 typedef std::vector<std::string> ReplicaList; 00159 00160 //---------------------------------------------------------------------------- 00162 //---------------------------------------------------------------------------- 00163 ReplicaList::const_iterator GetReplica( const Message *msg ) const; 00164 00165 RedirectList pPendingRedirects; 00166 std::string pUrl; 00167 File *pFile; 00168 CksumMap pChecksums; 00169 ReplicaList pReplicas; 00170 bool pReady; 00171 XRootDStatus pStatus; 00172 std::string pTarget; 00173 long long pFileSize; 00174 00175 XrdSysMutex pMutex; 00176 00177 static const std::string LocalFile; 00178 00179 }; 00180 00181 } /* namespace XrdCl */ 00182 00183 #endif /* SRC_XRDCL_XRDCLMETALINKREDIRECTOR_HH_ */