/*
 * Copyright (C) 1999 Paul Quinn
 * Copyright (C) 1999 Francis Beaudet
 * Copyright (C) 2003 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

import "oleidl.idl";
import "oaidl.idl";
import "servprov.idl";
import "urlmon.idl";


/*****************************************************************************
 * IOleControlTypes interface
 */
[
    pointer_default(unique)
]
interface IOleControlTypes
{
    typedef enum tagREADYSTATE
    {
        READYSTATE_UNINITIALIZED  = 0,
        READYSTATE_LOADING  = 1,
        READYSTATE_LOADED = 2,
        READYSTATE_INTERACTIVE  = 3,
        READYSTATE_COMPLETE = 4
    } READYSTATE;

    typedef struct tagVARIANT_BLOB
    {
        DWORD clSize;
        DWORD rpcReserved;
        [size_is(clSize-1)] ULONGLONG ahData[];
    } wireVARIANT_BLOB;

    typedef struct tagUserVARIANT
    {
      wireVARIANT_BLOB pVarBlob;
    } UserVARIANT;
}


/*****************************************************************************
 * IFont interface
 */
[
    object,
    uuid(bef6e002-a874-101a-8bba-00aa00300cab),
    pointer_default(unique)
]
interface IFont : IUnknown
{
    typedef IFont *LPFONT;
    typedef TEXTMETRICW TEXTMETRICOLE, *LPTEXTMETRICOLE;

    [propget] HRESULT Name( [out] BSTR *pname);
    [propput] HRESULT Name( [in] BSTR name );
    [propget] HRESULT Size( [out] CY *psize );
    [propput] HRESULT Size( [in] CY size );
    [propget] HRESULT Bold( [out] BOOL *pbold );
    [propput] HRESULT Bold( [in] BOOL bold );
    [propget] HRESULT Italic( [out] BOOL *pitalic );
    [propput] HRESULT Italic( [in] BOOL italic );
    [propget] HRESULT Underline( [out] BOOL *punderline );
    [propput] HRESULT Underline( [in] BOOL underline );
    [propget] HRESULT Strikethrough( [out] BOOL *pstrikethrough );
    [propput] HRESULT Strikethrough( [in] BOOL strikethrough );
    [propget] HRESULT Weight( [out] SHORT *pweight );
    [propput] HRESULT Weight( [in] SHORT weight );
    [propget] HRESULT Charset( [out] SHORT *pcharset );
    [propput] HRESULT Charset( [in] SHORT charset );
    [propget] HRESULT hFont( [out] HFONT *phfont );
    HRESULT Clone( [out] IFont **ppfont );
    HRESULT IsEqual( [in] IFont *pFontOther );
    HRESULT SetRatio( [in] LONG cyLogical, [in] LONG cyHimetric );
    HRESULT QueryTextMetrics( [out] TEXTMETRICOLE * ptm );
    HRESULT AddRefHfont( [in] HFONT hfont );
    HRESULT ReleaseHfont( [in] HFONT hfont );
    HRESULT SetHdc( [in] HDC hdc );
}


/*****************************************************************************
 * IFontDisp interface
 */
[
    object,
    uuid(bef6e003-a874-101a-8bba-00aa00300cab),
    pointer_default(unique)
]
interface IFontDisp : IDispatch
{
    typedef IFontDisp *LPFONTDISP;
}


/*****************************************************************************
 * IPicture interface
 */
[
    object,
    uuid(7bf80980-bf32-101a-8bbb-00aa00300cab),
    pointer_default(unique)
]
interface IPicture : IUnknown
{
    typedef IPicture *LPPICTURE;

    typedef enum tagPicture
    {
        PICTURE_SCALABLE = 0x1,
        PICTURE_TRANSPARENT = 0x2
    } PICTUREATTRIBUTES;

    typedef UINT OLE_HANDLE;
    typedef LONG OLE_XPOS_HIMETRIC;
    typedef LONG OLE_YPOS_HIMETRIC;
    typedef LONG OLE_XSIZE_HIMETRIC;
    typedef LONG OLE_YSIZE_HIMETRIC;

    [propget] HRESULT Handle( [out] OLE_HANDLE *pHandle );
    [propget] HRESULT hPal( [out] OLE_HANDLE *phPal );
    [propget] HRESULT Type( [out] SHORT *pType );
    [propget] HRESULT Width( [out] OLE_XSIZE_HIMETRIC *pWidth );
    [propget] HRESULT Height( [out] OLE_YSIZE_HIMETRIC *pHeight );

