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

#pragma makedep typelib

#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;


};
