/*
 * Copyright 2011 Jacek Caban for CodeWeavers
 *
 * 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
 */

import "oaidl.idl";
import "ocidl.idl";

[
    object,
    uuid(7e8bc44d-aeff-11d1-89c2-00c04fb6bfc4),
    dual,
    pointer_default(unique)
 ]
interface IClientCaps : IDispatch
{
    [propget, id(1)]
    HRESULT javaEnabled([out, retval] VARIANT_BOOL *pVal);

    [propget, id(2)]
    HRESULT cookieEnabled([out, retval] VARIANT_BOOL *pVal);

    [propget, id(3)]
    HRESULT cpuClass([out, retval] BSTR *p);

    [propget, id(4)]
    HRESULT systemLanguage([out, retval] BSTR *p);

    [propget, id(6)]
    HRESULT userLanguage([out, retval] BSTR *p);

    [propget, id(7)]
    HRESULT platform([out, retval] BSTR *p);

    [propget, id(9)]
    HRESULT connectionSpeed([out, retval] long *p);

    [propget, id(10)]
    HRESULT onLine([out, retval] VARIANT_BOOL *p);

    [propget, id(11)]
    HRESULT colorDepth([out, retval] long *p);

    [propget, id(12)]
    HRESULT bufferDepth([out, retval] long *p);

    [propget, id(13)]
    HRESULT width([out, retval] long *p);

    [propget, id(14)]
    HRESULT height([out, retval] long *p);

    [propget, id(15)]
    HRESULT availHeight([out, retval] long *p);

    [propget, id(16)]
    HRESULT availWidth([out, retval] long *p);

    [propget, id(17)]
    HRESULT connectionType([out, retval] BSTR *p);

    [id(18)]
    HRESULT isComponentInstalled(
            [in] BSTR bstrName,
            [in] BSTR bstrType,
            [in, defaultvalue("")] BSTR bStrVer,
            [out, retval] VARIANT_BOOL *p);

    [id(19)]
    HRESULT getComponentVersion(
            [in] BSTR bstrName,
            [in] BSTR bstrType,
            [out, retval] BSTR *pbstrVer);

    [id(20)]
    HRESULT compareVersions(
            [in] BSTR bstrVer1,
            [in] BSTR bstrVer2,
            [out, retval] long *p);

    [id(21)]
    HRESULT addComponentRequest(
            [in] BSTR bstrName,
            [in] BSTR bstrType,
            [in, defaultvalue("")] BSTR bstrVer);

    [id(22)]
    HRESULT doComponentRequest([out, retval] VARIANT_BOOL *p);

    [id(23)]
    HRESULT clearComponentRequest();
}

[
    uuid(7e8bc440-aeff-11d1-89c2-00c04fb6bfc4),
    version(1.0)
]
library IEXTagLib
{
    [
        uuid(7e8bc44e-aeff-11d1-89c2-00C04fb6bfc4)
    ]
    coclass ClientCaps
    {
        [default] interface IClientCaps;
    }
}
