Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

349 lines
7.8 KiB

/**************************************************************************
** 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 );
}