// @(#)root/netx:$Name: $:$Id: TXNetConn.h,v 1.5 2005/05/01 10:00:07 rdm Exp $
// Author: Alvise Dorigo, Fabrizio Furano
/*************************************************************************
* Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
#ifndef ROOT_TXNetConn
#define ROOT_TXNetConn
//////////////////////////////////////////////////////////////////////////
// //
// TXNetConn //
// //
// Authors: Alvise Dorigo, Fabrizio Furano //
// INFN Padova, 2003 //
// //
// High level handler of connections to xrootd. //
// Instantiated by TXNetFile. //
// //
//////////////////////////////////////////////////////////////////////////
#define DFLT_MAXREDIRECTCOUNT 255
#define DFLT_DEBUG 0
#define DFLT_RECONNECTTIMEOUT 10
#define DFLT_REQUESTTIMEOUT 60
#define REDIRCNTTIMEOUT 3600
#include "time.h"
#ifndef ROOT_TString
#include "TString.h"
#endif
#ifndef ROOT_TXAbsNetCommon
#include "TXAbsNetCommon.h"
#endif
#ifndef ROOT_TXMessage
#include "TXMessage.h"
#endif
#ifndef ROOT_TUrl
#include "TUrl.h"
#endif
class TXConnectionMgr;
class TXNetConn {
public:
enum ServerType {
kSTError = -1, // Some error occurred: server type undetermined
kSTNone = 0, // Remote server type un-recognized
kSTRootd = 1, // Remote server type: old rootd server
kSTBaseXrootd = 2, // Remote server type: xrootd dynamic load balancer
kSTDataXrootd = 3 // Remote server type: xrootd data server
};
enum ESrvErrorHandlerRetval {
kSEHRReturnMsgToCaller = 0,
kSEHRBreakLoop = 1,
kSEHRContinue = 2,
kSEHRReturnNoMsgToCaller = 3,
kSEHRRedirLimitReached = 4
};
enum EThreeStateReadHandler {
kTSRHReturnMex = 0,
kTSRHReturnNullMex = 1,
kTSRHContinue = 2
};
Int_t fLastDataBytesRecv;
Int_t fLastDataBytesSent;
XErrorCode fOpenError;
TString fOpenErrorMsg;
ServerResponseHeader fLastServerResp;
TXNetConn();
virtual ~TXNetConn();
Bool_t CheckHostDomain(TString hostToCheck, TString allow,
TString deny);
Short_t Connect(TString newHost, Int_t newPort, Int_t netopt);
void Disconnect(Bool_t ForcePhysicalDisc);
Bool_t GetAccessToSrv();
TString GetClientHostDomain() const { return fClientHostDomain; }
Int_t GetLogConnID() const { return fLogConnID; }
TUrl *GetLBSUrl() const { return fLBSUrl; }
XErrorCode GetOpenError() const { return fOpenError; }
TSocket *GetRootdSocket() const { return fLastRootdSocket; }
XReqErrorType GoToAnotherServer(TString, Int_t, Int_t);
Bool_t IsConnected() const { return fConnected; }
Int_t LastBytesRecv();
Int_t LastBytesSent();
Int_t LastDataBytesRecv();
Int_t LastDataBytesSent();
Bool_t SendGenCommand(ClientRequest *req,
const void *reqMoreData,
void **answMoreDataAllocated,
void *answMoreData, Bool_t HasToAlloc,
char *CmdName,
struct ServerResponseHeader *srh = 0);
ServerType GetServerType() const { return fServerType; }
void SetClientHostDomain(const char *src)
{ fClientHostDomain = src; }
void SetConnected(Bool_t conn) { fConnected = conn; }
void SetLogConnID(Short_t logconnid) { fLogConnID = logconnid;}
void SetOpenError(XErrorCode err) { fOpenError = err; }
void SetRedirHandler(TXAbsNetCommon *rh) { fRedirHandler = rh; }
void SetServerType(ServerType type) { fServerType = type; }
void SetSID(kXR_char *sid);
inline void SetUrl(TUrl thisUrl) { fUrl = thisUrl; }
static void SetTXConnectionMgr(TXConnectionMgr *connmgr);
private:
TString fClientHostDomain; // Save the client's domain name
Bool_t fConnected;
Short_t fGlobalRedirCnt; // Number of redirections
time_t fGlobalRedirLastUpdateTimestamp; // Timestamp of last redirection
Int_t fLastNetopt;
TUrl *fLBSUrl; // Needed to save the load balancer url
Short_t fLogConnID; // Logical connection ID of the current
// TXNetFile object
Short_t fMaxGlobalRedirCnt;
TXAbsNetCommon *fRedirHandler; // Pointer to a class inheriting from
// TXAbsNetCommon providing methods
// to handle the redir at higher level
TString fRedirInternalToken; // Token returned by the server when
// redirecting
Long_t fServerProto; // The server protocol
ServerType fServerType; // Server type as returned by doHandShake()
// (see enum ServerType)
TUrl fUrl;
TSocket *fLastRootdSocket; // rootd case: socket of the last open
// connection
Int_t fLastRootdProto; // rootd case: remote server protocol
static TXConnectionMgr *fgConnectionManager; //Connection Manager
Bool_t CheckErrorStatus(TXMessage *, Short_t &, char *);
void CheckPort(Int_t &port);
Bool_t CheckResp(struct ServerResponseHeader *resp, const char *method);
TXMessage *ClientServerCmd(ClientRequest *req, const void *reqMoreData,
void **answMoreDataAllocated, void *answMoreData,
Bool_t HasToAlloc);
Bool_t DoAuthentication(char *list, int lsiz);
ServerType DoHandShake(Short_t log);
Bool_t DoLogin();
TString GetDomainToMatch(TString hostname);
ESrvErrorHandlerRetval HandleServerError(XReqErrorType &, TXMessage *,
ClientRequest *);
Bool_t MatchStreamid(struct ServerResponseHeader *ServerResponse);
TString ParseDomainFromHostname(TString hostname);
TXMessage *ReadPartialAnswer(XReqErrorType &, size_t &,
ClientRequest *, Bool_t, void**,
EThreeStateReadHandler &);
XReqErrorType WriteToServer(ClientRequest *, ClientRequest *,
const void*, Short_t);
ClassDef(TXNetConn, 0); //A high level connection class for TXNetAdmin.
};
//
// Class implementing a trick to automatically unlock a TXPhyConnection.
// Used only by TXNetConn.
//
class TXPhyConnection;
class TXPhyConnLocker {
private:
TXPhyConnection *phyconn;
public:
TXPhyConnLocker(TXPhyConnection *phyc);
~TXPhyConnLocker();
};
#endif
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.