    HRESULT Render(
        [in] HDC hdc,
        [in] LONG x,
        [in] LONG y,
        [in] LONG cx,
        [in] LONG cy,
        [in] OLE_XPOS_HIMETRIC xSrc,
        [in] OLE_YPOS_HIMETRIC ySrc,
        [in] OLE_XSIZE_HIMETRIC cxSrc,
        [in] OLE_YSIZE_HIMETRIC cySrc,
        [in] LPCRECT pRcWBounds);

    HRESULT set_hPal( [in] OLE_HANDLE hPal );

    [propget] HRESULT CurDC( [out] HDC *phDC );

    HRESULT SelectPicture(
        [in] HDC hDCIn,
        [out] HDC * phDCOut,
        [out] OLE_HANDLE * phBmpOut);

    [propget] HRESULT KeepOriginalFormat( [out] BOOL *pKeep );

    [propput] HRESULT KeepOriginalFormat( [in] BOOL keep );

    HRESULT PictureChanged();

    HRESULT SaveAsFile(
        [in] LPSTREAM pStream,
        [in] BOOL fSaveMemCopy,
        [out] LONG *pCbSize);

    [propget] HRESULT Attributes( [out] DWORD *pDwAttr );
}


/*****************************************************************************
 * IPictureDisp interface
 */
[
    object,
    uuid(7bf80981-bf32-101a-8bbb-00aa00300cab),
    pointer_default(unique)
]
interface IPictureDisp : IDispatch
{
    typedef IPictureDisp *LPPICTUREDISP;
}


/*****************************************************************************
 * IOleControl interface
 */
