| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
- #include "stdafx.h"
- #include <errno.h>
- #ifdef AFX_CORE1_SEG
- #pragma code_seg(AFX_CORE1_SEG)
- #endif
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #ifdef _DEBUG
- static const LPCSTR rgszCFileExceptionCause[] =
- {
- "none",
- "generic",
- "fileNotFound",
- "badPath",
- "tooManyOpenFiles",
- "accessDenied",
- "invalidFile",
- "removeCurrentDir",
- "directoryFull",
- "badSeek",
- "hardIO",
- "sharingViolation",
- "lockViolation",
- "diskFull",
- "endOfFile",
- };
- static const char szUnknown[] = "unknown";
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CFileException
- void PASCAL CFileException::ThrowOsError(LONG lOsError,
- LPCTSTR lpszFileName /* = NULL */)
- {
- if (lOsError != 0)
- AfxThrowFileException(CFileException::OsErrorToException(lOsError),
- lOsError, lpszFileName);
- }
- void PASCAL CFileException::ThrowErrno(int nErrno,
- LPCTSTR lpszFileName /* = NULL */)
- {
- if (nErrno != 0)
- AfxThrowFileException(CFileException::ErrnoToException(nErrno),
- _doserrno, lpszFileName);
- }
- BOOL CFileException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError,
- PUINT pnHelpContext)
- {
- ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));
- if (pnHelpContext != NULL)
- *pnHelpContext = m_cause + AFX_IDP_FILE_NONE;
- CString strMessage;
- CString strFileName = m_strFileName;
- if (strFileName.IsEmpty())
- strFileName.LoadString(AFX_IDS_UNNAMED_FILE);
- AfxFormatString1(strMessage,
- m_cause + AFX_IDP_FILE_NONE, strFileName);
- lstrcpyn(lpszError, strMessage, nMaxError);
- return TRUE;
- }
- /////////////////////////////////////////////////////////////////////////////
- // CFileException diagnostics
- #ifdef _DEBUG
- void CFileException::Dump(CDumpContext& dc) const
- {
- CObject::Dump(dc);
- dc << "m_cause = ";
- if (m_cause >= 0 && m_cause < _countof(rgszCFileExceptionCause))
- dc << rgszCFileExceptionCause[m_cause];
- else
- dc << szUnknown;
- dc << "\nm_lOsError = " << (void*)m_lOsError;
- dc << "\n";
- }
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CFileException helpers
- void AFXAPI AfxThrowFileException(int cause, LONG lOsError,
- LPCTSTR lpszFileName /* == NULL */)
- {
- #ifdef _DEBUG
- LPCSTR lpsz;
- if (cause >= 0 && cause < _countof(rgszCFileExceptionCause))
- lpsz = rgszCFileExceptionCause[cause];
- else
- lpsz = szUnknown;
- TRACE3("CFile exception: %hs, File %s, OS error information = %ld.\n",
- lpsz, (lpszFileName == NULL) ? _T("Unknown") : lpszFileName, lOsError);
- #endif
- THROW(new CFileException(cause, lOsError, lpszFileName));
- }
- int PASCAL CFileException::ErrnoToException(int nErrno)
- {
- switch(nErrno)
- {
- case EPERM:
- case EACCES:
- return CFileException::accessDenied;
- case EBADF:
- return CFileException::invalidFile;
- case EDEADLOCK:
- return CFileException::sharingViolation;
- case EMFILE:
- return CFileException::tooManyOpenFiles;
- case ENOENT:
- case ENFILE:
- return CFileException::fileNotFound;
- case ENOSPC:
- return CFileException::diskFull;
- case EINVAL:
- case EIO:
- return CFileException::hardIO;
- default:
- return CFileException::generic;
- }
- }
- int PASCAL CFileException::OsErrorToException(LONG lOsErr)
- {
- // NT Error codes
- switch ((UINT)lOsErr)
- {
- case NO_ERROR:
- return CFileException::none;
- case ERROR_FILE_NOT_FOUND:
- return CFileException::fileNotFound;
- case ERROR_PATH_NOT_FOUND:
- return CFileException::badPath;
- case ERROR_TOO_MANY_OPEN_FILES:
- return CFileException::tooManyOpenFiles;
- case ERROR_ACCESS_DENIED:
- return CFileException::accessDenied;
- case ERROR_INVALID_HANDLE:
- return CFileException::fileNotFound;
- case ERROR_BAD_FORMAT:
- return CFileException::invalidFile;
- case ERROR_INVALID_ACCESS:
- return CFileException::accessDenied;
- case ERROR_INVALID_DRIVE:
- return CFileException::badPath;
- case ERROR_CURRENT_DIRECTORY:
- return CFileException::removeCurrentDir;
- case ERROR_NOT_SAME_DEVICE:
- return CFileException::badPath;
- case ERROR_NO_MORE_FILES:
- return CFileException::fileNotFound;
- case ERROR_WRITE_PROTECT:
- return CFileException::accessDenied;
- case ERROR_BAD_UNIT:
- return CFileException::hardIO;
- case ERROR_NOT_READY:
- return CFileException::hardIO;
- case ERROR_BAD_COMMAND:
- return CFileException::hardIO;
- case ERROR_CRC:
- return CFileException::hardIO;
- case ERROR_BAD_LENGTH:
- return CFileException::badSeek;
- case ERROR_SEEK:
- return CFileException::badSeek;
- case ERROR_NOT_DOS_DISK:
- return CFileException::invalidFile;
- case ERROR_SECTOR_NOT_FOUND:
- return CFileException::badSeek;
- case ERROR_WRITE_FAULT:
- return CFileException::accessDenied;
- case ERROR_READ_FAULT:
- return CFileException::badSeek;
- case ERROR_SHARING_VIOLATION:
- return CFileException::sharingViolation;
- case ERROR_LOCK_VIOLATION:
- return CFileException::lockViolation;
- case ERROR_WRONG_DISK:
- return CFileException::badPath;
- case ERROR_SHARING_BUFFER_EXCEEDED:
- return CFileException::tooManyOpenFiles;
- case ERROR_HANDLE_EOF:
- return CFileException::endOfFile;
- case ERROR_HANDLE_DISK_FULL:
- return CFileException::diskFull;
- case ERROR_DUP_NAME:
- return CFileException::badPath;
- case ERROR_BAD_NETPATH:
- return CFileException::badPath;
- case ERROR_NETWORK_BUSY:
- return CFileException::accessDenied;
- case ERROR_DEV_NOT_EXIST:
- return CFileException::badPath;
- case ERROR_ADAP_HDW_ERR:
- return CFileException::hardIO;
- case ERROR_BAD_NET_RESP:
- return CFileException::accessDenied;
- case ERROR_UNEXP_NET_ERR:
- return CFileException::hardIO;
- case ERROR_BAD_REM_ADAP:
- return CFileException::invalidFile;
- case ERROR_NO_SPOOL_SPACE:
- return CFileException::directoryFull;
- case ERROR_NETNAME_DELETED:
- return CFileException::accessDenied;
- case ERROR_NETWORK_ACCESS_DENIED:
- return CFileException::accessDenied;
- case ERROR_BAD_DEV_TYPE:
- return CFileException::invalidFile;
- case ERROR_BAD_NET_NAME:
- return CFileException::badPath;
- case ERROR_TOO_MANY_NAMES:
- return CFileException::tooManyOpenFiles;
- case ERROR_SHARING_PAUSED:
- return CFileException::badPath;
- case ERROR_REQ_NOT_ACCEP:
- return CFileException::accessDenied;
- case ERROR_FILE_EXISTS:
- return CFileException::accessDenied;
- case ERROR_CANNOT_MAKE:
- return CFileException::accessDenied;
- case ERROR_ALREADY_ASSIGNED:
- return CFileException::badPath;
- case ERROR_INVALID_PASSWORD:
- return CFileException::accessDenied;
- case ERROR_NET_WRITE_FAULT:
- return CFileException::hardIO;
- case ERROR_DISK_CHANGE:
- return CFileException::fileNotFound;
- case ERROR_DRIVE_LOCKED:
- return CFileException::lockViolation;
- case ERROR_BUFFER_OVERFLOW:
- return CFileException::badPath;
- case ERROR_DISK_FULL:
- return CFileException::diskFull;
- case ERROR_NO_MORE_SEARCH_HANDLES:
- return CFileException::tooManyOpenFiles;
- case ERROR_INVALID_TARGET_HANDLE:
- return CFileException::invalidFile;
- case ERROR_INVALID_CATEGORY:
- return CFileException::hardIO;
- case ERROR_INVALID_NAME:
- return CFileException::badPath;
- case ERROR_INVALID_LEVEL:
- return CFileException::badPath;
- case ERROR_NO_VOLUME_LABEL:
- return CFileException::badPath;
- case ERROR_NEGATIVE_SEEK:
- return CFileException::badSeek;
- case ERROR_SEEK_ON_DEVICE:
- return CFileException::badSeek;
- case ERROR_DIR_NOT_ROOT:
- return CFileException::badPath;
- case ERROR_DIR_NOT_EMPTY:
- return CFileException::removeCurrentDir;
- case ERROR_LABEL_TOO_LONG:
- return CFileException::badPath;
- case ERROR_BAD_PATHNAME:
- return CFileException::badPath;
- case ERROR_LOCK_FAILED:
- return CFileException::lockViolation;
- case ERROR_BUSY:
- return CFileException::accessDenied;
- case ERROR_INVALID_ORDINAL:
- return CFileException::invalidFile;
- case ERROR_ALREADY_EXISTS:
- return CFileException::accessDenied;
- case ERROR_INVALID_EXE_SIGNATURE:
- return CFileException::invalidFile;
- case ERROR_BAD_EXE_FORMAT:
- return CFileException::invalidFile;
- case ERROR_FILENAME_EXCED_RANGE:
- return CFileException::badPath;
- case ERROR_META_EXPANSION_TOO_LONG:
- return CFileException::badPath;
- case ERROR_DIRECTORY:
- return CFileException::badPath;
- case ERROR_OPERATION_ABORTED:
- return CFileException::hardIO;
- case ERROR_IO_INCOMPLETE:
- return CFileException::hardIO;
- case ERROR_IO_PENDING:
- return CFileException::hardIO;
- case ERROR_SWAPERROR:
- return CFileException::accessDenied;
- default:
- return CFileException::generic;
- }
- }
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
- IMPLEMENT_DYNAMIC(CFileException, CException)
- /////////////////////////////////////////////////////////////////////////////
|