/*
 * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

cpp_quote("/*")
cpp_quote(" * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.")
cpp_quote(" *")
cpp_quote(" * Redistribution and use in source and binary forms, with or without")
cpp_quote(" * modification, are permitted provided that the following conditions")
cpp_quote(" * are met:")
cpp_quote(" * 1. Redistributions of source code must retain the above copyright")
cpp_quote(" *    notice, this list of conditions and the following disclaimer.")
cpp_quote(" * 2. Redistributions in binary form must reproduce the above copyright")
cpp_quote(" *    notice, this list of conditions and the following disclaimer in the")
cpp_quote(" *    documentation and/or other materials provided with the distribution.")
cpp_quote(" *")
cpp_quote(" * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY")
cpp_quote(" * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE")
cpp_quote(" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR")
cpp_quote(" * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR")
cpp_quote(" * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,")
cpp_quote(" * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,")
cpp_quote(" * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR")
cpp_quote(" * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY")
cpp_quote(" * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT")
cpp_quote(" * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE")
cpp_quote(" * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ")
cpp_quote(" */")

import "oaidl.idl";
import "ocidl.idl";
import "IWebError.idl";
import "IWebURLResponse.idl";

interface IWebURLAuthenticationChallengeSender;
interface IWebURLProtectionSpace;
interface IWebURLCredential;

typedef enum {
    WebURLCredentialPersistenceNone,
    WebURLCredentialPersistenceForSession,
    WebURLCredentialPersistencePermanent
} WebURLCredentialPersistence;

[
    object,
    oleautomation,
    uuid(5382DABA-C3C3-40c5-AA40-04079F11A844),
    pointer_default(unique)
]
interface IWebURLAuthenticationChallenge : IUnknown
{
    /*
        - (NSError *)error
    */
    HRESULT error([out, retval] IWebError** result);

    /*
        - (NSURLResponse *)failureResponse
    */
    HRESULT failureResponse([out, retval] IWebURLResponse** result);

    /*
        - (id)initWithAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge sender:(id<NSURLAuthenticationChallengeSender>)sender
    */
    HRESULT initWithAuthenticationChallenge([in] IWebURLAuthenticationChallenge* challenge, [in] IWebURLAuthenticationChallengeSender* sender);

    /*
        - (id)initWithProtectionSpace:(NSURLProtectionSpace *)space proposedCredential:(NSURLCredential *)credential previousFailureCount:(int)count failureResponse:(NSURLResponse *)response error:(NSError *)error sender:(id <NSURLAuthenticationChallengeSender>)sender
    */
    HRESULT initWithProtectionSpace([in] IWebURLProtectionSpace* space, [in] IWebURLCredential* proposedCredential, [in] int previousFailureCount, [in] IWebURLResponse* failureResponse, [in] IWebError* error, [in] IWebURLAuthenticationChallengeSender* sender);

    /*
        -(unsigned)previousFailureCount
    */
    HRESULT previousFailureCount([out, retval] UINT* result);

    /*
        -(NSURLCredential *)proposedCredential
    */
    HRESULT proposedCredential([out, retval] IWebURLCredential** result);

    /*
        - (NSURLProtectionSpace *)protectionSpace
    */
    HRESULT protectionSpace([out, retval] IWebURLProtectionSpace** result);

    /*
        - (id<NSURLAuthenticationChallengeSender>)sender
    */
    HRESULT sender([out, retval] IWebURLAuthenticationChallengeSender** sender);
}

[
    object,
    oleautomation,
    uuid(9360D6FB-186C-4ff7-AE57-D1B973DA0D1C),
    pointer_default(unique)
]
interface IWebURLAuthenticationChallengeSender : IUnknown
{
    /*
        - (void)cancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
    */
    HRESULT cancelAuthenticationChallenge([in] IWebURLAuthenticationChallenge* challenge);

    /*
        - (void)continueWithoutCredentialForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
    */
    HRESULT continueWithoutCredentialForAuthenticationChallenge([in] IWebURLAuthenticationChallenge* challenge);

    /*
        - (void)useCredential:(NSURLCredential *)credential forAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
    */
    HRESULT useCredential([in] IWebURLCredential* credential, [in] IWebURLAuthenticationChallenge* challenge);
}

