diff options
author | Petr Mrázek <peterix@gmail.com> | 2013-12-02 00:55:24 +0100 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2013-12-02 00:55:24 +0100 |
commit | 6aa9bd0f77dcb5128167fae62e32aa5252fe85c6 (patch) | |
tree | 632994a61888929af9289927d338bd19a2b3f32c /mmc_updater/depends/win32cpp/file.h | |
parent | 613699b3626aea750093ab7eaaeccaa28c0e87c6 (diff) | |
download | MultiMC-6aa9bd0f77dcb5128167fae62e32aa5252fe85c6.tar MultiMC-6aa9bd0f77dcb5128167fae62e32aa5252fe85c6.tar.gz MultiMC-6aa9bd0f77dcb5128167fae62e32aa5252fe85c6.tar.lz MultiMC-6aa9bd0f77dcb5128167fae62e32aa5252fe85c6.tar.xz MultiMC-6aa9bd0f77dcb5128167fae62e32aa5252fe85c6.zip |
Renew the updater branch
Now with some actual consensus on what the updater will do!
Diffstat (limited to 'mmc_updater/depends/win32cpp/file.h')
-rw-r--r-- | mmc_updater/depends/win32cpp/file.h | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/mmc_updater/depends/win32cpp/file.h b/mmc_updater/depends/win32cpp/file.h new file mode 100644 index 00000000..4316dc94 --- /dev/null +++ b/mmc_updater/depends/win32cpp/file.h @@ -0,0 +1,392 @@ +// Win32++ Version 7.2 +// Released: 5th AUgust 2011 +// +// David Nash +// email: dnash@bigpond.net.au +// url: https://sourceforge.net/projects/win32-framework +// +// +// Copyright (c) 2005-2011 David Nash +// +// Permission is hereby granted, free of charge, to +// any person obtaining a copy of this software and +// associated documentation files (the "Software"), +// to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, +// merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom +// the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice +// shall be included in all copies or substantial portions +// of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +// OR OTHER DEALINGS IN THE SOFTWARE. +// +//////////////////////////////////////////////////////// + + +#ifndef _WIN32XX_FILE_H_ +#define _WIN32XX_FILE_H_ + + +#include "wincore.h" + +namespace Win32xx +{ + + class CFile + { + public: + CFile(); + CFile(HANDLE hFile); + CFile(LPCTSTR pszFileName, UINT nOpenFlags); + ~CFile(); + operator HANDLE() const; + + BOOL Close(); + BOOL Flush(); + HANDLE GetHandle() const; + ULONGLONG GetLength() const; + const CString& GetFileName() const; + const CString& GetFilePath() const; + const CString& GetFileTitle() const; + ULONGLONG GetPosition() const; + BOOL LockRange(ULONGLONG Pos, ULONGLONG Count); + BOOL Open(LPCTSTR pszFileName, UINT nOpenFlags); + CString OpenFileDialog(LPCTSTR pszFilePathName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR pszFilter = NULL, + CWnd* pOwnerWnd = NULL); + UINT Read(void* pBuf, UINT nCount); + static BOOL Remove(LPCTSTR pszFileName); + static BOOL Rename(LPCTSTR pszOldName, LPCTSTR pszNewName); + CString SaveFileDialog(LPCTSTR pszFilePathName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR pszFilter = NULL, + LPCTSTR pszDefExt = NULL, CWnd* pOwnerWnd = NULL); + ULONGLONG Seek(LONGLONG lOff, UINT nFrom); + void SeekToBegin(); + ULONGLONG SeekToEnd(); + void SetFilePath(LPCTSTR pszNewName); + BOOL SetLength(ULONGLONG NewLen); + BOOL UnlockRange(ULONGLONG Pos, ULONGLONG Count); + BOOL Write(const void* pBuf, UINT nCount); + + private: + CFile(const CFile&); // Disable copy construction + CFile& operator = (const CFile&); // Disable assignment operator + CString m_FileName; + CString m_FilePath; + CString m_FileTitle; + HANDLE m_hFile; + }; + +} + + + +namespace Win32xx +{ + inline CFile::CFile() : m_hFile(0) + { + } + + inline CFile::CFile(HANDLE hFile) : m_hFile(hFile) + { + } + + inline CFile::CFile(LPCTSTR pszFileName, UINT nOpenFlags) : m_hFile(0) + { + assert(pszFileName); + Open(pszFileName, nOpenFlags); + assert(m_hFile); + } + + inline CFile::~CFile() + { + Close(); + } + + inline CFile::operator HANDLE() const + { + return m_hFile; + } + + inline BOOL CFile::Close() + // Closes the file associated with this object. Closed file can no longer be read or written to. + { + BOOL bResult = TRUE; + if (m_hFile) + bResult = CloseHandle(m_hFile); + + m_hFile = 0; + return bResult; + } + + inline BOOL CFile::Flush() + // Causes any remaining data in the file buffer to be written to the file. + { + assert(m_hFile); + return FlushFileBuffers(m_hFile); + } + + inline HANDLE CFile::GetHandle() const + { + return m_hFile; + } + + inline ULONGLONG CFile::GetLength( ) const + // Returns the length of the file in bytes. + { + assert(m_hFile); + + LONG High = 0; + DWORD LowPos = SetFilePointer(m_hFile, 0, &High, FILE_END); + + ULONGLONG Result = ((ULONGLONG)High << 32) + LowPos; + return Result; + } + + inline const CString& CFile::GetFileName() const + // Returns the filename of the file associated with this object. + { + return (const CString&)m_FileName; + } + + inline const CString& CFile::GetFilePath() const + // Returns the full filename including the directory of the file associated with this object. + { + return (const CString&)m_FilePath; + } + + inline const CString& CFile::GetFileTitle() const + // Returns the filename of the file associated with this object, excluding the path and the file extension + { + return (const CString&)m_FileTitle; + } + + inline ULONGLONG CFile::GetPosition() const + // Returns the current value of the file pointer, which can be used in subsequent calls to Seek. + { + assert(m_hFile); + LONG High = 0; + DWORD LowPos = SetFilePointer(m_hFile, 0, &High, FILE_CURRENT); + + ULONGLONG Result = ((ULONGLONG)High << 32) + LowPos; + return Result; + } + + inline BOOL CFile::LockRange(ULONGLONG Pos, ULONGLONG Count) + // Locks a range of bytes in and open file. + { + assert(m_hFile); + + DWORD dwPosHigh = (DWORD)(Pos >> 32); + DWORD dwPosLow = (DWORD)(Pos & 0xFFFFFFFF); + DWORD dwCountHigh = (DWORD)(Count >> 32); + DWORD dwCountLow = (DWORD)(Count & 0xFFFFFFFF); + + return ::LockFile(m_hFile, dwPosLow, dwPosHigh, dwCountLow, dwCountHigh); + } + + inline BOOL CFile::Open(LPCTSTR pszFileName, UINT nOpenFlags) + // Prepares a file to be written to or read from. + { + if (m_hFile) Close(); + + m_hFile = ::CreateFile(pszFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, nOpenFlags, FILE_ATTRIBUTE_NORMAL, NULL); + + if (INVALID_HANDLE_VALUE == m_hFile) + { + TRACE(_T("Failed\n")); + m_hFile = 0; + } + + if (m_hFile) + { + SetFilePath(pszFileName); + } + + return (m_hFile != 0); + } + + inline CString CFile::OpenFileDialog(LPCTSTR pszFilePathName, DWORD dwFlags, LPCTSTR pszFilter, CWnd* pOwnerWnd) + // Displays the file open dialog. + // Returns a CString containing either the selected file name or an empty CString. + { + CString str; + if (pszFilePathName) + str = pszFilePathName; + + OPENFILENAME ofn = {0}; + ofn.lStructSize = sizeof(OPENFILENAME); + +#if defined OPENFILENAME_SIZE_VERSION_400 + if (GetWinVersion() < 2500) + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; +#endif + + ofn.hwndOwner = pOwnerWnd? pOwnerWnd->GetHwnd() : NULL; + ofn.hInstance = GetApp()->GetInstanceHandle(); + ofn.lpstrFilter = pszFilter; + ofn.lpstrTitle = _T("Open File"); + ofn.Flags = dwFlags; + ofn.nMaxFile = _MAX_PATH; + + ofn.lpstrFile = (LPTSTR)str.GetBuffer(_MAX_PATH); + ::GetOpenFileName(&ofn); + str.ReleaseBuffer(); + + return str; + } + + inline UINT CFile::Read(void* pBuf, UINT nCount) + // Reads from the file, storing the contents in the specified buffer. + { + assert(m_hFile); + DWORD dwRead = 0; + + if (!::ReadFile(m_hFile, pBuf, nCount, &dwRead, NULL)) + dwRead = 0; + + return dwRead; + } + + inline BOOL CFile::Rename(LPCTSTR pszOldName, LPCTSTR pszNewName) + // Renames the specified file. + { + return ::MoveFile(pszOldName, pszNewName); + } + + inline BOOL CFile::Remove(LPCTSTR pszFileName) + // Deletes the specified file. + { + return ::DeleteFile(pszFileName); + } + + inline CString CFile::SaveFileDialog(LPCTSTR pszFilePathName, DWORD dwFlags, LPCTSTR pszFilter, LPCTSTR pszDefExt, CWnd* pOwnerWnd) + // Displays the SaveFileDialog. + // Returns a CString containing either the selected file name or an empty CString + { + CString str; + if (pszFilePathName) + str = pszFilePathName; + + OPENFILENAME ofn = {0}; + ofn.lStructSize = sizeof(OPENFILENAME); + +#if defined OPENFILENAME_SIZE_VERSION_400 + if (GetWinVersion() < 2500) + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; +#endif + + ofn.hwndOwner = pOwnerWnd? pOwnerWnd->GetHwnd() : NULL; + ofn.hInstance = GetApp()->GetInstanceHandle(); + ofn.lpstrFilter = pszFilter; + ofn.lpstrFile = (LPTSTR)pszFilePathName; + ofn.lpstrFileTitle = (LPTSTR)pszFilePathName; + ofn.lpstrDefExt = pszDefExt; + ofn.nMaxFile = lstrlen(pszFilePathName); + ofn.lpstrTitle = _T("Save File"); + ofn.Flags = dwFlags; + ofn.nMaxFile = _MAX_PATH; + ofn.lpstrFile = (LPTSTR)str.GetBuffer(_MAX_PATH); + ::GetSaveFileName(&ofn); + str.ReleaseBuffer(); + + return str; + } + + inline ULONGLONG CFile::Seek(LONGLONG lOff, UINT nFrom) + // Positions the current file pointer. + // Permitted values for nFrom are: FILE_BEGIN, FILE_CURRENT, or FILE_END. + { + assert(m_hFile); + assert(nFrom == FILE_BEGIN || nFrom == FILE_CURRENT || nFrom == FILE_END); + + LONG High = LONG(lOff >> 32); + LONG Low = (LONG)(lOff & 0xFFFFFFFF); + + DWORD LowPos = SetFilePointer(m_hFile, Low, &High, nFrom); + + ULONGLONG Result = ((ULONGLONG)High << 32) + LowPos; + return Result; + } + + inline void CFile::SeekToBegin() + // Sets the current file pointer to the beginning of the file. + { + assert(m_hFile); + Seek(0, FILE_BEGIN); + } + + inline ULONGLONG CFile::SeekToEnd() + // Sets the current file pointer to the end of the file. + { + assert(m_hFile); + return Seek(0, FILE_END); + } + + inline void CFile::SetFilePath(LPCTSTR pszFileName) + // Specifies the full file name, including its path + { + TCHAR* pFileName = NULL; + int nBuffSize = ::GetFullPathName(pszFileName, 0, 0, 0); + if (nBuffSize > 0) + { + TCHAR* pBuff = m_FilePath.GetBuffer(nBuffSize); + ::GetFullPathName(pszFileName, nBuffSize, pBuff, &pFileName); + m_FilePath.ReleaseBuffer(); + m_FileName = pFileName; + int nPos = m_FileName.ReverseFind(_T(".")); + if (nPos >= 0) + m_FileTitle = m_FileName.Left(nPos); + } + } + + inline BOOL CFile::SetLength(ULONGLONG NewLen) + // Changes the length of the file to the specified value. + { + assert(m_hFile); + + Seek(NewLen, FILE_BEGIN); + return ::SetEndOfFile(m_hFile); + } + + inline BOOL CFile::UnlockRange(ULONGLONG Pos, ULONGLONG Count) + // Unlocks a range of bytes in an open file. + { + assert(m_hFile); + + DWORD dwPosHigh = (DWORD)(Pos >> 32); + DWORD dwPosLow = (DWORD)(Pos & 0xFFFFFFFF); + DWORD dwCountHigh = (DWORD)(Count >> 32); + DWORD dwCountLow = (DWORD)(Count & 0xFFFFFFFF); + + return ::UnlockFile(m_hFile, dwPosLow, dwPosHigh, dwCountLow, dwCountHigh); + } + + inline BOOL CFile::Write(const void* pBuf, UINT nCount) + // Writes the specified buffer to the file. + { + assert(m_hFile); + DWORD dwWritten = 0; + BOOL bResult = ::WriteFile(m_hFile, pBuf, nCount, &dwWritten, NULL); + if (dwWritten != nCount) + bResult = FALSE; + + return bResult; + } + + +} // namespace Win32xx + +#endif |