    // @(#)root/base:$Name:  $:$Id: TSystemFile.cxx,v 1.7 2005/05/30 10:21:14 rdm Exp $
    // Author: Rene Brun   26/06/96

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

    //////////////////////////////////////////////////////////////////////////
    //                                                                      //
    // TSystemFile                                                          //
    //                                                                      //
    // A TSystemFile describes an operating system file.                    //
    // The information is used by the browser (see TBrowser).               //
    //                                                                      //
    //////////////////////////////////////////////////////////////////////////

    #include "TSystemFile.h"
    #include "TBrowser.h"
    #include "TSystem.h"
    #include "TEnv.h"

    ClassImp(TSystemFile)

    //______________________________________________________________________________
     TSystemFile::TSystemFile() : TNamed()
    {
       // TSystemFile default constructor

    }

    //______________________________________________________________________________
     TSystemFile::TSystemFile(const char *filename, const char *dirname)
       : TNamed(filename, dirname)
    {
       // TSystemFile normal constructor

       SetBit(kCanDelete);
    }

    //______________________________________________________________________________
     TSystemFile::~TSystemFile()
    {
       // Delete TSystemFile object.
    }

    //______________________________________________________________________________
     Bool_t TSystemFile::IsDirectory(const char *dir) const
    {
       // Check if object is a directory.

       Long64_t size;
       Long_t id, flags, modtime;

       flags = id = size = modtime = 0;
       gSystem->GetPathInfo(!dir ? fName.Data() : dir, &id, &size, &flags, &modtime);
       Int_t isdir = (Int_t)flags & 2;

       return isdir ? kTRUE : kFALSE;
    }

    //______________________________________________________________________________
     void TSystemFile::Browse(TBrowser *b)
    {
       // Execute default action for this system file (action is specified
       // in the $HOME/.root.mimes or $ROOTSYS/etc/root.mimes file.

       if (b)
          b->ExecuteDefaultAction(this);
    }

    //______________________________________________________________________________
     void TSystemFile::Edit()
    {
       // Invoke text editor on this file

    #ifndef _WIN32
       const char *ed = gEnv->GetValue("Editor", "vi");
       Char_t *cmd = new Char_t[strlen(ed)+strlen(GetName()) + 50];
       if (!strcmp(ed, "vi"))
          sprintf(cmd, "xterm -e vi %s &", GetName());
       else
          sprintf(cmd, "%s %s &", ed, GetName());
    #else
       const char *ed = gEnv->GetValue("Editor", "notepad");
       Char_t *cmd = new Char_t[strlen(ed)+strlen(GetName()) + 50];
       sprintf(cmd, "start %s %s", ed, GetName());
    #endif
       gSystem->Exec(cmd);

       delete [] cmd;
    }

    //______________________________________________________________________________
     void TSystemFile::Copy(const char *to)
    {
       // copy this file

       TString name = to;

       if (IsDirectory(to)) {
          if (name.EndsWith("/")) name.Chop();
          name = gSystem->ConcatFileName(name, fName);
       }

       Int_t status = gSystem->CopyFile(fName, name, kFALSE);

       if (status == -2) {
          Warning("Copy", "File %s already exists", name.Data());
       } else if (status == -1) {
          Warning("Copy", "Failed to move file %s", name.Data());
       }
    }

    //______________________________________________________________________________
     void TSystemFile::Move(const char *to)
    {
       // move this file

       if (!to) {
          Warning("Move", "No file/dir name specified");
          return;
       }

       TString name = to;

       if (IsDirectory(to)) {
          if (name.EndsWith("/")) name.Chop();
          name = gSystem->ConcatFileName(name, fName);
       }
       Int_t status = gSystem->CopyFile(fName, name, kFALSE);

       if (!status) {
          gSystem->Unlink(fName);
       } else if (status == -2) {
          Warning("Move", "File %s already exists", name.Data());
       } else if (status == -1) {
          Warning("Move", "Failed to move file %s", name.Data());
       }
    }

    //______________________________________________________________________________
     void TSystemFile::Delete()
    {
       // delete this file

       gSystem->Unlink(fName);
    }

    //______________________________________________________________________________
     void TSystemFile::Rename(const char *name)
    {
       // rename this file

       gSystem->Rename(fName, name);
    }

    //______________________________________________________________________________
     void TSystemFile::Inspect() const
    {
       //
    }

    //______________________________________________________________________________
     void TSystemFile::Dump() const
    {
       //
    }