/*
 * 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;

    HRESULT get_Name( [out] BSTR *pname);
    HRESULT put_Name( [in] BSTR name );
    HRESULT get_Size( [out] CY *psize );
    HRESULT put_Size( [in] CY size );
    HRESULT get_Bold( [out] BOOL *pbold );
    HRESULT put_Bold( [in] BOOL bold );
    HRESULT get_Italic( [out] BOOL *pitalic );
    HRESULT put_Italic( [in] BOOL italic );
    HRESULT get_Underline( [out] BOOL *punderline );
    HRESULT put_Underline( [in] BOOL underline );
    HRESULT get_Strikethrough( [out] BOOL *pstrikethrough );
    HRESULT put_Strikethrough( [in] BOOL strikethrough );
    HRESULT get_Weight( [out] SHORT *pweight );
    HRESULT put_Weight( [in] SHORT weight );
    HRESULT get_Charset( [out] SHORT *pcharset );
    HRESULT put_Charset( [in] SHORT charset );
    HRESULT get_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;

    HRESULT get_Handle( [out] OLE_HANDLE *pHandle );
    HRESULT get_hPal( [out] OLE_HANDLE *phPal );
    HRESULT get_Type( [out] SHORT *pType );
    HRESULT get_Width( [out] OLE_XSIZE_HIMETRIC *pWidth );
    HRESULT get_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 );

    HRESULT get_CurDC( [out] HDC *phDC );

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

    HRESULT get_KeepOriginalFormat( [out] BOOL *pKeep );

    HRESULT put_KeepOriginalFormat( [in] BOOL keep );

    HRESULT PictureChanged();

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

    HRESULT get_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 __WINESRC__")
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 );
}
