/*
    This file is part of the KDE libraries

    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
    Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
    Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.

    This class provides all functionality needed for loading images, style sheets and html
    pages from the web. It has a memory cache for these objects.
*/

#ifndef CachedResourceClient_h
#define CachedResourceClient_h

#if ENABLE(XBL)
namespace XBL {
    class XBLDocument;
}
#endif

namespace WebCore {

    class CachedResource;
    class CachedImage;
    class String;
    class Image;
    class IntRect;

    /**
     * @internal
     *
     * a client who wants to load stylesheets, images or scripts from the web has to
     * inherit from this class and overload one of the 3 functions
     *
     */
    class CachedResourceClient
    {
    public:
        virtual ~CachedResourceClient() { }

        // Called whenever a frame of an image changes, either because we got more data from the network or
        // because we are animating.
        virtual void imageChanged(CachedImage*) { };
        
        // Called to find out if this client wants to actually display the image.  Used to tell when we
        // can halt animation.  Content nodes that hold image refs for example would not render the image,
        // but RenderImages would (assuming they have visibility: visible and their render tree isn't hidden
        // e.g., in the b/f cache or in a background tab).
        virtual bool willRenderImage(CachedImage*) { return false; }

        virtual void setCSSStyleSheet(const String& /*URL*/, const String& /*charset*/, const String& /*sheet*/) { }
        virtual void setXSLStyleSheet(const String& /*URL*/, const String& /*sheet*/) { }

#if ENABLE(XBL)
        virtual void setXBLDocument(const String& /*URL*/, XBL::XBLDocument*) { }
#endif

        virtual void notifyFinished(CachedResource*) { }
    };

}

#endif
