|
|
/**************************************************************************
** FILENAME: ** * INTEL CORPORATION PROPRIETARY INFORMATION * Copyright Intel Corporation * * This software is supplied under the terms of a license agreement or * non-disclosure agreement with Intel Corporation and may not be copied * or disclosed in accordance with the terms of that agreement. * * ** PURPOSE: ** ** $Header: ** ** ** $Log: *********************************************************************************/
#include "mbftpch.h"
#include "fileio.hpp"
#define STRSAFE_NO_DEPRECATE 1
#include <strsafe.h>
extern int MyLoadString(UINT, LPTSTR); extern int MyLoadString(UINT, LPTSTR, LPTSTR); extern int MyLoadString(UINT, LPTSTR, LPTSTR, LPTSTR);
CMBFTFile::CMBFTFile() { m_FileHandle = INVALID_HANDLE_VALUE; m_LastIOError = 0; m_szFileName[0] = 0; }
CMBFTFile::~CMBFTFile() { /* close file if still open */ Close (); }
BOOL CMBFTFile::Open(LPCSTR lpszFileName,unsigned iOpenMode) { lstrcpyn(m_szFileName,lpszFileName,sizeof(m_szFileName)); DWORD fdwAccess = ((0!=(iOpenMode&FDW_Read))*GENERIC_READ) | ((0!=(iOpenMode&FDW_Write))*GENERIC_WRITE); DWORD fdwShareMode = ((0==(iOpenMode&FDW_RDeny))*FILE_SHARE_READ) | ((0==(iOpenMode&FDW_WDeny))*FILE_SHARE_WRITE); DWORD fdwCreate = (iOpenMode&FDW_Create)?CREATE_ALWAYS:OPEN_EXISTING; m_LastIOError = 0; m_FileHandle = CreateFile( lpszFileName, fdwAccess, fdwShareMode, NULL, fdwCreate, FILE_ATTRIBUTE_NORMAL, NULL );
if( INVALID_HANDLE_VALUE == m_FileHandle ) { m_LastIOError = GetLastError(); } return(m_LastIOError == 0); }
BOOL CMBFTFile::Close(BOOL status) { m_LastIOError = 0;
/* nothing to do if file already closed */ if( m_FileHandle == INVALID_HANDLE_VALUE ) return ( m_LastIOError == 0 );
/* close the file */ if( !CloseHandle( m_FileHandle ) ) { m_LastIOError = GetLastError(); }
m_FileHandle = INVALID_HANDLE_VALUE;
/* just delete file if status==FALSE */ if( status == FALSE ) { ::DeleteFile(m_szFileName); }
return( m_LastIOError == 0 ); }
BOOL CMBFTFile::Create(LPCSTR lpszDirName, LPCSTR lpszFileName) { DWORD dwTick; BOOL bCreateFile = TRUE;
/* protect against path info embedded in received file name */ lpszFileName = GetFileNameFromPath(lpszFileName);
/* copy original file name */ if(FAILED(StringCchPrintfA(m_szFileName, CCHMAX(m_szFileName), "%s\\%s", lpszDirName, lpszFileName))) { m_LastIOError = ERROR_BUFFER_OVERFLOW; return FALSE; }
/* generate temp file name if file exists */ if (FFileExists(m_szFileName)) { // REVIEW
//Small hack here -- if file already exists, check to see if we have write access.
//If not, we say report an access denied error...
if (FFileExists(m_szFileName)) { TCHAR szNewFileName[_MAX_PATH]; INT_PTR nCount = 1; while (1) { MyLoadString(IDS_COPY_N_OF, szNewFileName, (LPTSTR)nCount, (LPTSTR)lpszFileName); if(FAILED(StringCchPrintfA(m_szFileName, CCHMAX(m_szFileName), "%s\\%s", lpszDirName, szNewFileName))) { m_LastIOError = ERROR_BUFFER_OVERFLOW; return FALSE; } if (!FFileExists(m_szFileName)) { break; } nCount++; } } else { bCreateFile = FALSE; } }
//This flag is reset only if file already exists and is read only...
if(bCreateFile) { /* finally, create the file */ m_LastIOError = 0; m_FileHandle = CreateFile( m_szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( INVALID_HANDLE_VALUE == m_FileHandle ) { m_LastIOError = GetLastError(); } } else { m_szFileName[0] = TEXT('\0'); // Clear file name
} return(bCreateFile && (m_LastIOError == 0)); }
LONG CMBFTFile::Seek( LONG lOffset, int iFromWhere ) { DWORD MoveMethod[] = { FILE_BEGIN, FILE_CURRENT, FILE_END }; LONG Position = (LONG)SetFilePointer( m_FileHandle, lOffset, NULL, MoveMethod[min((unsigned)iFromWhere,2)] ); m_LastIOError = 0;
if( Position == -1L ) { m_LastIOError = GetLastError(); }
return( Position ); }
ULONG CMBFTFile::Read(LPSTR lpszBuffer, ULONG iNumBytes) { ULONG iBytesRead = 0;
if(iNumBytes) { m_LastIOError = 0; if( !ReadFile( m_FileHandle, lpszBuffer, iNumBytes, (LPDWORD)&iBytesRead, NULL ) ) { m_LastIOError = GetLastError(); }
if(m_LastIOError != 0) { iBytesRead = (ULONG)-1; } }
return(iBytesRead); }
BOOL CMBFTFile::Write(LPCSTR lpszBuffer, ULONG iNumBytes) { ULONG iBytesWritten = 0;
if(iNumBytes) { if( !WriteFile( m_FileHandle, lpszBuffer, iNumBytes, (LPDWORD)&iBytesWritten, NULL ) ) { m_LastIOError = GetLastError(); } if(!m_LastIOError) { if(iBytesWritten != iNumBytes) { m_LastIOError = (ULONG)-1; //Kludge for insufficient disk space...
} } }
return(iBytesWritten == iNumBytes); }
LONG CMBFTFile::GetFileSize(void) { return( (LONG)::GetFileSize( m_FileHandle, NULL ) ); }
BOOL CMBFTFile::DeleteFile(void) { BOOL bReturn = FALSE;
/* delete if has name */ if(lstrlen(m_szFileName)) { /* close file before deleting */ CloseHandle( m_FileHandle ); bReturn = ::DeleteFile( m_szFileName ); if( !bReturn ) { m_LastIOError = GetLastError(); } }
return(bReturn); }
time_t CMBFTFile::GetFileDateTime(void) { WORD Date = 0; WORD Time = 0;
BY_HANDLE_FILE_INFORMATION bhfi; if( !GetFileInformationByHandle( m_FileHandle, &bhfi ) ) { return( 0 ); } FileTimeToDosDateTime( &bhfi.ftLastWriteTime, &Date, &Time ); return(MAKELONG(Time,Date)); }
BOOL CMBFTFile::SetFileDateTime(time_t FileDateTime) { BOOL bReturn = FALSE;
FILETIME ft; DosDateTimeToFileTime( HIWORD(FileDateTime), LOWORD(FileDateTime), &ft ); bReturn = SetFileTime( m_FileHandle, NULL, NULL, &ft ); return(bReturn); }
int CMBFTFile::GetLastErrorCode(void) { struct XLAT { unsigned Win32ErrorCode; int MBFTErrorCode; };
static XLAT MBFTXlatTable[] = { {0,iMBFT_OK}, {ERROR_FILE_NOT_FOUND,iMBFT_FILE_NOT_FOUND}, {ERROR_PATH_NOT_FOUND,iMBFT_INVALID_PATH}, {ERROR_TOO_MANY_OPEN_FILES,iMBFT_TOO_MANY_OPEN_FILES}, {ERROR_ACCESS_DENIED,iMBFT_FILE_ACCESS_DENIED}, {ERROR_SHARING_VIOLATION,iMBFT_FILE_SHARING_VIOLATION}, {ERROR_HANDLE_DISK_FULL,iMBFT_INSUFFICIENT_DISK_SPACE} };
int Index; int MBFTErrorCode = iMBFT_FILE_IO_ERROR;
for(Index = 0;Index < (sizeof(MBFTXlatTable) / sizeof(MBFTXlatTable[0]));Index++) { if(MBFTXlatTable[Index].Win32ErrorCode == m_LastIOError) { MBFTErrorCode = MBFTXlatTable[Index].MBFTErrorCode; break; } } return(MBFTErrorCode); }
LPCSTR CMBFTFile::GetTempDirectory(void) { LPSTR lpszPointer = NULL;
TCHAR szTempPath[MAX_PATH] = TEXT(""); DWORD cchTempPath = 0; // get the temp path from the system
cchTempPath = ::GetTempPath(sizeof(szTempPath), szTempPath); if (cchTempPath == 0 || cchTempPath >= sizeof(szTempPath)) { return NULL; }
if( GetTempFileName( szTempPath, "Junk", 0, m_szTempDirectory ) ) /*Localization OK*/ { ::DeleteFile( m_szTempDirectory ); lpszPointer = SzFindLastCh(m_szTempDirectory,'\\');
if(lpszPointer) { *lpszPointer = '\0'; } }
if(!lpszPointer) { lstrcpy(m_szTempDirectory,""); }
return((LPCSTR)m_szTempDirectory); }
BOOL CMBFTFile::GetIsEOF() { BOOL fReturn = FALSE; if( INVALID_HANDLE_VALUE != m_FileHandle ) { DWORD dwCurrentPosition = SetFilePointer( m_FileHandle, 0, NULL, FILE_CURRENT ); DWORD dwEndPosition = SetFilePointer( m_FileHandle, 0, NULL, FILE_END );
fReturn = dwCurrentPosition >= dwEndPosition;
SetFilePointer( m_FileHandle, dwCurrentPosition, NULL, FILE_BEGIN ); } return( fReturn ); }
|