Annotation of mstools/mfc/include/afx.h, revision 1.1

1.1     ! root        1: // Microsoft Foundation Classes C++ library.
        !             2: // Copyright (C) 1992 Microsoft Corporation,
        !             3: // All rights reserved.
        !             4: 
        !             5: // This source code is only intended as a supplement to the
        !             6: // Microsoft Foundation Classes Reference and Microsoft
        !             7: // QuickHelp documentation provided with the library.
        !             8: // See these sources for detailed information regarding the
        !             9: // Microsoft Foundation Classes product.
        !            10: 
        !            11: #ifndef __AFX_H__
        !            12: #define __AFX_H__
        !            13: 
        !            14: #define _MFC_VER 0x0100 /* Microsoft Foundation Classes */
        !            15: #define _AFX     1      /* Microsoft Application Framework Classes */
        !            16: 
        !            17: #ifndef __cplusplus
        !            18: #error Microsoft Foundation Classes require C++ compilation (use a .cpp suffix)
        !            19: #endif
        !            20: 
        !            21: /////////////////////////////////////////////////////////////////////////////
        !            22: // Classes declared in this file
        !            23: //   in addition to standard primitive data types and various helper macros
        !            24: 
        !            25: struct CRuntimeClass;                 // object type information
        !            26: 
        !            27: class CObject;                        // the root of all objects classes
        !            28: 
        !            29:        class CException;                 // the root of all exceptions
        !            30:                class CMemoryException;       // out-of-memory exception
        !            31:                class CNotSupportedException; // feature not supported exception
        !            32:                class CArchiveException;      // archive exception
        !            33:                class CFileException;         // file exception
        !            34: 
        !            35:        class CFile;                      // raw binary file
        !            36:                class CStdioFile;             // buffered stdio text/binary file
        !            37:                class CMemFile;               // memory based file
        !            38: 
        !            39: // Non CObject classes
        !            40: class CString;                        // growable string type
        !            41: class CTimeSpan;                      // time/date difference
        !            42: class CTime;                          // absolute time/date
        !            43: struct CFileStatus;                   // file status information
        !            44: struct CMemoryState;                  // diagnostic memory support
        !            45: 
        !            46: class CArchive;                       // object persistence tool
        !            47: class CDumpContext;                   // object diagnostic dumping
        !            48: 
        !            49: /////////////////////////////////////////////////////////////////////////////
        !            50: // Other includes from standard "C" runtimes
        !            51: 
        !            52: 
        !            53: #include <string.h>
        !            54: #include <stdio.h>
        !            55: #include <stdlib.h>
        !            56: #include <time.h>
        !            57: 
        !            58: /////////////////////////////////////////////////////////////////////////////
        !            59: // Target version control
        !            60: 
        !            61: // For target version (one of)
        !            62: //   _WINDOWS  : for Microsoft Windows target (defined by #include <afxwin.h>)
        !            63: //   _DOS      : for Microsoft DOS (non Windows) target
        !            64: //   _NTWIN    : with _WINDOWS is a Windows NT GUI application, by itself is a 
        !            65: //               character application (only <afx.h> applies)
        !            66: //
        !            67: // Additional build options:
        !            68: //   _DEBUG    : debug versions (full diagnostics)
        !            69: //
        !            70: // Internal version flags:
        !            71: //   _DOSWIN   : for Microsoft Windows and DOS target code (internal)
        !            72: //   _NEARDATA : ambient near data pointers needing far overloads
        !            73: 
        !            74: #if !defined(_WINDOWS) && !defined(_DOS) && !defined(_NTWIN)
        !            75: #error Please define one of _WINDOWS or _DOS or _NTWIN
        !            76: #endif
        !            77: 
        !            78: #if defined(_WINDOWS) && defined(_DOS)
        !            79: #error Please define only one of _WINDOWS or _DOS
        !            80: #endif
        !            81: 
        !            82: #ifndef _NTWIN
        !            83: #ifdef _WINDOWS
        !            84: #define _DOSWIN
        !            85: #endif
        !            86: 
        !            87: #ifdef _DOS
        !            88: #define _DOSWIN
        !            89: #endif
        !            90: #endif // _NTWIN
        !            91: 
        !            92: #if defined(_M_I86SM) || defined(_M_I86MM)
        !            93: #define _NEARDATA
        !            94: #endif
        !            95: 
        !            96: /////////////////////////////////////////////////////////////////////////////
        !            97: // Standard preprocessor symbols:
        !            98: 
        !            99: 
        !           100: #ifdef _DOSWIN
        !           101: #ifndef PASCAL
        !           102: #define PASCAL _pascal
        !           103: #endif
        !           104: 
        !           105: #ifndef CDECL
        !           106: #define CDECL _cdecl
        !           107: #endif
        !           108: 
        !           109: #ifndef FAR
        !           110: #define FAR _far
        !           111: #endif
        !           112: 
        !           113: #ifndef NEAR
        !           114: #define NEAR _near
        !           115: #endif
        !           116: 
        !           117: #else
        !           118: 
        !           119: extern "C" {
        !           120: #include <excpt.h>
        !           121: #include <windef.h>
        !           122: #include <winbase.h>
        !           123: }
        !           124: 
        !           125: #define BASED_CODE
        !           126: #undef _NEARDATA
        !           127: 
        !           128: #ifndef PASCAL
        !           129: #define PASCAL pascal
        !           130: #endif
        !           131: 
        !           132: #ifndef CDECL
        !           133: #define CDECL cdecl
        !           134: #endif
        !           135: 
        !           136: #ifndef FAR
        !           137: #define FAR far
        !           138: #endif
        !           139: 
        !           140: #ifndef NEAR
        !           141: #define NEAR near
        !           142: #endif
        !           143: 
        !           144: #define _huge
        !           145: #define huge
        !           146: #define pascal
        !           147: #define cdecl
        !           148: #define near
        !           149: #define far
        !           150: 
        !           151: #define _fstrcpy strcpy
        !           152: #define _fstrlen strlen
        !           153: #define _fstrcmp strcmp
        !           154: #define _fstrcat strcat
        !           155: #define _fstrncpy strncpy
        !           156: #define _fstrncmp strncmp
        !           157: #define _fmemcpy memcpy
        !           158: #define _fmalloc malloc
        !           159: #define _frealloc realloc
        !           160: #define _ffree free
        !           161: 
        !           162: #undef GetCurrentTime
        !           163: extern "C" unsigned long GetTickCount(void);
        !           164: inline unsigned long GetCurrentTime(void)
        !           165:        { return ::GetTickCount(); }
        !           166: 
        !           167: #endif
        !           168: 
        !           169: /////////////////////////////////////////////////////////////////////////////
        !           170: // Basic types (from Windows)
        !           171: 
        !           172: typedef unsigned char  BYTE;   // 8-bit unsigned entity
        !           173: typedef unsigned short WORD;   // 16-bit unsigned number
        !           174: typedef unsigned int   UINT;   // machine sized unsigned number (preferred)
        !           175: typedef long           LONG;   // 32-bit signed number
        !           176: typedef unsigned long DWORD;   // 32-bit unsigned number
        !           177: typedef int            BOOL;   // BOOLean (0 or !=0)
        !           178: 
        !           179: typedef void*      POSITION;   // abstract iteration position
        !           180: 
        !           181: // Standard constants
        !           182: #define FALSE   0
        !           183: #define TRUE    1
        !           184: #define NULL    0
        !           185: 
        !           186: /////////////////////////////////////////////////////////////////////////////
        !           187: // Diagnostic support
        !           188: 
        !           189: 
        !           190: #ifdef _DEBUG
        !           191: 
        !           192: extern "C"
        !           193: {
        !           194: void CDECL  AfxTrace(const char* pszFormat, ...);
        !           195: void PASCAL AfxAssertFailedLine(const char FAR* lpszFileName, int nLine);
        !           196: void PASCAL AfxAssertValidObject(const CObject* pOb);
        !           197: }
        !           198: #define TRACE              ::AfxTrace
        !           199: #define THIS_FILE          __FILE__
        !           200: #define ASSERT(f)          ((f) ? (void)0 : \
        !           201:                                                                ::AfxAssertFailedLine(THIS_FILE, __LINE__))
        !           202: #define VERIFY(f)          ASSERT(f)
        !           203: #define ASSERT_VALID(pOb)  (::AfxAssertValidObject(pOb))
        !           204: 
        !           205: #else
        !           206: 
        !           207: #define ASSERT(f)          ((void)0)
        !           208: #define VERIFY(f)          ((void)(f))
        !           209: #define ASSERT_VALID(pOb)  ((void)0)
        !           210: inline void CDECL AfxTrace(const char* /* pszFormat */, ...) { }
        !           211: #define TRACE              1 ? (void)0 : ::AfxTrace
        !           212: 
        !           213: #endif // _DEBUG
        !           214: 
        !           215: // Explicit extern for version API/Windows 3.0 loader problem
        !           216: #ifdef _WINDOWS
        !           217: extern "C" int FAR PASCAL __export _afx_version();
        !           218: #else
        !           219: extern "C" int FAR PASCAL _afx_version();
        !           220: #endif
        !           221: 
        !           222: // Turn off warnings for /W4
        !           223: // To resume any of these warning: #pragma warning(default: 4xxx)
        !           224: // which should be placed after the AFX include files
        !           225: #ifndef ALL_WARNINGS
        !           226: #pragma warning(disable: 4001)  // nameless unions are part of C++
        !           227: #pragma warning(disable: 4134)  // message map member fxn casts
        !           228: #pragma warning(disable: 4505)  // optimize away locals
        !           229: #pragma warning(disable: 4510)  // default constructors are bad to have
        !           230: #pragma warning(disable: 4511)  // private copy constructors are good to have
        !           231: #pragma warning(disable: 4512)  // private operator= are good to have
        !           232: #ifdef STRICT
        !           233: #pragma warning(disable: 4305)  // STRICT handles are near*, integer truncation
        !           234: #endif
        !           235: #endif
        !           236: 
        !           237: /////////////////////////////////////////////////////////////////////////////
        !           238: // Basic object model
        !           239: 
        !           240: struct CRuntimeClass
        !           241: {
        !           242: // Attributes
        !           243:        const char* m_pszClassName;
        !           244:        int m_nObjectSize;
        !           245:        UINT m_wSchema; // schema number of the loaded class
        !           246:        void (PASCAL *m_pfnConstruct)(void* p); // NULL => abstract class
        !           247:        CRuntimeClass* m_pBaseClass;
        !           248: 
        !           249: // Operations
        !           250:        CObject* CreateObject();
        !           251:        BOOL ConstructObject(void* pThis);
        !           252:        void Store(CArchive& ar);
        !           253:        static CRuntimeClass* Load(CArchive& ar, UINT* pwSchema);
        !           254: 
        !           255: // Implementation
        !           256:        static CRuntimeClass* pFirstClass; // start of class list
        !           257:        CRuntimeClass* m_pNextClass;       // linked list of registered classes
        !           258: };
        !           259: 
        !           260: 
        !           261: /////////////////////////////////////////////////////////////////////////////
        !           262: // class CObject is the root of all compliant objects
        !           263: 
        !           264: #if defined(_M_I86MM)
        !           265: // force vtables to be in far code segments for medium model
        !           266: class FAR CObjectRoot
        !           267: {
        !           268: protected:
        !           269:        virtual CRuntimeClass* GetRuntimeClass() NEAR const = 0;
        !           270: };
        !           271: 
        !           272: #pragma warning(disable: 4149)  // don't warn for medium model change
        !           273: class NEAR CObject : public CObjectRoot
        !           274: #else
        !           275: class CObject
        !           276: #endif
        !           277: {
        !           278: public:
        !           279: 
        !           280: // Object model (types, destruction, allocation)
        !           281:        virtual CRuntimeClass* GetRuntimeClass() const;
        !           282:        virtual ~CObject();  // virtual destructors are necessary
        !           283: 
        !           284:        // Diagnostic allocations
        !           285:        void* operator new(size_t, void* p);
        !           286:        void* operator new(size_t nSize);
        !           287:        void operator delete(void* p);
        !           288: 
        !           289: #ifdef _DEBUG
        !           290:        // for file name/line number tracking using DEBUG_NEW
        !           291:        void* operator new(size_t nSize, const char FAR* lpszFileName, int nLine);
        !           292: #endif
        !           293: 
        !           294:        // Disable the copy constructor and assignment by default so you will get
        !           295:        //   compiler errors instead of unexpected behaviour if you pass objects
        !           296:        //   by value or assign objects.
        !           297: protected:
        !           298:        CObject();
        !           299: private:
        !           300:        CObject(const CObject& objectSrc);
        !           301:        void operator=(const CObject& objectSrc);
        !           302: 
        !           303: // Attributes
        !           304: public:
        !           305:        BOOL IsSerializable() const;
        !           306: 
        !           307: // Overridables
        !           308:        virtual void Serialize(CArchive& ar);
        !           309: 
        !           310:        // Diagnostic Support
        !           311:        virtual void AssertValid() const;
        !           312:        virtual void Dump(CDumpContext& dc) const;
        !           313: 
        !           314: // Implementation
        !           315: public:
        !           316:        // dynamic type checking/construction support
        !           317:        BOOL IsKindOf(const CRuntimeClass* pClass) const;
        !           318:        static void PASCAL Construct(void* pMemory);
        !           319: 
        !           320:        static CRuntimeClass NEAR classCObject;
        !           321: };
        !           322: 
        !           323: #if defined(_M_I86MM)
        !           324: #pragma warning(default: 4149)  // base class now ambient
        !           325: #endif
        !           326: 
        !           327: 
        !           328: // Helper macros
        !           329: #define RUNTIME_CLASS(class_name)  \
        !           330:        (&class_name::class##class_name)
        !           331: 
        !           332: /////////////////////////////////////////////////////////////////////////////
        !           333: // Helper macros for declaring compliant classes
        !           334: 
        !           335: #define DECLARE_DYNAMIC(class_name) \
        !           336: public:                                 \
        !           337:        static CRuntimeClass NEAR class##class_name; \
        !           338:        virtual CRuntimeClass* GetRuntimeClass() const;
        !           339: 
        !           340: #define DECLARE_SERIAL(class_name)  \
        !           341:        DECLARE_DYNAMIC(class_name)     \
        !           342:        static void PASCAL Construct(void* p); \
        !           343:        friend CArchive& operator>>(CArchive& ar, class_name* &pOb);
        !           344: 
        !           345: // generate static object constructor for class registration
        !           346: struct NEAR CClassInit
        !           347:        { CClassInit(CRuntimeClass* pNewClass); };
        !           348: 
        !           349: #define IMPLEMENT_DYNAMIC(class_name, base_class_name)              \
        !           350:        CRuntimeClass NEAR class_name::class##class_name = {            \
        !           351:                #class_name, sizeof(class_name), 0xFFFF, NULL,              \
        !           352:                  &base_class_name::class##base_class_name, NULL };         \
        !           353:        static CClassInit _init_##class_name(&class_name::class##class_name);\
        !           354:        CRuntimeClass* class_name::GetRuntimeClass() const                  \
        !           355:                { return &class_name::class##class_name; }                      \
        !           356: // end of IMPLEMENT_DYNAMIC
        !           357: 
        !           358: #define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)  \
        !           359:        void    PASCAL class_name::Construct(void* p)                   \
        !           360:                { new(p) class_name; }                                          \
        !           361:        CRuntimeClass NEAR class_name::class##class_name = {                \
        !           362:                #class_name, sizeof(class_name), wSchema,                       \
        !           363:                  &class_name::Construct,                                       \
        !           364:                  &base_class_name::class##base_class_name, NULL };                 \
        !           365:        static CClassInit _init_##class_name(&class_name::class##class_name);\
        !           366:        CRuntimeClass* class_name::GetRuntimeClass() const                  \
        !           367:                { return &class_name::class##class_name; }                      \
        !           368:        CArchive& operator>>(CArchive& ar, class_name* &pOb) \
        !           369:                { ar >> (CObject*&) pOb; \
        !           370:                  if ((pOb != NULL) && !pOb->IsKindOf(RUNTIME_CLASS(class_name))) \
        !           371:                        AfxThrowArchiveException(CArchiveException::badClass);\
        !           372:                  return ar; }                                          \
        !           373: // end of IMPLEMENT_SERIAL
        !           374: 
        !           375: /////////////////////////////////////////////////////////////////////////////
        !           376: // setjmp for Windows and C++
        !           377: 
        !           378: #ifdef _NTWIN
        !           379: typedef  int  jmp_buf[8];
        !           380: #else
        !           381: typedef  int  jmp_buf[9];
        !           382: #endif
        !           383: 
        !           384: #ifdef _NTWIN
        !           385: #define setjmp _setjmp
        !           386: #endif
        !           387: 
        !           388: #if defined(_WINDOWS) && defined(_DOSWIN)
        !           389: extern "C" int  far pascal Catch(int FAR*);
        !           390: #define setjmp  ::Catch
        !           391: #else
        !           392: extern "C" int  __cdecl setjmp(jmp_buf);
        !           393: #endif
        !           394: 
        !           395: 
        !           396: /////////////////////////////////////////////////////////////////////////////
        !           397: // Exceptions
        !           398: 
        !           399: typedef void (CDECL *AFX_TERM_PROC)();
        !           400: struct CExceptionLink;
        !           401: 
        !           402: AFX_TERM_PROC AfxSetTerminate(AFX_TERM_PROC);
        !           403: 
        !           404: void CDECL AfxAbort();
        !           405: void CDECL AfxTerminate();
        !           406: 
        !           407: class CException : public CObject
        !           408: {
        !           409:        // abstract class for dynamic type checking
        !           410:        DECLARE_DYNAMIC(CException)
        !           411: };
        !           412: 
        !           413: // Exception global state - never access directly
        !           414: struct CExceptionContext
        !           415: {
        !           416:        CException* m_pCurrent;
        !           417:        BOOL m_bDeleteWhenDone;
        !           418:        CExceptionLink* m_pLinkTop;
        !           419: 
        !           420:        void Throw(CException* pNewException);
        !           421:        void Throw(CException* pNewException, BOOL bShared);
        !           422:        void ThrowLast();
        !           423: 
        !           424:        void Cleanup(); // call to free up exception
        !           425: };
        !           426: extern CExceptionContext NEAR afxExceptionContext;
        !           427: 
        !           428: // Placed on frame for EXCEPTION linkage
        !           429: struct CExceptionLink
        !           430: {
        !           431:        CExceptionLink* m_pLinkPrev;// previous top, next in handler chain
        !           432:        jmp_buf         m_jumpBuf;   // arg for setjmp/longjmp
        !           433: 
        !           434:        CExceptionLink(CExceptionLink* NEAR& rLinkTop);
        !           435:        ~CExceptionLink();
        !           436: };
        !           437: 
        !           438: /////////////////////////////////////////////////////////////////////////////
        !           439: // Exception helper macros
        !           440: 
        !           441: #define TRY \
        !           442:        { \
        !           443:        CExceptionLink _afxExLink(afxExceptionContext.m_pLinkTop); \
        !           444:        if (setjmp(_afxExLink.m_jumpBuf) == 0) \
        !           445: 
        !           446: #define CATCH(class, e) \
        !           447:        else { if (afxExceptionContext.m_pCurrent->IsKindOf(RUNTIME_CLASS(class)))\
        !           448:        { class* e = (class*) afxExceptionContext.m_pCurrent;
        !           449: 
        !           450: #define AND_CATCH(class, e) \
        !           451:        } else if (afxExceptionContext.m_pCurrent->IsKindOf(RUNTIME_CLASS(class)))\
        !           452:        { class* e = (class*) afxExceptionContext.m_pCurrent;
        !           453: 
        !           454: #define END_CATCH \
        !           455:        } else { THROW(afxExceptionContext.m_pCurrent); } \
        !           456:    afxExceptionContext.Cleanup(); } }
        !           457: 
        !           458: #define THROW(e) \
        !           459:        afxExceptionContext.Throw(e);
        !           460: #define THROW_LAST() \
        !           461:        afxExceptionContext.ThrowLast();
        !           462: 
        !           463: /////////////////////////////////////////////////////////////////////////////
        !           464: // Standard Exception classes
        !           465: 
        !           466: class CMemoryException : public CException
        !           467: {
        !           468:        DECLARE_DYNAMIC(CMemoryException)
        !           469: public: 
        !           470:        CMemoryException();
        !           471: };
        !           472: 
        !           473: class CNotSupportedException : public CException
        !           474: {
        !           475:        DECLARE_DYNAMIC(CNotSupportedException)
        !           476: public: 
        !           477:        CNotSupportedException();
        !           478: };
        !           479: 
        !           480: class CArchiveException : public CException
        !           481: {
        !           482:        DECLARE_DYNAMIC(CArchiveException)
        !           483: public:
        !           484:        enum {
        !           485:                none,
        !           486:                generic,
        !           487:                readOnly,
        !           488:                endOfFile,
        !           489:                writeOnly,
        !           490:                badIndex,
        !           491:                badClass,
        !           492:                badSchema
        !           493:        };
        !           494: 
        !           495: // Constructor
        !           496:        CArchiveException(int cause = CArchiveException::none);
        !           497: 
        !           498: // Attributes
        !           499:        int m_cause;
        !           500: 
        !           501: #ifdef _DEBUG
        !           502:        virtual void Dump(CDumpContext& dc) const;
        !           503: #endif
        !           504: };
        !           505: 
        !           506: class CFileException : public CException
        !           507: {
        !           508:        DECLARE_DYNAMIC(CFileException)
        !           509: 
        !           510: public:
        !           511:        enum {
        !           512:                none,
        !           513:                generic,
        !           514:                fileNotFound,
        !           515:                badPath,
        !           516:                tooManyOpenFiles,
        !           517:                accessDenied,
        !           518:                invalidFile,
        !           519:                removeCurrentDir,
        !           520:                directoryFull,
        !           521:                badSeek,
        !           522:                hardIO,
        !           523:                sharingViolation,
        !           524:                lockViolation,
        !           525:                diskFull,
        !           526:                endOfFile,
        !           527:        };
        !           528: 
        !           529: // Constructors
        !           530: 
        !           531:        CFileException(int cause = CFileException::none, LONG lOsError = -1);
        !           532: 
        !           533: // Attributes
        !           534:        int  m_cause;
        !           535:        LONG m_lOsError;
        !           536: 
        !           537: // Operations
        !           538: 
        !           539:        // convert a OS dependent error code to a Cause
        !           540:        static int OsErrorToException(LONG lOsError);
        !           541:        static int ErrnoToException(int nErrno);
        !           542:        
        !           543:        // helper functions to throw exception after converting to a Cause
        !           544:        static void ThrowOsError(LONG lOsError);
        !           545:        static void ThrowErrno(int nErrno);
        !           546: 
        !           547: #ifdef _DEBUG
        !           548:        virtual void Dump(CDumpContext&) const;
        !           549: #endif
        !           550: };
        !           551: 
        !           552: /////////////////////////////////////////////////////////////////////////////
        !           553: // Standard exception throws
        !           554: 
        !           555: void PASCAL AfxThrowMemoryException();
        !           556: void PASCAL AfxThrowNotSupportedException();
        !           557: void PASCAL AfxThrowArchiveException(int cause);
        !           558: void PASCAL AfxThrowFileException(int cause, LONG lOsError = -1);
        !           559: 
        !           560: 
        !           561: /////////////////////////////////////////////////////////////////////////////
        !           562: // File - raw unbuffered disk file I/O 
        !           563: 
        !           564: class CFile : public CObject
        !           565: {
        !           566:        DECLARE_DYNAMIC(CFile)
        !           567: 
        !           568: public:
        !           569: // Flag values
        !           570:        enum OpenFlags {
        !           571:                modeRead =          0x0000,
        !           572:                modeWrite =         0x0001,
        !           573:                modeReadWrite =     0x0002,
        !           574:                shareCompat =       0x0000,
        !           575:                shareExclusive =    0x0010,
        !           576:                shareDenyWrite =    0x0020,
        !           577:                shareDenyRead =     0x0030,
        !           578:                shareDenyNone =     0x0040,
        !           579:                modeNoInherit =     0x0080,
        !           580:                modeCreate =        0x1000,
        !           581:                typeText =          0x4000, // typeText and typeBinary are used in
        !           582:                typeBinary =   (int)0x8000 // derived classes only
        !           583:                };
        !           584: 
        !           585:        enum Attribute {
        !           586:                normal =    0x00,
        !           587:                readOnly =  0x01,
        !           588:                hidden =    0x02,
        !           589:                system =    0x04,
        !           590:                volume =    0x08,
        !           591:                directory = 0x10,
        !           592:                archive =   0x20
        !           593:                };
        !           594: 
        !           595:        enum SeekPosition { begin = 0x0, current = 0x1, end = 0x2 };
        !           596: 
        !           597:        enum {hFileNull = -1};
        !           598: 
        !           599: // Constructors
        !           600:        CFile();
        !           601:        CFile(int hFile);
        !           602:        CFile(const char* pszFileName, UINT nOpenFlags);
        !           603: 
        !           604: // Attributes
        !           605:        UINT m_hFile;
        !           606: 
        !           607:        virtual DWORD GetPosition() const;
        !           608:        virtual BOOL GetStatus(CFileStatus& rStatus) const;
        !           609: 
        !           610: // Operations
        !           611:        virtual BOOL Open(const char* pszFileName, UINT nOpenFlags, CFileException* pError = NULL);
        !           612: 
        !           613:        static void Rename(const char* pszOldName, const char* pszNewName);
        !           614:        static void Remove(const char* pszFileName);
        !           615:        static BOOL GetStatus(const char* pszFileName, CFileStatus& rStatus);
        !           616:        static void SetStatus(const char* pszFileName, const CFileStatus& status);
        !           617: 
        !           618:        DWORD   SeekToEnd();
        !           619:        void    SeekToBegin();
        !           620: 
        !           621: // Overridables
        !           622:        virtual CFile* Duplicate() const;
        !           623: 
        !           624:        virtual LONG Seek(LONG lOff, UINT nFrom);
        !           625:        virtual void SetLength(DWORD dwNewLen);
        !           626:        virtual DWORD GetLength() const;
        !           627: 
        !           628:        virtual UINT Read(void FAR* lpBuf, UINT nCount);
        !           629:        virtual void Write(const void FAR* lpBuf, UINT nCount);
        !           630: 
        !           631:        virtual void LockRange(DWORD dwPos, DWORD dwCount);
        !           632:        virtual void UnlockRange(DWORD dwPos, DWORD dwCount);
        !           633: 
        !           634:        virtual void Flush();
        !           635:        virtual void Close();
        !           636: 
        !           637: #ifdef _DEBUG
        !           638:        virtual void AssertValid() const;
        !           639:        virtual void Dump(CDumpContext& dc) const;
        !           640: #endif
        !           641: 
        !           642: // Implementation
        !           643:        virtual ~CFile();
        !           644: protected:
        !           645:        BOOL m_bCloseOnDelete;
        !           646: };
        !           647: 
        !           648: /////////////////////////////////////////////////////////////////////////////
        !           649: // STDIO file implementation
        !           650: 
        !           651: class CStdioFile : public CFile
        !           652: {
        !           653:        DECLARE_DYNAMIC(CStdioFile)
        !           654: 
        !           655: public:
        !           656: // Constructors
        !           657:        CStdioFile();
        !           658:        CStdioFile(FILE* pOpenStream);
        !           659:        CStdioFile(const char* pszFileName, UINT nOpenFlags);
        !           660: 
        !           661: // Attributes
        !           662:        FILE* m_pStream;    // stdio FILE
        !           663:                                                // m_hFile from base class is _fileno(m_pStream)
        !           664: 
        !           665:        virtual DWORD GetPosition() const;
        !           666: 
        !           667: // Overridables
        !           668:        virtual BOOL Open(const char* pszFileName, UINT nOpenFlags, CFileException* pError = NULL);
        !           669:        virtual UINT Read(void FAR* lpBuf, UINT nCount);
        !           670:        virtual void Write(const void FAR* lpBuf, UINT nCount);
        !           671:        virtual LONG Seek(LONG lOff, UINT nFrom);
        !           672:        virtual void Flush();
        !           673:        virtual void Close();
        !           674: 
        !           675:        virtual void WriteString(const char FAR* lpsz); // write a string, like "C" fputs
        !           676:        virtual char FAR* ReadString(char FAR* lpsz, UINT nMax); // like "C" fgets
        !           677: 
        !           678:        // Unsupported APIs
        !           679:        virtual CFile* Duplicate() const;
        !           680:        virtual void LockRange(DWORD dwPos, DWORD dwCount);
        !           681:        virtual void UnlockRange(DWORD dwPos, DWORD dwCount);
        !           682: 
        !           683: 
        !           684: #ifdef _DEBUG
        !           685:        void Dump(CDumpContext& dc) const;
        !           686: #endif
        !           687: // Implementation
        !           688:        virtual ~CStdioFile();
        !           689: };
        !           690: 
        !           691: ////////////////////////////////////////////////////////////////////////////
        !           692: // Memory based file implementation
        !           693: 
        !           694: class CMemFile : public CFile
        !           695: {
        !           696:        DECLARE_DYNAMIC(CMemFile)
        !           697: 
        !           698: public:
        !           699: // Constructors
        !           700:        CMemFile(UINT nGrowBytes = 1024);
        !           701: 
        !           702: // Attributes
        !           703:        virtual DWORD GetPosition() const;
        !           704:        virtual BOOL GetStatus(CFileStatus& rStatus) const;
        !           705: 
        !           706: // Overridables
        !           707:        virtual LONG Seek(LONG lOff, UINT nFrom);
        !           708:        virtual void SetLength(DWORD dwNewLen);
        !           709:        virtual UINT Read(void FAR* lpBuf, UINT nCount);
        !           710:        virtual void Write(const void FAR* lpBuf, UINT nCount);
        !           711:        virtual void Flush();
        !           712:        virtual void Close();
        !           713: 
        !           714: #ifdef _DEBUG
        !           715:        virtual void Dump(CDumpContext& dc) const;
        !           716:        virtual void AssertValid() const;
        !           717: #endif
        !           718: 
        !           719:        // Unsupported APIs
        !           720:        virtual CFile* Duplicate() const;
        !           721:        virtual void LockRange(DWORD dwPos, DWORD dwCount);
        !           722:        virtual void UnlockRange(DWORD dwPos, DWORD dwCount);
        !           723: 
        !           724: 
        !           725: // Implementation
        !           726:        virtual ~CMemFile();
        !           727: 
        !           728: protected:
        !           729:        virtual BYTE FAR* Alloc(UINT nBytes);
        !           730:        virtual BYTE FAR* Realloc(BYTE FAR* lpMem, UINT nBytes);
        !           731:        virtual BYTE FAR* Memcpy(BYTE FAR* lpMemTarget, const BYTE FAR* lpMemSource, UINT nCount);
        !           732:        virtual void Free(BYTE FAR* lpMem);
        !           733:        virtual void GrowFile(DWORD dwNewLen);
        !           734: 
        !           735:        UINT m_nGrowBytes;
        !           736:        UINT m_nPosition;
        !           737:        UINT m_nBufferSize;
        !           738:        UINT m_nFileSize;
        !           739:        BYTE FAR* m_lpBuffer;
        !           740: };
        !           741: 
        !           742: /////////////////////////////////////////////////////////////////////////////
        !           743: // Strings
        !           744: 
        !           745: class CString
        !           746: {
        !           747: public:
        !           748: 
        !           749: // Constructors
        !           750:        CString();
        !           751:        CString(const CString& stringSrc);
        !           752:        CString(char ch, int nRepeat = 1);
        !           753:        CString(const char* psz);
        !           754:        CString(const char* pch, int nLength);
        !           755: #ifdef _NEARDATA
        !           756:        // Additional versions for far string data
        !           757:        CString(const char FAR* lpsz);
        !           758:        CString(const char FAR* lpch, int nLength);
        !           759: #endif
        !           760:        ~CString();
        !           761: 
        !           762: // Attributes & Operations
        !           763: 
        !           764:        // as an array of characters
        !           765:        int GetLength() const;
        !           766:        BOOL IsEmpty() const;
        !           767:        void Empty();  // free up the data
        !           768: 
        !           769:        char GetAt(int nIndex) const;       // 0 based
        !           770:        char operator[](int nIndex) const;  // same as GetAt
        !           771:        void SetAt(int nIndex, char ch);
        !           772:        operator const char*() const;       // as a C string
        !           773: 
        !           774:        // overloaded assignment
        !           775:        const CString& operator=(const CString& stringSrc);
        !           776:        const CString& operator=(char ch);
        !           777:        const CString& operator=(const char* psz);
        !           778: 
        !           779:        // string concatenation
        !           780:        const CString& operator+=(const CString& string);
        !           781:        const CString& operator+=(char ch);
        !           782:        const CString& operator+=(const char* psz);
        !           783: 
        !           784:        friend CString operator+(const CString& string1, const CString& string2);
        !           785:        friend CString operator+(const CString& string, char ch);
        !           786:        friend CString operator+(char ch, const CString& string);
        !           787:        friend CString operator+(const CString& string, const char* psz);
        !           788:        friend CString operator+(const char* psz, const CString& string);
        !           789: 
        !           790:        // string comparison
        !           791:        int Compare(const char* psz) const;         // straight character
        !           792:        int CompareNoCase(const char* psz) const;   // ignore case
        !           793:        int Collate(const char* psz) const;         // NLS aware
        !           794: 
        !           795:        // simple sub-string extraction
        !           796:        CString Mid(int nFirst, int nCount) const;
        !           797:        CString Mid(int nFirst) const;
        !           798:        CString Left(int nCount) const;
        !           799:        CString Right(int nCount) const;
        !           800: 
        !           801:        CString SpanIncluding(const char* pszCharSet) const;
        !           802:        CString SpanExcluding(const char* pszCharSet) const;
        !           803: 
        !           804:        // upper/lower/reverse conversion
        !           805:        void MakeUpper();
        !           806:        void MakeLower();
        !           807:        void MakeReverse();
        !           808: 
        !           809:        // searching (return starting index, or -1 if not found)
        !           810:        // look for a single character match
        !           811:        int Find(char ch) const;                    // like "C" strchr
        !           812:        int ReverseFind(char ch) const;
        !           813:        int FindOneOf(const char* pszCharSet) const;
        !           814: 
        !           815:        // look for a specific sub-string
        !           816:        int Find(const char* pszSub) const;         // like "C" strstr
        !           817: 
        !           818:        // input and output
        !           819: #ifdef _DEBUG
        !           820:        friend CDumpContext& operator<<(CDumpContext&, const CString& string);
        !           821: #endif
        !           822:        friend CArchive& operator<<(CArchive& ar, const CString& string);
        !           823:        friend CArchive& operator>>(CArchive& ar, CString& string);
        !           824: 
        !           825:        // Windows support
        !           826: #ifdef _WINDOWS
        !           827:        BOOL LoadString(UINT nID);          // load from string resource
        !           828:                                                                                // 255 chars max
        !           829:        // ANSI<->OEM support (convert string in place)
        !           830:        void AnsiToOem();
        !           831:        void OemToAnsi();
        !           832: #endif //_WINDOWS
        !           833: 
        !           834:        // Access to string implementation buffer as "C" character array
        !           835:        char* GetBuffer(int nMinBufLength);
        !           836:        void ReleaseBuffer(int nNewLength = -1);
        !           837:        char* GetBufferSetLength(int nNewLength);
        !           838: 
        !           839: // Implementation
        !           840: protected:
        !           841:        // lengths/sizes in characters
        !           842:        //  (note: an extra character is always allocated)
        !           843:        char* m_pchData;            // actual string (zero terminated)
        !           844:        int m_nDataLength;          // does not include terminating 0
        !           845:        int m_nAllocLength;         // does not include terminating 0
        !           846: 
        !           847:        // implementation helpers
        !           848:        void Init();
        !           849:        void AllocCopy(CString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const;
        !           850:        void AllocBuffer(int nLen);
        !           851:        void AssignCopy(int nSrcLen, const char* pszSrcData);
        !           852:        void ConcatCopy(int nSrc1Len, const char* pszSrc1Data, int nSrc2Len, const char* pszSrc2Data);
        !           853:        void ConcatInPlace(int nSrcLen, const char* pszSrcData);
        !           854: };
        !           855: 
        !           856: 
        !           857: // Compare helpers
        !           858: BOOL operator==(const CString& s1, const CString& s2);
        !           859: BOOL operator==(const CString& s1, const char* s2);
        !           860: BOOL operator==(const char* s1, const CString& s2);
        !           861: BOOL operator!=(const CString& s1, const CString& s2);
        !           862: BOOL operator!=(const CString& s1, const char* s2);
        !           863: BOOL operator!=(const char* s1, const CString& s2);
        !           864: BOOL operator<(const CString& s1, const CString& s2);
        !           865: BOOL operator<(const CString& s1, const char* s2);
        !           866: BOOL operator<(const char* s1, const CString& s2);
        !           867: BOOL operator>(const CString& s1, const CString& s2);
        !           868: BOOL operator>(const CString& s1, const char* s2);
        !           869: BOOL operator>(const char* s1, const CString& s2);
        !           870: BOOL operator<=(const CString& s1, const CString& s2);
        !           871: BOOL operator<=(const CString& s1, const char* s2);
        !           872: BOOL operator<=(const char* s1, const CString& s2);
        !           873: BOOL operator>=(const CString& s1, const CString& s2);
        !           874: BOOL operator>=(const CString& s1, const char* s2);
        !           875: BOOL operator>=(const char* s1, const CString& s2);
        !           876: 
        !           877: /////////////////////////////////////////////////////////////////////////////
        !           878: // CTimeSpan and CTime
        !           879: 
        !           880: class CTimeSpan
        !           881: {
        !           882: public:
        !           883: 
        !           884: // Constructors
        !           885:        CTimeSpan();
        !           886:        CTimeSpan(time_t time);
        !           887:        CTimeSpan(LONG lDays, int nHours, int nMins, int nSecs);
        !           888: 
        !           889:        CTimeSpan(const CTimeSpan& timeSpanSrc);
        !           890:        const CTimeSpan& operator=(const CTimeSpan& timeSpanSrc);
        !           891: 
        !           892: // Attributes
        !           893:        // extract parts
        !           894:        LONG GetDays() const;   // total # of days
        !           895:        LONG GetTotalHours() const;
        !           896:        int GetHours() const;
        !           897:        LONG GetTotalMinutes() const;
        !           898:        int GetMinutes() const;
        !           899:        LONG GetTotalSeconds() const;
        !           900:        int GetSeconds() const;
        !           901: 
        !           902: // Operations
        !           903:        // time math
        !           904:        CTimeSpan operator-(CTimeSpan timeSpan) const;
        !           905:        CTimeSpan operator+(CTimeSpan timeSpan) const;
        !           906:        const CTimeSpan& operator+=(CTimeSpan timeSpan);
        !           907:        const CTimeSpan& operator-=(CTimeSpan timeSpan);
        !           908:        BOOL operator==(CTimeSpan timeSpan) const;
        !           909:        BOOL operator!=(CTimeSpan timeSpan) const;
        !           910:        BOOL operator<(CTimeSpan timeSpan) const;
        !           911:        BOOL operator>(CTimeSpan timeSpan) const;
        !           912:        BOOL operator<=(CTimeSpan timeSpan) const;
        !           913:        BOOL operator>=(CTimeSpan timeSpan) const;
        !           914: 
        !           915: #ifndef _WINDLL
        !           916:        CString Format(const char* pFormat);
        !           917: #endif //!_WINDLL
        !           918: 
        !           919:        // serialization
        !           920: #ifdef _DEBUG
        !           921:        friend CDumpContext& operator<<(CDumpContext& dc, CTimeSpan timeSpan);
        !           922: #endif
        !           923:        friend CArchive& operator<<(CArchive& ar, CTimeSpan timeSpan);
        !           924:        friend CArchive& operator>>(CArchive& ar, CTimeSpan& rtimeSpan);
        !           925: 
        !           926: private:
        !           927:        time_t m_timeSpan;
        !           928:        friend class CTime;
        !           929: };
        !           930: 
        !           931: 
        !           932: class CTime
        !           933: {
        !           934: public:
        !           935: 
        !           936: // Constructors
        !           937:        static  CTime GetCurrentTime();
        !           938: 
        !           939:        CTime();
        !           940:        CTime(time_t time);
        !           941:        CTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec);
        !           942:        CTime(WORD wDosDate, WORD wDosTime);
        !           943:        CTime(const CTime& timeSrc);
        !           944: 
        !           945: #ifdef _NTWIN
        !           946:        struct _SYSTEMTIME;
        !           947:        struct _FILETIME;
        !           948:        CTime(const _SYSTEMTIME& sysTime);
        !           949:        CTime(const _FILETIME& fileTime);
        !           950: #endif
        !           951: 
        !           952:        const CTime& operator=(const CTime& timeSrc);
        !           953:        const CTime& operator=(time_t t);
        !           954: 
        !           955: // Attributes
        !           956:        struct tm* GetGmtTm(struct tm* ptm = NULL) const;
        !           957:        struct tm* GetLocalTm(struct tm* ptm = NULL) const;
        !           958: 
        !           959:        time_t  GetTime() const;
        !           960:        int GetYear() const;
        !           961:        int GetMonth() const;       // month of year (1 = Jan)
        !           962:        int GetDay() const;         // day of month
        !           963:        int GetHour() const;
        !           964:        int GetMinute() const;
        !           965:        int GetSecond() const;
        !           966:        int GetDayOfWeek() const;   // 1=Sun, 2=Mon, ..., 7=Sat
        !           967: 
        !           968: // Operations
        !           969:        // time math
        !           970:        CTimeSpan operator-(CTime time) const;
        !           971:        CTime operator-(CTimeSpan timeSpan) const;
        !           972:        CTime operator+(CTimeSpan timeSpan) const;
        !           973:        const CTime& operator+=(CTimeSpan timeSpan);
        !           974:        const CTime& operator-=(CTimeSpan timeSpan);
        !           975:        BOOL operator==(CTime time) const;
        !           976:        BOOL operator!=(CTime time) const;
        !           977:        BOOL operator<(CTime time) const;
        !           978:        BOOL operator>(CTime time) const;
        !           979:        BOOL operator<=(CTime time) const;
        !           980:        BOOL operator>=(CTime time) const;
        !           981: 
        !           982:        // formatting using "C" strftime
        !           983: #ifndef _WINDLL
        !           984:        CString Format(const char* pFormat);
        !           985:        CString FormatGmt(const char* pFormat);
        !           986: #endif //!_WINDLL
        !           987: 
        !           988:        // serialization
        !           989: #ifdef _DEBUG
        !           990:        friend CDumpContext& operator<<(CDumpContext& dc, CTime time);
        !           991: #endif
        !           992:        friend CArchive& operator<<(CArchive& ar, CTime time);
        !           993:        friend CArchive& operator>>(CArchive& ar, CTime& rtime);
        !           994: 
        !           995: private:
        !           996:        time_t  m_time;
        !           997: };
        !           998: 
        !           999: /////////////////////////////////////////////////////////////////////////////
        !          1000: // File status
        !          1001: 
        !          1002: struct CFileStatus
        !          1003: {
        !          1004:        CTime m_ctime;          // creation date/time of file
        !          1005:        CTime m_mtime;          // last modification date/time of file
        !          1006:        CTime m_atime;          // last access date/time of file
        !          1007:        LONG m_size;            // logical size of file in bytes
        !          1008:        BYTE m_attribute;       // logical OR of CFile::Attribute enum values
        !          1009:        BYTE _m_padding;        // pad the structure to a WORD
        !          1010:        char m_szFullName[_MAX_PATH]; // absolute path name
        !          1011: 
        !          1012: #ifdef _DEBUG
        !          1013:        void Dump(CDumpContext& dc) const;
        !          1014: #endif
        !          1015: };
        !          1016: 
        !          1017: 
        !          1018: /////////////////////////////////////////////////////////////////////////////
        !          1019: // Diagnostic memory management routines
        !          1020: 
        !          1021: #ifdef _DEBUG
        !          1022: 
        !          1023: extern "C" BOOL AfxDiagnosticInit(void);
        !          1024: 
        !          1025: // Memory tracking allocation
        !          1026: void* operator new(size_t nSize, const char FAR* lpszFileName, int nLine);
        !          1027: #define DEBUG_NEW new(THIS_FILE, __LINE__)
        !          1028: 
        !          1029: // Low level sanity checks for memory blocks
        !          1030: extern "C" BOOL FAR PASCAL AfxIsValidAddress(const void FAR* lp, 
        !          1031:                        UINT nBytes, BOOL bReadWrite = TRUE);
        !          1032: #ifdef _NEARDATA
        !          1033: inline BOOL PASCAL AfxIsValidAddress(const void NEAR* np, 
        !          1034:                UINT nBytes, BOOL bReadWrite = TRUE)
        !          1035:        { return np != NULL && ::AfxIsValidAddress((const void FAR*)np, 
        !          1036:                nBytes, bReadWrite); }
        !          1037: #endif
        !          1038: 
        !          1039: // Return TRUE if valid memory block of nBytes
        !          1040: BOOL PASCAL AfxIsMemoryBlock(const void* p, UINT nBytes, LONG* plRequestNumber = NULL);
        !          1041: 
        !          1042: // Return TRUE if memory is sane or print out what is wrong
        !          1043: BOOL PASCAL AfxCheckMemory();
        !          1044: 
        !          1045: // Options for tuning the allocation diagnostics
        !          1046: extern "C" 
        !          1047: {
        !          1048:        extern int afxMemDF;    // global variable for easy setting in debugger
        !          1049: }
        !          1050: 
        !          1051: enum AfxMemDF // memory debug/diagnostic flags
        !          1052: {
        !          1053:        allocMemDF          = 0x01,         // turn on debugging allocator
        !          1054:        delayFreeMemDF      = 0x02,         // delay freeing memory memory
        !          1055:        checkAlwaysMemDF    = 0x04,         // AfxCheckMemory on every alloc/free
        !          1056: };
        !          1057: 
        !          1058: // turn on/off tracking for a short while
        !          1059: BOOL PASCAL AfxEnableMemoryTracking(BOOL bTrack);
        !          1060: 
        !          1061: // Memory allocator failure simulation and control (_DEBUG only)
        !          1062: 
        !          1063: // A failure hook returns whether to permit allocation
        !          1064: typedef BOOL (PASCAL * AFX_ALLOC_HOOK)(size_t nSize, BOOL bObject, LONG lRequestNumber);
        !          1065: 
        !          1066: // Set new hook, return old (never NULL)
        !          1067: AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);
        !          1068: 
        !          1069: // Debugger hook on specified allocation request
        !          1070: void PASCAL AfxSetAllocStop(LONG lRequestNumber);
        !          1071: 
        !          1072: // Memory state for snapshots/leak detection
        !          1073: struct CMemoryState
        !          1074: {
        !          1075: // Attributes
        !          1076:        enum blockUsage
        !          1077:        {
        !          1078:                freeBlock,    // not used
        !          1079:                objectBlock,  // contains a CObject derived class object
        !          1080:                bitBlock,     // contains ::operator new data
        !          1081:                nBlockUseMax, // total number of usages
        !          1082:        };
        !          1083: 
        !          1084:        struct CBlockHeader* m_pBlockHeader;
        !          1085:        LONG m_lCounts[nBlockUseMax];
        !          1086:        LONG m_lSizes[nBlockUseMax];
        !          1087:        LONG m_lHighWaterCount;
        !          1088:        LONG m_lTotalCount;
        !          1089: 
        !          1090:        CMemoryState();
        !          1091: 
        !          1092: // Operations
        !          1093:        void Checkpoint();  // fill with current state
        !          1094:        BOOL Difference(const CMemoryState& oldState,
        !          1095:                                        const CMemoryState& newState);  // fill with difference
        !          1096: 
        !          1097:        // Output to afxDump
        !          1098:        void DumpStatistics() const;
        !          1099:        void DumpAllObjectsSince() const;
        !          1100: };
        !          1101: 
        !          1102: // Enumerate allocated objects or runtime classes
        !          1103: void PASCAL AfxDoForAllObjects(void (*pfn)(CObject* pObject, void* pContext), void* pContext);
        !          1104: void PASCAL AfxDoForAllClasses(void (*pfn)(const CRuntimeClass* pClass, void* pContext), void* pContext);
        !          1105: 
        !          1106: #else
        !          1107: 
        !          1108: // NonDebug version that assume everything is OK
        !          1109: #define DEBUG_NEW new
        !          1110: #define AfxCheckMemory()                TRUE
        !          1111: #define AfxIsMemoryBlock(pBuf, nBytes)  TRUE
        !          1112: 
        !          1113: #endif // _DEBUG
        !          1114: 
        !          1115: /////////////////////////////////////////////////////////////////////////////
        !          1116: // Archives for serializing CObject data
        !          1117: 
        !          1118: // needed for implementation
        !          1119: class CPtrArray;
        !          1120: class CMapPtrToWord;
        !          1121: 
        !          1122: class CArchive
        !          1123: {
        !          1124: public:
        !          1125: // Flag values
        !          1126:        enum Mode { store = 0, load = 1 };
        !          1127: 
        !          1128:        CArchive(CFile* pFile, UINT nMode, int nBufSize = 512, void FAR* lpBuf = NULL);
        !          1129:        ~CArchive();
        !          1130: 
        !          1131: // Attributes
        !          1132:        BOOL IsLoading() const;
        !          1133:        BOOL IsStoring() const;
        !          1134:        CFile* GetFile() const;
        !          1135: 
        !          1136: // Operations
        !          1137:        UINT Read(void FAR* lpBuf, UINT nMax);
        !          1138:        void Write(const void FAR* lpBuf, UINT nMax);
        !          1139:        void Flush();
        !          1140:        void Close();
        !          1141: 
        !          1142: protected:
        !          1143:        void FillBuffer(UINT nBytesNeeded);
        !          1144:        CObject* ReadObject(const CRuntimeClass* pClass);
        !          1145:        void WriteObject(const CObject* pOb);
        !          1146: 
        !          1147: public:
        !          1148:        // Object I/O is pointer based to avoid added construction overhead.
        !          1149:        // Use the Serialize member function directly for embedded objects.
        !          1150:        friend CArchive& operator<<(CArchive& ar, const CObject* pOb);
        !          1151: 
        !          1152:        friend CArchive& operator>>(CArchive& ar, CObject*& pOb);
        !          1153:        friend CArchive& operator>>(CArchive& ar, const CObject*& pOb);
        !          1154: 
        !          1155:        // insertion operations
        !          1156:        // NOTE: operators available only for fixed size types for portability
        !          1157:        CArchive& operator<<(BYTE by);
        !          1158:        CArchive& operator<<(WORD w);
        !          1159:        CArchive& operator<<(LONG l);
        !          1160:        CArchive& operator<<(DWORD dw);
        !          1161: 
        !          1162:        // extraction operations
        !          1163:        // NOTE: operators available only for fixed size types for portability
        !          1164:        CArchive& operator>>(BYTE& by);
        !          1165:        CArchive& operator>>(WORD& w);
        !          1166:        CArchive& operator>>(DWORD& dw);
        !          1167:        CArchive& operator>>(LONG& l);
        !          1168: 
        !          1169: // Implementation
        !          1170: protected:
        !          1171:        // archive objects cannot be copied or assigned
        !          1172:        CArchive(const CArchive& arSrc);
        !          1173:        void operator=(const CArchive& arSrc);
        !          1174: 
        !          1175:        BOOL m_nMode;
        !          1176:        BOOL m_bUserBuf;
        !          1177:        int m_nBufSize;
        !          1178:        CFile* m_pFile;
        !          1179:        BYTE FAR* m_lpBufCur;
        !          1180:        BYTE FAR* m_lpBufMax;
        !          1181:        BYTE FAR* m_lpBufStart;
        !          1182: 
        !          1183:        UINT m_nMapCount;   // count and map used when storing
        !          1184:        union
        !          1185:        {
        !          1186:                CPtrArray* m_pLoadArray;
        !          1187:                CMapPtrToWord* m_pStoreMap;
        !          1188:        };
        !          1189: };
        !          1190: 
        !          1191: 
        !          1192: /////////////////////////////////////////////////////////////////////////////
        !          1193: // Diagnostic dumping
        !          1194: 
        !          1195: class CDumpContext
        !          1196: {
        !          1197: public:
        !          1198:        CDumpContext(CFile* pFile);
        !          1199: 
        !          1200: // Attributes
        !          1201:        int GetDepth() const;      // 0 => this object, 1 => children objects
        !          1202:        void SetDepth(int nNewDepth);
        !          1203: 
        !          1204: // Operations
        !          1205:        CDumpContext& operator<<(const char FAR* lpsz);
        !          1206:        CDumpContext& operator<<(const void FAR* lp);
        !          1207: #ifdef _NEARDATA
        !          1208:        CDumpContext& operator<<(const void NEAR* np);
        !          1209: #endif
        !          1210:        CDumpContext& operator<<(const CObject* pOb);
        !          1211:        CDumpContext& operator<<(const CObject& ob);
        !          1212:        CDumpContext& operator<<(BYTE by);
        !          1213:        CDumpContext& operator<<(WORD w);
        !          1214:        CDumpContext& operator<<(UINT u);
        !          1215:        CDumpContext& operator<<(LONG l);
        !          1216:        CDumpContext& operator<<(DWORD dw);
        !          1217:        CDumpContext& operator<<(int n);
        !          1218:        void HexDump(const char* pszLine, BYTE* pby, int nBytes, int nWidth);
        !          1219:        void Flush();
        !          1220: 
        !          1221: // Implementation
        !          1222: protected:
        !          1223:        // dump context objects cannot be copied or assigned
        !          1224:        CDumpContext(const CDumpContext& dcSrc);
        !          1225:        void operator=(const CDumpContext& dcSrc);
        !          1226:        void OutputString(const char FAR* lpsz);
        !          1227: 
        !          1228:        int m_nDepth;
        !          1229: 
        !          1230: public:
        !          1231:        CFile* m_pFile;
        !          1232: };
        !          1233: 
        !          1234: #ifdef _DEBUG
        !          1235: extern CDumpContext& afxDump;
        !          1236: extern "C" BOOL afxTraceEnabled;
        !          1237: #endif
        !          1238: 
        !          1239: /////////////////////////////////////////////////////////////////////////////
        !          1240: // Other implementation helpers
        !          1241: 
        !          1242: #define BEFORE_START_POSITION ((void*)(void NEAR*)-1)
        !          1243: #define _AFX_FP_OFF(thing) (*((UINT*)&(thing)))
        !          1244: #define _AFX_FP_SEG(lp) (*((UINT*)&(lp)+1))
        !          1245: 
        !          1246: 
        !          1247: /////////////////////////////////////////////////////////////////////////////
        !          1248: // Swap tuning for AFX library
        !          1249: 
        !          1250: // Use BASED_CODE so that it may be easily redefined for tuning purposes
        !          1251: 
        !          1252: //  Data defined using this modifier is placed in the current
        !          1253: //  code segment, which is modified with #pragma code_seg
        !          1254: #ifndef BASED_CODE
        !          1255: #define BASED_CODE __based(__segname("_CODE"))
        !          1256: #endif
        !          1257: 
        !          1258: #if defined(_M_I86MM) || defined(_M_I86LM) // far code
        !          1259: #define AFX_CORE_SEG  "AFX_CORE_TEXT" /* core functionality */
        !          1260: #define AFX_AUX_SEG   "AFX_AUX_TEXT"  /* auxilliary functionality */
        !          1261: #define AFX_COLL_SEG  "AFX_COLL_TEXT" /* collections */
        !          1262: #define AFX_OLE_SEG   "AFX_OLE_TEXT"  /* OLE support */
        !          1263: #endif
        !          1264: /////////////////////////////////////////////////////////////////////////////
        !          1265: // Inline function declarations
        !          1266: 
        !          1267: #include "afx.inl"
        !          1268: 
        !          1269: #endif // __AFX_H__

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.