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
22class CInFileStream:
23  public IInStream,
24  public IStreamGetSize,
25  #ifdef USE_WIN_FILE
26  public IStreamGetProps,
27  public IStreamGetProps2,
28  #endif
29  public CMyUnknownImp
30{
31public:
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
84class CStdInFileStream:
85  public ISequentialInStream,
86  public CMyUnknownImp
87{
88public:
89  MY_UNKNOWN_IMP
90
91  virtual ~CStdInFileStream() {}
92  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
93};
94
95class COutFileStream:
96  public IOutStream,
97  public CMyUnknownImp
98{
99public:
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
137class CStdOutFileStream:
138  public ISequentialOutStream,
139  public CMyUnknownImp
140{
141public:
142  MY_UNKNOWN_IMP
143
144  virtual ~CStdOutFileStream() {}
145  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
146};
147
148#endif
149