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#ifdef _WIN32 23typedef UINT_PTR My_UINT_PTR; 24#else 25typedef UINT My_UINT_PTR; 26#endif 27 28struct IInFileStream_Callback 29{ 30 virtual HRESULT InFileStream_On_Error(My_UINT_PTR val, DWORD error) = 0; 31 virtual void InFileStream_On_Destroy(My_UINT_PTR val) = 0; 32}; 33 34class CInFileStream: 35 public IInStream, 36 public IStreamGetSize, 37 #ifdef USE_WIN_FILE 38 public IStreamGetProps, 39 public IStreamGetProps2, 40 #endif 41 public CMyUnknownImp 42{ 43public: 44 #ifdef USE_WIN_FILE 45 NWindows::NFile::NIO::CInFile File; 46 47 #ifdef SUPPORT_DEVICE_FILE 48 UInt64 VirtPos; 49 UInt64 PhyPos; 50 UInt64 BufStartPos; 51 Byte *Buf; 52 UInt32 BufSize; 53 #endif 54 55 #else 56 NC::NFile::NIO::CInFile File; 57 #endif 58 59 bool SupportHardLinks; 60 61 IInFileStream_Callback *Callback; 62 My_UINT_PTR CallbackRef; 63 64 virtual ~CInFileStream(); 65 66 CInFileStream(); 67 68 bool Open(CFSTR fileName) 69 { 70 return File.Open(fileName); 71 } 72 73 bool OpenShared(CFSTR fileName, bool shareForWrite) 74 { 75 return File.OpenShared(fileName, shareForWrite); 76 } 77 78 MY_QUERYINTERFACE_BEGIN2(IInStream) 79 MY_QUERYINTERFACE_ENTRY(IStreamGetSize) 80 #ifdef USE_WIN_FILE 81 MY_QUERYINTERFACE_ENTRY(IStreamGetProps) 82 MY_QUERYINTERFACE_ENTRY(IStreamGetProps2) 83 #endif 84 MY_QUERYINTERFACE_END 85 MY_ADDREF_RELEASE 86 87 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); 88 STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); 89 90 STDMETHOD(GetSize)(UInt64 *size); 91 #ifdef USE_WIN_FILE 92 STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib); 93 STDMETHOD(GetProps2)(CStreamFileProps *props); 94 #endif 95}; 96 97class CStdInFileStream: 98 public ISequentialInStream, 99 public CMyUnknownImp 100{ 101public: 102 MY_UNKNOWN_IMP 103 104 virtual ~CStdInFileStream() {} 105 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); 106}; 107 108class COutFileStream: 109 public IOutStream, 110 public CMyUnknownImp 111{ 112public: 113 #ifdef USE_WIN_FILE 114 NWindows::NFile::NIO::COutFile File; 115 #else 116 NC::NFile::NIO::COutFile File; 117 #endif 118 virtual ~COutFileStream() {} 119 bool Create(CFSTR fileName, bool createAlways) 120 { 121 ProcessedSize = 0; 122 return File.Create(fileName, createAlways); 123 } 124 bool Open(CFSTR fileName, DWORD creationDisposition) 125 { 126 ProcessedSize = 0; 127 return File.Open(fileName, creationDisposition); 128 } 129 130 HRESULT Close(); 131 132 UInt64 ProcessedSize; 133 134 #ifdef USE_WIN_FILE 135 bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) 136 { 137 return File.SetTime(cTime, aTime, mTime); 138 } 139 bool SetMTime(const FILETIME *mTime) { return File.SetMTime(mTime); } 140 #endif 141 142 143 MY_UNKNOWN_IMP1(IOutStream) 144 145 STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); 146 STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); 147 STDMETHOD(SetSize)(UInt64 newSize); 148 149 HRESULT GetSize(UInt64 *size); 150}; 151 152class CStdOutFileStream: 153 public ISequentialOutStream, 154 public CMyUnknownImp 155{ 156 UInt64 _size; 157public: 158 MY_UNKNOWN_IMP 159 160 UInt64 GetSize() const { return _size; } 161 CStdOutFileStream(): _size(0) {} 162 virtual ~CStdOutFileStream() {} 163 STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); 164}; 165 166#endif 167