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>