[
    object,
    uuid(b196b288-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]

interface IOleControl : IUnknown
{
    typedef IOleControl *LPOLECONTROL;

    typedef struct tagCONTROLINFO
    {
        ULONG cb;
        HACCEL hAccel;
        USHORT cAccel;
        DWORD dwFlags;
    } CONTROLINFO, *LPCONTROLINFO;

    typedef enum tagCTRLINFO
    {
        CTRLINFO_EATS_RETURN = 1,
        CTRLINFO_EATS_ESCAPE = 2
    } CTRLINFO;

    HRESULT GetControlInfo( [out] CONTROLINFO *pCI );
    HRESULT OnMnemonic( [in] MSG *pMsg );
    HRESULT OnAmbientPropertyChange( [in] DISPID dispID );
    HRESULT FreezeEvents( [in] BOOL bFreeze );
}


/*****************************************************************************
 * IOleControlSite interface
 */
[
    object,
    uuid(b196b289-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IOleControlSite : IUnknown
{
    typedef IOleControlSite *LPOLECONTROLSITE;

    typedef struct tagPOINTF
    {
        FLOAT x;
        FLOAT y;
    } POINTF, *LPPOINTF;

    typedef enum tagXFORMCOORDS
    {
	XFORMCOORDS_POSITION = 0x1,
	XFORMCOORDS_SIZE = 0x2,
	XFORMCOORDS_HIMETRICTOCONTAINER = 0x4,
	XFORMCOORDS_CONTAINERTOHIMETRIC = 0x8,
        XFORMCOORDS_EVENTCOMPAT = 0x10
    } XFORMCOORDS;

    HRESULT OnControlInfoChanged();

    HRESULT LockInPlaceActive( [in] BOOL fLock );

    HRESULT GetExtendedControl( [out] IDispatch ** ppDisp );

    HRESULT TransformCoords(
        [in, out] POINTL *pPtlHimetric,
        [in, out] POINTF *pPtfContainer,
        [in] DWORD dwFlags);

    HRESULT TranslateAccelerator( [in] MSG *pMsg, [in] DWORD grfModifiers );

    HRESULT OnFocus( [in] BOOL fGotFocus );

    HRESULT ShowPropertyFrame();
}


/*****************************************************************************
 * IOleInPlaceSiteEx interface
 */
[
    object,
    uuid(9c2cad80-3424-11cf-b670-00aa004cd6d8),
    pointer_default(unique)
]
interface IOleInPlaceSiteEx : IOleInPlaceSite
{
    typedef IOleInPlaceSiteEx *LPOLEINPLACESITEEX;

    typedef enum tagACTIVATEFLAGS
    {
        ACTIVATE_WINDOWLESS = 1
    } ACTIVATE_FLAGS;

    HRESULT OnInPlaceActivateEx( [out] BOOL * pfNoRedraw, [in] DWORD dwFlags );
    HRESULT OnInPlaceDeactivateEx( [in] BOOL fNoRedraw );
    HRESULT RequestUIActivate();
}


/*****************************************************************************
 * IOleInPlaceSiteWindowless interface
 */
[
    local,
    object,
    uuid(922eada0-3424-11cf-b670-00aa004cd6d8),
    pointer_default(unique)
]
interface IOleInPlaceSiteWindowless : IOleInPlaceSiteEx
{
    typedef IOleInPlaceSiteWindowless *LPOLEINPLACESITEWINDOWLESS;

    typedef enum tagOLEDCFLAGS
    {
        OLEDC_NODRAW = 0x1,
        OLEDC_PAINTBKGND = 0x2,
        OLEDC_OFFSCREEN = 0x4
    } OLEDCFLAGS;

    HRESULT CanWindowlessActivate();

    HRESULT GetCapture();

    HRESULT SetCapture( [in] BOOL fCapture );

    HRESULT GetFocus();

    HRESULT SetFocus( [in] BOOL fFocus );

    HRESULT GetDC(
        [in] LPCRECT pRect,
        [in] DWORD grfFlags,
        [out] HDC *phDC);

    HRESULT ReleaseDC( [in] HDC hDC );

    HRESULT InvalidateRect(
        [in] LPCRECT pRect,
        [in] BOOL fErase);

    HRESULT InvalidateRgn(
        [in] HRGN hRGN,
        [in] BOOL fErase);

    HRESULT ScrollRect(
        [in] INT dx,
        [in] INT dy,
        [in] LPCRECT pRectScroll,
        [in] LPCRECT pRectClip);

    HRESULT AdjustRect( [in, out] LPRECT prc );

    HRESULT OnDefWindowMessage(
        [in] UINT msg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] LRESULT *plResult);
}


/*****************************************************************************
 * IOleInPlaceObjectWindowless interface
 */
[
    local,
    object,
    uuid(1c2056cc-5ef4-101b-8bc8-00aa003e3b29),
    pointer_default(unique)
]
interface IOleInPlaceObjectWindowless : IOleInPlaceObject
{
    typedef IOleInPlaceObjectWindowless *LPOLEINPLACEOBJECTWINDOWLESS;

    HRESULT OnWindowMessage(
        [in] UINT msg,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] LRESULT *plResult);

    HRESULT GetDropTarget( [out] IDropTarget **ppDropTarget );
}


/*****************************************************************************
 * IClassFactory2 interface
 */
[
    object,
    uuid(b196b28f-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IClassFactory2 : IClassFactory
{
    typedef IClassFactory2 *LPCLASSFACTORY2;

    typedef struct tagLICINFO
    {
        LONG cbLicInfo;
        BOOL fRuntimeKeyAvail;
        BOOL fLicVerified;
    } LICINFO, *LPLICINFO;

    HRESULT GetLicInfo( [out] LICINFO *pLicInfo );

    HRESULT RequestLicKey(
        [in] DWORD dwReserved,
        [out] BSTR *pBstrKey);

    [local]
    HRESULT CreateInstanceLic(
        [in] IUnknown *pUnkOuter,
        [in] IUnknown *pUnkReserved,
        [in] REFIID riid,
        [in] BSTR bstrKey,
        [out, iid_is(riid)] PVOID *ppvObj);

    [call_as(CreateInstanceLic)]
    HRESULT RemoteCreateInstanceLic(
        [in] REFIID riid,
        [in] BSTR bstrKey,
        [out, iid_is(riid)] IUnknown **ppvObj);
}


/*****************************************************************************
 * IViewObject interface
 */
[
    local,
    object,
    uuid(3af24292-0c96-11ce-a0cf-00aa00600ab8),
    pointer_default(unique)
]
interface IViewObjectEx : IViewObject2
{
    typedef IViewObjectEx *LPVIEWOBJECTEX;

    typedef enum tagVIEWSTATUS
    {
        VIEWSTATUS_OPAQUE = 1,
        VIEWSTATUS_SOLIDBKGND = 2,
        VIEWSTATUS_DVASPECTOPAQUE = 4,
        VIEWSTATUS_DVASPECTTRANSPARENT = 8,
        VIEWSTATUS_SURFACE = 16,
        VIEWSTATUS_3DSURFACE = 32
    } VIEWSTATUS;

    typedef enum tagHITRESULT
    {
        HITRESULT_OUTSIDE = 0,
        HITRESULT_TRANSPARENT = 1,
        HITRESULT_CLOSE = 2,
        HITRESULT_HIT = 3
    } HITRESULT;

    typedef enum tagDVASPECT2
    {
        DVASPECT_OPAQUE = 16,
        DVASPECT_TRANSPARENT = 32
    } DVASPECT2;

    typedef struct tagExtentInfo
    {
        ULONG cb;
        DWORD dwExtentMode;
        SIZEL sizelProposed;
    } DVEXTENTINFO;

    typedef enum tagAspectInfoFlag
    {
        DVASPECTINFOFLAG_CANOPTIMIZE = 1
    } DVASPECTINFOFLAG;

    typedef struct tagAspectInfo
    {
        ULONG cb;
        DWORD dwFlags;
    } DVASPECTINFO;

    HRESULT GetRect(
        [in] DWORD dwAspect,
        [out] LPRECTL pRect);

    HRESULT GetViewStatus( [out] DWORD *pdwStatus );

    HRESULT QueryHitPoint(
        [in] DWORD dwAspect,
        [in] LPCRECT pRectBounds,
        [in] POINT ptlLoc,
        [in] LONG lCloseHint,
        [out] DWORD *pHitResult);

    HRESULT QueryHitRect(
        [in] DWORD dwAspect,
        [in] LPCRECT pRectBounds,
        [in] LPCRECT pRectLoc,
        [in] LONG lCloseHint,
        [out] DWORD *pHitResult);

    HRESULT GetNaturalExtent (
        [in] DWORD dwAspect,
        [in] LONG lindex,
        [in] DVTARGETDEVICE *ptd,
        [in] HDC hicTargetDev,
        [in] DVEXTENTINFO *pExtentInfo,
        [out] LPSIZEL pSizel);
}


/*****************************************************************************
 * IProvideClassInfo interface
 */
[
    object,
    uuid(b196b283-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IProvideClassInfo : IUnknown
{
    typedef IProvideClassInfo *LPPROVIDECLASSINFO;

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef GetClassInfo")
cpp_quote("#endif")

    HRESULT GetClassInfo( [out] ITypeInfo ** ppTI );
}


/*****************************************************************************
 * IProvideClassInfo2 interface
 */
[
    object,
    uuid(a6bc3ac0-dbaa-11ce-9de3-00aa004bb851),
    pointer_default(unique)
]
interface IProvideClassInfo2 : IProvideClassInfo
{
    typedef IProvideClassInfo2 *LPPROVIDECLASSINFO2;

    typedef enum tagGUIDKIND
    {
        GUIDKIND_DEFAULT_SOURCE_DISP_IID = 1
    } GUIDKIND;

    HRESULT GetGUID(
        [in]  DWORD dwGuidKind,
        [out] GUID *pGUID );
}


/*****************************************************************************
 * IConnectionPoint interface
 */
interface IConnectionPointContainer; /* forward declarations */
interface IEnumConnections;

[
    object,
    uuid(b196b286-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IConnectionPoint : IUnknown
{
    typedef IConnectionPoint *PCONNECTIONPOINT, *LPCONNECTIONPOINT;

    HRESULT GetConnectionInterface( [out] IID *pIID );
    HRESULT GetConnectionPointContainer( [out] IConnectionPointContainer **ppCPC );
    HRESULT Advise( [in] IUnknown *pUnkSink, [out] DWORD *pdwCookie );
    HRESULT Unadvise( [in] DWORD dwCookie );
    HRESULT EnumConnections( [out] IEnumConnections **ppEnum );
}


/*****************************************************************************
 * IConnectionPointContainer interface
 */
interface IEnumConnectionPoints; /* forward declaration */
[
    object,
    uuid(b196b284-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IConnectionPointContainer : IUnknown
{
    typedef IConnectionPointContainer *PCONNECTIONPOINTCONTAINER, *LPCONNECTIONPOINTCONTAINER;

    HRESULT EnumConnectionPoints( [out] IEnumConnectionPoints **ppEnum );
    HRESULT FindConnectionPoint( [in] REFIID riid, [out] IConnectionPoint **ppCP );
}


/*****************************************************************************
 * IEnumConnections interface
 */
[
    object,
    uuid(b196b287-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IEnumConnections : IUnknown
{
    typedef IEnumConnections *PENUMCONNECTIONS, *LPENUMCONNECTIONS;

    typedef struct tagCONNECTDATA
    {
        IUnknown *pUnk;
        DWORD dwCookie;
    } CONNECTDATA, *PCONNECTDATA, *LPCONNECTDATA;

    [local]
    HRESULT Next(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTDATA rgcd,
        [out] ULONG *pcFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTDATA rgcd,
        [out] ULONG *pcFetched);

    HRESULT Skip( [in] ULONG cConnections );

    HRESULT Reset();

    HRESULT Clone( [out] IEnumConnections **ppEnum );
}


/*****************************************************************************
 * IEnumConnectionPoints interface
 */
[
    object,
    uuid(b196b285-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IEnumConnectionPoints : IUnknown
{
    typedef IEnumConnectionPoints *PENUMCONNECTIONPOINTS, *LPENUMCONNECTIONPOINTS;

    [local]
    HRESULT Next(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTIONPOINT *ppCP,
        [out] ULONG *pcFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cConnections,
        [out, size_is(cConnections), length_is(*pcFetched)] LPCONNECTIONPOINT *ppCP,
        [out] ULONG *pcFetched);

    HRESULT Skip( [in] ULONG cConnections );

    HRESULT Reset();

    HRESULT Clone( [out] IEnumConnectionPoints **ppEnum );
}


/*****************************************************************************
 * IPropertyPage interface
 */
interface IPropertyPageSite;  /* forward declaration */
[
    object,
    uuid(b196b28d-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IPropertyPage : IUnknown
{
    typedef IPropertyPage *LPPROPERTYPAGE;

    typedef struct tagPROPPAGEINFO
    {
        ULONG cb;
        LPOLESTR pszTitle;
        SIZE size;
        LPOLESTR pszDocString;
        LPOLESTR pszHelpFile;
        DWORD dwHelpContext;
    } PROPPAGEINFO, *LPPROPPAGEINFO;

    HRESULT SetPageSite( [in] IPropertyPageSite *pPageSite );

    HRESULT Activate(
        [in] HWND hWndParent,
        [in] LPCRECT pRect,
        [in] BOOL bModal);

    HRESULT Deactivate();

    HRESULT GetPageInfo( [out] PROPPAGEINFO *pPageInfo );

    HRESULT SetObjects(
        [in] ULONG cObjects,
        [in, size_is(cObjects)] IUnknown **ppUnk);

    HRESULT Show( [in] UINT nCmdShow );

    HRESULT Move( [in] LPCRECT pRect );

    HRESULT IsPageDirty();

    HRESULT Apply();

    HRESULT Help( [in] LPCOLESTR pszHelpDir );

    HRESULT TranslateAccelerator( [in] MSG *pMsg );
}


/*****************************************************************************
 * IPropertyPage2 interface
 */
[
    object,
    uuid(01e44665-24ac-101b-84ed-08002b2ec713),
    pointer_default(unique)
]
interface IPropertyPage2 : IPropertyPage
{
    typedef IPropertyPage2 *LPPROPERTYPAGE2;

    HRESULT EditProperty( [in] DISPID dispID );
}


/*****************************************************************************
 * IPropertyPageSite interface
 */
[
    object,
    uuid(b196b28c-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface IPropertyPageSite : IUnknown
{
    typedef IPropertyPageSite *LPPROPERTYPAGESITE;

    typedef enum tagPROPPAGESTATUS
    {
        PROPPAGESTATUS_DIRTY = 0x1,
        PROPPAGESTATUS_VALIDATE = 0x2,
        PROPPAGESTATUS_CLEAN = 0x4
    } PROPPAGESTATUS;

    HRESULT OnStatusChange( [in] DWORD dwFlags );
    HRESULT GetLocaleID( [out] LCID *pLocaleID );
    HRESULT GetPageContainer( [out] IUnknown **ppUnk );
    HRESULT TranslateAccelerator( [in] MSG *pMsg );
}


/*****************************************************************************
 * IPropertyNotifySink interface
 */
[
    object,
    uuid(9bfbbc02-eff1-101a-84ed-00aa00341d07),
    pointer_default(unique)
]
interface IPropertyNotifySink : IUnknown
{
    typedef IPropertyNotifySink *LPPROPERTYNOTIFYSINK;

    HRESULT OnChanged( [in] DISPID dispID );
    HRESULT OnRequestEdit( [in] DISPID dispID );
}


/*****************************************************************************
 * ISimpleFrameSite interface
 */
[
    object,
    uuid(742b0e01-14e6-101b-914e-00aa00300cab),
    pointer_default(unique)
]
interface ISimpleFrameSite : IUnknown
{
    typedef ISimpleFrameSite *LPSIMPLEFRAMESITE;

    HRESULT PreMessageFilter(
        [in] HWND hWnd,
        [in] UINT msg,
        [in] WPARAM wp,
        [in] LPARAM lp,
        [out] LRESULT *plResult,
        [out] DWORD *pdwCookie);

    HRESULT PostMessageFilter(
        [in] HWND hWnd,
        [in] UINT msg,
        [in] WPARAM wp,
        [in] LPARAM lp,
        [out] LRESULT *plResult,
        [in] DWORD dwCookie);
}


/*****************************************************************************
 * IPersistStreamInit interface
 */
[
    object,
    uuid(7fd52380-4e07-101b-ae2d-08002b2ec713),
    pointer_default(unique)
]
interface IPersistStreamInit : IPersist
{
    typedef IPersistStreamInit *LPPERSISTSTREAMINIT;

    HRESULT IsDirty();
    HRESULT Load( [in] LPSTREAM pStm );
    HRESULT Save( [in] LPSTREAM pStm, [in] BOOL fClearDirty );
    HRESULT GetSizeMax( [out] ULARGE_INTEGER *pcbSize );
    HRESULT InitNew();
}


/*****************************************************************************
 * IPersistMemory interface
 */
[
    object,
    uuid(bd1ae5e0-a6ae-11ce-bd37-504200c10000),
    pointer_default(unique)
]
interface IPersistMemory : IPersist
{
    typedef IPersistMemory *LPPERSISTMEMORY;

    HRESULT IsDirty();

    [local]
    HRESULT Load(
        [in, size_is(cbSize)] LPVOID pMem,
        [in] ULONG cbSize);

    [call_as(Load)]
    HRESULT RemoteLoad(
        [in, size_is(cbSize)] BYTE *pMem,
        [in] ULONG cbSize);

    [local]
    HRESULT Save(
        [out, size_is(cbSize)] LPVOID pMem,
        [in] BOOL fClearDirty,
        [in] ULONG cbSize);

    [call_as(Save)]
    HRESULT RemoteSave(
        [out, size_is(cbSize)] BYTE *pMem,
        [in] BOOL fClearDirty,
        [in] ULONG cbSize);

    HRESULT GetSizeMax( [out] ULONG *pCbSize );
    HRESULT InitNew();
}


/*****************************************************************************
 * IPersistPropertyBag interface
 */
[
    object,
    uuid(37d84f60-42cb-11ce-8135-00aa004bb851),
    pointer_default(unique)
]
interface IPersistPropertyBag : IPersist
{
    typedef IPersistPropertyBag *LPPERSISTPROPERTYBAG;

    HRESULT InitNew();

    HRESULT Load(
        [in] IPropertyBag *pPropBag,
        [in] IErrorLog *pErrorLog);

    HRESULT Save(
        [in] IPropertyBag *pPropBag,
        [in] BOOL fClearDirty,
        [in] BOOL fSaveAllProperties);
}


/*****************************************************************************
 * IPropertyBag2 interface
 */
[
    object,
    uuid(22f55882-280b-11d0-a8a9-00a0c90c2004),
    pointer_default(unique)
]
interface IPropertyBag2 : IUnknown
{
    typedef IPropertyBag2 *LPPROPERTYBAG2;

    typedef enum tagPROPBAG2_TYPE
    {
        PROPBAG2_TYPE_UNDEFINED = 0,
        PROPBAG2_TYPE_DATA = 1,
        PROPBAG2_TYPE_URL = 2,
        PROPBAG2_TYPE_OBJECT = 3,
        PROPBAG2_TYPE_STREAM = 4,
        PROPBAG2_TYPE_STORAGE = 5,
        PROPBAG2_TYPE_MONIKER = 6
    } PROPBAG2_TYPE;

    typedef struct tagPROPBAG2
    {
        DWORD dwType;
        VARTYPE vt;
        CLIPFORMAT cfType;
        DWORD dwHint;
        LPOLESTR pstrName;
        CLSID clsid;
    } PROPBAG2;

    HRESULT Read(
        [in] ULONG cProperties,
        [in] PROPBAG2 *pPropBag,
        [in] IErrorLog *pErrLog,
        [out] VARIANT *pvarValue,
        [out] HRESULT *phrError);

    HRESULT Write(
        [in] ULONG cProperties,
        [in] PROPBAG2 *pPropBag,
        [in] VARIANT *pvarValue);

    HRESULT CountProperties(
        [out] ULONG *pcProperties );

    HRESULT GetPropertyInfo(
        [in] ULONG iProperty,
        [in] ULONG cProperties,
        [out] PROPBAG2 *pPropBag,
        [out] ULONG *pcProperties);

    HRESULT LoadObject(
        [in] LPCOLESTR pstrName,
        [in] DWORD dwHint,
        [in] IUnknown *pUnkObject,
        [in] IErrorLog *pErrLog);
}


/*****************************************************************************
 * IPersistPropertyBag2 interface
 */
[
    object,
    uuid(22f55881-280b-11d0-a8a9-00a0c90c2004),
    pointer_default(unique)
]
interface IPersistPropertyBag2 : IPersist
{
    typedef IPersistPropertyBag2 *LPPERSISTPROPERTYBAG2;

    HRESULT InitNew();

    HRESULT Load(
        [in] IPropertyBag2 *pPropBag,
        [in] IErrorLog *pErrorLog);

    HRESULT Save(
        [in] IPropertyBag2 *pPropBag,
        [in] BOOL fClearDirty,
        [in] BOOL fSaveAllProperties);

    HRESULT IsDirty();
}


/*****************************************************************************
 * ISpecifyPropertyPages interface
 */
[
    object,
    uuid(b196b28b-bab4-101a-b69c-00aa00341d07),
    pointer_default(unique)
]
interface ISpecifyPropertyPages : IUnknown
{
    typedef ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;

    typedef struct tagCAUUID
    {
	ULONG cElems;
        [size_is(cElems)] GUID *pElems;
    } CAUUID, *LPCAUUID;

    HRESULT GetPages( [out] CAUUID *pPages );
}


/*****************************************************************************
 * IPerPropertyBrowsing interface
 */
[
    object,
    uuid(376bd3aa-3845-101b-84ed-08002b2ec713),
    pointer_default(unique)
]
interface IPerPropertyBrowsing : IUnknown
{
    typedef IPerPropertyBrowsing *LPPERPROPERTYBROWSING;

    typedef struct tagCALPOLESTR
    {
        ULONG cElems;
        [size_is(cElems)] LPOLESTR *pElems;
    } CALPOLESTR, *LPCALPOLESTR;

    typedef struct tagCADWORD
    {
        ULONG cElems;
        [size_is(cElems)] DWORD *pElems;
    } CADWORD, *LPCADWORD;

    HRESULT GetDisplayString(
        [in] DISPID dispID,
        [out] BSTR *pBstr);

    HRESULT MapPropertyToPage(
        [in] DISPID dispID,
        [out] CLSID *pClsid);

    HRESULT GetPredefinedStrings(
        [in] DISPID dispID,
        [out] CALPOLESTR *pCaStringsOut,
        [out] CADWORD *pCaCookiesOut);

    HRESULT GetPredefinedValue(
        [in] DISPID dispID,
        [in] DWORD dwCookie,
        [out] VARIANT *pVarOut);
}


/*****************************************************************************
 * IAdviseSinkEx interface
 */
[
    object,
    uuid(3af24290-0c96-11ce-a0cf-00aa00600ab8),
    pointer_default(unique)
]
interface IAdviseSinkEx : IAdviseSink
{
    typedef IAdviseSinkEx *LPADVISESINKEX;

    [local]
    void OnViewStatusChange( [in] DWORD dwViewStatus );

    [call_as(OnViewStatusChange)]
    HRESULT RemoteOnViewStatusChange( [in] DWORD dwViewStatus );
}


/*****************************************************************************
 * IPointerInactive interface
 */
[
    object,
    uuid(55980ba0-35aa-11cf-b671-00aa004cd6d8),
    pointer_default(unique)
]
interface IPointerInactive : IUnknown
{
    typedef IPointerInactive *LPPOINTERINACTIVE;

    HRESULT GetActivationPolicy(
        [out] DWORD *pdwPolicy);

    HRESULT OnInactiveMouseMove(
        [in] LPCRECT pRectBounds,
        [in] LONG x,
        [in] LONG y,
        [in] DWORD grfKeyState);

    HRESULT OnInactiveSetCursor(
        [in] LPCRECT pRectBounds,
        [in] LONG x,
        [in] LONG y,
        [in] DWORD dwMouseMsg,
        [in] BOOL fSetAlways);
}


/*****************************************************************************
 * IObjectWithSite interface
 */
[
    object,
    uuid(fc4801a3-2ba9-11cf-a229-00aa003d7352),
    pointer_default(unique)
]
interface IObjectWithSite : IUnknown
{
    typedef IObjectWithSite *LPOBJECTWITHSITE;

    HRESULT SetSite(
        [in] IUnknown * pUnkSite);

    HRESULT GetSite(
        [in] REFIID riid, 
        [out, iid_is(riid)] PVOID *ppvSite);
}


/*****************************************************************************
 * IOleUndoUnit interface
 */
interface IOleUndoManager;  /* forward declaration */
[
    object,
    uuid(894ad3b0-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IOleUndoUnit : IUnknown
{
    typedef IOleUndoUnit *LPOLEUNDOUNIT;

    HRESULT Do( [in] IOleUndoManager *pUndoManager );
    HRESULT GetDescription( [out] BSTR *pBstr );
    HRESULT GetUnitType( [out] CLSID *pClsid, [out] LONG *plID );
    HRESULT OnNextAdd();
}


/*****************************************************************************
 * IOleParentUndoUnit interface
 */
[
    object,
    uuid(a1faf330-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IOleParentUndoUnit : IOleUndoUnit
{
    typedef IOleParentUndoUnit *LPOLEPARENTUNDOUNIT;

    HRESULT Open( [in] IOleParentUndoUnit *pPUU );
    HRESULT Close( [in] IOleParentUndoUnit *pPUU, [in] BOOL fCommit );
    HRESULT Add( [in] IOleUndoUnit *pUU );
    HRESULT FindUnit( [in] IOleUndoUnit *pUU );
    HRESULT GetParentState( [out] DWORD *pdwState );
}


/*****************************************************************************
 * IEnumOleUndoUnits interface
 */
[
    object,
    uuid(b3e7c340-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IEnumOleUndoUnits : IUnknown
{
    typedef IEnumOleUndoUnits *LPENUMOLEUNDOUNITS;

    [local]
    HRESULT Next(
        [in] ULONG cElt,
        [out, size_is(cElt), length_is(*pcEltFetched)] IOleUndoUnit **rgElt,
        [out] ULONG *pcEltFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cElt,
        [out, size_is(cElt), length_is(*pcEltFetched)] IOleUndoUnit **rgElt,
        [out] ULONG *pcEltFetched);

    HRESULT Skip( [in] ULONG cElt );

    HRESULT Reset();

    HRESULT Clone( [out] IEnumOleUndoUnits **ppEnum );
}


/*****************************************************************************
 * IOleUndoManager interface
 */
[
    object,
    uuid(d001f200-ef97-11ce-9bc9-00aa00608e01),
    pointer_default(unique)
]
interface IOleUndoManager : IUnknown
{
    typedef IOleUndoManager *LPOLEUNDOMANAGER;

    HRESULT Open( [in] IOleParentUndoUnit *pPUU );
    HRESULT Close( [in] IOleParentUndoUnit *pPUU, [in] BOOL fCommit );
    HRESULT Add( [in] IOleUndoUnit *pUU );
    HRESULT GetOpenParentState( [out] DWORD *pdwState );
    HRESULT DiscardFrom( [in] IOleUndoUnit *pUU );
    HRESULT UndoTo( [in] IOleUndoUnit *pUU );
    HRESULT RedoTo( [in] IOleUndoUnit *pUU );
    HRESULT EnumUndoable( [out] IEnumOleUndoUnits **ppEnum );
    HRESULT EnumRedoable( [out] IEnumOleUndoUnits **ppEnum );
    HRESULT GetLastUndoDescription( [out] BSTR *pBstr );
    HRESULT GetLastRedoDescription( [out] BSTR *pBstr );
    HRESULT Enable( [in] BOOL fEnable );
}


/*****************************************************************************
 * IQuickActivate interface
 */
[
    object,
    uuid(cf51ed10-62fe-11cf-bf86-00a0c9034836),
    pointer_default(unique)
]
interface IQuickActivate : IUnknown
{
    typedef IQuickActivate *LPQUICKACTIVATE;

    typedef enum tagQACONTAINERFLAGS
    {
        QACONTAINER_SHOWHATCHING = 0x1,
        QACONTAINER_SHOWGRABHANDLES = 0x2,
        QACONTAINER_USERMODE = 0x4,
        QACONTAINER_DISPLAYASDEFAULT = 0x8,
        QACONTAINER_UIDEAD = 0x10,
        QACONTAINER_AUTOCLIP = 0x20,
        QACONTAINER_MESSAGEREFLECT = 0x40,
        QACONTAINER_SUPPORTSMNEMONICS = 0x80
    } QACONTAINERFLAGS;

    typedef DWORD OLE_COLOR;
    
    typedef struct tagQACONTAINER
    {
        ULONG cbSize;
        IOleClientSite *pClientSite;
        IAdviseSinkEx *pAdviseSink;
        IPropertyNotifySink *pPropertyNotifySink;
        IUnknown *pUnkEventSink;
        DWORD dwAmbientFlags;
        OLE_COLOR colorFore;
        OLE_COLOR colorBack;
        IFont *pFont;
        IOleUndoManager *pUndoMgr;
        DWORD dwAppearance;
        LONG lcid;
        HPALETTE hpal;
        IBindHost *pBindHost;
        IOleControlSite *pOleControlSite;
        IServiceProvider *pServiceProvider;
    } QACONTAINER;

    typedef struct tagQACONTROL
    {
        ULONG cbSize;
        DWORD dwMiscStatus;
        DWORD dwViewStatus;
        DWORD dwEventCookie;
        DWORD dwPropNotifyCookie;
        DWORD dwPointerActivationPolicy;
    } QACONTROL;

    [local]
    HRESULT QuickActivate(
        [in] QACONTAINER *pQaContainer,
        [in,out] QACONTROL *pQaControl);

    [call_as(QuickActivate)]
    HRESULT RemoteQuickActivate(
        [in] QACONTAINER *pQaContainer,
        [out] QACONTROL *pQaControl);

    HRESULT SetContentExtent( [in] LPSIZEL pSizel );

    HRESULT GetContentExtent( [out] LPSIZEL pSizel );
}
