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

#ifndef WebHTMLRepresentation_H
#define WebHTMLRepresentation_H

#include "IWebHTMLRepresentation.h"
#include "IWebDocument.h"

class WebFrame;

class WebHTMLRepresentation : public IWebHTMLRepresentation, IWebDocumentRepresentation
{
public:
    static WebHTMLRepresentation* createInstance(WebFrame* frame);
protected:
    WebHTMLRepresentation();
    ~WebHTMLRepresentation();
public:

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef(void);
    virtual ULONG STDMETHODCALLTYPE Release(void);

    // IWebHTMLRepresentation
    virtual HRESULT STDMETHODCALLTYPE supportedMIMETypes( 
        /* [out][in] */ BSTR* types,
        /* [out][in] */ int* cTypes);
    
    virtual HRESULT STDMETHODCALLTYPE supportedNonImageMIMETypes( 
        /* [out][in] */ BSTR* types,
        /* [out][in] */ int* cTypes);
    
    virtual HRESULT STDMETHODCALLTYPE supportedImageMIMETypes( 
        /* [out][in] */ BSTR* types,
        /* [out][in] */ int* cTypes);
    
    virtual HRESULT STDMETHODCALLTYPE attributedStringFromDOMNodes( 
        /* [in] */ IDOMNode* startNode,
        /* [in] */ int startOffset,
        /* [in] */ IDOMNode* endNode,
        /* [in] */ int endOffset,
        /* [retval][out] */ IDataObject** attributedString);
    
    virtual HRESULT STDMETHODCALLTYPE elementWithName( 
        /* [in] */ BSTR name,
        /* [in] */ IDOMElement* form,
        /* [retval][out] */ IDOMElement** element);
    
    virtual HRESULT STDMETHODCALLTYPE elementDoesAutoComplete( 
        /* [in] */ IDOMElement* element,
        /* [retval][out] */ BOOL* result);
    
    virtual HRESULT STDMETHODCALLTYPE elementIsPassword( 
        /* [in] */ IDOMElement* element,
        /* [retval][out] */ BOOL* result);
    
    virtual HRESULT STDMETHODCALLTYPE formForElement( 
        /* [in] */ IDOMElement* element,
        /* [retval][out] */ IDOMElement** form);
    
    virtual HRESULT STDMETHODCALLTYPE currentForm( 
        /* [retval][out] */ IDOMElement** form);
    
    virtual HRESULT STDMETHODCALLTYPE controlsInForm( 
        /* [in] */ IDOMElement* form,
        /* [out][in] */ IDOMElement** controls,
        /* [out][in] */ int* cControls);
    
    virtual HRESULT STDMETHODCALLTYPE searchForLabels( 
        /* [size_is][in] */ BSTR *labels,
        /* [in] */ int cLabels,
        /* [in] */ IDOMElement *beforeElement,
        /* [retval][out] */ BSTR *result);
    
    virtual HRESULT STDMETHODCALLTYPE matchLabels( 
        /* [size_is][in] */ BSTR *labels,
        /* [in] */ int cLabels,
        /* [in] */ IDOMElement *againstElement,
        /* [retval][out] */ BSTR *result);

    // IWebDocumentRepresentation
    virtual HRESULT STDMETHODCALLTYPE setDataSource( 
        /* [in] */ IWebDataSource* dataSource);
    
    virtual HRESULT STDMETHODCALLTYPE receivedData( 
        /* [in] */ IStream* data,
        /* [in] */ IWebDataSource* dataSource);
    
    virtual HRESULT STDMETHODCALLTYPE receivedError( 
        /* [in] */ IWebError* error,
        /* [in] */ IWebDataSource* dataSource);
    
    virtual HRESULT STDMETHODCALLTYPE finishedLoadingWithDataSource( 
        /* [in] */ IWebDataSource* dataSource);
    
    virtual HRESULT STDMETHODCALLTYPE canProvideDocumentSource( 
        /* [retval][out] */ BOOL* result);
    
    virtual HRESULT STDMETHODCALLTYPE documentSource( 
        /* [retval][out] */ BSTR* source);
    
    virtual HRESULT STDMETHODCALLTYPE title( 
        /* [retval][out] */ BSTR* docTitle);

protected:
    ULONG m_refCount;
    WebFrame* m_frame;
};

#endif
