/*
 * Copyright (C) 2006, 2007, 2008 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 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 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. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
#endif

/*!
    @class WebResource
    @discussion A WebResource represents a fully downloaded URL. 
    It includes the data of the resource as well as the metadata associated with the resource.
    
    @interface WebResource : NSObject <NSCoding, NSCopying>
*/
[
    object,
    oleautomation,
    uuid(09567E0E-7859-494a-B0E4-92C13CFE5574),
    pointer_default(unique)
]
interface IWebResource : IUnknown
{
    /*!
        @method initWithData:URL:MIMEType:textEncodingName:frameName
        @abstract The initializer for WebResource.
        @param data The data of the resource.
        @param URL The URL of the resource.
        @param MIMEType The MIME type of the resource.
        @param textEncodingName The text encoding name of the resource (can be nil).
        @param frameName The frame name of the resource if the resource represents the contents of an entire HTML frame (can be nil).
        @result An initialized WebResource.
        - (id)initWithData:(NSData *)data URL:(NSURL *)URL MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName frameName:(NSString *)frameName;
    */
    HRESULT initWithData([in] IStream* data, [in] BSTR url, [in] BSTR mimeType, [in] BSTR textEncodingName, [in] BSTR frameName);

    /*!
        @method data
        @result The data of the resource.
        - (NSData *)data;
    */
    HRESULT data([out, retval] IStream** data);

    /*!
        @method URL
        @result The URL of the resource.
        - (NSURL *)URL;
    */
    HRESULT URL([out, retval] BSTR* url);

    /*!
        @method MIMEType
        @result The MIME type of the resource.
        - (NSString *)MIMEType;
    */
    HRESULT MIMEType([out, retval] BSTR* mime);

    /*!
        @method textEncodingName
        @result The text encoding name of the resource (can be nil).
        - (NSString *)textEncodingName;
    */
    HRESULT textEncodingName([out, retval] BSTR* encodingName);

    /*!
        @method frameName
        @result The frame name of the resource if the resource represents the contents of an entire HTML frame (can be nil).
        - (NSString *)frameName;
    */
    HRESULT frameName([out, retval] BSTR* name);
}
