PAGELIST.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*+==========================================================================
  2.   File:      PAGELIST.H
  3.   Summary:   Include file for the connectable COPageList COM object class.
  4.              COPageList offers a main standard IUnknown interface (basic
  5.              COM object features), an implementation of the standard
  6.              IConnectionPointContainer interface (connectable object
  7.              features), an implementation of the standard IPersistStream
  8.              interface (stream persistence features), and an
  9.              implementation of the custom IPageList interface (drawing
  10.              PageList-related features). This multiple interface COM
  11.              Object Class is achieved via the technique of nested classes.
  12.              The implementation of the various interfaces are nested
  13.              inside of the COPageList Class.
  14.              For a comprehensive tutorial code tour of this module's
  15.              contents and offerings see the tutorial PERSERVE.HTM file.
  16.              For more specific technical details on the internal workings
  17.              see the comments dispersed throughout the module's source code.
  18.   Functions: .
  19.   Classes:   COPageList.
  20.   Origin:    2-4-97: atrent - Editor-inheritance from PAPER.H in
  21.              the STOSERVE Tutorial Code Sample.
  22. ----------------------------------------------------------------------------
  23.   This file is part of the Microsoft COM Tutorial Code Samples.
  24.   Copyright (C) Microsoft Corporation, 1997.  All rights reserved.
  25.   This source code is intended only as a supplement to Microsoft
  26.   Development Tools and/or on-line documentation.  See these other
  27.   materials for detailed information regarding Microsoft code samples.
  28.   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  29.   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  30.   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  31.   PARTICULAR PURPOSE.
  32. ==========================================================================+*/
  33. #if !defined(PAGELIST_H)
  34. #define PAGELIST_H
  35. #ifdef __cplusplus
  36. // Current format version of PageList is 1.0. Thus, the format version
  37. // is a compile-time constant.
  38. #define PAGELIST_VERSION10 MAKELONG(0,1)
  39. // PageList allocation sizes for the Dynamic PageList array.
  40. enum
  41. {
  42.   PAGELIST_ALLOC_INIT = 30,
  43.   PAGELIST_ALLOC = 20
  44. };
  45. // Strings used for assembling IStorage/IStream names.
  46. #define DRAWING_STR "Drawing"
  47. #define TEXT_STR    "Text"
  48. // The PageList item structure.
  49. typedef struct _PAGEITEM
  50. {
  51.   SHORT     nType;                       // Page Type.
  52.   BOOL      bOpen;                       // Page Open status.
  53.   INT       iPage;                       // Page Number.
  54.   WCHAR     wszDataName[PAGE_NAME_SIZE]; // Page Storage/Stream Data Name.
  55.   WCHAR     wszTitle[PAGE_TITLE_SIZE];   // Page Title.
  56. } PAGEITEM;
  57. // Properties of the PageList.
  58. typedef struct _PAGELISTPROPS
  59. {
  60.   LONG lPageListVersion;
  61.   LONG lPageListSize;
  62.   LONG lPageNameCounter;
  63.   WCHAR wszTitle[PAGE_TITLE_SIZE];
  64.   WCHAR wszAuthor[PAGE_TITLE_SIZE];
  65.   WCHAR wszReserved1[PAGE_TITLE_SIZE];
  66. } PAGELISTPROPS;
  67. // PageList event constants.
  68. enum PAGELIST_EVENT
  69. {
  70.   PAGELIST_EVENT_NONE = 0,
  71.   PAGELIST_EVENT_LOADED,
  72.   PAGELIST_EVENT_SAVED,
  73.   PAGELIST_EVENT_CLEARED,
  74.   PAGELIST_EVENT_PAGEADDED,
  75.   PAGELIST_EVENT_PAGEDELETED,
  76.   PAGELIST_EVENT_PAGESET
  77. };
  78. /*O+O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O
  79.   ObjectClass: COPageList
  80.   Summary:     COM object class for COPageList COM objects.  COM objects
  81.                of this class encapsulate management of a page list. The
  82.                list has items representing user editable pages. The
  83.                mulitple interfaces on this COM object are constructed via
  84.                the nested interface classes technique.
  85.   Interfaces:  IUnknown
  86.                  Standard interface providing COM object features.
  87.                IConnectionPointContainer
  88.                  Standard Connection Point container features rendering
  89.                  COPageList objects connectable objects.
  90.                IPersistStream
  91.                  Standard Stream Persistance features.
  92.                IPageList
  93.                  Custom interface providing basic PageList features.
  94.   Aggregation: Yes, COPageList COM Objects are aggregatable by passing
  95.                a non-NULL pUnkOuter IUnknown pointer into the constructor.
  96. O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O-O*/
  97. class COPageList : public IUnknown
  98. {
  99.   public:
  100.     // Main Object Constructor & Destructor.
  101.     COPageList(IUnknown* pUnkOuter, CServer* pServer);
  102.     ~COPageList(void);
  103.     // A general public method for initializing this newly created
  104.     // object. Creates any subordinate arrays, structures, or objects.
  105.     // Not exposed as part of an interface. Used by Class Factory.
  106.     HRESULT Init(void);
  107.     // Main object IUnknown methods. Non-delegating.
  108.     STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  109.     STDMETHODIMP_(ULONG) AddRef(void);
  110.     STDMETHODIMP_(ULONG) Release(void);
  111.   private:
  112.     // We declare nested class interface implementations here.
  113.     class CImpIConnectionPointContainer : public IConnectionPointContainer
  114.     {
  115.       public:
  116.         // Interface Implementation Constructor & Destructor.
  117.         CImpIConnectionPointContainer(COPageList* pCO, IUnknown* pUnkOuter);
  118.         ~CImpIConnectionPointContainer(void);
  119.         // IUnknown methods.
  120.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  121.         STDMETHODIMP_(ULONG) AddRef(void);
  122.         STDMETHODIMP_(ULONG) Release(void);
  123.         // IConnectionPointContainer methods.
  124.         STDMETHODIMP         FindConnectionPoint(REFIID, IConnectionPoint**);
  125.         STDMETHODIMP         EnumConnectionPoints(IEnumConnectionPoints**);
  126.       private:
  127.         // Data private to this interface implementation.
  128.         COPageList*   m_pCO;          // Parent Object back pointer.
  129.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  130.     };
  131.     class CImpIPersistStream : public IPersistStream
  132.     {
  133.       public:
  134.         // Interface Implementation Constructor & Destructor.
  135.         CImpIPersistStream(COPageList* pCO, IUnknown* pUnkOuter);
  136.         ~CImpIPersistStream(void);
  137.         // IUnknown methods.
  138.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  139.         STDMETHODIMP_(ULONG) AddRef(void);
  140.         STDMETHODIMP_(ULONG) Release(void);
  141.         // IPersistStream methods.
  142.         STDMETHODIMP         GetClassID(CLSID* pClassID);
  143.         STDMETHODIMP         IsDirty(void);
  144.         STDMETHODIMP         Load(IStream* pIStream);
  145.         STDMETHODIMP         Save(IStream* pIStream, BOOL bClearDirty);
  146.         STDMETHODIMP         GetSizeMax(ULARGE_INTEGER* pcbSize);
  147.       private:
  148.         // Data private to this interface implementation.
  149.         COPageList*   m_pCO;          // Parent Object back pointer.
  150.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  151.     };
  152.     class CImpIPageList : public IPageList
  153.     {
  154.       public:
  155.         // Interface Implementation Constructor & Destructor.
  156.         CImpIPageList(COPageList* pCO, IUnknown* pUnkOuter);
  157.         ~CImpIPageList(void);
  158.         // IUnknown methods.
  159.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  160.         STDMETHODIMP_(ULONG) AddRef(void);
  161.         STDMETHODIMP_(ULONG) Release(void);
  162.         // IPageList methods.
  163.         STDMETHODIMP         Get(
  164.                                  INT     iPage,
  165.                                  BOOL*   pbOpen,
  166.                                  SHORT*  pnType,
  167.                                  WCHAR*  pwszTitle,
  168.                                  WCHAR*  pwszDataName);
  169.         STDMETHODIMP         Set(
  170.                                  INT     iPage,
  171.                                  SHORT   nOpenStatus,
  172.                                  WCHAR*  pwszNewTitle);
  173.         STDMETHODIMP         Add(
  174.                                  INT   iPage,
  175.                                  SHORT nType,
  176.                                  WCHAR* pwszTitle,
  177.                                  INT* piNewPage);
  178.         STDMETHODIMP         Delete(INT iPage);
  179.         STDMETHODIMP         Clear(void);
  180.       private:
  181.         // Private utility methods of this interface implementation.
  182.         HRESULT FindSlot(INT iPage, LONG* plSlot);
  183.         HRESULT NextSlot(INT iPage, LONG* plSlot);
  184.         HRESULT NextName(SHORT nType, WCHAR* pwszDataName);
  185.         // Data private to this interface implementation of IPageList.
  186.         COPageList*   m_pCO;          // Parent Object back pointer.
  187.         IUnknown*     m_pUnkOuter;    // Outer unknown for Delegation.
  188.     };
  189.     // Make the otherwise private and nested interface implementations
  190.     // friends to COM object instantiations of this COM object class.
  191.     friend CImpIConnectionPointContainer;
  192.     friend CImpIPersistStream;
  193.     friend CImpIPageList;
  194.     // Private method of main connectable COPageList COM object to
  195.     // broadcast event notifications to all connected listening sinks.
  196.     HRESULT NotifySinks(PAGELIST_EVENT PageListEvent, INT iPage);
  197.     // Private method to Clear entire page list array.
  198.     HRESULT Clear(void);
  199.     // Private data of COPageList COM objects.
  200.     // Nested IConnectionPointContainer implementation instantiation.
  201.     CImpIConnectionPointContainer m_ImpIConnectionPointContainer;
  202.     // Nested IPersistStream implementation instantiation.
  203.     CImpIPersistStream m_ImpIPersistStream;
  204.     // Nested IPageList implementation instantiation. This IPageList
  205.     // interface is instantiated as a native interface of COPageList.
  206.     CImpIPageList     m_ImpIPageList;
  207.     // Main Object reference count.
  208.     ULONG             m_cRefs;
  209.     // Outer unknown (aggregation & delegation).
  210.     IUnknown*         m_pUnkOuter;
  211.     // Pointer to this component server's control object.
  212.     CServer*          m_pServer;
  213.     // The array of connection points for this connectable COM object.
  214.     IConnectionPoint* m_aConnectionPoints[MAX_CONNECTION_POINTS];
  215.     // The following private data and methods constitute the working
  216.     // heart of COPageList as an actual application object.
  217.     PAGELISTPROPS     m_PageListProps;// For file storage.
  218.     PAGEITEM*         m_paPageList;   // Dynamic page list array pointer.
  219.     LONG              m_lPageListEnd; // Current end of the page list.
  220.     LONG              m_lPageListMax; // Current end of the page list array.
  221.     BOOL              m_bDirty;       // RAM doesn't match file--save needed.
  222.     CLSID             m_ClassID;      // CLSID of this COM Object.
  223. };
  224. #endif // __cplusplus
  225. #endif // PAGELIST_H