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
23 typedef UINT_PTR My_UINT_PTR;
24 #else
25 typedef UINT My_UINT_PTR;
26 #endif
27 
28 struct 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 
34 class CInFileStream:
35   public IInStream,
36   public IStreamGetSize,
37   #ifdef USE_WIN_FILE
38   public IStreamGetProps,
39   public IStreamGetProps2,
40   #endif
41   public CMyUnknownImp
42 {
43 public:
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 
Open(CFSTR fileName)68   bool Open(CFSTR fileName)
69   {
70     return File.Open(fileName);
71   }
72 
OpenShared(CFSTR fileName,bool shareForWrite)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 
97 class CStdInFileStream:
98   public ISequentialInStream,
99   public CMyUnknownImp
100 {
101 public:
102   MY_UNKNOWN_IMP
103 
~CStdInFileStream()104   virtual ~CStdInFileStream() {}
105   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
106 };
107 
108 class COutFileStream:
109   public IOutStream,
110   public CMyUnknownImp
111 {
112 public:
113   #ifdef USE_WIN_FILE
114   NWindows::NFile::NIO::COutFile File;
115   #else
116   NC::NFile::NIO::COutFile File;
117   #endif
~COutFileStream()118   virtual ~COutFileStream() {}
Create(CFSTR fileName,bool createAlways)119   bool Create(CFSTR fileName, bool createAlways)
120   {
121     ProcessedSize = 0;
122     return File.Create(fileName, createAlways);
123   }
Open(CFSTR fileName,DWORD creationDisposition)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
SetTime(const FILETIME * cTime,const FILETIME * aTime,const FILETIME * mTime)135   bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)
136   {
137     return File.SetTime(cTime, aTime, mTime);
138   }
SetMTime(const FILETIME * mTime)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 
152 class CStdOutFileStream:
153   public ISequentialOutStream,
154   public CMyUnknownImp
155 {
156   UInt64 _size;
157 public:
158   MY_UNKNOWN_IMP
159 
GetSize()160   UInt64 GetSize() const { return _size; }
CStdOutFileStream()161   CStdOutFileStream(): _size(0) {}
~CStdOutFileStream()162   virtual ~CStdOutFileStream() {}
163   STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
164 };
165 
166 #endif
167