ROOT logo
// @(#)root/netx:$Id: TXNetFileStager.cxx 24747 2008-07-09 15:41:49Z rdm $
// Author: A. Peters, G. Ganis   7/2/2007

/*************************************************************************
 * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TXNetFileStager                                                      //
//                                                                      //
// Interface to the 'XRD' staging capabilities.                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TError.h"
#include "TObjString.h"
#include "TUrl.h"
#include "TXNetFileStager.h"
#include "TXNetSystem.h"

//_____________________________________________________________________________
TXNetFileStager::TXNetFileStager(const char *url) : TFileStager("xrd")
{
   // Constructor. Init a TXNetSystem instance to the XRD system.

   fSystem = 0;
   if (url && strlen(url) > 0) {
      GetPrefix(url, fPrefix);

      fSystem = new TXNetSystem(fPrefix);
   }
}

//_____________________________________________________________________________
TXNetFileStager::~TXNetFileStager()
{
   // Destructor

   if (fSystem)
      delete fSystem;
   fSystem = 0;
   fPrefix = "";
}

//_____________________________________________________________________________
Bool_t TXNetFileStager::IsStaged(const char *path)
{
   // Check if the file defined by 'path' is ready to be used.

   if (!IsValid()) {
      GetPrefix(path, fPrefix);
      fSystem = new TXNetSystem(path);
   }

   if (IsValid()) {
      TString p(path);
      if (!p.BeginsWith("root:"))
         p.Insert(0, fPrefix);
      return (fSystem->IsOnline(p));
   }

   // Failure
   Warning("IsStaged","TXNetSystem not initialized");
   return kFALSE;
}

//_____________________________________________________________________________
Bool_t TXNetFileStager::Stage(TCollection *paths, Option_t *opt)
{
   // Issue a stage request for file defined by 'path'. The string 'opt'
   // defines 'option' and 'priority' for 'Prepare': the format is
   //    opt = "option=o priority=p".

   if (IsValid()) {
      UChar_t o = 8;
      UChar_t p = 0;
      // Parse options, if any
      if (opt && strlen(opt) > 0) {
         TString xo(opt), io;
         Ssiz_t from = 0;
         while (xo.Tokenize(io, from, "[ ,|]")) {
            if (io.Contains("option=")) {
               io.ReplaceAll("option=","");
               if (io.IsDigit()) {
                  Int_t i = io.Atoi();
                  if (i >= 0 && i <= 255)
                     o = (UChar_t) i;
               }
            }
            if (io.Contains("priority=")) {
               io.ReplaceAll("priority=","");
               if (io.IsDigit()) {
                  Int_t i = io.Atoi();
                  if (i >= 0 && i <= 255)
                     p = (UChar_t) i;
               }
            }
         }
      }
      // Run prepare
      return fSystem->Prepare(paths, o, p);
   }

   // Failure
   Warning("Stage","TXNetSystem not initialized");
   return kFALSE;

}

//_____________________________________________________________________________
Bool_t TXNetFileStager::Stage(const char *path, Option_t *opt)
{
   // Issue a stage request for file defined by 'path'. The string 'opt'
   // defines 'option' and 'priority' for 'Prepare': the format is
   //                opt = "option=o priority=p".

   if (!IsValid()) {
      GetPrefix(path, fPrefix);
      fSystem = new TXNetSystem(path);
   }

   if (IsValid()) {
      UChar_t o = 8;
      UChar_t p = 0;
      // Parse options
      TString xo(opt), io;
      Ssiz_t from = 0;
      while (xo.Tokenize(io, from, "[ ,|]")) {
         if (io.Contains("option=")) {
            io.ReplaceAll("option=","");
            if (io.IsDigit()) {
               Int_t i = io.Atoi();
               if (i >= 0 && i <= 255)
                  o = (UChar_t) i;
            }
         }
         if (io.Contains("priority=")) {
            io.ReplaceAll("priority=","");
            if (io.IsDigit()) {
               Int_t i = io.Atoi();
               if (i >= 0 && i <= 255)
                  p = (UChar_t) i;
            }
         }
      }
      // Make user the full path is used
      TString pp(path);
      if (!pp.BeginsWith("root:"))
         pp.Insert(0, fPrefix);
      return fSystem->Prepare(pp, o, p);
   }

   // Failure
   Warning("Stage","TXNetSystem not initialized");
   return kFALSE;
}

//_____________________________________________________________________________
void TXNetFileStager::GetPrefix(const char *url, TString &pfx)
{
   // Isolate prefix in url

   if (gDebug > 1)
      ::Info("TXNetFileStager::GetPrefix", "enter: %s", url);

   TUrl u(url);
   pfx = Form("%s://", u.GetProtocol());
   if (strlen(u.GetUser()) > 0)
      pfx += Form("%s@", u.GetUser());
   pfx += u.GetHost();
   if (u.GetPort() != TUrl("root://host").GetPort())
      pfx += Form(":%d", u.GetPort());
   pfx += "/";

   if (gDebug > 1)
      ::Info("TXNetFileStager::GetPrefix", "found prefix: %s", pfx.Data());
}

//_____________________________________________________________________________
void TXNetFileStager::Print(Option_t *) const
{
   // Print basic info about this stager

   Printf("+++ stager: %s  %s", GetName(), fPrefix.Data());
}

//______________________________________________________________________________
Int_t TXNetFileStager::Locate(const char *path, TString &eurl)
{
   // Get actual end-point url for a path
   // Returns 0 in case of success and 1 if any error occured

   if (!IsValid()) {
      GetPrefix(path, fPrefix);
      fSystem = new TXNetSystem(path);
   }

   if (IsValid())
      return fSystem->Locate(path, eurl);

   // Unable to initialize TXNetSystem
   return -1;
}

//______________________________________________________________________________
Bool_t TXNetFileStager::Matches(const char *s)
{
   // Returns kTRUE if stager 's' is compatible with current stager.
   // Avoids multiple instantiations of the potentially the same TXNetSystem.

   if (IsValid()) {
      TString pfx;
      GetPrefix(s, pfx);
      return ((fPrefix == pfx) ? kTRUE : kFALSE);
   }

   // Not valid
   return kFALSE;
}
 TXNetFileStager.cxx:1
 TXNetFileStager.cxx:2
 TXNetFileStager.cxx:3
 TXNetFileStager.cxx:4
 TXNetFileStager.cxx:5
 TXNetFileStager.cxx:6
 TXNetFileStager.cxx:7
 TXNetFileStager.cxx:8
 TXNetFileStager.cxx:9
 TXNetFileStager.cxx:10
 TXNetFileStager.cxx:11
 TXNetFileStager.cxx:12
 TXNetFileStager.cxx:13
 TXNetFileStager.cxx:14
 TXNetFileStager.cxx:15
 TXNetFileStager.cxx:16
 TXNetFileStager.cxx:17
 TXNetFileStager.cxx:18
 TXNetFileStager.cxx:19
 TXNetFileStager.cxx:20
 TXNetFileStager.cxx:21
 TXNetFileStager.cxx:22
 TXNetFileStager.cxx:23
 TXNetFileStager.cxx:24
 TXNetFileStager.cxx:25
 TXNetFileStager.cxx:26
 TXNetFileStager.cxx:27
 TXNetFileStager.cxx:28
 TXNetFileStager.cxx:29
 TXNetFileStager.cxx:30
 TXNetFileStager.cxx:31
 TXNetFileStager.cxx:32
 TXNetFileStager.cxx:33
 TXNetFileStager.cxx:34
 TXNetFileStager.cxx:35
 TXNetFileStager.cxx:36
 TXNetFileStager.cxx:37
 TXNetFileStager.cxx:38
 TXNetFileStager.cxx:39
 TXNetFileStager.cxx:40
 TXNetFileStager.cxx:41
 TXNetFileStager.cxx:42
 TXNetFileStager.cxx:43
 TXNetFileStager.cxx:44
 TXNetFileStager.cxx:45
 TXNetFileStager.cxx:46
 TXNetFileStager.cxx:47
 TXNetFileStager.cxx:48
 TXNetFileStager.cxx:49
 TXNetFileStager.cxx:50
 TXNetFileStager.cxx:51
 TXNetFileStager.cxx:52
 TXNetFileStager.cxx:53
 TXNetFileStager.cxx:54
 TXNetFileStager.cxx:55
 TXNetFileStager.cxx:56
 TXNetFileStager.cxx:57
 TXNetFileStager.cxx:58
 TXNetFileStager.cxx:59
 TXNetFileStager.cxx:60
 TXNetFileStager.cxx:61
 TXNetFileStager.cxx:62
 TXNetFileStager.cxx:63
 TXNetFileStager.cxx:64
 TXNetFileStager.cxx:65
 TXNetFileStager.cxx:66
 TXNetFileStager.cxx:67
 TXNetFileStager.cxx:68
 TXNetFileStager.cxx:69
 TXNetFileStager.cxx:70
 TXNetFileStager.cxx:71
 TXNetFileStager.cxx:72
 TXNetFileStager.cxx:73
 TXNetFileStager.cxx:74
 TXNetFileStager.cxx:75
 TXNetFileStager.cxx:76
 TXNetFileStager.cxx:77
 TXNetFileStager.cxx:78
 TXNetFileStager.cxx:79
 TXNetFileStager.cxx:80
 TXNetFileStager.cxx:81
 TXNetFileStager.cxx:82
 TXNetFileStager.cxx:83
 TXNetFileStager.cxx:84
 TXNetFileStager.cxx:85
 TXNetFileStager.cxx:86
 TXNetFileStager.cxx:87
 TXNetFileStager.cxx:88
 TXNetFileStager.cxx:89
 TXNetFileStager.cxx:90
 TXNetFileStager.cxx:91
 TXNetFileStager.cxx:92
 TXNetFileStager.cxx:93
 TXNetFileStager.cxx:94
 TXNetFileStager.cxx:95
 TXNetFileStager.cxx:96
 TXNetFileStager.cxx:97
 TXNetFileStager.cxx:98
 TXNetFileStager.cxx:99
 TXNetFileStager.cxx:100
 TXNetFileStager.cxx:101
 TXNetFileStager.cxx:102
 TXNetFileStager.cxx:103
 TXNetFileStager.cxx:104
 TXNetFileStager.cxx:105
 TXNetFileStager.cxx:106
 TXNetFileStager.cxx:107
 TXNetFileStager.cxx:108
 TXNetFileStager.cxx:109
 TXNetFileStager.cxx:110
 TXNetFileStager.cxx:111
 TXNetFileStager.cxx:112
 TXNetFileStager.cxx:113
 TXNetFileStager.cxx:114
 TXNetFileStager.cxx:115
 TXNetFileStager.cxx:116
 TXNetFileStager.cxx:117
 TXNetFileStager.cxx:118
 TXNetFileStager.cxx:119
 TXNetFileStager.cxx:120
 TXNetFileStager.cxx:121
 TXNetFileStager.cxx:122
 TXNetFileStager.cxx:123
 TXNetFileStager.cxx:124
 TXNetFileStager.cxx:125
 TXNetFileStager.cxx:126
 TXNetFileStager.cxx:127
 TXNetFileStager.cxx:128
 TXNetFileStager.cxx:129
 TXNetFileStager.cxx:130
 TXNetFileStager.cxx:131
 TXNetFileStager.cxx:132
 TXNetFileStager.cxx:133
 TXNetFileStager.cxx:134
 TXNetFileStager.cxx:135
 TXNetFileStager.cxx:136
 TXNetFileStager.cxx:137
 TXNetFileStager.cxx:138
 TXNetFileStager.cxx:139
 TXNetFileStager.cxx:140
 TXNetFileStager.cxx:141
 TXNetFileStager.cxx:142
 TXNetFileStager.cxx:143
 TXNetFileStager.cxx:144
 TXNetFileStager.cxx:145
 TXNetFileStager.cxx:146
 TXNetFileStager.cxx:147
 TXNetFileStager.cxx:148
 TXNetFileStager.cxx:149
 TXNetFileStager.cxx:150
 TXNetFileStager.cxx:151
 TXNetFileStager.cxx:152
 TXNetFileStager.cxx:153
 TXNetFileStager.cxx:154
 TXNetFileStager.cxx:155
 TXNetFileStager.cxx:156
 TXNetFileStager.cxx:157
 TXNetFileStager.cxx:158
 TXNetFileStager.cxx:159
 TXNetFileStager.cxx:160
 TXNetFileStager.cxx:161
 TXNetFileStager.cxx:162
 TXNetFileStager.cxx:163
 TXNetFileStager.cxx:164
 TXNetFileStager.cxx:165
 TXNetFileStager.cxx:166
 TXNetFileStager.cxx:167
 TXNetFileStager.cxx:168
 TXNetFileStager.cxx:169
 TXNetFileStager.cxx:170
 TXNetFileStager.cxx:171
 TXNetFileStager.cxx:172
 TXNetFileStager.cxx:173
 TXNetFileStager.cxx:174
 TXNetFileStager.cxx:175
 TXNetFileStager.cxx:176
 TXNetFileStager.cxx:177
 TXNetFileStager.cxx:178
 TXNetFileStager.cxx:179
 TXNetFileStager.cxx:180
 TXNetFileStager.cxx:181
 TXNetFileStager.cxx:182
 TXNetFileStager.cxx:183
 TXNetFileStager.cxx:184
 TXNetFileStager.cxx:185
 TXNetFileStager.cxx:186
 TXNetFileStager.cxx:187
 TXNetFileStager.cxx:188
 TXNetFileStager.cxx:189
 TXNetFileStager.cxx:190
 TXNetFileStager.cxx:191
 TXNetFileStager.cxx:192
 TXNetFileStager.cxx:193
 TXNetFileStager.cxx:194
 TXNetFileStager.cxx:195
 TXNetFileStager.cxx:196
 TXNetFileStager.cxx:197
 TXNetFileStager.cxx:198
 TXNetFileStager.cxx:199
 TXNetFileStager.cxx:200
 TXNetFileStager.cxx:201
 TXNetFileStager.cxx:202
 TXNetFileStager.cxx:203
 TXNetFileStager.cxx:204
 TXNetFileStager.cxx:205
 TXNetFileStager.cxx:206
 TXNetFileStager.cxx:207
 TXNetFileStager.cxx:208
 TXNetFileStager.cxx:209
 TXNetFileStager.cxx:210
 TXNetFileStager.cxx:211
 TXNetFileStager.cxx:212
 TXNetFileStager.cxx:213
 TXNetFileStager.cxx:214
 TXNetFileStager.cxx:215
 TXNetFileStager.cxx:216
 TXNetFileStager.cxx:217
 TXNetFileStager.cxx:218
 TXNetFileStager.cxx:219
 TXNetFileStager.cxx:220
 TXNetFileStager.cxx:221
 TXNetFileStager.cxx:222
 TXNetFileStager.cxx:223
 TXNetFileStager.cxx:224