cpp_quote("#define WebURLProtectionSpaceHTTP TEXT(\"http\")")
cpp_quote("#define WebURLProtectionSpaceHTTPS TEXT(\"https\")")
cpp_quote("#define WebURLProtectionSpaceFTP TEXT(\"ftp\")")
cpp_quote("#define WebURLProtectionSpaceFTPS TEXT(\"ftps\")")
cpp_quote("#define WebURLProtectionSpaceHTTPProxy TEXT(\"http\")")
cpp_quote("#define WebURLProtectionSpaceHTTPSProxy TEXT(\"https\")")
cpp_quote("#define WebURLProtectionSpaceFTPProxy TEXT(\"ftp\")")
cpp_quote("#define WebURLProtectionSpaceSOCKSProxy TEXT(\"SOCKS\")")
cpp_quote("#define WebURLAuthenticationMethodDefault TEXT(\"WebURLAuthenticationMethodDefault\")")
cpp_quote("#define WebURLAuthenticationMethodHTTPBasic TEXT(\"WebURLAuthenticationMethodHTTPBasic\")")
cpp_quote("#define WebURLAuthenticationMethodHTTPDigest TEXT(\"WebURLAuthenticationMethodHTTPDigest\")")
cpp_quote("#define WebURLAuthenticationMethodHTMLForm TEXT(\"WebURLAuthenticationMethodHTMLForm\")")

[
    object,
    oleautomation,
    hidden,
    uuid(71D2622A-3FF2-404b-BD45-C60659C901AF),
    pointer_default(unique)
]
interface IWebURLProtectionSpace : IUnknown
{
    /*
        -(NSString *)authenticationMethod
    */
    HRESULT authenticationMethod([out, retval] BSTR* result);

    /*
        -(NSString *)host
    */
    HRESULT host([out, retval] BSTR* result);

    /*
        -(id)initWithHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm authenticationMethod:(NSString *)authenticationMethod
    */
    HRESULT initWithHost([in] BSTR host, [in] int port, [in] BSTR protocol, [in] BSTR realm, [in] BSTR authenticationMethod);

    /*
        -(id)initWithProxyHost:(NSString *)host port:(int)port type:(NSString *)proxyType realm:(NSString *)realm authenticationMethod:(NSString *)authenticationMethod
    */
    HRESULT initWithProxyHost([in] BSTR host, [in] int port, [in] BSTR proxyType, [in] BSTR realm, [in] BSTR authenticationMethod);

    /*
        -(BOOL)isProxy
    */
    HRESULT isProxy([out, retval] BOOL* result);

    /*
        -(int)port
    */
    HRESULT port([out, retval] int* result);

    /*
        -(NSString *)protocol
    */
    HRESULT protocol([out, retval] BSTR* result);

    /*
        -(NSString *)proxyType
    */
    HRESULT proxyType([out, retval] BSTR* result);

    /*
        -(NSString *)realm
    */
    HRESULT realm([out, retval] BSTR* result);

    /*
        -(BOOL)receivesCredentialSecurely
    */
    HRESULT receivesCredentialSecurely([out, retval] BOOL* result);
}

[
    object,
    oleautomation,
    hidden,
    uuid(A1E9D765-FACE-4189-BBE3-AED7EBF65EBD),
    pointer_default(unique)
]
interface IWebURLCredential : IUnknown
{
    /*
        -(BOOL)hasPassword
    */
    HRESULT hasPassword([out, retval] BOOL* result);

    /*
        -(id)initWithUser:(NSString *)user password:(NSString *)password persistence:(NSURLCredentialPersistence)persistence
    */
    HRESULT initWithUser([in] BSTR user, [in] BSTR password, [in] WebURLCredentialPersistence persistence);

    /*
        -(NSString *)password
    */
    HRESULT password([out, retval] BSTR* password);

    /*
        -(NSURLCredentialPersistence)persistence
    */
    HRESULT persistence([out, retval] WebURLCredentialPersistence* result);

    /*
        -(NSString *)user
    */
    HRESULT user([out, retval] BSTR* result);
}
