Annotation of elwix/tools/oldlzma/SRC/7zip/Common/FileStreams.cpp, revision 1.1.1.1
1.1 misho 1: // FileStreams.cpp
2:
3: #include "StdAfx.h"
4:
5: #ifndef _WIN32
6: #include <fcntl.h>
7: #include <unistd.h>
8: #endif
9:
10: #include "FileStreams.h"
11:
12: static inline HRESULT ConvertBoolToHRESULT(bool result)
13: {
14: // return result ? S_OK: E_FAIL;
15: #ifdef _WIN32
16: return result ? S_OK: (::GetLastError());
17: #else
18: return result ? S_OK: E_FAIL;
19: #endif
20: }
21:
22: bool CInFileStream::Open(LPCTSTR fileName)
23: {
24: return File.Open(fileName);
25: }
26:
27: #ifdef _WIN32
28: #ifndef _UNICODE
29: bool CInFileStream::Open(LPCWSTR fileName)
30: {
31: return File.Open(fileName);
32: }
33: #endif
34: #endif
35:
36: STDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)
37: {
38: #ifdef _WIN32
39:
40: UInt32 realProcessedSize;
41: bool result = File.Read(data, size, realProcessedSize);
42: if(processedSize != NULL)
43: *processedSize = realProcessedSize;
44: return ConvertBoolToHRESULT(result);
45:
46: #else
47:
48: if(processedSize != NULL)
49: *processedSize = 0;
50: ssize_t res = File.Read(data, (size_t)size);
51: if (res == -1)
52: return E_FAIL;
53: if(processedSize != NULL)
54: *processedSize = (UInt32)res;
55: return S_OK;
56:
57: #endif
58: }
59:
60: STDMETHODIMP CInFileStream::ReadPart(void *data, UInt32 size, UInt32 *processedSize)
61: {
62: return Read(data, size, processedSize);
63: }
64:
65: #ifndef _WIN32_WCE
66: STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize)
67: {
68: #ifdef _WIN32
69: UInt32 realProcessedSize;
70: BOOL res = ::ReadFile(GetStdHandle(STD_INPUT_HANDLE),
71: data, size, (DWORD *)&realProcessedSize, NULL);
72: if(processedSize != NULL)
73: *processedSize = realProcessedSize;
74: if (res == FALSE && GetLastError() == ERROR_BROKEN_PIPE)
75: return S_OK;
76: return ConvertBoolToHRESULT(res != FALSE);
77:
78: #else
79:
80: if(processedSize != NULL)
81: *processedSize = 0;
82: ssize_t res = read(0, data, (size_t)size);
83: if (res == -1)
84: return E_FAIL;
85: if(processedSize != NULL)
86: *processedSize = (UInt32)res;
87: return S_OK;
88:
89: #endif
90: }
91:
92: STDMETHODIMP CStdInFileStream::ReadPart(void *data, UInt32 size, UInt32 *processedSize)
93: {
94: return Read(data, size, processedSize);
95: }
96: #endif
97:
98: STDMETHODIMP CInFileStream::Seek(Int64 offset, UInt32 seekOrigin,
99: UInt64 *newPosition)
100: {
101: if(seekOrigin >= 3)
102: return STG_E_INVALIDFUNCTION;
103:
104: #ifdef _WIN32
105:
106: UInt64 realNewPosition;
107: bool result = File.Seek(offset, seekOrigin, realNewPosition);
108: if(newPosition != NULL)
109: *newPosition = realNewPosition;
110: return ConvertBoolToHRESULT(result);
111:
112: #else
113:
114: off_t res = File.Seek(offset, seekOrigin);
115: if (res == -1)
116: return E_FAIL;
117: if(newPosition != NULL)
118: *newPosition = (UInt64)res;
119: return S_OK;
120:
121: #endif
122: }
123:
124: STDMETHODIMP CInFileStream::GetSize(UInt64 *size)
125: {
126: return ConvertBoolToHRESULT(File.GetLength(*size));
127: }
128:
129:
130: //////////////////////////
131: // COutFileStream
132:
133: bool COutFileStream::Create(LPCTSTR fileName, bool createAlways)
134: {
135: return File.Create(fileName, createAlways);
136: }
137:
138: #ifdef _WIN32
139: #ifndef _UNICODE
140: bool COutFileStream::Create(LPCWSTR fileName, bool createAlways)
141: {
142: return File.Create(fileName, createAlways);
143: }
144: #endif
145: #endif
146:
147: STDMETHODIMP COutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
148: {
149: #ifdef _WIN32
150:
151: UInt32 realProcessedSize;
152: bool result = File.Write(data, size, realProcessedSize);
153: if(processedSize != NULL)
154: *processedSize = realProcessedSize;
155: return ConvertBoolToHRESULT(result);
156:
157: #else
158:
159: if(processedSize != NULL)
160: *processedSize = 0;
161: ssize_t res = File.Write(data, (size_t)size);
162: if (res == -1)
163: return E_FAIL;
164: if(processedSize != NULL)
165: *processedSize = (UInt32)res;
166: return S_OK;
167:
168: #endif
169: }
170:
171: STDMETHODIMP COutFileStream::WritePart(const void *data, UInt32 size, UInt32 *processedSize)
172: {
173: return Write(data, size, processedSize);
174: }
175:
176:
177: STDMETHODIMP COutFileStream::Seek(Int64 offset, UInt32 seekOrigin,
178: UInt64 *newPosition)
179: {
180: if(seekOrigin >= 3)
181: return STG_E_INVALIDFUNCTION;
182: #ifdef _WIN32
183:
184: UInt64 realNewPosition;
185: bool result = File.Seek(offset, seekOrigin, realNewPosition);
186: if(newPosition != NULL)
187: *newPosition = realNewPosition;
188: return ConvertBoolToHRESULT(result);
189:
190: #else
191:
192: off_t res = File.Seek(offset, seekOrigin);
193: if (res == -1)
194: return E_FAIL;
195: if(newPosition != NULL)
196: *newPosition = (UInt64)res;
197: return S_OK;
198:
199: #endif
200: }
201:
202: STDMETHODIMP COutFileStream::SetSize(Int64 newSize)
203: {
204: #ifdef _WIN32
205: UInt64 currentPos;
206: if(!File.Seek(0, FILE_CURRENT, currentPos))
207: return E_FAIL;
208: bool result = File.SetLength(newSize);
209: UInt64 currentPos2;
210: result = result && File.Seek(currentPos, currentPos2);
211: return result ? S_OK : E_FAIL;
212: #else
213: return E_FAIL;
214: #endif
215: }
216:
217: #ifndef _WIN32_WCE
218: STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
219: {
220: if(processedSize != NULL)
221: *processedSize = 0;
222:
223: #ifdef _WIN32
224: UInt32 realProcessedSize;
225: BOOL res = TRUE;
226: while (size > 0)
227: {
228: // Seems that Windows doesn't like big amounts writing to stdout.
229: // So we limit portions by 32KB.
230: UInt32 sizeTemp = (1 << 15);
231: if (sizeTemp > size)
232: sizeTemp = size;
233: res = ::WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
234: data, sizeTemp, (DWORD *)&realProcessedSize, NULL);
235: if (realProcessedSize == 0)
236: break;
237: size -= realProcessedSize;
238: data = (const void *)((const Byte *)data + realProcessedSize);
239: if(processedSize != NULL)
240: *processedSize += realProcessedSize;
241: }
242: return ConvertBoolToHRESULT(res != FALSE);
243:
244: #else
245:
246: ssize_t res = write(1, data, (size_t)size);
247: if (res == -1)
248: return E_FAIL;
249: if(processedSize != NULL)
250: *processedSize = (UInt32)res;
251: return S_OK;
252:
253: return S_OK;
254: #endif
255: }
256:
257: STDMETHODIMP CStdOutFileStream::WritePart(const void *data, UInt32 size, UInt32 *processedSize)
258: {
259: return Write(data, size, processedSize);
260: }
261: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>