Annotation of elwix/tools/oldlzma/SRC/Windows/FileIO.cpp, revision 1.1

1.1     ! misho       1: // Windows/FileIO.cpp
        !             2: 
        !             3: #include "StdAfx.h"
        !             4: 
        !             5: #include "FileIO.h"
        !             6: #include "Defs.h"
        !             7: #ifndef _UNICODE
        !             8: #include "../Common/StringConvert.h"
        !             9: #endif
        !            10: 
        !            11: namespace NWindows {
        !            12: namespace NFile {
        !            13: namespace NIO {
        !            14: 
        !            15: CFileBase::~CFileBase()
        !            16: {
        !            17:   Close();
        !            18: }
        !            19: 
        !            20: bool CFileBase::Create(LPCTSTR fileName, DWORD desiredAccess,
        !            21:     DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes)
        !            22: {
        !            23:   Close();
        !            24:   _handle = ::CreateFile(fileName, desiredAccess, shareMode, 
        !            25:       (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, 
        !            26:       flagsAndAttributes, (HANDLE) NULL);
        !            27:   _fileIsOpen = _handle != INVALID_HANDLE_VALUE;
        !            28:   return _fileIsOpen;
        !            29: }
        !            30: 
        !            31: #ifndef _UNICODE
        !            32: bool CFileBase::Create(LPCWSTR fileName, DWORD desiredAccess,
        !            33:     DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes)
        !            34: {
        !            35:   Close();
        !            36:   // MessageBoxW(0, fileName, 0, 0);
        !            37:   // ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        !            38:   _handle = ::CreateFileW(fileName, desiredAccess, shareMode, 
        !            39:       (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, 
        !            40:       flagsAndAttributes, (HANDLE) NULL);
        !            41:   if ((_handle == INVALID_HANDLE_VALUE ||  _handle == 0) &&
        !            42:       ::GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
        !            43:     return Create(UnicodeStringToMultiByte(fileName, ::AreFileApisANSI() ? CP_ACP : CP_OEMCP), 
        !            44:       desiredAccess, shareMode, creationDisposition, flagsAndAttributes);
        !            45:   return (_fileIsOpen = _handle != INVALID_HANDLE_VALUE);
        !            46: }
        !            47: #endif
        !            48: 
        !            49: bool CFileBase::Close()
        !            50: {
        !            51:   if(!_fileIsOpen)
        !            52:     return true;
        !            53:   bool result = BOOLToBool(::CloseHandle(_handle));
        !            54:   _fileIsOpen = !result;
        !            55:   return result;
        !            56: }
        !            57: 
        !            58: bool CFileBase::GetPosition(UINT64 &position) const
        !            59: {
        !            60:   return Seek(0, FILE_CURRENT, position);
        !            61: }
        !            62: 
        !            63: bool CFileBase::GetLength(UINT64 &length) const
        !            64: {
        !            65:   DWORD sizeHigh;
        !            66:   DWORD sizeLow = ::GetFileSize(_handle, &sizeHigh);
        !            67:   if(sizeLow == 0xFFFFFFFF)
        !            68:     if(::GetLastError() != NO_ERROR )
        !            69:       return false;
        !            70:   length = (((UINT64)sizeHigh) << 32) + sizeLow;
        !            71:   return true;
        !            72: }
        !            73: 
        !            74: bool CFileBase::Seek(INT64 distanceToMove, DWORD moveMethod, UINT64 &newPosition) const
        !            75: {
        !            76:   LARGE_INTEGER *pointer = (LARGE_INTEGER *)&distanceToMove;
        !            77:   pointer->LowPart = ::SetFilePointer(_handle, pointer->LowPart, 
        !            78:       &pointer->HighPart, moveMethod);
        !            79:   if (pointer->LowPart == 0xFFFFFFFF)
        !            80:     if(::GetLastError() != NO_ERROR) 
        !            81:       return false;
        !            82:   newPosition = *((UINT64 *)pointer);
        !            83:   return true;
        !            84: }
        !            85: 
        !            86: bool CFileBase::Seek(UINT64 position, UINT64 &newPosition)
        !            87: {
        !            88:   return Seek(position, FILE_BEGIN, newPosition);
        !            89: }
        !            90: 
        !            91: bool CFileBase::SeekToBegin()
        !            92: {
        !            93:   UINT64 newPosition;
        !            94:   return Seek(0, newPosition);
        !            95: }
        !            96: 
        !            97: bool CFileBase::SeekToEnd(UINT64 &newPosition)
        !            98: {
        !            99:   return Seek(0, FILE_END, newPosition);
        !           100: }
        !           101: 
        !           102: bool CFileBase::GetFileInformation(CByHandleFileInfo &fileInfo) const
        !           103: {
        !           104:   BY_HANDLE_FILE_INFORMATION winFileInfo;
        !           105:   if(!::GetFileInformationByHandle(_handle, &winFileInfo))
        !           106:     return false;
        !           107:   fileInfo.Attributes = winFileInfo.dwFileAttributes;
        !           108:   fileInfo.CreationTime = winFileInfo.ftCreationTime;
        !           109:   fileInfo.LastAccessTime = winFileInfo.ftLastAccessTime;
        !           110:   fileInfo.LastWriteTime = winFileInfo.ftLastWriteTime;
        !           111:   fileInfo.VolumeSerialNumber = winFileInfo.dwFileAttributes; 
        !           112:   fileInfo.Size = (((UINT64)winFileInfo.nFileSizeHigh) << 32) + 
        !           113:       winFileInfo.nFileSizeLow;
        !           114:   fileInfo.NumberOfLinks = winFileInfo.nNumberOfLinks;
        !           115:   fileInfo.FileIndex = (((UINT64)winFileInfo.nFileIndexHigh) << 32) + 
        !           116:       winFileInfo.nFileIndexLow;
        !           117:   return true;
        !           118: }
        !           119: 
        !           120: /////////////////////////
        !           121: // CInFile
        !           122: 
        !           123: bool CInFile::Open(LPCTSTR fileName, DWORD shareMode, 
        !           124:     DWORD creationDisposition,  DWORD flagsAndAttributes)
        !           125: {
        !           126:   return Create(fileName, GENERIC_READ, shareMode, 
        !           127:       creationDisposition, flagsAndAttributes);
        !           128: }
        !           129: 
        !           130: bool CInFile::Open(LPCTSTR fileName)
        !           131: {
        !           132:   return Open(fileName, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
        !           133: }
        !           134: 
        !           135: #ifndef _UNICODE
        !           136: bool CInFile::Open(LPCWSTR fileName, DWORD shareMode, 
        !           137:     DWORD creationDisposition,  DWORD flagsAndAttributes)
        !           138: {
        !           139:   return Create(fileName, GENERIC_READ, shareMode, 
        !           140:       creationDisposition, flagsAndAttributes);
        !           141: }
        !           142: 
        !           143: bool CInFile::Open(LPCWSTR fileName)
        !           144: {
        !           145:   return Open(fileName, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
        !           146: }
        !           147: #endif
        !           148: 
        !           149: bool CInFile::Read(void *data, UINT32 size, UINT32 &processedSize)
        !           150: {
        !           151:   return BOOLToBool(::ReadFile(_handle, data, size, 
        !           152:       (DWORD *)&processedSize, NULL));
        !           153: }
        !           154: 
        !           155: /////////////////////////
        !           156: // COutFile
        !           157: 
        !           158: bool COutFile::Open(LPCTSTR fileName, DWORD shareMode, 
        !           159:     DWORD creationDisposition, DWORD flagsAndAttributes)
        !           160: {
        !           161:   return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, 
        !           162:       creationDisposition, flagsAndAttributes);
        !           163: }
        !           164: 
        !           165: static inline DWORD GetCreationDisposition(bool createAlways)
        !           166:   {  return createAlways? CREATE_ALWAYS: CREATE_NEW; }
        !           167: 
        !           168: bool COutFile::Open(LPCTSTR fileName, DWORD creationDisposition)
        !           169: {
        !           170:   return Open(fileName, FILE_SHARE_READ, 
        !           171:       creationDisposition, FILE_ATTRIBUTE_NORMAL);
        !           172: }
        !           173: 
        !           174: bool COutFile::Create(LPCTSTR fileName, bool createAlways)
        !           175: {
        !           176:   return Open(fileName, GetCreationDisposition(createAlways));
        !           177: }
        !           178: 
        !           179: #ifndef _UNICODE
        !           180: 
        !           181: bool COutFile::Open(LPCWSTR fileName, DWORD shareMode, 
        !           182:     DWORD creationDisposition, DWORD flagsAndAttributes)
        !           183: {
        !           184:   return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, 
        !           185:       creationDisposition, flagsAndAttributes);
        !           186: }
        !           187: 
        !           188: bool COutFile::Open(LPCWSTR fileName, DWORD creationDisposition)
        !           189: {
        !           190:   return Open(fileName, FILE_SHARE_READ, 
        !           191:       creationDisposition, FILE_ATTRIBUTE_NORMAL);
        !           192: }
        !           193: 
        !           194: bool COutFile::Create(LPCWSTR fileName, bool createAlways)
        !           195: {
        !           196:   return Open(fileName, GetCreationDisposition(createAlways));
        !           197: }
        !           198: 
        !           199: #endif
        !           200: 
        !           201: bool COutFile::SetTime(const FILETIME *creationTime,
        !           202:   const FILETIME *lastAccessTime, const FILETIME *lastWriteTime)
        !           203: {
        !           204:   return BOOLToBool(::SetFileTime(_handle, creationTime,
        !           205:       lastAccessTime, lastWriteTime));
        !           206: }
        !           207: 
        !           208: bool COutFile::SetLastWriteTime(const FILETIME *lastWriteTime)
        !           209: {
        !           210:   return SetTime(NULL, NULL, lastWriteTime);
        !           211: }
        !           212: 
        !           213: bool COutFile::Write(const void *data, UINT32 size, UINT32 &processedSize)
        !           214: {
        !           215:   return BOOLToBool(::WriteFile(_handle, data, size, 
        !           216:       (DWORD *)&processedSize, NULL));
        !           217: }
        !           218: 
        !           219: bool COutFile::SetEndOfFile()
        !           220: {
        !           221:   return BOOLToBool(::SetEndOfFile(_handle));
        !           222: }
        !           223: 
        !           224: bool COutFile::SetLength(UINT64 length)
        !           225: {
        !           226:   UINT64 newPosition;
        !           227:   if(!Seek(length, newPosition))
        !           228:     return false;
        !           229:   if(newPosition != length)
        !           230:     return false;
        !           231:   return SetEndOfFile();
        !           232: }
        !           233: 
        !           234: }}}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>