/*
 * Copyright 2021 Nikolay Sivov 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";

[
    object,
    uuid(1b8efec4-3019-4c27-964e-367202156906),
]
interface IPrintDocumentPackageTarget : IUnknown
{
    HRESULT GetPackageTargetTypes(
        [out] UINT32 *targetCount,
        [out, size_is(, *targetCount)] GUID **targetTypes
    );

    HRESULT GetPackageTarget(
        [in] REFGUID guidTargetType,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvTarget
    );

    HRESULT Cancel();
}

typedef [v1_enum] enum PrintDocumentPackageCompletion
{
    PrintDocumentPackageCompletion_InProgress,
    PrintDocumentPackageCompletion_Completed,
    PrintDocumentPackageCompletion_Canceled,
    PrintDocumentPackageCompletion_Failed
} PrintDocumentPackageCompletion;

typedef struct
{
    UINT32 JobId;
    INT32 CurrentDocument;
    INT32 CurrentPage;
    INT32 CurrentPageTotal;
    PrintDocumentPackageCompletion Completion;
    HRESULT PackageStatus;
} PrintDocumentPackageStatus;

[
    object,
    dual,
    nonextensible,
    uuid(ed90c8ad-5c34-4d05-a1ec-0e8a9b3ad7af),
]
interface IPrintDocumentPackageStatusEvent : IDispatch
{
    [id(1)]
    HRESULT PackageStatusUpdated(
        [in] PrintDocumentPackageStatus *packageStatus
    );
}

[
    object,
    uuid(d2959bf7-b31b-4a3d-9600-712eb1335ba4),
]
interface IPrintDocumentPackageTargetFactory : IUnknown
{
    HRESULT CreateDocumentPackageTargetForPrintJob(
        [in, string] LPCWSTR printerName,
        [in, string] LPCWSTR jobName,
        [in] IStream *jobOutputStream,
        [in] IStream *jobPrintTicketStream,
        [out] IPrintDocumentPackageTarget **docPackageTarget
    );
}

[
    version(1.0),
    uuid(410d76f7-8bb5-4a7d-9d37-9c71b1b14d14),
]
library PrintDocumentTargetLib
{

[
    noncreatable,
    uuid(4842669e-9947-46ea-8ba2-d8cce432c2ca),
]
coclass PrintDocumentPackageTarget
{
    [default] interface IPrintDocumentPackageTarget;
    [source] dispinterface IPrintDocumentPackageStatusEvent;
}

[
    uuid(348ef17d-6c81-4982-92b4-ee188a43867a)
]
coclass PrintDocumentPackageTargetFactory
{
    [default] interface IPrintDocumentPackageTargetFactory;
}

} /* library */

cpp_quote("DEFINE_GUID(ID_DOCUMENTPACKAGETARGET_MSXPS, 0x9cae40a8, 0xded1, 0x41c9, 0xa9, 0xfd, 0xd7, 0x35, 0xef, 0x33, 0xae, 0xda);")
cpp_quote("DEFINE_GUID(ID_DOCUMENTPACKAGETARGET_OPENXPS, 0x0056bb72, 0x8c9c, 0x4612, 0xbd, 0x0f, 0x93, 0x01, 0x2a, 0x87, 0x09, 0x9d);")
cpp_quote("DEFINE_GUID(ID_DOCUMENTPACKAGETARGET_OPENXPS_WITH_3D, 0x63dbd720, 0x8b14, 0x4577, 0xb0, 0x74, 0x7b, 0xb1, 0x1b, 0x59, 0x6d, 0x28);")