From 785a4d2a3e4954a7c26a59ab259151de70c243a8 Mon Sep 17 00:00:00 2001
From: Philippe Canal <pcanal@fnal.gov>
Date: Tue, 24 Jan 2006 21:32:46 +0000
Subject: [PATCH] From Sergei Linev: 1) In normal TBasket constructor mother
 directory assigned to TBranch directory. 2) In TBasket::CopyTo method file
 for copy is used directly without setting gFile/gDirectory 3) In
 TBasket::WriteBuffer mother dir assigned once again. It is required when
 basket with    default constructor was created.

git-svn-id: http://root.cern.ch/svn/root/trunk@13914 27541ba8-7e3a-0410-8455-c3a389f83636
---
 tree/inc/TBasket.h   |  7 ++++---
 tree/src/TBasket.cxx | 45 +++++++++++++++++++++++++++++++++++++-------
 tree/src/TBranch.cxx |  6 +++---
 3 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/tree/inc/TBasket.h b/tree/inc/TBasket.h
index 1c026e11b1f..023cb29f46a 100644
--- a/tree/inc/TBasket.h
+++ b/tree/inc/TBasket.h
@@ -1,4 +1,4 @@
-// @(#)root/tree:$Name:  $:$Id: TBasket.h,v 1.14 2005/11/11 22:16:04 pcanal Exp $
+// @(#)root/tree:$Name:  $:$Id: TBasket.h,v 1.15 2005/11/16 20:18:36 pcanal Exp $
 // Author: Rene Brun   19/01/96
 
 /*************************************************************************
@@ -50,6 +50,7 @@ protected:
 public:
    
    TBasket();
+   TBasket(TDirectory *motherDir);
    TBasket(const char *name, const char *title, TBranch *branch);
    virtual ~TBasket();
    
@@ -72,8 +73,8 @@ public:
         Int_t      LoadBasketBuffers(Long64_t pos, Int_t len, TFile *file);
         Long64_t   CopyTo(TFile *to);
 
-           void    SetBranch(TBranch *branch) {fBranch = branch;}
-           void    SetNevBufSize(Int_t n) {fNevBufSize=n;}
+           void    SetBranch(TBranch *branch) { fBranch = branch; }
+           void    SetNevBufSize(Int_t n) { fNevBufSize=n; }
    virtual void    SetReadMode();
    virtual void    SetWriteMode();
    inline  void    Update(Int_t newlast) { Update(newlast,newlast); }; 
diff --git a/tree/src/TBasket.cxx b/tree/src/TBasket.cxx
index 02c667ee5d2..4f7c63c5cd5 100644
--- a/tree/src/TBasket.cxx
+++ b/tree/src/TBasket.cxx
@@ -1,4 +1,4 @@
-// @(#)root/tree:$Name:  $:$Id: TBasket.cxx,v 1.36 2006/01/23 19:38:34 pcanal Exp $
+// @(#)root/tree:$Name:  $:$Id: TBasket.cxx,v 1.37 2006/01/23 19:41:03 pcanal Exp $
 // Author: Rene Brun   19/01/96
 /*************************************************************************
  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
@@ -32,7 +32,7 @@ ClassImp(TBasket)
 //
 
 //_______________________________________________________________________
-TBasket::TBasket()
+TBasket::TBasket() 
 {
    // Default contructor.
 
@@ -49,7 +49,23 @@ TBasket::TBasket()
 }
 
 //_______________________________________________________________________
-TBasket::TBasket(const char *name, const char *title, TBranch *branch)
+TBasket::TBasket(TDirectory *motherDir) : TKey(motherDir)
+{
+   fDisplacement  = 0;
+   fEntryOffset   = 0;
+   fBufferRef     = 0;
+   fBuffer        = 0;
+   fHeaderOnly    = kFALSE;
+   fBufferSize    = 0;
+   fNevBufSize    = 0;
+   fNevBuf        = 0;
+   fLast          = 0;
+   fBranch        = 0;
+}
+
+//_______________________________________________________________________
+TBasket::TBasket(const char *name, const char *title, TBranch *branch) : 
+  TKey(branch->GetDirectory())
 {
    // Basket normal constructor.
 
@@ -70,6 +86,7 @@ TBasket::TBasket(const char *name, const char *title, TBranch *branch)
    }
    fHeaderOnly  = kTRUE;
    fLast        = 0; // RDK: Must initialize before calling Streamer()
+   
    Streamer(*fBufferRef);
    fKeylen      = fBufferRef->Length();
    fObjlen      = fBufferSize - fKeylen;
@@ -110,16 +127,18 @@ Long64_t TBasket::CopyTo(TFile *to)
 {
    // Copy the basket of this branch onto the file to.
 
-   TDirectory::TContext c(gDirectory,to);
+//   Global variables no longer required by key store   
+//   TDirectory::TContext c(gDirectory,to);
+
    fBufferRef->SetWriteMode();
    Int_t nout = fNbytes - fKeylen;
    fBuffer = fBufferRef->Buffer();
-   Create(nout);
+   Create(nout, to);
    fBufferRef->SetBufferOffset(0);
    fHeaderOnly = kTRUE;
    Streamer(*fBufferRef);
    fHeaderOnly = kFALSE;
-   Int_t nBytes = WriteFile(0);
+   Int_t nBytes = WriteFile(0, to);
 
    return nBytes>0 ? nBytes : -1;
 }
@@ -246,10 +265,13 @@ Int_t TBasket::ReadBasketBuffers(Long64_t pos, Int_t len, TFile *file)
 
    fBufferRef = new TBuffer(TBuffer::kRead, len);
    fBufferRef->SetParent(file);
+   
    char *buffer = fBufferRef->Buffer();
    file->Seek(pos);
    file->ReadBuffer(buffer,len);
+
    Streamer(*fBufferRef);
+
    Bool_t oldCase = fObjlen==fNbytes-fKeylen 
         && GetBranch()->GetCompressionLevel()!=0
         && file->GetVersion()<=30401;
@@ -328,6 +350,7 @@ AfterBuffer:
       // array.
       fBufferRef->ReadArray(fDisplacement);
    }
+
    return badread;
 }
 
@@ -521,12 +544,15 @@ Int_t TBasket::WriteBuffer()
       cursav->cd(); 
       return -1;
    }
-
+   
+   fMotherDir = fBranch->GetDirectory();
+   
    if (fBufferRef->TestBit(TBuffer::kNotDecompressed)) {
       // Read the basket information that was saved inside the buffer.
       Bool_t writing = fBufferRef->IsWriting();
       fBufferRef->SetReadMode();
       fBufferRef->SetBufferOffset(0);
+
       Streamer(*fBufferRef);
       if (writing) fBufferRef->SetWriteMode();
       Int_t nout = fNbytes - fKeylen;
@@ -536,6 +562,7 @@ Int_t TBasket::WriteBuffer()
       Create(nout);
       fBufferRef->SetBufferOffset(0);
       fHeaderOnly = kTRUE;
+
       Streamer(*fBufferRef);         //write key itself again
       int nBytes = WriteFile(0);
       fHeaderOnly = kFALSE;
@@ -580,6 +607,7 @@ Int_t TBasket::WriteBuffer()
             fBuffer = fBufferRef->Buffer();
             Create(fObjlen);
             fBufferRef->SetBufferOffset(0);
+
             Streamer(*fBufferRef);         //write key itself again
             //Warning("WriteBuffer","Found pathological case where buffer cannot be compressed. Result is OK. fNbytes=%d, fObjLen=%d, fKeylen=%d",fNbytes,fObjlen,fKeylen);
             goto WriteFile;
@@ -592,6 +620,7 @@ Int_t TBasket::WriteBuffer()
       nout = noutot;
       Create(noutot);
       fBufferRef->SetBufferOffset(0);
+
       Streamer(*fBufferRef);         //write key itself again
       memcpy(fBuffer,fBufferRef->Buffer(),fKeylen);
       delete fBufferRef; fBufferRef = 0;
@@ -599,6 +628,7 @@ Int_t TBasket::WriteBuffer()
       fBuffer = fBufferRef->Buffer();
       Create(fObjlen);
       fBufferRef->SetBufferOffset(0);
+
       Streamer(*fBufferRef);         //write key itself again
       nout = fObjlen;
    }
@@ -609,3 +639,4 @@ WriteFile:
    cursav->cd();
    return nBytes>0 ? fKeylen+nout : -1;
 }
+
diff --git a/tree/src/TBranch.cxx b/tree/src/TBranch.cxx
index 2598cb6822b..9006307995d 100644
--- a/tree/src/TBranch.cxx
+++ b/tree/src/TBranch.cxx
@@ -1,4 +1,4 @@
-// @(#)root/tree:$Name:  $:$Id: TBranch.cxx,v 1.95 2005/11/11 22:16:04 pcanal Exp $
+// @(#)root/tree:$Name:  $:$Id: TBranch.cxx,v 1.96 2005/11/16 20:20:01 pcanal Exp $
 // Author: Rene Brun   12/01/96
 
 /*************************************************************************
@@ -732,7 +732,7 @@ TBasket *TBranch::GetBasket(Int_t basketnumber)
      // create/decode basket parameters from buffer
    TDirectory *cursav = gDirectory;
    TFile *file = GetFile(0);
-   basket = new TBasket();
+   basket = new TBasket(file);
    if (fSkipZip) basket->SetBit(TBuffer::kNotDecompressed);
    basket->SetBranch(this);
    if (fBasketBytes[basketnumber] == 0) {
@@ -1101,7 +1101,7 @@ Int_t TBranch::LoadBaskets()
    for (Int_t i=0;i<nbaskets;i++) {
       basket = (TBasket*)fBaskets.UncheckedAt(i);
       if (basket) continue;
-      basket = new TBasket();
+      basket = new TBasket(file);
       basket->SetBranch(this);
       if (fBasketBytes[i] == 0) {
          fBasketBytes[i] = basket->ReadBasketBytes(fBasketSeek[i],file);
-- 
GitLab