text: // FileStreams.h
  
  #ifndef __FILE_STREAMS_H
  #define __FILE_STREAMS_H
  
  #if defined(_WIN32) || defined(ENV_UNIX)
  #define USE_WIN_FILE
  #endif
  
  #include "../../Common/MyString.h"
  
  #ifdef USE_WIN_FILE
  #include "../../Windows/FileIO.h"
  #else
  #include "../../Common/C_FileIO.h"
  #endif
  
  #include "../../Common/MyCom.h"
  
  #include "../IStream.h"
  
  class CInFileStream:
    public IInStream,
    public IStreamGetSize,
    #if 0 // #ifdef USE_WIN_FILE
    public IStreamGetProps,
    public IStreamGetProps2,
    #endif
    public CMyUnknownImp
  {
    bool _ignoreSymbolicLink;
  public:
    #ifdef USE_WIN_FILE
    NWindows::NFile::NIO::CInFile File;
  
    #ifdef SUPPORT_DEVICE_FILE
    UInt64 VirtPos;
    UInt64 PhyPos;
    UInt64 BufStartPos;
    Byte *Buf;
    UInt32 BufSize;
    #endif
  
    #else
    NC::NFile::NIO::CInFile File;
    #endif
  
    bool SupportHardLinks;
  
    CInFileStream(bool b=false) { _ignoreSymbolicLink = b; }
    virtual ~CInFileStream();
  
    bool Open(CFSTR fileName)
    {
      return File.Open(fileName,_ignoreSymbolicLink);
    }
  
    bool OpenShared(CFSTR fileName , bool /* shareForWrite */ )
    {
      return File.Open(fileName,_ignoreSymbolicLink);
    }
  
    MY_QUERYINTERFACE_BEGIN2(IInStream)
    MY_QUERYINTERFACE_ENTRY(IStreamGetSize)
    #if 0 // #ifdef USE_WIN_FILE
    MY_QUERYINTERFACE_ENTRY(IStreamGetProps)
    MY_QUERYINTERFACE_ENTRY(IStreamGetProps2)
    #endif
    MY_QUERYINTERFACE_END
    MY_ADDREF_RELEASE
  
    STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
    STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
  
    STDMETHOD(GetSize)(UInt64 *size);
    #if 0 // #ifdef USE_WIN_FILE
    STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib);
    STDMETHOD(GetProps2)(CStreamFileProps *props);
    #endif
  };
  
  class CStdInFileStream:
    public ISequentialInStream,
    public CMyUnknownImp
  {
  public:
    MY_UNKNOWN_IMP
  
    virtual ~CStdInFileStream() {}
    STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
  };
  
  class COutFileStream:
    public IOutStream,
    public CMyUnknownImp
  {
  public:
    #ifdef USE_WIN_FILE
    NWindows::NFile::NIO::COutFile File;
    #else
    NC::NFile::NIO::COutFile File;
    #endif
    virtual ~COutFileStream() {}
    bool Create(CFSTR fileName, bool createAlways)
    {
      ProcessedSize = 0;
      return File.Create(fileName, createAlways);
    }
    bool Open(CFSTR fileName, DWORD creationDisposition)
    {
      ProcessedSize = 0;
      return File.Open(fileName, creationDisposition);
    }
  
    HRESULT Close();
  
    UInt64 ProcessedSize;
  
    #ifdef USE_WIN_FILE
    bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)
    {
      return File.SetTime(cTime, aTime, mTime);
    }
    bool SetMTime(const FILETIME *mTime) {  return File.SetMTime(mTime); }
    #endif
  
  
    MY_UNKNOWN_IMP1(IOutStream)
  
    STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
    STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
    STDMETHOD(SetSize)(UInt64 newSize);
  };
  
  class CStdOutFileStream:
    public ISequentialOutStream,
    public CMyUnknownImp
  {
  public:
    MY_UNKNOWN_IMP
  
    virtual ~CStdOutFileStream() {}
    STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
  };
  
  #endif
  