diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /public/sdk/inc/mfc42/afx.h | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'public/sdk/inc/mfc42/afx.h')
-rw-r--r-- | public/sdk/inc/mfc42/afx.h | 1916 |
1 files changed, 1916 insertions, 0 deletions
diff --git a/public/sdk/inc/mfc42/afx.h b/public/sdk/inc/mfc42/afx.h new file mode 100644 index 000000000..bcbf102f1 --- /dev/null +++ b/public/sdk/inc/mfc42/afx.h @@ -0,0 +1,1916 @@ +// This is a part of the Microsoft Foundation Classes C++ library. +// Copyright (C) 1992-1995 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. + +#ifndef __AFX_H__ +#define __AFX_H__ + +#ifndef __cplusplus + #error MFC requires C++ compilation (use a .cpp suffix) +#endif + +///////////////////////////////////////////////////////////////////////////// + +#ifdef _AFX_MINREBUILD +#pragma component(minrebuild, off) +#endif +#ifndef _AFX_FULLTYPEINFO +#pragma component(mintypeinfo, on) +#endif + +#include <afxver_.h> // Target version control + +#ifndef _AFX_NOFORCE_LIBS +#ifndef _MAC + +///////////////////////////////////////////////////////////////////////////// +// Win32 libraries + +#ifndef _AFXDLL + #ifndef _UNICODE + #ifdef _DEBUG + #pragma comment(lib, "nafxcwd.lib") + #else + #pragma comment(lib, "nafxcw.lib") + #endif + #else + #ifdef _DEBUG + #pragma comment(lib, "uafxcwd.lib") + #else + #pragma comment(lib, "uafxcw.lib") + #endif + #endif +#else + #ifndef _UNICODE + #ifdef _DEBUG + #pragma comment(lib, "mfc42d.lib") + #pragma comment(lib, "mfcs42d.lib") + #else + #pragma comment(lib, "mfc42.lib") + #pragma comment(lib, "mfcs42.lib") + #endif + #else + #ifdef _DEBUG + #pragma comment(lib, "mfc42ud.lib") + #pragma comment(lib, "mfcs42ud.lib") + #else + #pragma comment(lib, "mfc42u.lib") + #pragma comment(lib, "mfcs42u.lib") + #endif + #endif +#endif + +#ifdef _DLL + #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG) + #pragma comment(lib, "msvcrtd.lib") + #else + #pragma comment(lib, "msvcrt.lib") + #endif +#else +#ifdef _MT + #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG) + #pragma comment(lib, "libcmtd.lib") + #else + #pragma comment(lib, "libcmt.lib") + #endif +#else + #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG) + #pragma comment(lib, "libcd.lib") + #else + #pragma comment(lib, "libc.lib") + #endif +#endif +#endif + +#pragma comment(lib, "kernel32.lib") +#pragma comment(lib, "user32.lib") +#pragma comment(lib, "gdi32.lib") +#pragma comment(lib, "comdlg32.lib") +#pragma comment(lib, "winspool.lib") +#pragma comment(lib, "advapi32.lib") +#pragma comment(lib, "shell32.lib") +#pragma comment(lib, "comctl32.lib") + +#else //!_MAC + +////////////////////////////////////////////////////////////////////////////// +// Macintosh libraries + +#ifndef _AFXDLL + #ifdef _DEBUG + #ifdef _68K_ + #pragma comment(lib, "nafxcmd.lib") + #else + #pragma comment(lib, "nafxcpd.lib") + #endif + #else + #ifdef _68K_ + #pragma comment(lib, "nafxcm.lib") + #else + #pragma comment(lib, "nafxcp.lib") + #endif + #endif +#else + #ifdef _DEBUG + #ifdef _68K_ + #error _AFXDLL is not supported for 68K Macintosh + #else + #pragma comment(lib, "mfc42pd.lib") + #pragma comment(lib, "mfcs42pd.lib") + #endif + #else + #ifdef _68K_ + #error _AFXDLL is not supported for 68K Macintosh + #else + #pragma comment(lib, "mfc42p.lib") + #pragma comment(lib, "mfcs42p.lib") + #endif + #endif +#endif + +#if !defined(_AFXDLL) && !defined(_USRDLL) + #ifdef _DEBUG + #pragma comment(lib, "wlmd.lib") + #pragma comment(lib, "comctld.lib") + #else + #pragma comment(lib, "wlm.lib") + #pragma comment(lib, "comctl.lib") + #endif + #pragma comment(linker, "/macres:wlm.rsc /macres:commdlg.rsc") + #pragma comment(linker, "/macres:comctl.rsc") + #ifdef _MPPC_ + #pragma comment(lib, "privint.lib") + #pragma comment(lib, "threads.lib") + #pragma comment(lib, "math.lib") + #endif +#else + #ifdef _DEBUG + #pragma comment(lib, "msvcwlmd.lib") + #pragma comment(lib, "msvcctld.lib") + #else + #pragma comment(lib, "msvcwlm.lib") + #pragma comment(lib, "msvcctl.lib") + #endif +#endif + +#ifdef _68K_ + #ifdef _DEBUG + #pragma comment(lib, "swapd.lib") + #else + #pragma comment(lib, "swap.lib") + #endif + #pragma comment(lib, "lsanes.lib") + #pragma comment(lib, "llibcs.lib") + #pragma comment(lib, "osl.lib") +#endif + +#ifdef _MPPC_ + #ifdef _DLL + #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG) + #pragma comment(lib, "msvcrtd.lib") + #else + #pragma comment(lib, "msvcrt.lib") + #endif + #else + #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG) + #pragma comment(lib, "libcd.lib") + #else + #pragma comment(lib, "libc.lib") + #endif + #endif +#endif + +#endif //_MAC + +// force inclusion of NOLIB.OBJ for /disallowlib directives +#pragma comment(linker, "/include:__afxForceEXCLUDE") + +// force inclusion of DLLMODUL.OBJ for _USRDLL +#ifdef _USRDLL +#pragma comment(linker, "/include:__afxForceUSRDLL") +#endif + +// force inclusion of STDAFX.OBJ for precompiled types +#ifdef _AFXDLL +#pragma comment(linker, "/include:__afxForceSTDAFX") +#endif + +#endif //!_AFX_NOFORCE_LIBS + +///////////////////////////////////////////////////////////////////////////// +// Classes declared in this file +// in addition to standard primitive data types and various helper macros + +struct CRuntimeClass; // object type information + +class CObject; // the root of all objects classes + + class CException; // the root of all exceptions + class CArchiveException; // archive exception + class CFileException; // file exception + class CSimpleException; + class CMemoryException; // out-of-memory exception + class CNotSupportedException; // feature not supported exception + + class CFile; // raw binary file + class CStdioFile; // buffered stdio text/binary file + class CMemFile; // memory based file + +// Non CObject classes +class CString; // growable string type +class CTimeSpan; // time/date difference +class CTime; // absolute time/date +struct CFileStatus; // file status information +struct CMemoryState; // diagnostic memory support + +class CArchive; // object persistence tool +class CDumpContext; // object diagnostic dumping + +///////////////////////////////////////////////////////////////////////////// +// Other includes from standard "C" runtimes + +#ifndef _INC_STRING + #include <string.h> +#endif +#ifndef _INC_STDIO + #include <stdio.h> +#endif +#ifndef _INC_STDLIB + #include <stdlib.h> +#endif +#ifndef _INC_TIME + #include <time.h> +#endif +#ifndef _INC_LIMITS + #include <limits.h> +#endif +#ifndef _INC_STDDEF + #include <stddef.h> +#endif +#ifndef _INC_STDARG + #include <stdarg.h> +#endif + +#ifndef _AFX_NO_DEBUG_CRT +#ifndef _INC_CRTDBG + #include <crtdbg.h> +#endif +#endif // _AFX_NO_DEBUG_CRT + +#ifdef _AFX_OLD_EXCEPTIONS +// use setjmp and helper functions instead of C++ keywords +#ifndef _INC_SETJMP + #pragma warning(disable: 4611) + #include <setjmp.h> +#endif +#endif + +#ifdef _AFX_PACKING +#pragma pack(push, _AFX_PACKING) +#endif + +///////////////////////////////////////////////////////////////////////////// +// Basic types + +// abstract iteration position +struct __POSITION { }; +typedef __POSITION* POSITION; + +struct _AFX_DOUBLE { BYTE doubleBits[sizeof(double)]; }; +struct _AFX_FLOAT { BYTE floatBits[sizeof(float)]; }; + +// Standard constants +#undef FALSE +#undef TRUE +#undef NULL + +#define FALSE 0 +#define TRUE 1 +#define NULL 0 + +///////////////////////////////////////////////////////////////////////////// +// Diagnostic support + +#ifdef _DEBUG + +BOOL AFXAPI AfxAssertFailedLine(LPCSTR lpszFileName, int nLine); + +void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...); +// Note: file names are still ANSI strings (filenames rarely need UNICODE) +void AFXAPI AfxAssertValidObject(const CObject* pOb, + LPCSTR lpszFileName, int nLine); +void AFXAPI AfxDump(const CObject* pOb); // Dump an object from CodeView + +#define TRACE ::AfxTrace +#define THIS_FILE __FILE__ +#define ASSERT(f) \ + do \ + { \ + if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \ + AfxDebugBreak(); \ + } while (0) \ + +#define VERIFY(f) ASSERT(f) +#define ASSERT_VALID(pOb) (::AfxAssertValidObject(pOb, THIS_FILE, __LINE__)) +#define DEBUG_ONLY(f) (f) + +// The following trace macros are provided for backward compatiblity +// (they also take a fixed number of parameters which provides +// some amount of extra error checking) +#define TRACE0(sz) ::AfxTrace(_T("%s"), _T(sz)) +#define TRACE1(sz, p1) ::AfxTrace(_T(sz), p1) +#define TRACE2(sz, p1, p2) ::AfxTrace(_T(sz), p1, p2) +#define TRACE3(sz, p1, p2, p3) ::AfxTrace(_T(sz), p1, p2, p3) + +// These AFX_DUMP macros also provided for backward compatibility +#define AFX_DUMP0(dc, sz) dc << _T(sz) +#define AFX_DUMP1(dc, sz, p1) dc << _T(sz) << p1 + +#else // _DEBUG + +#define ASSERT(f) ((void)0) +#define VERIFY(f) ((void)(f)) +#define ASSERT_VALID(pOb) ((void)0) +#define DEBUG_ONLY(f) ((void)0) +inline void AFX_CDECL AfxTrace(LPCTSTR, ...) { } +#define TRACE 1 ? (void)0 : ::AfxTrace +#define TRACE0(sz) +#define TRACE1(sz, p1) +#define TRACE2(sz, p1, p2) +#define TRACE3(sz, p1, p2, p3) + +#endif // !_DEBUG + +#define ASSERT_POINTER(p, type) \ + ASSERT(((p) != NULL) && AfxIsValidAddress((p), sizeof(type), FALSE)) + +#define ASSERT_NULL_OR_POINTER(p, type) \ + ASSERT(((p) == NULL) || AfxIsValidAddress((p), sizeof(type), FALSE)) + +///////////////////////////////////////////////////////////////////////////// +// Turn off warnings for /W4 +// To resume any of these warning: #pragma warning(default: 4xxx) +// which should be placed after the AFX include files +#ifndef ALL_WARNINGS +// warnings generated with common MFC/Windows code +#pragma warning(disable: 4127) // constant expression for TRACE/ASSERT +#pragma warning(disable: 4134) // message map member fxn casts +#pragma warning(disable: 4201) // nameless unions are part of C++ +#pragma warning(disable: 4511) // private copy constructors are good to have +#pragma warning(disable: 4512) // private operator= are good to have +#pragma warning(disable: 4514) // unreferenced inlines are common +#pragma warning(disable: 4710) // private constructors are disallowed +#pragma warning(disable: 4705) // statement has no effect in optimized code +// warnings caused by normal optimizations +#ifndef _DEBUG +#pragma warning(disable: 4701) // local variable *may* be used without init +#pragma warning(disable: 4702) // unreachable code caused by optimizations +#pragma warning(disable: 4791) // loss of debugging info in release version +#endif +// warnings specific to _AFXDLL version +#ifdef _AFXDLL +#pragma warning(disable: 4204) // non-constant aggregate initializer +#endif +#ifdef _AFXDLL +#pragma warning(disable: 4275) // deriving exported class from non-exported +#pragma warning(disable: 4251) // using non-exported as public in exported +#endif +#endif //!ALL_WARNINGS + +#ifdef _DEBUG +#define UNUSED(x) +#else +#define UNUSED(x) x +#endif +#define UNUSED_ALWAYS(x) x + +///////////////////////////////////////////////////////////////////////////// +// Other implementation helpers + +#define BEFORE_START_POSITION ((POSITION)-1L) + +///////////////////////////////////////////////////////////////////////////// +// explicit initialization for general purpose classes + +BOOL AFXAPI AfxInitialize(BOOL bDLL = FALSE, DWORD dwVersion = _MFC_VER); + +#undef AFX_DATA +#define AFX_DATA AFX_CORE_DATA + +///////////////////////////////////////////////////////////////////////////// +// Basic object model + +struct CRuntimeClass +{ +// Attributes + LPCSTR m_lpszClassName; + int m_nObjectSize; + UINT m_wSchema; // schema number of the loaded class + CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class +#ifdef _AFXDLL + CRuntimeClass* (PASCAL* m_pfnGetBaseClass)(); +#else + CRuntimeClass* m_pBaseClass; +#endif + +// Operations + CObject* CreateObject(); + BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const; + +// Implementation + void Store(CArchive& ar) const; + static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum); + + // CRuntimeClass objects linked together in simple list + CRuntimeClass* m_pNextClass; // linked list of registered classes +}; + +///////////////////////////////////////////////////////////////////////////// +// Strings + +#ifndef _OLEAUTO_H_ +#ifdef OLE2ANSI + typedef LPSTR BSTR; +#else + typedef LPWSTR BSTR;// must (semantically) match typedef in oleauto.h +#endif +#endif + +struct CStringData +{ + long nRefs; // reference count + int nDataLength; + int nAllocLength; + // TCHAR data[nAllocLength] + + TCHAR* data() + { return (TCHAR*)(this+1); } +}; + +class CString +{ +public: +// Constructors + CString(); + CString(const CString& stringSrc); + CString(TCHAR ch, int nRepeat = 1); + CString(LPCSTR lpsz); + CString(LPCWSTR lpsz); + CString(LPCTSTR lpch, int nLength); + CString(const unsigned char* psz); + +// Attributes & Operations + // as an array of characters + int GetLength() const; + BOOL IsEmpty() const; + void Empty(); // free up the data + + TCHAR GetAt(int nIndex) const; // 0 based + TCHAR operator[](int nIndex) const; // same as GetAt + void SetAt(int nIndex, TCHAR ch); + operator LPCTSTR() const; // as a C string + + // overloaded assignment + const CString& operator=(const CString& stringSrc); + const CString& operator=(TCHAR ch); +#ifdef _UNICODE + const CString& operator=(char ch); +#endif + const CString& operator=(LPCSTR lpsz); + const CString& operator=(LPCWSTR lpsz); + const CString& operator=(const unsigned char* psz); + + // string concatenation + const CString& operator+=(const CString& string); + const CString& operator+=(TCHAR ch); +#ifdef _UNICODE + const CString& operator+=(char ch); +#endif + const CString& operator+=(LPCTSTR lpsz); + + friend CString AFXAPI operator+(const CString& string1, + const CString& string2); + friend CString AFXAPI operator+(const CString& string, TCHAR ch); + friend CString AFXAPI operator+(TCHAR ch, const CString& string); +#ifdef _UNICODE + friend CString AFXAPI operator+(const CString& string, char ch); + friend CString AFXAPI operator+(char ch, const CString& string); +#endif + friend CString AFXAPI operator+(const CString& string, LPCTSTR lpsz); + friend CString AFXAPI operator+(LPCTSTR lpsz, const CString& string); + + // string comparison + int Compare(LPCTSTR lpsz) const; // straight character + int CompareNoCase(LPCTSTR lpsz) const; // ignore case + int Collate(LPCTSTR lpsz) const; // NLS aware + + // simple sub-string extraction + CString Mid(int nFirst, int nCount) const; + CString Mid(int nFirst) const; + CString Left(int nCount) const; + CString Right(int nCount) const; + + CString SpanIncluding(LPCTSTR lpszCharSet) const; + CString SpanExcluding(LPCTSTR lpszCharSet) const; + + // upper/lower/reverse conversion + void MakeUpper(); + void MakeLower(); + void MakeReverse(); + + // trimming whitespace (either side) + void TrimRight(); + void TrimLeft(); + + // searching (return starting index, or -1 if not found) + // look for a single character match + int Find(TCHAR ch) const; // like "C" strchr + int ReverseFind(TCHAR ch) const; + int FindOneOf(LPCTSTR lpszCharSet) const; + + // look for a specific sub-string + int Find(LPCTSTR lpszSub) const; // like "C" strstr + + // simple formatting + void AFX_CDECL Format(LPCTSTR lpszFormat, ...); + void AFX_CDECL Format(UINT nFormatID, ...); + +#ifndef _MAC + // formatting for localization (uses FormatMessage API) + void AFX_CDECL FormatMessage(LPCTSTR lpszFormat, ...); + void AFX_CDECL FormatMessage(UINT nFormatID, ...); +#endif + + // input and output +#ifdef _DEBUG + friend CDumpContext& AFXAPI operator<<(CDumpContext& dc, + const CString& string); +#endif + friend CArchive& AFXAPI operator<<(CArchive& ar, const CString& string); + friend CArchive& AFXAPI operator>>(CArchive& ar, CString& string); + + // Windows support + BOOL LoadString(UINT nID); // load from string resource + // 255 chars max +#ifndef _UNICODE + // ANSI <-> OEM support (convert string in place) + void AnsiToOem(); + void OemToAnsi(); +#endif + +#ifndef _AFX_NO_BSTR_SUPPORT + // OLE BSTR support (use for OLE automation) + BSTR AllocSysString() const; + BSTR SetSysString(BSTR* pbstr) const; +#endif + + // Access to string implementation buffer as "C" character array + LPTSTR GetBuffer(int nMinBufLength); + void ReleaseBuffer(int nNewLength = -1); + LPTSTR GetBufferSetLength(int nNewLength); + void FreeExtra(); + + // Use LockBuffer/UnlockBuffer to turn refcounting off + LPTSTR LockBuffer(); + void UnlockBuffer(); + +// Implementation +public: + ~CString(); + int GetAllocLength() const; + +protected: + LPTSTR m_pchData; // pointer to ref counted string data + + // implementation helpers + CStringData* GetData() const; + void Init(); + void AllocCopy(CString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const; + void AllocBuffer(int nLen); + void AssignCopy(int nSrcLen, LPCTSTR lpszSrcData); + void ConcatCopy(int nSrc1Len, LPCTSTR lpszSrc1Data, int nSrc2Len, LPCTSTR lpszSrc2Data); + void ConcatInPlace(int nSrcLen, LPCTSTR lpszSrcData); + void FormatV(LPCTSTR lpszFormat, va_list argList); + void CopyBeforeWrite(); + void AllocBeforeWrite(int nLen); + void Release(); + static void PASCAL Release(CStringData* pData); + static int PASCAL SafeStrlen(LPCTSTR lpsz); +}; + +// Compare helpers +BOOL AFXAPI operator==(const CString& s1, const CString& s2); +BOOL AFXAPI operator==(const CString& s1, LPCTSTR s2); +BOOL AFXAPI operator==(LPCTSTR s1, const CString& s2); +BOOL AFXAPI operator!=(const CString& s1, const CString& s2); +BOOL AFXAPI operator!=(const CString& s1, LPCTSTR s2); +BOOL AFXAPI operator!=(LPCTSTR s1, const CString& s2); +BOOL AFXAPI operator<(const CString& s1, const CString& s2); +BOOL AFXAPI operator<(const CString& s1, LPCTSTR s2); +BOOL AFXAPI operator<(LPCTSTR s1, const CString& s2); +BOOL AFXAPI operator>(const CString& s1, const CString& s2); +BOOL AFXAPI operator>(const CString& s1, LPCTSTR s2); +BOOL AFXAPI operator>(LPCTSTR s1, const CString& s2); +BOOL AFXAPI operator<=(const CString& s1, const CString& s2); +BOOL AFXAPI operator<=(const CString& s1, LPCTSTR s2); +BOOL AFXAPI operator<=(LPCTSTR s1, const CString& s2); +BOOL AFXAPI operator>=(const CString& s1, const CString& s2); +BOOL AFXAPI operator>=(const CString& s1, LPCTSTR s2); +BOOL AFXAPI operator>=(LPCTSTR s1, const CString& s2); + +// conversion helpers +int AFX_CDECL _wcstombsz(char* mbstr, const wchar_t* wcstr, size_t count); +int AFX_CDECL _mbstowcsz(wchar_t* wcstr, const char* mbstr, size_t count); + +// Globals +extern AFX_DATA TCHAR afxChNil; +const CString& AFXAPI AfxGetEmptyString(); +#define afxEmptyString AfxGetEmptyString() + +///////////////////////////////////////////////////////////////////////////// +// class CObject is the root of all compliant objects + +class CObject +{ +public: + +// Object model (types, destruction, allocation) + virtual CRuntimeClass* GetRuntimeClass() const; + virtual ~CObject(); // virtual destructors are necessary + + // Diagnostic allocations + void* PASCAL operator new(size_t nSize); + void* PASCAL operator new(size_t, void* p); + void PASCAL operator delete(void* p); + +#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT) + // for file name/line number tracking using DEBUG_NEW + void* PASCAL operator new(size_t nSize, LPCSTR lpszFileName, int nLine); +#endif + + // Disable the copy constructor and assignment by default so you will get + // compiler errors instead of unexpected behaviour if you pass objects + // by value or assign objects. +protected: + CObject(); +private: + CObject(const CObject& objectSrc); // no implementation + void operator=(const CObject& objectSrc); // no implementation + +// Attributes +public: + BOOL IsSerializable() const; + BOOL IsKindOf(const CRuntimeClass* pClass) const; + +// Overridables + virtual void Serialize(CArchive& ar); + + // Diagnostic Support + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; + +// Implementation +public: + static const AFX_DATA CRuntimeClass classCObject; +#ifdef _AFXDLL + static CRuntimeClass* PASCAL _GetBaseClass(); +#endif +}; + +// Helper macros +#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name)) +#define ASSERT_KINDOF(class_name, object) \ + ASSERT((object)->IsKindOf(RUNTIME_CLASS(class_name))) + +// RTTI helper macros/functions +const CObject* AFX_CDECL AfxDynamicDownCast(CRuntimeClass* pClass, const CObject* pObject); +CObject* AFX_CDECL AfxDynamicDownCast(CRuntimeClass* pClass, CObject* pObject); +#define DYNAMIC_DOWNCAST(class_name, object) \ + (class_name*)AfxDynamicDownCast(RUNTIME_CLASS(class_name), object) + +#ifdef _DEBUG +const CObject* AFX_CDECL AfxStaticDownCast(CRuntimeClass* pClass, const CObject* pObject); +CObject* AFX_CDECL AfxStaticDownCast(CRuntimeClass* pClass, CObject* pObject); +#define STATIC_DOWNCAST(class_name, object) \ + ((class_name*)AfxStaticDownCast(RUNTIME_CLASS(class_name), object)) +#else +#define STATIC_DOWNCAST(class_name, object) ((class_name*)object) +#endif + +////////////////////////////////////////////////////////////////////////////// +// Helper macros for declaring CRuntimeClass compatible classes + +#ifdef _AFXDLL +#define DECLARE_DYNAMIC(class_name) \ +protected: \ + static CRuntimeClass* PASCAL _GetBaseClass(); \ +public: \ + static const AFX_DATA CRuntimeClass class##class_name; \ + virtual CRuntimeClass* GetRuntimeClass() const; \ + +#define _DECLARE_DYNAMIC(class_name) \ +protected: \ + static CRuntimeClass* PASCAL _GetBaseClass(); \ +public: \ + static AFX_DATA CRuntimeClass class##class_name; \ + virtual CRuntimeClass* GetRuntimeClass() const; \ + +#else +#define DECLARE_DYNAMIC(class_name) \ +public: \ + static const AFX_DATA CRuntimeClass class##class_name; \ + virtual CRuntimeClass* GetRuntimeClass() const; \ + +#define _DECLARE_DYNAMIC(class_name) \ +public: \ + static AFX_DATA CRuntimeClass class##class_name; \ + virtual CRuntimeClass* GetRuntimeClass() const; \ + +#endif + +// not serializable, but dynamically constructable +#define DECLARE_DYNCREATE(class_name) \ + DECLARE_DYNAMIC(class_name) \ + static CObject* PASCAL CreateObject(); + +#define _DECLARE_DYNCREATE(class_name) \ + _DECLARE_DYNAMIC(class_name) \ + static CObject* PASCAL CreateObject(); + +#define DECLARE_SERIAL(class_name) \ + _DECLARE_DYNCREATE(class_name) \ + friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb); + +// generate static object constructor for class registration +struct AFX_CLASSINIT + { AFX_CLASSINIT(CRuntimeClass* pNewClass); }; + +#ifdef _AFXDLL +#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \ + CRuntimeClass* PASCAL class_name::_GetBaseClass() \ + { return RUNTIME_CLASS(base_class_name); } \ + const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \ + #class_name, sizeof(class class_name), wSchema, pfnNew, \ + &class_name::_GetBaseClass, NULL }; \ + CRuntimeClass* class_name::GetRuntimeClass() const \ + { return RUNTIME_CLASS(class_name); } \ + +#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \ + CRuntimeClass* PASCAL class_name::_GetBaseClass() \ + { return RUNTIME_CLASS(base_class_name); } \ + AFX_DATADEF CRuntimeClass class_name::class##class_name = { \ + #class_name, sizeof(class class_name), wSchema, pfnNew, \ + &class_name::_GetBaseClass, NULL }; \ + CRuntimeClass* class_name::GetRuntimeClass() const \ + { return RUNTIME_CLASS(class_name); } \ + +#else +#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \ + const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \ + #class_name, sizeof(class class_name), wSchema, pfnNew, \ + RUNTIME_CLASS(base_class_name), NULL }; \ + CRuntimeClass* class_name::GetRuntimeClass() const \ + { return RUNTIME_CLASS(class_name); } \ + +#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \ + AFX_DATADEF CRuntimeClass class_name::class##class_name = { \ + #class_name, sizeof(class class_name), wSchema, pfnNew, \ + RUNTIME_CLASS(base_class_name), NULL }; \ + CRuntimeClass* class_name::GetRuntimeClass() const \ + { return RUNTIME_CLASS(class_name); } \ + +#endif + +#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \ + IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL) + +#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \ + CObject* PASCAL class_name::CreateObject() \ + { return new class_name; } \ + IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \ + class_name::CreateObject) + +#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \ + CObject* PASCAL class_name::CreateObject() \ + { return new class_name; } \ + _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \ + class_name::CreateObject) \ + static const AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \ + CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \ + { pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \ + return ar; } \ + +// optional bit for schema number that enables object versioning +#define VERSIONABLE_SCHEMA (0x80000000) + +///////////////////////////////////////////////////////////////////////////// +// other helpers + +// zero fill everything after the vtbl pointer +#define AFX_ZERO_INIT_OBJECT(base_class) \ + memset(((base_class*)this)+1, 0, sizeof(*this) - sizeof(class base_class)); + + +///////////////////////////////////////////////////////////////////////////// +// Exceptions + +class CException : public CObject +{ + // abstract class for dynamic type checking + DECLARE_DYNAMIC(CException) + +public: +// Constructors + CException(); // sets m_bAutoDelete = TRUE + CException(BOOL bAutoDelete); // sets m_bAutoDelete = bAutoDelete + +// Operations + void Delete(); // use to delete exception in 'catch' block + + virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, + PUINT pnHelpContext = NULL); + virtual int ReportError(UINT nType = MB_OK, UINT nMessageID = 0); + +// Implementation (setting m_bAutoDelete to FALSE is advanced) +public: + virtual ~CException(); + BOOL m_bAutoDelete; +#ifdef _DEBUG + void PASCAL operator delete(void* p); +protected: + BOOL m_bReadyForDelete; +#endif +}; + +class CSimpleException : public CException +{ + // base class for resource-critical MFC exceptions + // handles ownership and initialization of an error message + +public: +// Constructors + CSimpleException(); + CSimpleException(BOOL bAutoDelete); + +// Operations + virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, + PUINT pnHelpContext = NULL); + +// Implementation (setting m_bAutoDelete to FALSE is advanced) +public: + virtual ~CSimpleException(); + BOOL m_bAutoDelete; + + void InitString(); // used during MFC initialization + +protected: + BOOL m_bInitialized; + BOOL m_bLoaded; + TCHAR m_szMessage[128]; + UINT m_nResourceID; + +#ifdef _DEBUG + BOOL m_bReadyForDelete; +#endif +}; + +// helper routines for non-C++ EH implementations +#ifdef _AFX_OLD_EXCEPTIONS + BOOL AFXAPI AfxCatchProc(CRuntimeClass* pClass); + void AFXAPI AfxThrow(CException* pException); +#else + // for THROW_LAST auto-delete backward compatiblity + void AFXAPI AfxThrowLastCleanup(); +#endif + +// other out-of-line helper functions +void AFXAPI AfxTryCleanup(); + +#ifndef _AFX_JUMPBUF +// Use portable 'jmp_buf' defined by ANSI by default. +#define _AFX_JUMPBUF jmp_buf +#endif + +// Placed on frame for EXCEPTION linkage, or CException cleanup +struct AFX_EXCEPTION_LINK +{ +#ifdef _AFX_OLD_EXCEPTIONS + union + { + _AFX_JUMPBUF m_jumpBuf; + struct + { + void (PASCAL* pfnCleanup)(AFX_EXCEPTION_LINK* pLink); + void* pvData; // extra data follows + } m_callback; // callback for cleanup (nType != 0) + }; + UINT m_nType; // 0 for setjmp, !=0 for user extension +#endif //!_AFX_OLD_EXCEPTIONS + + AFX_EXCEPTION_LINK* m_pLinkPrev; // previous top, next in handler chain + CException* m_pException; // current exception (NULL in TRY block) + + AFX_EXCEPTION_LINK(); // for initialization and linking + ~AFX_EXCEPTION_LINK() // for cleanup and unlinking + { AfxTryCleanup(); }; +}; + +// Exception global state - never access directly +struct AFX_EXCEPTION_CONTEXT +{ + AFX_EXCEPTION_LINK* m_pLinkTop; + + // Note: most of the exception context is now in the AFX_EXCEPTION_LINK +}; + +#ifndef _PNH_DEFINED +typedef int (__cdecl * _PNH)( size_t ); +#define _PNH_DEFINED +#endif + +_PNH AFXAPI AfxGetNewHandler(); +_PNH AFXAPI AfxSetNewHandler(_PNH pfnNewHandler); +int AFX_CDECL AfxNewHandler(size_t nSize); + +void AFXAPI AfxAbort(); + +#ifdef _AFX_OLD_EXCEPTIONS + +// Obsolete and non-portable: setting terminate handler +// use CWinApp::ProcessWndProcException for Windows apps instead +// can also use set_terminate which is part of C++ standard library +// (these are provided for backward compatibility) +void AFXAPI AfxTerminate(); +typedef void (AFXAPI* AFX_TERM_PROC)(); +AFX_TERM_PROC AFXAPI AfxSetTerminate(AFX_TERM_PROC); + +#endif + +///////////////////////////////////////////////////////////////////////////// +// Exception macros using try, catch and throw +// (for backward compatibility to previous versions of MFC) + +#ifndef _AFX_OLD_EXCEPTIONS + +#define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try { + +#define CATCH(class, e) } catch (class* e) \ + { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \ + _afxExceptionLink.m_pException = e; + +#define AND_CATCH(class, e) } catch (class* e) \ + { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \ + _afxExceptionLink.m_pException = e; + +#define END_CATCH } } + +#define THROW(e) throw e +#define THROW_LAST() (AfxThrowLastCleanup(), throw) + +// Advanced macros for smaller code +#define CATCH_ALL(e) } catch (CException* e) \ + { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \ + _afxExceptionLink.m_pException = e; + +#define AND_CATCH_ALL(e) } catch (CException* e) \ + { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \ + _afxExceptionLink.m_pException = e; + +#define END_CATCH_ALL } } } + +#define END_TRY } catch (CException* e) \ + { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \ + _afxExceptionLink.m_pException = e; } } + +#else //_AFX_OLD_EXCEPTIONS + +///////////////////////////////////////////////////////////////////////////// +// Exception macros using setjmp and longjmp +// (for portability to compilers with no support for C++ exception handling) + +#define TRY \ + { AFX_EXCEPTION_LINK _afxExceptionLink; \ + if (::setjmp(_afxExceptionLink.m_jumpBuf) == 0) + +#define CATCH(class, e) \ + else if (::AfxCatchProc(RUNTIME_CLASS(class))) \ + { class* e = (class*)_afxExceptionLink.m_pException; + +#define AND_CATCH(class, e) \ + } else if (::AfxCatchProc(RUNTIME_CLASS(class))) \ + { class* e = (class*)_afxExceptionLink.m_pException; + +#define END_CATCH \ + } else { ::AfxThrow(NULL); } } + +#define THROW(e) AfxThrow(e) +#define THROW_LAST() AfxThrow(NULL) + +// Advanced macros for smaller code +#define CATCH_ALL(e) \ + else { CException* e = _afxExceptionLink.m_pException; + +#define AND_CATCH_ALL(e) \ + } else { CException* e = _afxExceptionLink.m_pException; + +#define END_CATCH_ALL } } + +#define END_TRY } + +#endif //_AFX_OLD_EXCEPTIONS + +///////////////////////////////////////////////////////////////////////////// +// Standard Exception classes + +class CMemoryException : public CSimpleException +{ + DECLARE_DYNAMIC(CMemoryException) +public: + CMemoryException(); + +// Implementation +public: + CMemoryException(BOOL bAutoDelete); + CMemoryException(BOOL bAutoDelete, UINT nResourceID); + virtual ~CMemoryException(); +}; + +class CNotSupportedException : public CSimpleException +{ + DECLARE_DYNAMIC(CNotSupportedException) +public: + CNotSupportedException(); + +// Implementation +public: + CNotSupportedException(BOOL bAutoDelete); + CNotSupportedException(BOOL bAutoDelete, UINT nResourceID); + virtual ~CNotSupportedException(); +}; + +class CArchiveException : public CException +{ + DECLARE_DYNAMIC(CArchiveException) +public: + enum { + none, + generic, + readOnly, + endOfFile, + writeOnly, + badIndex, + badClass, + badSchema + }; + +// Constructor + CArchiveException(int cause = CArchiveException::none, + LPCTSTR lpszArchiveName = NULL); + +// Attributes + int m_cause; + CString m_strFileName; + +// Implementation +public: + virtual ~CArchiveException(); +#ifdef _DEBUG + virtual void Dump(CDumpContext& dc) const; +#endif + virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, + PUINT pnHelpContext = NULL); +}; + +class CFileException : public CException +{ + DECLARE_DYNAMIC(CFileException) + +public: + enum { + none, + generic, + fileNotFound, + badPath, + tooManyOpenFiles, + accessDenied, + invalidFile, + removeCurrentDir, + directoryFull, + badSeek, + hardIO, + sharingViolation, + lockViolation, + diskFull, + endOfFile + }; + +// Constructor + CFileException(int cause = CFileException::none, LONG lOsError = -1, + LPCTSTR lpszArchiveName = NULL); + +// Attributes + int m_cause; + LONG m_lOsError; + CString m_strFileName; + +// Operations + // convert a OS dependent error code to a Cause + static int PASCAL OsErrorToException(LONG lOsError); + static int PASCAL ErrnoToException(int nErrno); + + // helper functions to throw exception after converting to a Cause + static void PASCAL ThrowOsError(LONG lOsError, LPCTSTR lpszFileName = NULL); + static void PASCAL ThrowErrno(int nErrno, LPCTSTR lpszFileName = NULL); + +// Implementation +public: + virtual ~CFileException(); +#ifdef _DEBUG + virtual void Dump(CDumpContext&) const; +#endif + virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, + PUINT pnHelpContext = NULL); +}; + +///////////////////////////////////////////////////////////////////////////// +// Standard exception throws + +void AFXAPI AfxThrowMemoryException(); +void AFXAPI AfxThrowNotSupportedException(); +void AFXAPI AfxThrowArchiveException(int cause, + LPCTSTR lpszArchiveName = NULL); +void AFXAPI AfxThrowFileException(int cause, LONG lOsError = -1, + LPCTSTR lpszFileName = NULL); + +///////////////////////////////////////////////////////////////////////////// +// File - raw unbuffered disk file I/O + +class CFile : public CObject +{ + DECLARE_DYNAMIC(CFile) + +public: +// Flag values + enum OpenFlags { + modeRead = 0x0000, + modeWrite = 0x0001, + modeReadWrite = 0x0002, + shareCompat = 0x0000, + shareExclusive = 0x0010, + shareDenyWrite = 0x0020, + shareDenyRead = 0x0030, + shareDenyNone = 0x0040, + modeNoInherit = 0x0080, + modeCreate = 0x1000, + modeNoTruncate = 0x2000, + typeText = 0x4000, // typeText and typeBinary are used in + typeBinary = (int)0x8000 // derived classes only + }; + + enum Attribute { + normal = 0x00, + readOnly = 0x01, + hidden = 0x02, + system = 0x04, + volume = 0x08, + directory = 0x10, + archive = 0x20 + }; + + enum SeekPosition { begin = 0x0, current = 0x1, end = 0x2 }; + + enum { hFileNull = -1 }; + +// Constructors + CFile(); + CFile(int hFile); + CFile(LPCTSTR lpszFileName, UINT nOpenFlags); + +// Attributes + UINT m_hFile; + operator HFILE() const; + + virtual DWORD GetPosition() const; + BOOL GetStatus(CFileStatus& rStatus) const; + virtual CString GetFileName() const; + virtual CString GetFileTitle() const; + virtual CString GetFilePath() const; + virtual void SetFilePath(LPCTSTR lpszNewName); + +// Operations + virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, + CFileException* pError = NULL); + + static void PASCAL Rename(LPCTSTR lpszOldName, + LPCTSTR lpszNewName); + static void PASCAL Remove(LPCTSTR lpszFileName); + static BOOL PASCAL GetStatus(LPCTSTR lpszFileName, + CFileStatus& rStatus); + static void PASCAL SetStatus(LPCTSTR lpszFileName, + const CFileStatus& status); + + DWORD SeekToEnd(); + void SeekToBegin(); + + // backward compatible ReadHuge and WriteHuge + DWORD ReadHuge(void* lpBuffer, DWORD dwCount); + void WriteHuge(const void* lpBuffer, DWORD dwCount); + +// Overridables + virtual CFile* Duplicate() const; + + virtual LONG Seek(LONG lOff, UINT nFrom); + virtual void SetLength(DWORD dwNewLen); + virtual DWORD GetLength() const; + + virtual UINT Read(void* lpBuf, UINT nCount); + virtual void Write(const void* lpBuf, UINT nCount); + + virtual void LockRange(DWORD dwPos, DWORD dwCount); + virtual void UnlockRange(DWORD dwPos, DWORD dwCount); + + virtual void Abort(); + virtual void Flush(); + virtual void Close(); + +// Implementation +public: + virtual ~CFile(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + enum BufferCommand { bufferRead, bufferWrite, bufferCommit, bufferCheck }; + virtual UINT GetBufferPtr(UINT nCommand, UINT nCount = 0, + void** ppBufStart = NULL, void** ppBufMax = NULL); + +protected: + BOOL m_bCloseOnDelete; + CString m_strFileName; +}; + +///////////////////////////////////////////////////////////////////////////// +// STDIO file implementation + +class CStdioFile : public CFile +{ + DECLARE_DYNAMIC(CStdioFile) + +public: +// Constructors + CStdioFile(); + CStdioFile(FILE* pOpenStream); + CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags); + +// Attributes + FILE* m_pStream; // stdio FILE + // m_hFile from base class is _fileno(m_pStream) + +// Operations + // reading and writing strings + virtual void WriteString(LPCTSTR lpsz); + virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax); + virtual BOOL ReadString(CString& rString); + +// Implementation +public: + virtual ~CStdioFile(); +#ifdef _DEBUG + void Dump(CDumpContext& dc) const; +#endif + virtual DWORD GetPosition() const; + virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, + CFileException* pError = NULL); + virtual UINT Read(void* lpBuf, UINT nCount); + virtual void Write(const void* lpBuf, UINT nCount); + virtual LONG Seek(LONG lOff, UINT nFrom); + virtual void Abort(); + virtual void Flush(); + virtual void Close(); + + // Unsupported APIs + virtual CFile* Duplicate() const; + virtual void LockRange(DWORD dwPos, DWORD dwCount); + virtual void UnlockRange(DWORD dwPos, DWORD dwCount); +}; + +//////////////////////////////////////////////////////////////////////////// +// Memory based file implementation + +class CMemFile : public CFile +{ + DECLARE_DYNAMIC(CMemFile) + +public: +// Constructors + CMemFile(UINT nGrowBytes = 1024); + CMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes = 0); + +// Operations + void Attach(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes = 0); + BYTE* Detach(); + +// Advanced Overridables +protected: + virtual BYTE* Alloc(DWORD nBytes); + virtual BYTE* Realloc(BYTE* lpMem, DWORD nBytes); + virtual BYTE* Memcpy(BYTE* lpMemTarget, const BYTE* lpMemSource, UINT nBytes); + virtual void Free(BYTE* lpMem); + virtual void GrowFile(DWORD dwNewLen); + +// Implementation +protected: + UINT m_nGrowBytes; + DWORD m_nPosition; + DWORD m_nBufferSize; + DWORD m_nFileSize; + BYTE* m_lpBuffer; + BOOL m_bAutoDelete; + +public: + virtual ~CMemFile(); +#ifdef _DEBUG + virtual void Dump(CDumpContext& dc) const; + virtual void AssertValid() const; +#endif + virtual DWORD GetPosition() const; + BOOL GetStatus(CFileStatus& rStatus) const; + virtual LONG Seek(LONG lOff, UINT nFrom); + virtual void SetLength(DWORD dwNewLen); + virtual UINT Read(void* lpBuf, UINT nCount); + virtual void Write(const void* lpBuf, UINT nCount); + virtual void Abort(); + virtual void Flush(); + virtual void Close(); + virtual UINT GetBufferPtr(UINT nCommand, UINT nCount = 0, + void** ppBufStart = NULL, void** ppBufMax = NULL); + + // Unsupported APIs + virtual CFile* Duplicate() const; + virtual void LockRange(DWORD dwPos, DWORD dwCount); + virtual void UnlockRange(DWORD dwPos, DWORD dwCount); +}; + +#ifndef _MAC + +//////////////////////////////////////////////////////////////////////////// +// Local file searches + +class CFileFind : public CObject +{ +public: + CFileFind(); + virtual ~CFileFind(); + +// Attributes +public: + DWORD GetLength() const; +#if defined(_X86_) || defined(_ALPHA_) + __int64 GetLength64() const; +#endif + virtual CString GetFileName() const; + virtual CString GetFilePath() const; + virtual CString GetFileTitle() const; + virtual CString GetFileURL() const; + virtual CString GetRoot() const; + + virtual BOOL GetLastWriteTime(FILETIME* pTimeStamp) const; + virtual BOOL GetLastAccessTime(FILETIME* pTimeStamp) const; + virtual BOOL GetCreationTime(FILETIME* pTimeStamp) const; + virtual BOOL GetLastWriteTime(CTime& refTime) const; + virtual BOOL GetLastAccessTime(CTime& refTime) const; + virtual BOOL GetCreationTime(CTime& refTime) const; + + virtual BOOL MatchesMask(DWORD dwMask) const; + + virtual BOOL IsDots() const; + // these aren't virtual because they all use MatchesMask(), which is + BOOL IsReadOnly() const; + BOOL IsDirectory() const; + BOOL IsCompressed() const; + BOOL IsSystem() const; + BOOL IsHidden() const; + BOOL IsTemporary() const; + BOOL IsNormal() const; + BOOL IsArchived() const; + +// Operations + void Close(); + virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwUnused = 0); + virtual BOOL FindNextFile(); + +protected: + virtual void CloseContext(); + +// Implementation +protected: + void* m_pFoundInfo; + void* m_pNextInfo; + HANDLE m_hContext; + BOOL m_bGotLast; + CString m_strRoot; + TCHAR m_chDirSeparator; // not '\\' for Internet classes + +#ifdef _DEBUG + void Dump(CDumpContext& dc) const; + void AssertValid() const; +#endif + + DECLARE_DYNAMIC(CFileFind) +}; + +#endif + +///////////////////////////////////////////////////////////////////////////// +// CTimeSpan and CTime + +class CTimeSpan +{ +public: + +// Constructors + CTimeSpan(); + CTimeSpan(time_t time); + CTimeSpan(LONG lDays, int nHours, int nMins, int nSecs); + + CTimeSpan(const CTimeSpan& timeSpanSrc); + const CTimeSpan& operator=(const CTimeSpan& timeSpanSrc); + +// Attributes + // extract parts + LONG GetDays() const; // total # of days + LONG GetTotalHours() const; + int GetHours() const; + LONG GetTotalMinutes() const; + int GetMinutes() const; + LONG GetTotalSeconds() const; + int GetSeconds() const; + +// Operations + // time math + CTimeSpan operator-(CTimeSpan timeSpan) const; + CTimeSpan operator+(CTimeSpan timeSpan) const; + const CTimeSpan& operator+=(CTimeSpan timeSpan); + const CTimeSpan& operator-=(CTimeSpan timeSpan); + BOOL operator==(CTimeSpan timeSpan) const; + BOOL operator!=(CTimeSpan timeSpan) const; + BOOL operator<(CTimeSpan timeSpan) const; + BOOL operator>(CTimeSpan timeSpan) const; + BOOL operator<=(CTimeSpan timeSpan) const; + BOOL operator>=(CTimeSpan timeSpan) const; + +#ifdef _UNICODE + // for compatibility with MFC 3.x + CString Format(LPCSTR pFormat) const; +#endif + CString Format(LPCTSTR pFormat) const; + CString Format(UINT nID) const; + + // serialization +#ifdef _DEBUG + friend CDumpContext& AFXAPI operator<<(CDumpContext& dc,CTimeSpan timeSpan); +#endif + friend CArchive& AFXAPI operator<<(CArchive& ar, CTimeSpan timeSpan); + friend CArchive& AFXAPI operator>>(CArchive& ar, CTimeSpan& rtimeSpan); + +private: + time_t m_timeSpan; + friend class CTime; +}; + +class CTime +{ +public: + +// Constructors + static CTime PASCAL GetCurrentTime(); + + CTime(); + CTime(time_t time); + CTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, + int nDST = -1); + CTime(WORD wDosDate, WORD wDosTime, int nDST = -1); + CTime(const CTime& timeSrc); + + CTime(const SYSTEMTIME& sysTime, int nDST = -1); + CTime(const FILETIME& fileTime, int nDST = -1); + const CTime& operator=(const CTime& timeSrc); + const CTime& operator=(time_t t); + +// Attributes + struct tm* GetGmtTm(struct tm* ptm = NULL) const; + struct tm* GetLocalTm(struct tm* ptm = NULL) const; + + time_t GetTime() const; + int GetYear() const; + int GetMonth() const; // month of year (1 = Jan) + int GetDay() const; // day of month + int GetHour() const; + int GetMinute() const; + int GetSecond() const; + int GetDayOfWeek() const; // 1=Sun, 2=Mon, ..., 7=Sat + +// Operations + // time math + CTimeSpan operator-(CTime time) const; + CTime operator-(CTimeSpan timeSpan) const; + CTime operator+(CTimeSpan timeSpan) const; + const CTime& operator+=(CTimeSpan timeSpan); + const CTime& operator-=(CTimeSpan timeSpan); + BOOL operator==(CTime time) const; + BOOL operator!=(CTime time) const; + BOOL operator<(CTime time) const; + BOOL operator>(CTime time) const; + BOOL operator<=(CTime time) const; + BOOL operator>=(CTime time) const; + + // formatting using "C" strftime + CString Format(LPCTSTR pFormat) const; + CString FormatGmt(LPCTSTR pFormat) const; + CString Format(UINT nFormatID) const; + CString FormatGmt(UINT nFormatID) const; + +#ifdef _UNICODE + // for compatibility with MFC 3.x + CString Format(LPCSTR pFormat) const; + CString FormatGmt(LPCSTR pFormat) const; +#endif + + // serialization +#ifdef _DEBUG + friend CDumpContext& AFXAPI operator<<(CDumpContext& dc, CTime time); +#endif + friend CArchive& AFXAPI operator<<(CArchive& ar, CTime time); + friend CArchive& AFXAPI operator>>(CArchive& ar, CTime& rtime); + +private: + time_t m_time; +}; + +///////////////////////////////////////////////////////////////////////////// +// File status + +struct CFileStatus +{ + CTime m_ctime; // creation date/time of file + CTime m_mtime; // last modification date/time of file + CTime m_atime; // last access date/time of file + LONG m_size; // logical size of file in bytes + BYTE m_attribute; // logical OR of CFile::Attribute enum values + BYTE _m_padding; // pad the structure to a WORD + TCHAR m_szFullName[_MAX_PATH]; // absolute path name + +#ifdef _DEBUG + void Dump(CDumpContext& dc) const; +#endif +}; + +///////////////////////////////////////////////////////////////////////////// +// Diagnostic memory management routines + +// Low level sanity checks for memory blocks +BOOL AFXAPI AfxIsValidAddress(const void* lp, + UINT nBytes, BOOL bReadWrite = TRUE); +BOOL AFXAPI AfxIsValidString(LPCWSTR lpsz, int nLength = -1); +BOOL AFXAPI AfxIsValidString(LPCSTR lpsz, int nLength = -1); + +#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT) + +// Memory tracking allocation +void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine); +#define DEBUG_NEW new(THIS_FILE, __LINE__) + +void* AFXAPI AfxAllocMemoryDebug(size_t nSize, BOOL bIsObject, + LPCSTR lpszFileName, int nLine); +void AFXAPI AfxFreeMemoryDebug(void* pbData, BOOL bIsObject); + +// Dump any memory leaks since program started +BOOL AFXAPI AfxDumpMemoryLeaks(); + +// Return TRUE if valid memory block of nBytes +BOOL AFXAPI AfxIsMemoryBlock(const void* p, UINT nBytes, + LONG* plRequestNumber = NULL); + +// Return TRUE if memory is sane or print out what is wrong +BOOL AFXAPI AfxCheckMemory(); + +#define afxMemDF _crtDbgFlag + +enum AfxMemDF // memory debug/diagnostic flags +{ + allocMemDF = 0x01, // turn on debugging allocator + delayFreeMemDF = 0x02, // delay freeing memory + checkAlwaysMemDF = 0x04 // AfxCheckMemory on every alloc/free +}; + +#ifdef _UNICODE +#define AfxOutputDebugString(lpsz) \ + do \ + { \ + int _convert; _convert = 0; \ + _RPT0(_CRT_WARN, W2CA(lpsz)); \ + } while (0) +#else +#define AfxOutputDebugString(lpsz) _RPT0(_CRT_WARN, lpsz) +#endif + +// turn on/off tracking for a short while +BOOL AFXAPI AfxEnableMemoryTracking(BOOL bTrack); + +// Advanced initialization: for overriding default diagnostics +BOOL AFXAPI AfxDiagnosticInit(void); + +// A failure hook returns whether to permit allocation +typedef BOOL (AFXAPI* AFX_ALLOC_HOOK)(size_t nSize, BOOL bObject, LONG lRequestNumber); + +// Set new hook, return old (never NULL) +AFX_ALLOC_HOOK AFXAPI AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook); + +// Debugger hook on specified allocation request - Obsolete +void AFXAPI AfxSetAllocStop(LONG lRequestNumber); + +// Memory state for snapshots/leak detection +struct CMemoryState +{ +// Attributes + enum blockUsage + { + freeBlock, // memory not used + objectBlock, // contains a CObject derived class object + bitBlock, // contains ::operator new data + crtBlock, + ignoredBlock, + nBlockUseMax // total number of usages + }; + + _CrtMemState m_memState; + LONG m_lCounts[nBlockUseMax]; + LONG m_lSizes[nBlockUseMax]; + LONG m_lHighWaterCount; + LONG m_lTotalCount; + + CMemoryState(); + +// Operations + void Checkpoint(); // fill with current state + BOOL Difference(const CMemoryState& oldState, + const CMemoryState& newState); // fill with difference + void UpdateData(); + + // Output to afxDump + void DumpStatistics() const; + void DumpAllObjectsSince() const; +}; + +// Enumerate allocated objects or runtime classes +void AFXAPI AfxDoForAllObjects(void (AFX_CDECL *pfn)(CObject* pObject, void* pContext), + void* pContext); +void AFXAPI AfxDoForAllClasses(void (AFX_CDECL *pfn)(const CRuntimeClass* pClass, + void* pContext), void* pContext); + +#else + +// non-_DEBUG_ALLOC version that assume everything is OK +#define DEBUG_NEW new +#define AfxCheckMemory() TRUE +#define AfxIsMemoryBlock(p, nBytes) TRUE +#define AfxEnableMemoryTracking(bTrack) FALSE +#define AfxOutputDebugString(lpsz) ::OutputDebugString(lpsz) + +// diagnostic initialization +#ifndef _DEBUG +#define AfxDiagnosticInit() TRUE +#else +BOOL AFXAPI AfxDiagnosticInit(void); +#endif + +#endif // _DEBUG + +///////////////////////////////////////////////////////////////////////////// +// Archives for serializing CObject data + +// needed for implementation +class CPtrArray; +class CMapPtrToPtr; +class CDocument; + +class CArchive +{ +public: +// Flag values + enum Mode { store = 0, load = 1, bNoFlushOnDelete = 2, bNoByteSwap = 4 }; + + CArchive(CFile* pFile, UINT nMode, int nBufSize = 4096, void* lpBuf = NULL); + ~CArchive(); + +// Attributes + BOOL IsLoading() const; + BOOL IsStoring() const; + BOOL IsByteSwapping() const; + BOOL IsBufferEmpty() const; + + CFile* GetFile() const; + UINT GetObjectSchema(); // only valid when reading a CObject* + void SetObjectSchema(UINT nSchema); + + // pointer to document being serialized -- must set to serialize + // COleClientItems in a document! + CDocument* m_pDocument; + +// Operations + UINT Read(void* lpBuf, UINT nMax); + void Write(const void* lpBuf, UINT nMax); + void Flush(); + void Close(); + void Abort(); // close and shutdown without exceptions + + // reading and writing strings + void WriteString(LPCTSTR lpsz); + LPTSTR ReadString(LPTSTR lpsz, UINT nMax); + BOOL ReadString(CString& rString); + +public: + // Object I/O is pointer based to avoid added construction overhead. + // Use the Serialize member function directly for embedded objects. + friend CArchive& AFXAPI operator<<(CArchive& ar, const CObject* pOb); + + friend CArchive& AFXAPI operator>>(CArchive& ar, CObject*& pOb); + friend CArchive& AFXAPI operator>>(CArchive& ar, const CObject*& pOb); + + // insertion operations + CArchive& operator<<(BYTE by); + CArchive& operator<<(WORD w); + CArchive& operator<<(LONG l); + CArchive& operator<<(DWORD dw); + CArchive& operator<<(float f); + CArchive& operator<<(double d); + + CArchive& operator<<(int i); + CArchive& operator<<(short w); + CArchive& operator<<(char ch); + CArchive& operator<<(unsigned u); + + // extraction operations + CArchive& operator>>(BYTE& by); + CArchive& operator>>(WORD& w); + CArchive& operator>>(DWORD& dw); + CArchive& operator>>(LONG& l); + CArchive& operator>>(float& f); + CArchive& operator>>(double& d); + + CArchive& operator>>(int& i); + CArchive& operator>>(short& w); + CArchive& operator>>(char& ch); + CArchive& operator>>(unsigned& u); + + // object read/write + CObject* ReadObject(const CRuntimeClass* pClass); + void WriteObject(const CObject* pOb); + // advanced object mapping (used for forced references) + void MapObject(const CObject* pOb); + + // advanced versioning support + void WriteClass(const CRuntimeClass* pClassRef); + CRuntimeClass* ReadClass(const CRuntimeClass* pClassRefRequested = NULL, + UINT* pSchema = NULL, DWORD* pObTag = NULL); + void SerializeClass(const CRuntimeClass* pClassRef); + + // advanced operations (used when storing/loading many objects) + void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128); + void SetLoadParams(UINT nGrowBy = 1024); + +// Implementation +public: + BOOL m_bForceFlat; // for COleClientItem implementation (default TRUE) + BOOL m_bDirectBuffer; // TRUE if m_pFile supports direct buffering + void FillBuffer(UINT nBytesNeeded); + void CheckCount(); // throw exception if m_nMapCount is too large + + // special functions for reading and writing (16-bit compatible) counts + DWORD ReadCount(); + void WriteCount(DWORD dwCount); + + // public for advanced use + UINT m_nObjectSchema; + CString m_strFileName; + +protected: + // archive objects cannot be copied or assigned + CArchive(const CArchive& arSrc); + void operator=(const CArchive& arSrc); + + BOOL m_nMode; + BOOL m_bUserBuf; + int m_nBufSize; + CFile* m_pFile; + BYTE* m_lpBufCur; + BYTE* m_lpBufMax; + BYTE* m_lpBufStart; + + // array/map for CObject* and CRuntimeClass* load/store + UINT m_nMapCount; + union + { + CPtrArray* m_pLoadArray; + CMapPtrToPtr* m_pStoreMap; + }; + // map to keep track of mismatched schemas + CMapPtrToPtr* m_pSchemaMap; + + // advanced parameters (controls performance with large archives) + UINT m_nGrowSize; + UINT m_nHashSize; +}; + +///////////////////////////////////////////////////////////////////////////// +// Diagnostic dumping + +class CDumpContext +{ +public: + CDumpContext(CFile* pFile = NULL); + +// Attributes + int GetDepth() const; // 0 => this object, 1 => children objects + void SetDepth(int nNewDepth); + +// Operations + CDumpContext& operator<<(LPCTSTR lpsz); +#ifdef _UNICODE + CDumpContext& operator<<(LPCSTR lpsz); // automatically widened +#else + CDumpContext& operator<<(LPCWSTR lpsz); // automatically thinned +#endif + CDumpContext& operator<<(const void* lp); + CDumpContext& operator<<(const CObject* pOb); + CDumpContext& operator<<(const CObject& ob); + CDumpContext& operator<<(BYTE by); + CDumpContext& operator<<(WORD w); + CDumpContext& operator<<(UINT u); + CDumpContext& operator<<(LONG l); + CDumpContext& operator<<(DWORD dw); + CDumpContext& operator<<(float f); + CDumpContext& operator<<(double d); + CDumpContext& operator<<(int n); + void HexDump(LPCTSTR lpszLine, BYTE* pby, int nBytes, int nWidth); + void Flush(); + +// Implementation +protected: + // dump context objects cannot be copied or assigned + CDumpContext(const CDumpContext& dcSrc); + void operator=(const CDumpContext& dcSrc); + void OutputString(LPCTSTR lpsz); + + int m_nDepth; + +public: + CFile* m_pFile; +}; + +#ifdef _DEBUG +extern AFX_DATA CDumpContext afxDump; +extern AFX_DATA BOOL afxTraceEnabled; +#endif + +///////////////////////////////////////////////////////////////////////////// +// Special include for Win32s compatibility + +#ifdef _AFX_PACKING +#pragma pack(pop) +#endif + +#ifndef __AFXCOLL_H__ + #include <afxcoll.h> + #ifndef __AFXSTATE_H__ + #include <afxstat_.h> // for _AFX_APP_STATE and _AFX_THREAD_STATE + #endif +#endif + +///////////////////////////////////////////////////////////////////////////// +// Inline function declarations + +#ifdef _AFX_ENABLE_INLINES +#define _AFX_INLINE inline +#include <afx.inl> +#endif + +#undef AFX_DATA +#define AFX_DATA + +#ifdef _AFX_MINREBUILD +#pragma component(minrebuild, on) +#endif +#ifndef _AFX_FULLTYPEINFO +#pragma component(mintypeinfo, off) +#endif + +#endif // __AFX_H__ + +///////////////////////////////////////////////////////////////////////////// |