00001 //------------------------------------------------------------------------------ 00002 // Copyright (c) 2011-2012 by European Organization for Nuclear Research (CERN) 00003 // Author: Lukasz Janyst <ljanyst@cern.ch> 00004 //------------------------------------------------------------------------------ 00005 // XRootD is free software: you can redistribute it and/or modify 00006 // it under the terms of the GNU Lesser General Public License as published by 00007 // the Free Software Foundation, either version 3 of the License, or 00008 // (at your option) any later version. 00009 // 00010 // XRootD is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 // GNU General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU Lesser General Public License 00016 // along with XRootD. If not, see <http://www.gnu.org/licenses/>. 00017 //------------------------------------------------------------------------------ 00018 00019 #ifndef __XRD_CL_POST_MASTER_INTERFACES_HH__ 00020 #define __XRD_CL_POST_MASTER_INTERFACES_HH__ 00021 00022 #include <stdint.h> 00023 #include <ctime> 00024 00025 #include "XrdCl/XrdClStatus.hh" 00026 #include "XrdCl/XrdClAnyObject.hh" 00027 #include "XrdCl/XrdClURL.hh" 00028 00029 namespace XrdCl 00030 { 00031 class Channel; 00032 class Message; 00033 class URL; 00034 00035 //---------------------------------------------------------------------------- 00037 //---------------------------------------------------------------------------- 00038 class MessageFilter 00039 { 00040 public: 00041 virtual ~MessageFilter() {} 00042 00043 //------------------------------------------------------------------------ 00046 //------------------------------------------------------------------------ 00047 virtual bool Filter( const Message *msg ) = 0; 00048 }; 00049 00050 //---------------------------------------------------------------------------- 00052 //---------------------------------------------------------------------------- 00053 class IncomingMsgHandler 00054 { 00055 public: 00056 //------------------------------------------------------------------------ 00058 //------------------------------------------------------------------------ 00059 enum Action 00060 { 00061 Take = 0x0001, 00062 Ignore = 0x0002, 00063 RemoveHandler = 0x0004, 00064 00065 Raw = 0x0008, 00066 00067 00068 NoProcess = 0x0010 00069 00070 00071 }; 00072 00073 //------------------------------------------------------------------------ 00075 //------------------------------------------------------------------------ 00076 enum StreamEvent 00077 { 00078 Ready = 1, 00079 Broken = 2, 00080 Timeout = 3, 00081 FatalError = 4 00082 }; 00083 00084 //------------------------------------------------------------------------ 00086 //------------------------------------------------------------------------ 00087 00088 virtual ~IncomingMsgHandler() {} 00089 00090 //------------------------------------------------------------------------ 00096 //------------------------------------------------------------------------ 00097 virtual uint16_t Examine( Message *msg ) = 0; 00098 00099 //------------------------------------------------------------------------ 00103 //------------------------------------------------------------------------ 00104 virtual void Process( Message *msg ) { (void)msg; }; 00105 00106 //------------------------------------------------------------------------ 00116 //------------------------------------------------------------------------ 00117 virtual Status ReadMessageBody( Message *msg, 00118 int socket, 00119 uint32_t &bytesRead ) 00120 { 00121 (void)msg; (void)socket; (void)bytesRead; 00122 return Status( stOK, suDone ); 00123 }; 00124 00125 //------------------------------------------------------------------------ 00132 //------------------------------------------------------------------------ 00133 virtual uint8_t OnStreamEvent( StreamEvent event, 00134 uint16_t streamNum, 00135 Status status ) 00136 { 00137 (void)event; (void)streamNum; (void)status; 00138 return 0; 00139 }; 00140 }; 00141 00142 //---------------------------------------------------------------------------- 00144 //---------------------------------------------------------------------------- 00145 class OutgoingMsgHandler 00146 { 00147 public: 00148 virtual ~OutgoingMsgHandler() {} 00149 00150 //------------------------------------------------------------------------ 00152 //------------------------------------------------------------------------ 00153 virtual void OnStatusReady( const Message *message, 00154 Status status ) = 0; 00155 00156 //------------------------------------------------------------------------ 00164 //------------------------------------------------------------------------ 00165 virtual void OnReadyToSend( Message *msg, uint16_t streamNum ) 00166 { 00167 (void)msg; (void)streamNum; 00168 }; 00169 00170 //------------------------------------------------------------------------ 00174 //------------------------------------------------------------------------ 00175 virtual bool IsRaw() const { return false; } 00176 00177 //------------------------------------------------------------------------ 00186 //------------------------------------------------------------------------ 00187 virtual Status WriteMessageBody( int socket, 00188 uint32_t &bytesRead ) 00189 { 00190 (void)socket; (void)bytesRead; 00191 return Status(); 00192 } 00193 }; 00194 00195 //---------------------------------------------------------------------------- 00197 //---------------------------------------------------------------------------- 00198 class ChannelEventHandler 00199 { 00200 public: 00201 //------------------------------------------------------------------------ 00203 //------------------------------------------------------------------------ 00204 enum ChannelEvent 00205 { 00206 StreamReady = 1, 00207 StreamBroken = 2, 00208 FatalError = 4 00209 }; 00210 00211 //------------------------------------------------------------------------ 00213 //------------------------------------------------------------------------ 00214 virtual ~ChannelEventHandler() {}; 00215 00216 //------------------------------------------------------------------------ 00224 //------------------------------------------------------------------------ 00225 virtual bool OnChannelEvent( ChannelEvent event, 00226 Status status, 00227 uint16_t stream ) = 0; 00228 }; 00229 00230 //---------------------------------------------------------------------------- 00232 //---------------------------------------------------------------------------- 00233 struct HandShakeData 00234 { 00235 //-------------------------------------------------------------------------- 00237 //-------------------------------------------------------------------------- 00238 HandShakeData( const URL *addr, uint16_t stream, uint16_t subStream ): 00239 step(0), out(0), in(0), url(addr), streamId(stream), 00240 subStreamId( subStream ), startTime( time(0) ), serverAddr(0) 00241 {} 00242 uint16_t step; 00243 Message *out; 00244 Message *in; 00245 const URL *url; 00246 uint16_t streamId; 00247 uint16_t subStreamId; 00248 time_t startTime; 00249 const void *serverAddr; 00250 std::string clientName; 00251 std::string streamName; 00252 }; 00253 00254 //---------------------------------------------------------------------------- 00257 //---------------------------------------------------------------------------- 00258 struct PathID 00259 { 00260 PathID( uint16_t u = 0, uint16_t d = 0 ): up(u), down(d) {} 00261 uint16_t up; 00262 uint16_t down; 00263 }; 00264 00265 //---------------------------------------------------------------------------- 00268 //---------------------------------------------------------------------------- 00269 struct TransportQuery 00270 { 00271 static const uint16_t Name = 1; 00272 static const uint16_t Auth = 2; 00273 }; 00274 00275 //---------------------------------------------------------------------------- 00277 //---------------------------------------------------------------------------- 00278 class TransportHandler 00279 { 00280 public: 00281 00282 //------------------------------------------------------------------------ 00284 //------------------------------------------------------------------------ 00285 enum StreamAction 00286 { 00287 NoAction = 0x0000, 00288 DigestMsg = 0x0001, 00289 00290 AbortStream = 0x0002, 00291 00292 00293 CloseStream = 0x0004, 00294 00295 ResumeStream = 0x0008, 00296 00297 HoldStream = 0x0010 00298 }; 00299 00300 00301 virtual ~TransportHandler() {} 00302 00303 //------------------------------------------------------------------------ 00314 //------------------------------------------------------------------------ 00315 virtual Status GetHeader( Message *message, int socket ) = 0; 00316 00317 //------------------------------------------------------------------------ 00326 //------------------------------------------------------------------------ 00327 virtual Status GetBody( Message *message, int socket ) = 0; 00328 00329 //------------------------------------------------------------------------ 00331 //------------------------------------------------------------------------ 00332 virtual void InitializeChannel( AnyObject &channelData ) = 0; 00333 00334 //------------------------------------------------------------------------ 00336 //------------------------------------------------------------------------ 00337 virtual void FinalizeChannel( AnyObject &channelData ) = 0; 00338 00339 //------------------------------------------------------------------------ 00341 //------------------------------------------------------------------------ 00342 virtual Status HandShake( HandShakeData *handShakeData, 00343 AnyObject &channelData ) = 0; 00344 00345 //------------------------------------------------------------------------ 00347 //------------------------------------------------------------------------ 00348 virtual bool IsStreamTTLElapsed( time_t inactiveTime, 00349 AnyObject &channelData ) = 0; 00350 00351 //------------------------------------------------------------------------ 00357 //------------------------------------------------------------------------ 00358 virtual PathID Multiplex( Message *msg, 00359 AnyObject &channelData, 00360 PathID *hint = 0 ) = 0; 00361 00362 //------------------------------------------------------------------------ 00368 //------------------------------------------------------------------------ 00369 virtual PathID MultiplexSubStream( Message *msg, 00370 AnyObject &channelData, 00371 PathID *hint = 0 ) = 0; 00372 00373 //------------------------------------------------------------------------ 00375 //------------------------------------------------------------------------ 00376 virtual uint16_t StreamNumber( AnyObject &channelData ) = 0; 00377 00378 //------------------------------------------------------------------------ 00380 //------------------------------------------------------------------------ 00381 virtual uint16_t SubStreamNumber( AnyObject &channelData ) = 0; 00382 00383 //------------------------------------------------------------------------ 00385 //------------------------------------------------------------------------ 00386 virtual void Disconnect( AnyObject &channelData, 00387 uint16_t streamId, 00388 uint16_t subStreamId ) = 0; 00389 00390 //------------------------------------------------------------------------ 00392 //------------------------------------------------------------------------ 00393 virtual Status Query( uint16_t query, 00394 AnyObject &result, 00395 AnyObject &channelData ) = 0; 00396 00397 //------------------------------------------------------------------------ 00399 //------------------------------------------------------------------------ 00400 virtual uint32_t StreamAction( Message *msg, AnyObject &channelData ) = 0; 00401 }; 00402 } 00403 00404 #endif // __XRD_CL_POST_MASTER_INTERFACES_HH__