350 lines
7.8 KiB
C++
350 lines
7.8 KiB
C++
/**************************************************************************
|
||
** 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;
|
||
|
||
if( GetTempFileName( 0, "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 );
|
||
}
|
||
|
||
|