/*
 * 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 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. 
 */

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