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>