/*
 * Background Intelligent Transfer Service (BITS) interface
 *
 * Copyright 2007 Google (Roy Shea)
 *
 * 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
 *
 */

#ifndef DO_NO_IMPORTS
import "unknwn.idl";
#endif

cpp_quote("#include \"bitsmsg.h\"")
cpp_quote("#define BG_SIZE_UNKNOWN (UINT64)(-1)")
cpp_quote("#define BG_NOTIFY_JOB_TRANSFERRED 0x0001")
cpp_quote("#define BG_NOTIFY_JOB_ERROR 0x0002")
cpp_quote("#define BG_NOTIFY_DISABLE 0x0004")
cpp_quote("#define BG_NOTIFY_JOB_MODIFICATION 0x0008")

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef EnumJobs")
cpp_quote("#undef GetJob")
cpp_quote("#endif")

#define BG_ENUM_SIZEIS(maxcount) maxcount
#define BG_ENUM_LENGTHIS(maxcount,lengthptr) lengthptr ? *lengthptr : maxcount

[
    uuid(01b7bd23-fb88-4a77-8490-5891d3e4653a),
    odl
]
interface IBackgroundCopyFile : IUnknown
{
    typedef struct _BG_FILE_PROGRESS {
        UINT64 BytesTotal;
        UINT64 BytesTransferred;
        BOOL Completed;
    } BG_FILE_PROGRESS;

    HRESULT GetRemoteName(
            [out] LPWSTR *pVal
    );

    HRESULT GetLocalName(
            [out] LPWSTR *pVal
    );

    HRESULT GetProgress(
            [out] BG_FILE_PROGRESS *pVal
    );
}


[
    uuid(ca51e165-c365-424c-8d41-24aaa4ff3c40),
    odl
]
interface IEnumBackgroundCopyFiles: IUnknown
{
    HRESULT Next(
            [in] ULONG celt,
            [out,size_is(BG_ENUM_SIZEIS(celt)),length_is(BG_ENUM_LENGTHIS(celt,pceltFetched))] IBackgroundCopyFile **rgelt,
            [in,out,unique] ULONG *pceltFetched
    );

    HRESULT Skip(
            [in] ULONG celt
    );

    HRESULT Reset();

    HRESULT Clone(
            [out] IEnumBackgroundCopyFiles **ppenum
    );

    HRESULT GetCount(
            [out] ULONG *puCount
    );
}


[
    uuid(19c613a0-fcb8-4f28-81ae-897c3d078f81),
    odl
]
interface IBackgroundCopyError : IUnknown
{
    typedef enum {
        BG_ERROR_CONTEXT_NONE = 0,
        BG_ERROR_CONTEXT_UNKNOWN = 1,
        BG_ERROR_CONTEXT_GENERAL_QUEUE_MANAGER = 2,
        BG_ERROR_CONTEXT_QUEUE_MANAGER_NOTIFICATION =3,
        BG_ERROR_CONTEXT_LOCAL_FILE = 4,
        BG_ERROR_CONTEXT_REMOTE_FILE = 5,
        BG_ERROR_CONTEXT_GENERAL_TRANSPORT = 6,
        BG_ERROR_CONTEXT_REMOTE_APPLICATION =7,
    } BG_ERROR_CONTEXT;

    HRESULT GetError(
            [out,ref] BG_ERROR_CONTEXT *pContext,
            [out,ref] HRESULT *pCode
    );

    HRESULT GetFile(
            [out] IBackgroundCopyFile **pVal
    );

    HRESULT GetErrorDescription(
            [in] DWORD LanguageId,
            [out,ref] LPWSTR *pErrorDescription
    );

    HRESULT GetErrorContextDescription(
            [in] DWORD LanguageId,
            [out,ref] LPWSTR *pContextDescription
    );

    HRESULT GetProtocol(
            [out,ref] LPWSTR *pProtocol
    );
}



[
    uuid(37668d37-507e-4160-9316-26306d150b12),
    odl
]
interface IBackgroundCopyJob : IUnknown
{
    typedef struct _BG_FILE_INFO {
        LPWSTR RemoteName;
        LPWSTR LocalName;
    } BG_FILE_INFO;

    typedef struct _BG_JOB_PROGRESS {
        UINT64 BytesTotal;
        UINT64 BytesTransferred;
        ULONG FilesTotal;
        ULONG FilesTransferred;
    } BG_JOB_PROGRESS;

    typedef struct _BG_JOB_TIMES {
        FILETIME CreationTime;
        FILETIME ModificationTime;
        FILETIME TransferCompletionTime;
    } BG_JOB_TIMES;

    typedef enum {
        BG_JOB_PRIORITY_FOREGROUND = 0,
        BG_JOB_PRIORITY_HIGH = 1,
        BG_JOB_PRIORITY_NORMAL = 2,
        BG_JOB_PRIORITY_LOW = 3
    } BG_JOB_PRIORITY;

    typedef enum {
        BG_JOB_STATE_QUEUED = 0,
        BG_JOB_STATE_CONNECTING = 1,
        BG_JOB_STATE_TRANSFERRING = 2,
        BG_JOB_STATE_SUSPENDED = 3,
        BG_JOB_STATE_ERROR = 4,
        BG_JOB_STATE_TRANSIENT_ERROR = 5,
        BG_JOB_STATE_TRANSFERRED = 6,
        BG_JOB_STATE_ACKNOWLEDGED = 7,
        BG_JOB_STATE_CANCELLED = 8
    } BG_JOB_STATE;

    typedef enum {
       BG_JOB_TYPE_DOWNLOAD = 0,
       BG_JOB_TYPE_UPLOAD = 1,
       BG_JOB_TYPE_UPLOAD_REPLY = 2
    } BG_JOB_TYPE;

