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 ) {}; 00105 00106 //------------------------------------------------------------------------ 00116 //------------------------------------------------------------------------ 00117 virtual Status ReadMessageBody( Message *msg, 00118 int socket, 00119 uint32_t &bytesRead ) 00120 { 00121 return Status( stOK, suDone ); 00122 }; 00123 00124 //------------------------------------------------------------------------ 00131 //------------------------------------------------------------------------ 00132 virtual uint8_t OnStreamEvent( StreamEvent event, 00133 uint16_t streamNum, 00134 Status status ) 00135 { 00136 return 0; 00137 }; 00138 }; 00139 00140 //---------------------------------------------------------------------------- 00142 //---------------------------------------------------------------------------- 00143 class OutgoingMsgHandler 00144 { 00145 public: 00146 virtual ~OutgoingMsgHandler() {} 00147 00148 //------------------------------------------------------------------------ 00150 //------------------------------------------------------------------------ 00151 virtual void OnStatusReady( const Message *message, 00152 Status status ) = 0; 00153 00154 //------------------------------------------------------------------------ 00162 //------------------------------------------------------------------------ 00163 virtual void OnReadyToSend( Message *msg, uint16_t streamNum ) {}; 00164 00165 //------------------------------------------------------------------------ 00169 //------------------------------------------------------------------------ 00170 virtual bool IsRaw() const { return false; } 00171 00172 //------------------------------------------------------------------------ 00181 //------------------------------------------------------------------------ 00182 virtual Status WriteMessageBody( int socket, 00183 uint32_t &bytesRead ) 00184 { 00185 return Status(); 00186 } 00187 }; 00188 00189 //---------------------------------------------------------------------------- 00191 //---------------------------------------------------------------------------- 00192 class ChannelEventHandler 00193 { 00194 public: 00195 //------------------------------------------------------------------------ 00197 //------------------------------------------------------------------------ 00198 enum ChannelEvent 00199 { 00200 StreamReady = 1, 00201 StreamBroken = 2, 00202 FatalError = 4 00203 }; 00204 00205 //------------------------------------------------------------------------ 00207 //------------------------------------------------------------------------ 00208 virtual ~ChannelEventHandler() {}; 00209 00210 //------------------------------------------------------------------------ 00218 //------------------------------------------------------------------------ 00219 virtual bool OnChannelEvent( ChannelEvent event, 00220 Status status, 00221 uint16_t stream ) = 0; 00222 }; 00223 00224 //---------------------------------------------------------------------------- 00226 //---------------------------------------------------------------------------- 00227 struct HandShakeData 00228 { 00229 //-------------------------------------------------------------------------- 00231 //-------------------------------------------------------------------------- 00232 HandShakeData( const URL *addr, uint16_t stream, uint16_t subStream ): 00233 step(0), out(0), in(0), url(addr), streamId(stream), 00234 subStreamId( subStream ), startTime( time(0) ), serverAddr(0) 00235 {} 00236 uint16_t step; 00237 Message *out; 00238 Message *in; 00239 const URL *url; 00240 uint16_t streamId; 00241 uint16_t subStreamId; 00242 time_t startTime; 00243 const void *serverAddr; 00244 std::string clientName; 00245 std::string streamName; 00246 }; 00247 00248 //---------------------------------------------------------------------------- 00251 //---------------------------------------------------------------------------- 00252 struct PathID 00253 { 00254 PathID( uint16_t u = 0, uint16_t d = 0 ): up(u), down(d) {} 00255 uint16_t up; 00256 uint16_t down; 00257 }; 00258 00259 //---------------------------------------------------------------------------- 00262 //---------------------------------------------------------------------------- 00263 struct TransportQuery 00264 { 00265 static const uint16_t Name = 1; 00266 static const uint16_t Auth = 2; 00267 }; 00268 00269 //---------------------------------------------------------------------------- 00271 //---------------------------------------------------------------------------- 00272 class TransportHandler 00273 { 00274 public: 00275 00276 //------------------------------------------------------------------------ 00278 //------------------------------------------------------------------------ 00279 enum StreamAction 00280 { 00281 NoAction = 0x0000, 00282 DigestMsg = 0x0001, 00283 00284 AbortStream = 0x0002, 00285 00286 00287 CloseStream = 0x0004, 00288 00289 ResumeStream = 0x0008, 00290 00291 HoldStream = 0x0010 00292 }; 00293 00294 00295 virtual ~TransportHandler() {} 00296 00297 //------------------------------------------------------------------------ 00308 //------------------------------------------------------------------------ 00309 virtual Status GetHeader( Message *message, int socket ) = 0; 00310 00311 //------------------------------------------------------------------------ 00320 //------------------------------------------------------------------------ 00321 virtual Status GetBody( Message *message, int socket ) = 0; 00322 00323 //------------------------------------------------------------------------ 00325 //------------------------------------------------------------------------ 00326 virtual void InitializeChannel( AnyObject &channelData ) = 0; 00327 00328 //------------------------------------------------------------------------ 00330 //------------------------------------------------------------------------ 00331 virtual void FinalizeChannel( AnyObject &channelData ) = 0; 00332 00333 //------------------------------------------------------------------------ 00335 //------------------------------------------------------------------------ 00336 virtual Status HandShake( HandShakeData *handShakeData, 00337 AnyObject &channelData ) = 0; 00338 00339 //------------------------------------------------------------------------ 00341 //------------------------------------------------------------------------ 00342 virtual bool IsStreamTTLElapsed( time_t inactiveTime, 00343 AnyObject &channelData ) = 0; 00344 00345 //------------------------------------------------------------------------ 00351 //------------------------------------------------------------------------ 00352 virtual PathID Multiplex( Message *msg, 00353 AnyObject &channelData, 00354 PathID *hint = 0 ) = 0; 00355 00356 //------------------------------------------------------------------------ 00362 //------------------------------------------------------------------------ 00363 virtual PathID MultiplexSubStream( Message *msg, 00364 AnyObject &channelData, 00365 PathID *hint = 0 ) = 0; 00366 00367 //------------------------------------------------------------------------ 00369 //------------------------------------------------------------------------ 00370 virtual uint16_t StreamNumber( AnyObject &channelData ) = 0; 00371 00372 //------------------------------------------------------------------------ 00374 //------------------------------------------------------------------------ 00375 virtual uint16_t SubStreamNumber( AnyObject &channelData ) = 0; 00376 00377 //------------------------------------------------------------------------ 00379 //------------------------------------------------------------------------ 00380 virtual void Disconnect( AnyObject &channelData, 00381 uint16_t streamId, 00382 uint16_t subStreamId ) = 0; 00383 00384 //------------------------------------------------------------------------ 00386 //------------------------------------------------------------------------ 00387 virtual Status Query( uint16_t query, 00388 AnyObject &result, 00389 AnyObject &channelData ) = 0; 00390 00391 //------------------------------------------------------------------------ 00393 //------------------------------------------------------------------------ 00394 virtual uint32_t StreamAction( Message *msg, AnyObject &channelData ) = 0; 00395 }; 00396 } 00397 00398 #endif // __XRD_CL_POST_MASTER_INTERFACES_HH__