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