// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
use shared::basetsd::UINT64;
use shared::guiddef::{GUID, REFGUID};
use shared::minwindef::{BOOL, DWORD, FILETIME, ULONG};
use um::bits::{
    IBackgroundCopyCallback, IBackgroundCopyCallbackVtbl, IBackgroundCopyFile, IBackgroundCopyJob,
};
use um::bits2_0::{
    BG_FILE_RANGE, IBackgroundCopyFile2, IBackgroundCopyFile2Vtbl, IBackgroundCopyJob3,
    IBackgroundCopyJob3Vtbl,
};
use um::unknwnbase::{IUnknown, IUnknownVtbl};
use um::winnt::{HRESULT, LPCWSTR, LPWSTR};
RIDL!{#[uuid(0x659cdeaf, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IBitsPeerCacheRecord(IBitsPeerCacheRecordVtbl): IUnknown(IUnknownVtbl) {
    fn GetId(
        pVal: *mut GUID,
    ) -> HRESULT,
    fn GetOriginUrl(
        pVal: *mut LPWSTR,
    ) -> HRESULT,
    fn GetFileSize(
        pVal: *mut UINT64,
    ) -> HRESULT,
    fn GetFileModificationTime(
        pVal: *mut FILETIME,
    ) -> HRESULT,
    fn GetLastAccessTime(
        pVal: *mut FILETIME,
    ) -> HRESULT,
    fn IsFileValidated() -> HRESULT,
    fn GetFileRanges(
        pRangeCount: *mut DWORD,
        ppRanges: *mut *mut BG_FILE_RANGE,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x659cdea4, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IEnumBitsPeerCacheRecords(IEnumBitsPeerCacheRecordsVtbl): IUnknown(IUnknownVtbl) {
    fn Next(
        celt: ULONG,
        rgelt: *mut *mut IBitsPeerCacheRecord,
        pceltFetched: *mut ULONG,
    ) -> HRESULT,
    fn Skip(
        celt: ULONG,
    ) -> HRESULT,
    fn Reset() -> HRESULT,
    fn Clone(
        ppenum: *mut *mut IEnumBitsPeerCacheRecords,
    ) -> HRESULT,
    fn GetCount(
        puCount: *mut ULONG,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x659cdea2, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IBitsPeer(IBitsPeerVtbl): IUnknown(IUnknownVtbl) {
    fn GetPeerName(
        pName: *mut LPWSTR,
    ) -> HRESULT,
    fn IsAuthenticated(
        pAuth: *mut BOOL,
    ) -> HRESULT,
    fn IsAvailable(
        pOnline: *mut BOOL,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x659cdea5, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IEnumBitsPeers(IEnumBitsPeersVtbl): IUnknown(IUnknownVtbl) {
    fn Next(
        celt: ULONG,
        rgelt: *mut *mut IBitsPeer,
        pceltFetched: *mut ULONG,
    ) -> HRESULT,
    fn Skip(
        celt: ULONG,
    ) -> HRESULT,
    fn Reset() -> HRESULT,
    fn Clone(
        ppenum: *mut *mut IEnumBitsPeers,
    ) -> HRESULT,
    fn GetCount(
        puCount: *mut ULONG,
    ) -> HRESULT,
}}
pub const BG_ENABLE_PEERCACHING_CLIENT: DWORD = 0x0001;
pub const BG_ENABLE_PEERCACHING_SERVER: DWORD = 0x0002;
pub const BG_DISABLE_BRANCH_CACHE: DWORD = 0x0004;
RIDL!{#[uuid(0x659cdead, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IBitsPeerCacheAdministration(IBitsPeerCacheAdministrationVtbl): IUnknown(IUnknownVtbl) {
    fn GetMaximumCacheSize(
        pBytes: *mut DWORD,
    ) -> HRESULT,
    fn SetMaximumCacheSize(
        Bytes: DWORD,
    ) -> HRESULT,
    fn GetMaximumContentAge(
        pSeconds: *mut ULONG,
    ) -> HRESULT,
    fn SetMaximumContentAge(
        Seconds: ULONG,
    ) -> HRESULT,
    fn GetConfigurationFlags(
        pFlags: *mut DWORD,
    ) -> HRESULT,
    fn SetConfigurationFlags(
        Flags: DWORD,
    ) -> HRESULT,
    fn EnumRecords(
        ppEnum: *mut *mut IEnumBitsPeerCacheRecords,
    ) -> HRESULT,
    fn GetRecord(
        ppRecord: *mut *mut IBitsPeerCacheRecord,
    ) -> HRESULT,
    fn ClearRecords() -> HRESULT,
    fn DeleteRecord(
        id: REFGUID,
    ) -> HRESULT,
    fn DeleteUrl(
        url: LPCWSTR,
    ) -> HRESULT,
    fn EnumPeers(
        ppEnum: *mut *mut IEnumBitsPeers,
    ) -> HRESULT,
    fn ClearPeers() -> HRESULT,
    fn DiscoverPeers() -> HRESULT,
}}
pub const BG_JOB_ENABLE_PEERCACHING_CLIENT: DWORD = 0x0001;
pub const BG_JOB_ENABLE_PEERCACHING_SERVER: DWORD = 0x0002;
pub const BG_JOB_DISABLE_BRANCH_CACHE: DWORD = 0x0004;
RIDL!{#[uuid(0x659cdeae, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IBackgroundCopyJob4(IBackgroundCopyJob4Vtbl):
    IBackgroundCopyJob3(IBackgroundCopyJob3Vtbl) {
    fn SetPeerCachingFlags(
        Flags: DWORD,
    ) -> HRESULT,
    fn GetPeerCachingFlags(
        pFlags: *mut DWORD,
    ) -> HRESULT,
    fn GetOwnerIntegrityLevel(
        pLevel: *mut ULONG,
    ) -> HRESULT,
    fn GetOwnerElevationState(
        pElevated: *mut BOOL,
    ) -> HRESULT,
    fn SetMaximumDownloadTime(
        Timeout: ULONG,
    ) -> HRESULT,
    fn GetMaximumDownloadTime(
        pTimeout: *mut ULONG,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x659cdeaa, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IBackgroundCopyFile3(IBackgroundCopyFile3Vtbl):
    IBackgroundCopyFile2(IBackgroundCopyFile2Vtbl) {
    fn GetTemporaryName(
        pFilename: *mut LPWSTR,
    ) -> HRESULT,
    fn SetValidationState(
        state: BOOL,
    ) -> HRESULT,
    fn GetValidationState(
        pState: *mut BOOL,
    ) -> HRESULT,
    fn IsDownloadedFromPeer(
        pVal: *mut BOOL,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x659cdeac, 0x489e, 0x11d9, 0xa9, 0xcd, 0x00, 0x0d, 0x56, 0x96, 0x52, 0x51)]
interface IBackgroundCopyCallback2(IBackgroundCopyCallback2Vtbl):
    IBackgroundCopyCallback(IBackgroundCopyCallbackVtbl) {
    fn FileTransferred(
        pJob: *mut IBackgroundCopyJob,
        pFile: *mut IBackgroundCopyFile,
    ) -> HRESULT,
}}