/*
 * Copyright (C) 2003 Robert Shearman
 *               2005 Huw Davies
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 */

#if 0
#pragma makedep install
#pragma makedep typelib
#endif

#include <olectl.h>

[
  uuid(00020430-0000-0000-C000-000000000046),
  version(2.0),
  helpstring("OLE Automation")
]
library stdole
{
	/* typedefs aren't stored in the type library.
           These type names are known by the type compiler so it
           doesn't really matter what we define them as. */

    typedef short VARIANT_BOOL;
    typedef long BSTR;
    typedef double CURRENCY;
    typedef unsigned long HRESULT;
    typedef void *VARIANT;
    typedef unsigned long SCODE;

    typedef struct GUID {
        unsigned long  Data1;
        unsigned short Data2;
        unsigned short Data3;
        unsigned char  Data4[ 8 ];
    } GUID;

    typedef struct DISPPARAMS {
        VARIANT *rgvarg;
        long *rgdispidNamedArgs;
        unsigned int cArgs;
        unsigned int cNamedArgs;
    } DISPPARAMS;

    typedef struct EXCEPINFO {
        unsigned short wCode;
        unsigned short wReserved;
        BSTR  bstrSource;
        BSTR  bstrDescription;
        BSTR  bstrHelpFile;
        unsigned long dwHelpContext;
        void *pvReserved;
        void *pfnDeferredFillIn;
        SCODE scode;
    } EXCEPINFO;

    [
        odl,
        uuid(00000000-0000-0000-C000-000000000046),
        hidden
    ]
    interface IUnknown
    {
        [restricted]
        HRESULT QueryInterface(
                               [in] GUID *riid,
                               [out] void **ppvObj);

        [restricted]
        unsigned long AddRef();

        [restricted]
        unsigned long Release();
    }

    [
        odl,
        uuid(00020400-0000-0000-C000-000000000046),
        restricted
    ]
    interface IDispatch : IUnknown
    {
        [restricted]
        HRESULT GetTypeInfoCount(
                                 [out] unsigned int *pctinfo);

        [restricted]
        HRESULT GetTypeInfo(
                            [in] unsigned int itinfo,
                            [in] unsigned long lcid,
                            [out] void **pptinfo);

        [restricted]
        HRESULT GetIDsOfNames(
                              [in] GUID *riid,
                              [in] char **rgszNames,
                              [in] unsigned int cNames,
                              [in] unsigned long lcid,
                              [out] long *rgdispid);

        [restricted]
        HRESULT Invoke(
                       [in] long dispidMember,
                       [in] GUID *riid,
                       [in] unsigned long lcid,
                       [in] unsigned short wFlags,
                       [in] DISPPARAMS *pdispparams,
                       [out] VARIANT *pvarResult,
                       [out] EXCEPINFO *pexcepinfo,
                       [out] unsigned int *puArgErr);

    }

    [
        odl,
        uuid(00020404-0000-0000-C000-000000000046),
        hidden
    ]
    interface IEnumVARIANT : IUnknown
    {
        HRESULT Next(
                     [in] unsigned long celt,
                     [in] VARIANT *rgvar,
                     [out] unsigned long *pceltFetched);

        HRESULT Skip(
                     [in] unsigned long celt);

        HRESULT Reset();

        HRESULT Clone(
                      [out] IEnumVARIANT **ppenum);
    }

    typedef [uuid(66504301-BE0F-101A-8BBB-00AA00300CAB), public]
        unsigned long OLE_COLOR;

    typedef [uuid(66504302-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_XPOS_PIXELS;

    typedef [uuid(66504303-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_YPOS_PIXELS;

    typedef [uuid(66504304-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_XSIZE_PIXELS;

    typedef [uuid(66504305-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_YSIZE_PIXELS;

    typedef [uuid(66504306-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_XPOS_HIMETRIC;

    typedef [uuid(66504307-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_YPOS_HIMETRIC;

    typedef [uuid(66504308-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_XSIZE_HIMETRIC;

    typedef [uuid(66504309-BE0F-101A-8BBB-00AA00300CAB), public]
        long OLE_YSIZE_HIMETRIC;

    typedef [uuid(BF030640-9069-101B-AE2D-08002B2EC713), public]
        float OLE_XPOS_CONTAINER;

    typedef [uuid(BF030641-9069-101B-AE2D-08002B2EC713), public]
        float OLE_YPOS_CONTAINER;

    typedef [uuid(BF030642-9069-101B-AE2D-08002B2EC713), public]
        float OLE_XSIZE_CONTAINER;

    typedef [uuid(BF030643-9069-101B-AE2D-08002B2EC713), public]
        float OLE_YSIZE_CONTAINER;

    typedef [uuid(66504313-BE0F-101A-8BBB-00AA00300CAB), public]
        int OLE_HANDLE;

    typedef [uuid(6650430B-BE0F-101A-8BBB-00AA00300CAB), public]
        VARIANT_BOOL OLE_OPTEXCLUSIVE;

    typedef [uuid(BF030644-9069-101B-AE2D-08002B2EC713), public]
        VARIANT_BOOL OLE_CANCELBOOL;

    typedef [uuid(BF030645-9069-101B-AE2D-08002B2EC713), public]
        VARIANT_BOOL OLE_ENABLEDEFAULTBOOL;

    [
     uuid(6650430A-BE0F-101A-8BBB-00AA00300CAB)
    ]
    enum OLE_TRISTATE {
        Unchecked = 0,
        Checked = 1,
        Gray = 2
    };

    typedef [uuid(6650430D-BE0F-101A-8BBB-00AA00300CAB), public]
        BSTR FONTNAME;

    typedef [uuid(6650430E-BE0F-101A-8BBB-00AA00300CAB), public]
        CURRENCY FONTSIZE;

    typedef [uuid(6650430F-BE0F-101A-8BBB-00AA00300CAB), public]
        VARIANT_BOOL FONTBOLD;

    typedef [uuid(66504310-BE0F-101A-8BBB-00AA00300CAB), public]
        VARIANT_BOOL FONTITALIC;

    typedef [uuid(66504311-BE0F-101A-8BBB-00AA00300CAB), public]
        VARIANT_BOOL FONTUNDERSCORE;

    typedef [uuid(66504312-BE0F-101A-8BBB-00AA00300CAB), public]
        VARIANT_BOOL FONTSTRIKETHROUGH;


    [
     odl,
     uuid(BEF6E002-A874-101A-8BBA-00AA00300CAB),
     helpstring("Font Object"),
     hidden
    ]
    interface IFont : IUnknown {
        [propget] HRESULT Name([out, retval] BSTR *pname);
        [propput] HRESULT Name([in] BSTR pname);

        [propget] HRESULT Size([out, retval] CURRENCY *psize);
        [propput] HRESULT Size([in] CURRENCY psize);

        [propget] HRESULT Bold([out, retval] VARIANT_BOOL *pbold);
        [propput] HRESULT Bold([in] VARIANT_BOOL pbold);

        [propget] HRESULT Italic([out, retval] VARIANT_BOOL *pitalic);
        [propput] HRESULT Italic([in] VARIANT_BOOL pitalic);

        [propget] HRESULT Underline([out, retval] VARIANT_BOOL *punderline);
        [propput] HRESULT Underline([in] VARIANT_BOOL punderline);

        [propget] HRESULT Strikethrough([out, retval] VARIANT_BOOL *pstrikethrough);
        [propput] HRESULT Strikethrough([in] VARIANT_BOOL pstrikethrough);

        [propget] HRESULT Weight([out, retval] short *pweight);
        [propput] HRESULT Weight([in] short pweight);

        [propget] HRESULT Charset([out, retval] short *pcharset);
        [propput] HRESULT Charset([in] short pcharset);

        [propget] HRESULT hFont([out, retval] OLE_HANDLE *phfont);
        
        HRESULT Clone([out] IFont **ppfont);

        HRESULT IsEqual([in] IFont *pfontOther);

        HRESULT SetRatio([in] long cyLogical, [in] long cyHimetric);

        HRESULT AddRefHfont([in] OLE_HANDLE hFont);

        HRESULT ReleaseHfont([in] OLE_HANDLE hFont);
    };


    [
     odl,
     uuid(BEF6E003-A874-101A-8BBA-00AA00300CAB)
    ]
    dispinterface Font {
    properties:
        [id(DISPID_FONT_NAME)] BSTR Name;
        [id(DISPID_FONT_SIZE)] CURRENCY Size;
        [id(DISPID_FONT_BOLD)] VARIANT_BOOL Bold;
        [id(DISPID_FONT_ITALIC)] VARIANT_BOOL Italic;
        [id(DISPID_FONT_UNDER)] VARIANT_BOOL Underline;
        [id(DISPID_FONT_STRIKE)] VARIANT_BOOL Strikethrough;
        [id(DISPID_FONT_WEIGHT)] short Weight;
        [id(DISPID_FONT_CHARSET)] short Charset;
    methods:
    }

    typedef [public] Font IFontDisp;

    [
     uuid(0BE35203-8F91-11CE-9DE3-00AA004BB851)
    ]
    coclass StdFont {
        [default] dispinterface Font;
        /* FIXME: We can't reference dispinterface FontEvents here because we need it to
           appear at the end of the typelib. */
/*      [default, source] dispinterface FontEvents;*/
        interface IFont;
    };

    [
     odl,
     uuid(7BF80980-BF32-101A-8BBB-00AA00300CAB),
     helpstring("Picture Object"),
     hidden
    ]
    interface IPicture : IUnknown {
        [propget] HRESULT Handle([out, retval] OLE_HANDLE *phandle);

        [propget] HRESULT hPal([out, retval] OLE_HANDLE *phpal);
        
        [propget] HRESULT Type([out, retval] short *ptype);

        [propget] HRESULT Width([out, retval] OLE_XSIZE_HIMETRIC *pwidth);

        [propget] HRESULT Height([out, retval] OLE_YSIZE_HIMETRIC *pheight);

        HRESULT Render([in] int 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] void *prcWBounds);

        [propput] HRESULT hPal([in] OLE_HANDLE phpal);

        [propget] HRESULT CurDC([out, retval] int *phdcOut);

        HRESULT SelectPicture([in] int hdcIn,
                              [out] int *phdcOut,
                              [out] OLE_HANDLE *phbmpOut);
        
        [propget] HRESULT KeepOriginalFormat([out, retval] VARIANT_BOOL *pfkeep);
        [propput] HRESULT KeepOriginalFormat([in] VARIANT_BOOL pfkeep);

        HRESULT PictureChanged();

        HRESULT SaveAsFile([in] void *pstm,
                           [in] VARIANT_BOOL fSaveMemCopy,
                           [out] long *pcbSize);

        [propget] HRESULT Attributes([out, retval] long *pdwAttr);

        HRESULT SetHdc([in] OLE_HANDLE hdc);
    };

    [
     uuid(7BF80981-BF32-101A-8BBB-00AA00300CAB)
    ]
    dispinterface Picture {
    properties:
        [id(DISPID_PICT_HANDLE), readonly] OLE_HANDLE Handle;
        [id(DISPID_PICT_HPAL)] OLE_HANDLE hPal;
        [id(DISPID_PICT_TYPE), readonly] short Type;
        [id(DISPID_PICT_WIDTH), readonly] OLE_XSIZE_HIMETRIC Width;
        [id(DISPID_PICT_HEIGHT), readonly] OLE_YSIZE_HIMETRIC Height;
    methods:
        [id(DISPID_PICT_RENDER)]
                  void Render(int hdc,
                              long x,
                              long y,
                              long cx,
                              long cy,
                              OLE_XPOS_HIMETRIC xSrc,
                              OLE_YPOS_HIMETRIC ySrc,
                              OLE_XSIZE_HIMETRIC cxSrc,
                              OLE_YSIZE_HIMETRIC cySrc,
                              void *prcWBounds);
    };
    
    typedef [public] Picture IPictureDisp;

    [
     uuid(0BE35204-8F91-11CE-9DE3-00AA004BB851)
    ]
    coclass StdPicture {
        [default] dispinterface Picture;
        interface IPicture;
    };

    [
     uuid(E6C8FA08-BD9F-11D0-985E-00C04FC29993)
    ]
    enum LoadPictureConstants {
        Default = 0,
        Monochrome = 1,
        VgaColor = 2,
        Color = 4
    };

    [
     dllname("oleaut32.dll"),
     uuid(91209AC0-60F6-11CF-9C5D-00AA00C1489E),
     helpstring("Functions for Standard OLE Objects"),
     helpcontext(0x2775)
    ]
    module StdFunctions{
        [
         entry("OleLoadPictureFileEx"),
         helpstring("Loads a picture from a file"),
         helpcontext(0x2775)
        ]
        HRESULT LoadPicture([in, optional] VARIANT filename,
                            [in, defaultvalue(0)] int widthDesired,
                            [in, defaultvalue(0)] int heightDesired,
                            [in, defaultvalue(Default)] enum LoadPictureConstants flags,
                            [out, retval] IPictureDisp **retval);
        [
         entry("OleSavePictureFile"),
         helpstring("Saves a picture to a file"),
         helpcontext(0x2775)
        ]
        HRESULT SavePicture([in] IPictureDisp *Picture,
                            [in] BSTR filename);
    };


    [
     uuid(4EF6100A-AF88-11D0-9846-00C04FC29993),
     helpstring("Event Interface for the Font Object"),
     hidden
    ]
    dispinterface FontEvents {
    properties:
    methods:
        [id(DISPID_FONT_CHANGED)] void FontChanged([in] BSTR PropertyName);
    };

    typedef [public] FontEvents IFontEventsDisp;


};
