11 #include "FileStreams.h"
13 static inline HRESULT ConvertBoolToHRESULT(bool result)
18 DWORD lastError = ::GetLastError();
23 return result ? S_OK: E_FAIL;
27 bool CInFileStream::Open(LPCTSTR fileName)
29 return File.Open(fileName);
34 bool CInFileStream::Open(LPCWSTR fileName)
36 return File.Open(fileName);
41 bool CInFileStream::OpenShared(LPCTSTR fileName, bool shareForWrite)
43 return File.OpenShared(fileName, shareForWrite);
48 bool CInFileStream::OpenShared(LPCWSTR fileName, bool shareForWrite)
50 return File.OpenShared(fileName, shareForWrite);
55 STDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)
59 UInt32 realProcessedSize;
60 bool result = File.ReadPart(data, size, realProcessedSize);
61 if(processedSize != NULL)
62 *processedSize = realProcessedSize;
63 return ConvertBoolToHRESULT(result);
67 if(processedSize != NULL)
69 ssize_t res = File.Read(data, (size_t)size);
72 if(processedSize != NULL)
73 *processedSize = (UInt32)res;
80 STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)
83 UInt32 realProcessedSize;
84 BOOL res = ::ReadFile(GetStdHandle(STD_INPUT_HANDLE),
85 data, size, (DWORD *)&realProcessedSize, NULL);
86 if(processedSize != NULL)
87 *processedSize = realProcessedSize;
88 if (res == FALSE && GetLastError() == ERROR_BROKEN_PIPE)
90 return ConvertBoolToHRESULT(res != FALSE);
94 if(processedSize != NULL)
99 res = read(0, data, (size_t)size);
101 while (res < 0 && (errno == EINTR));
104 if(processedSize != NULL)
105 *processedSize = (UInt32)res;
113 STDMETHODIMP CInFileStream::Seek(Int64 offset, UInt32 seekOrigin,
117 return STG_E_INVALIDFUNCTION;
121 UInt64 realNewPosition;
122 bool result = File.Seek(offset, seekOrigin, realNewPosition);
123 if(newPosition != NULL)
124 *newPosition = realNewPosition;
125 return ConvertBoolToHRESULT(result);
129 off_t res = File.Seek(offset, seekOrigin);
132 if(newPosition != NULL)
133 *newPosition = (UInt64)res;
139 STDMETHODIMP CInFileStream::GetSize(UInt64 *size)
141 return ConvertBoolToHRESULT(File.GetLength(*size));
145 //////////////////////////
148 HRESULT COutFileStream::Close()
150 return ConvertBoolToHRESULT(File.Close());
153 STDMETHODIMP COutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
157 UInt32 realProcessedSize;
158 bool result = File.WritePart(data, size, realProcessedSize);
159 ProcessedSize += realProcessedSize;
160 if(processedSize != NULL)
161 *processedSize = realProcessedSize;
162 return ConvertBoolToHRESULT(result);
166 if(processedSize != NULL)
168 ssize_t res = File.Write(data, (size_t)size);
171 if(processedSize != NULL)
172 *processedSize = (UInt32)res;
173 ProcessedSize += res;
179 STDMETHODIMP COutFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
182 return STG_E_INVALIDFUNCTION;
185 UInt64 realNewPosition;
186 bool result = File.Seek(offset, seekOrigin, realNewPosition);
187 if(newPosition != NULL)
188 *newPosition = realNewPosition;
189 return ConvertBoolToHRESULT(result);
193 off_t res = File.Seek(offset, seekOrigin);
196 if(newPosition != NULL)
197 *newPosition = (UInt64)res;
203 STDMETHODIMP COutFileStream::SetSize(Int64 newSize)
207 if(!File.Seek(0, FILE_CURRENT, currentPos))
209 bool result = File.SetLength(newSize);
211 result = result && File.Seek(currentPos, currentPos2);
212 return result ? S_OK : E_FAIL;
219 STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
221 if(processedSize != NULL)
225 UInt32 realProcessedSize;
229 // Seems that Windows doesn't like big amounts writing to stdout.
230 // So we limit portions by 32KB.
231 UInt32 sizeTemp = (1 << 15);
234 res = ::WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
235 data, sizeTemp, (DWORD *)&realProcessedSize, NULL);
236 size -= realProcessedSize;
237 data = (const void *)((const Byte *)data + realProcessedSize);
238 if(processedSize != NULL)
239 *processedSize += realProcessedSize;
241 return ConvertBoolToHRESULT(res != FALSE);
248 res = write(1, data, (size_t)size);
250 while (res < 0 && (errno == EINTR));
253 if(processedSize != NULL)
254 *processedSize = (UInt32)res;