// @(#)root/netx:$Id$
/*************************************************************************
 * 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_TXNetFile
#define ROOT_TXNetFile


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TXNetFile                                                            //
//                                                                      //
// Authors: Alvise Dorigo, Fabrizio Furano                              //
//          INFN Padova, 2003                                           //
// Interfaced to the posix client: G. Ganis, CERN                       //
//                                                                      //
// TXNetFile is an extension of TNetFile able to deal with new xrootd   //
// server. Its new features are:                                        //
//  - Automatic server kind recognition (xrootd load balancer, xrootd   //
//    data server, old rootd)                                           //
//  - Backward compatibility with old rootd server (acts as an old      //
//    TNetFile)                                                         //
//  - Fault tolerance for read/write operations (read/write timeouts    //
//    and retry)                                                        //
//  - Internal connection timeout (tunable indipendently from the OS    //
//    one) handled by threads                                           //
//  - handling of redirections from server                              //
//  - Single TCP physical channel for multiple TXNetFile's instances    //
//    inside the same application                                       //
//    So, each TXNetFile object client must send messages containing    //
//    its ID (streamid). The server, of course, will respond with       //
//    messages containing the client's ID, in order to make the client  //
//    able to recognize its message by matching its streamid with that  //
//    one contained in the server's response.                           //
//  - Tunable log verbosity level (0 = nothing, 3 = dump read/write     //
//    buffers too!)                                                     //
//  - Many parameters configurable via TEnv facility (see SetParm()     //
//    methods)                                                          //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TNetFile
#include "TNetFile.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif
#ifndef ROOT_TUrl
#include "TUrl.h"
#endif

class TFileStager;
class TSocket;
class XrdClient;

class TXNetFile : public TNetFile {

friend class TXNetSystem;

private:
   // Members
   XrdClient         *fClient;       // Handle to the client object
   Bool_t             fIsRootd;      // Nature of remote file server

   // Static members
   static Bool_t  fgInitDone;    // Avoid initializing more than once
   static Bool_t  fgRootdBC;     // Control rootd backward compatibility
   static TFileStager *fgFileStager; // Stager for IsStaged checks

   void              *fInitMtx;     // Protects fInitDone, serializes the
                                    // attempts to Init() for this object only

   // Methods
   TXNetFile(const TXNetFile&);  // Not implemented
   TXNetFile& operator=(const TXNetFile&);  // Not implemented
   void    CreateXClient(const char *url, Option_t *option, Int_t netopt,
                         Bool_t parallelopen);

   Int_t   ParseOptions(const char *opts, Int_t &cachesz, Int_t &readaheadsz,
                        Int_t &rmpolicy, Int_t &mxredir, Int_t &rastrategy, Int_t &readtrimblksz);

   // Synchronizes the cache size in XrdClient
   // XrdClient cannot have a cache size smaller than the one in TFile
   void    SynchronizeCacheSize();

   void    Init(Bool_t create);
   Bool_t  Open(Option_t *option, Bool_t parallelopen);
   Int_t   SysStat(Int_t fd, Long_t *id, Long64_t *size, Long_t *flags,
                   Long_t *modtime);
   Int_t   SysOpen(const char *pathname, Int_t flags, UInt_t mode);
   Int_t   SysClose(Int_t fd);

   // Static methods
   static void FormUrl(TUrl uut, TString &uu);
   static Int_t GetRootdProtocol(TSocket *s);
   static void SetEnv();

public:
   TXNetFile() : TNetFile(), fClient(0), fIsRootd(0), fInitMtx(0) {}
   TXNetFile(const char *url, Option_t *option = "", const char *fTitle = "",
             Int_t compress = 1, Int_t netopt = 0, Bool_t parallelopen = kFALSE,
             const char *logicalurl = 0);

   virtual ~TXNetFile();

   virtual void     Close(const Option_t *opt ="");
   virtual void     ResetCache();
   virtual void     Flush();
   virtual Int_t    GetBytesToPrefetch() const;
   virtual Bool_t   ReadBufferAsync(Long64_t offs, Int_t len);
   virtual TFile::EAsyncOpenStatus GetAsyncOpenStatus();
   virtual Bool_t   IsOpen() const;

   virtual void     Print(Option_t *option="") const;
   virtual Bool_t   ReadBuffer(char *buf, Int_t len);
   virtual Bool_t   ReadBuffer(char *buf, Long64_t pos, Int_t len);
   virtual Bool_t   ReadBuffers(char *buf,  Long64_t *pos, Int_t *len, Int_t nbuf);
   virtual Int_t    ReOpen(const Option_t *mode);
   virtual Bool_t   WriteBuffer(const char *buffer, Int_t BufferLength);

   ClassDef(TXNetFile,0) // TFile implementation to deal with new xrootd server.
};

#endif
 TXNetFile.h:1
 TXNetFile.h:2
 TXNetFile.h:3
 TXNetFile.h:4
 TXNetFile.h:5
 TXNetFile.h:6
 TXNetFile.h:7
 TXNetFile.h:8
 TXNetFile.h:9
 TXNetFile.h:10
 TXNetFile.h:11
 TXNetFile.h:12
 TXNetFile.h:13
 TXNetFile.h:14
 TXNetFile.h:15
 TXNetFile.h:16
 TXNetFile.h:17
 TXNetFile.h:18
 TXNetFile.h:19
 TXNetFile.h:20
 TXNetFile.h:21
 TXNetFile.h:22
 TXNetFile.h:23
 TXNetFile.h:24
 TXNetFile.h:25
 TXNetFile.h:26
 TXNetFile.h:27
 TXNetFile.h:28
 TXNetFile.h:29
 TXNetFile.h:30
 TXNetFile.h:31
 TXNetFile.h:32
 TXNetFile.h:33
 TXNetFile.h:34
 TXNetFile.h:35
 TXNetFile.h:36
 TXNetFile.h:37
 TXNetFile.h:38
 TXNetFile.h:39
 TXNetFile.h:40
 TXNetFile.h:41
 TXNetFile.h:42
 TXNetFile.h:43
 TXNetFile.h:44
 TXNetFile.h:45
 TXNetFile.h:46
 TXNetFile.h:47
 TXNetFile.h:48
 TXNetFile.h:49
 TXNetFile.h:50
 TXNetFile.h:51
 TXNetFile.h:52
 TXNetFile.h:53
 TXNetFile.h:54
 TXNetFile.h:55
 TXNetFile.h:56
 TXNetFile.h:57
 TXNetFile.h:58
 TXNetFile.h:59
 TXNetFile.h:60
 TXNetFile.h:61
 TXNetFile.h:62
 TXNetFile.h:63
 TXNetFile.h:64
 TXNetFile.h:65
 TXNetFile.h:66
 TXNetFile.h:67
 TXNetFile.h:68
 TXNetFile.h:69
 TXNetFile.h:70
 TXNetFile.h:71
 TXNetFile.h:72
 TXNetFile.h:73
 TXNetFile.h:74
 TXNetFile.h:75
 TXNetFile.h:76
 TXNetFile.h:77
 TXNetFile.h:78
 TXNetFile.h:79
 TXNetFile.h:80
 TXNetFile.h:81
 TXNetFile.h:82
 TXNetFile.h:83
 TXNetFile.h:84
 TXNetFile.h:85
 TXNetFile.h:86
 TXNetFile.h:87
 TXNetFile.h:88
 TXNetFile.h:89
 TXNetFile.h:90
 TXNetFile.h:91
 TXNetFile.h:92
 TXNetFile.h:93
 TXNetFile.h:94
 TXNetFile.h:95
 TXNetFile.h:96
 TXNetFile.h:97
 TXNetFile.h:98
 TXNetFile.h:99
 TXNetFile.h:100
 TXNetFile.h:101
 TXNetFile.h:102
 TXNetFile.h:103
 TXNetFile.h:104
 TXNetFile.h:105
 TXNetFile.h:106
 TXNetFile.h:107
 TXNetFile.h:108
 TXNetFile.h:109
 TXNetFile.h:110
 TXNetFile.h:111
 TXNetFile.h:112
 TXNetFile.h:113
 TXNetFile.h:114
 TXNetFile.h:115
 TXNetFile.h:116
 TXNetFile.h:117
 TXNetFile.h:118
 TXNetFile.h:119
 TXNetFile.h:120
 TXNetFile.h:121
 TXNetFile.h:122
 TXNetFile.h:123
 TXNetFile.h:124
 TXNetFile.h:125
 TXNetFile.h:126
 TXNetFile.h:127
 TXNetFile.h:128
 TXNetFile.h:129