    typedef enum {
        BG_JOB_PROXY_USAGE_PRECONFIG,
        BG_JOB_PROXY_USAGE_NO_PROXY,
        BG_JOB_PROXY_USAGE_OVERRIDE,
        BG_JOB_PROXY_USAGE_AUTODETECT
    } BG_JOB_PROXY_USAGE;


    HRESULT AddFileSet(
            [in] ULONG cFileCount,
            [in,size_is(cFileCount)] BG_FILE_INFO *pFileSet
    );

    HRESULT AddFile(
            [in] LPCWSTR RemoteUrl,
            [in] LPCWSTR LocalName
    );

    HRESULT EnumFiles(
            [out] IEnumBackgroundCopyFiles **pEnum
    );

    HRESULT Suspend();

    HRESULT Resume();

    HRESULT Cancel();

    HRESULT Complete();

    HRESULT GetId(
            [out] GUID *pVal
    );

    HRESULT GetType(
            [out] BG_JOB_TYPE *pVal
    );

    HRESULT GetProgress(
            [out] BG_JOB_PROGRESS *pVal
    );

    HRESULT GetTimes(
            [out] BG_JOB_TIMES *pVal
    );

    HRESULT GetState(
            [out] BG_JOB_STATE *pVal
    );

    HRESULT GetError(
            [out] IBackgroundCopyError **ppError
    );

    HRESULT GetOwner(
            [out] LPWSTR *pVal
    );

    HRESULT SetDisplayName(
            [in] LPCWSTR Val
    );

    HRESULT GetDisplayName(
            [out] LPWSTR *pVal
    );

    HRESULT SetDescription(
            [in] LPCWSTR Val
    );

    HRESULT GetDescription(
            [out] LPWSTR *pVal
    );

    HRESULT SetPriority(
            [in] BG_JOB_PRIORITY Val
    );

    HRESULT GetPriority(
            [out] BG_JOB_PRIORITY *pVal
    );

    HRESULT SetNotifyFlags(
            [in] ULONG Val
    );

    HRESULT GetNotifyFlags(
            [out] ULONG *pVal
    );

    HRESULT SetNotifyInterface(
            [in] IUnknown *Val
    );

    HRESULT GetNotifyInterface(
            [out] IUnknown ** pVal
    );

    HRESULT SetMinimumRetryDelay(
            [in] ULONG Seconds
    );

    HRESULT GetMinimumRetryDelay(
            [out] ULONG *Seconds
    );

    HRESULT SetNoProgressTimeout(
            [in] ULONG Seconds
    );

    HRESULT GetNoProgressTimeout(
            [out] ULONG *Seconds
    );

    HRESULT GetErrorCount(
            [out] ULONG *Errors
    );

    HRESULT SetProxySettings(
            [in] BG_JOB_PROXY_USAGE ProxyUsage,
            [in,string,unique] const WCHAR *ProxyList,
            [in,string,unique] const WCHAR *ProxyBypassList
    );

    HRESULT GetProxySettings(
            [out] BG_JOB_PROXY_USAGE *pProxyUsage,
            [out] LPWSTR *pProxyList,
            [out] LPWSTR *pProxyBypassList
    );

    HRESULT TakeOwnership();
}

[
    uuid(1af4f612-3b71-466f-8f58-7b6f73ac57ad),
    odl
]
interface IEnumBackgroundCopyJobs : IUnknown
{
    HRESULT Next(
            [in] ULONG celt,
            [out,size_is(BG_ENUM_SIZEIS(celt)),length_is(BG_ENUM_LENGTHIS(celt,pceltFetched))] IBackgroundCopyJob **rgelt,
            [in,out,unique] ULONG *pceltFetched
    );

    HRESULT Skip(
            [in] ULONG celt
    );

    HRESULT Reset();

    HRESULT Clone(
            [out] IEnumBackgroundCopyJobs **ppenum
    );

    HRESULT GetCount(
            [out] ULONG *puCount
    );
}


[
    uuid(97ea99c7-0186-4ad4-8df9-c5b4e0ed6b22),
    odl
]
interface IBackgroundCopyCallback : IUnknown
{
    HRESULT JobTransferred(
            [in] IBackgroundCopyJob *pJob
    );

    HRESULT JobError(
            [in] IBackgroundCopyJob *pJob,
            [in] IBackgroundCopyError *pError
    );

    HRESULT JobModification(
            [in] IBackgroundCopyJob *pJob,
            [in] DWORD dwReserved
    );
}

[
    uuid(5ce34c0d-0dc9-4c1f-897c-daa1b78cee7c),
    odl
]
interface IBackgroundCopyManager : IUnknown
{
    cpp_quote("#define BG_JOB_ENUM_ALL_USERS 0x0001")

    HRESULT CreateJob(
            [in] LPCWSTR DisplayName,
            [in] BG_JOB_TYPE Type,
            [out] GUID *pJobId,
            [out] IBackgroundCopyJob **ppJob
    );

    HRESULT GetJob(
            [in] REFGUID jobID,
            [out] IBackgroundCopyJob **ppJob
    );

    HRESULT EnumJobs(
            [in] DWORD dwFlags,
            [out] IEnumBackgroundCopyJobs **ppEnum
    );
    HRESULT GetErrorDescription(
            [in] HRESULT hResult,
            [in] DWORD LanguageId,
            [out] LPWSTR *pErrorDescription);
}


[
    uuid(1deeb74f-7915-4560-b558-918c83f176a6),
    version(1.0)
]
library BackgroundCopyManager
{
    [
        uuid(4991d34b-80a1-4291-83b6-3328366b9097),
    ]
    coclass BackgroundCopyManager
    {
        [default] interface IBackgroundCopyManager;
    };

    interface IBackgroundCopyCallback;
}
