/*
 * Copyright 2009 Damjan Jovanovic
 *
 * 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 "wtypes.idl";
import "objidl.idl";

interface IEnumWIA_DEV_INFO;
interface IWiaItem;
interface IWiaEventCallback;

cpp_quote("DEFINE_GUID(CLSID_WiaDevMgr, 0xa1f4e726,0x8cf1,0x11d1,0xbf,0x92,0x00,0x60,0x08,0x1e,0xd8,0x11);")

[
    object,
    uuid(5eb2502a-8cf1-11d1-bf92-0060081ed811)
]
interface IWiaDevMgr : IUnknown
{
    HRESULT EnumDeviceInfo(
        [in] LONG lFlag,
        [retval, out] IEnumWIA_DEV_INFO **ppIEnum);

    HRESULT CreateDevice(
        [in] BSTR bstrDeviceID,
        [out] IWiaItem **ppWiaItemRoot);

    HRESULT SelectDeviceDlg(
        [in] HWND hwndParent,
        [in] LONG lDeviceType,
        [in] LONG lFlags,
        [in, out] BSTR *pbstrDeviceID,
        [retval, out] IWiaItem **ppItemRoot);

    HRESULT SelectDeviceDlgID(
        [in] HWND hwndParent,
        [in] LONG lDeviceType,
        [in] LONG lFlags,
        [retval, out] BSTR *pbstrDeviceID);

    HRESULT GetImageDlg(
        [in] HWND hwndParent,
        [in] LONG lDeviceType,
        [in] LONG lFlags,
        [in] LONG lIntent,
        [in] IWiaItem *pItemRoot,
        [in] BSTR bstrFilename,
        [in, out] GUID *pguidFormat);

    HRESULT RegisterEventCallbackProgram(
        [in] LONG lFlags,
        [in] BSTR bstrDeviceID,
        [in] const GUID *pEventGUID,
        [in] BSTR bstrCommandline,
        [in] BSTR bstrName,
        [in] BSTR bstrDescription,
        [in] BSTR bstrIcon);

    HRESULT RegisterEventCallbackInterface(
        [in] LONG lFlags,
        [in] BSTR bstrDeviceID,
        [in] const GUID *pEventGUID,
        [unique, in] IWiaEventCallback *pIWiaEventCallback,
        [out] IUnknown **pEventObject);

    HRESULT RegisterEventCallbackCLSID(
        [in] LONG lFlags,
        [in] BSTR bstrDeviceID,
        [in] const GUID *pEventGUID,
        [unique, in] const GUID *pClsID,
        [in] BSTR bstrName,
        [in] BSTR bstrDescription,
        [in] BSTR bstrIcon);

    HRESULT AddDeviceDlg(
        [in] HWND hwndParent,
        [in] LONG lFlags);
}

[
    object,
    uuid(5e38b83c-8cf1-11d1-bf92-0060081ed811)
]
interface IEnumWIA_DEV_INFO : IUnknown
{
    /* fill in */
}

[
    object,
    uuid(4db1ad10-3391-11d2-9a33-00c04fa36145)
]
interface IWiaItem : IUnknown
{
    /* FIXME: fill in */
}

[
    object,
    uuid(ae6287b0-0084-11d2-973b-00a0c9068f2e)
]
interface IWiaEventCallback : IUnknown
{
    HRESULT ImageEventCallback(
        [in] const GUID *pEventGUID,
        [in] BSTR bstrEventDescription,
        [in] BSTR bstrDeviceID,
        [in] BSTR bstrDeviceDescription,
        [in] DWORD dwDeviceType,
        [in] BSTR bstrFullItemName,
        [in,out] ULONG *pulEventType,
        [in] ULONG ulReserved);
}
