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


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