Home | History | Annotate | Download | only in Common
      1 // FileStreams.h
      2 
      3 #ifndef __FILE_STREAMS_H
      4 #define __FILE_STREAMS_H
      5 
      6 #ifdef _WIN32
      7 #define USE_WIN_FILE
      8 #endif
      9 
     10 #include "../../Common/MyString.h"
     11 
     12 #ifdef USE_WIN_FILE
     13 #include "../../Windows/FileIO.h"
     14 #else
     15 #include "../../Common/C_FileIO.h"
     16 #endif
     17 
     18 #include "../../Common/MyCom.h"
     19 
     20 #include "../IStream.h"
     21 
     22 class CInFileStream:
     23   public IInStream,
     24   public IStreamGetSize,
     25   #ifdef USE_WIN_FILE
     26   public IStreamGetProps,
     27   public IStreamGetProps2,
     28   #endif
     29   public CMyUnknownImp
     30 {
     31 public:
     32   #ifdef USE_WIN_FILE
     33   NWindows::NFile::NIO::CInFile File;
     34 
     35   #ifdef SUPPORT_DEVICE_FILE
     36   UInt64 VirtPos;
     37   UInt64 PhyPos;
     38   UInt64 BufStartPos;
     39   Byte *Buf;
     40   UInt32 BufSize;
     41   #endif
     42 
     43   #else
     44   NC::NFile::NIO::CInFile File;
     45   #endif
     46 
     47   bool SupportHardLinks;
     48 
     49   virtual ~CInFileStream();
     50 
     51   #ifdef SUPPORT_DEVICE_FILE
     52   CInFileStream();
     53   #endif
     54 
     55   bool Open(CFSTR fileName)
     56   {
     57     return File.Open(fileName);
     58   }
     59 
     60   bool OpenShared(CFSTR fileName, bool shareForWrite)
     61   {
     62     return File.OpenShared(fileName, shareForWrite);
     63   }
     64 
     65   MY_QUERYINTERFACE_BEGIN2(IInStream)
     66   MY_QUERYINTERFACE_ENTRY(IStreamGetSize)
     67   #ifdef USE_WIN_FILE
     68   MY_QUERYINTERFACE_ENTRY(IStreamGetProps)
     69   MY_QUERYINTERFACE_ENTRY(IStreamGetProps2)
     70   #endif
     71   MY_QUERYINTERFACE_END
     72   MY_ADDREF_RELEASE
     73 
     74   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
     75   STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
     76 
     77   STDMETHOD(GetSize)(UInt64 *size);
     78   #ifdef USE_WIN_FILE
     79   STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib);
     80   STDMETHOD(GetProps2)(CStreamFileProps *props);
     81   #endif
     82 };
     83 
     84 class CStdInFileStream:
     85   public ISequentialInStream,
     86   public CMyUnknownImp
     87 {
     88 public:
     89   MY_UNKNOWN_IMP
     90 
     91   virtual ~CStdInFileStream() {}
     92   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
     93 };
     94 
     95 class COutFileStream:
     96   public IOutStream,
     97   public CMyUnknownImp
     98 {
     99 public:
    100   #ifdef USE_WIN_FILE
    101   NWindows::NFile::NIO::COutFile File;
    102   #else
    103   NC::NFile::NIO::COutFile File;
    104   #endif
    105   virtual ~COutFileStream() {}
    106   bool Create(CFSTR fileName, bool createAlways)
    107   {
    108     ProcessedSize = 0;
    109     return File.Create(fileName, createAlways);
    110   }
    111   bool Open(CFSTR fileName, DWORD creationDisposition)
    112   {
    113     ProcessedSize = 0;
    114     return File.Open(fileName, creationDisposition);
    115   }
    116 
    117   HRESULT Close();
    118 
    119   UInt64 ProcessedSize;
    120 
    121   #ifdef USE_WIN_FILE
    122   bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)
    123   {
    124     return File.SetTime(cTime, aTime, mTime);
    125   }
    126   bool SetMTime(const FILETIME *mTime) {  return File.SetMTime(mTime); }
    127   #endif
    128 
    129 
    130   MY_UNKNOWN_IMP1(IOutStream)
    131 
    132   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
    133   STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
    134   STDMETHOD(SetSize)(UInt64 newSize);
    135 };
    136 
    137 class CStdOutFileStream:
    138   public ISequentialOutStream,
    139   public CMyUnknownImp
    140 {
    141 public:
    142   MY_UNKNOWN_IMP
    143 
    144   virtual ~CStdOutFileStream() {}
    145   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
    146 };
    147 
    148 #endif
    149