/*
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Hold different CSS images
*
*/


#ifndef CCSSImageList_H
#define CCSSImageList_H

//  INCLUDES
#include <e32base.h>
#include "BrsrStatusCodes.h"
#include "nw_text_ucs2.h"
#include "nw_image_abstractimage.h"
#include "nw_image_virtualimage.h"
#include "nw_image_epoc32simpleimage.h"
#include "nwx_http_header.h"
#include "nw_css_processor.h"

// CONSTANTS

// MACROS

// DATA TYPES
class CVirtualNodeImageEntry;

typedef CArrayPtrFlat<CVirtualNodeImageEntry>	 CVirtualNodeImageList;

// FORWARD DECLARATIONS

// CLASS DECLARATION

/**
*  This class contains information about virtual node-image pairs associated
*  with an image list entry
*  @lib css.lib
*  @since 2.1
*/
class CVirtualNodeImageEntry : public CBase
  {
  public:

   /**
    * Two-phased constructor.
    * @return CVirtualNodeImageEntry*
	  */
    static CVirtualNodeImageEntry* NewL();

    /**
    * Two-phased constructor.
    * @return CVirtualNodeImageEntry*
	  */
    static CVirtualNodeImageEntry* NewLC();

    /**
    * Destructor.
    */
    virtual ~CVirtualNodeImageEntry();

    /**
    * This method add a new virtual image 
    * @since 2.1
    * @param aVirtualImage: virtual image
    * @return void
    */
    void AddVirtualImage( NW_Image_Virtual_t* aVirtualImage ) { iVirtualImage = aVirtualImage; }

    /**
    * This method add a new virtual node 
    * @since 2.1
    * @param aVirtualNode: virtual node associated with a virtual image
    * @return void
    */
    void AddVirtualNode( NW_DOM_ElementNode_t* aVirtualNode ) { iVirtualNode = aVirtualNode; }

    /**
    * This method sets the ownership of the virtual image
    * @since 2.1
    * @return void
    */
    void TakeVirtualImageOwnership( void ) { iImageOwnership = ETrue; }

    /**
    * This method removes the ownership of the virtual image
    * @since 2.1
    * @param aUrl: url of the image
    * @return void
    */
    void RemoveVirtualImageOwnership( void ) { iImageOwnership = EFalse; }

    /**
    * This method returns the virtual image
    * @since 2.1
    * @return NW_Image_Virtual_t* virtual image
    */
    NW_Image_Virtual_t* VirtualImage( void ) { return iVirtualImage; }

    /**
    * This method returns with virtual node
    * @since 2.1
    * @return NW_DOM_ElementNode_t* virtual node
    */
    NW_DOM_ElementNode_t* VirtulaNode( void ) { return iVirtualNode; }

    /**
    * This method returns the value of the ownership
    * @since 2.1
    * @return TBool: ETrue if the image is owned by the entry
    */
    TBool VirtualImageOwnership( void ) { return iImageOwnership; }

  private: // New functions

    /**
    * C++ default constructor.
    */
    CVirtualNodeImageEntry();

    /**
    * By default Symbian 2nd phase constructor is private.
    */
    void ConstructL();

  private:
    // associated virtual image. 
    // "ownership" member indicates
    // the imageOwnership of the image
    NW_Image_Virtual_t* iVirtualImage;
    // associated virtual DOM node. 
    // not owned
    NW_DOM_ElementNode_t* iVirtualNode;
    TBool iImageOwnership;
  };


/**
*  This class contains information about an image entry in the list
*  @lib css.lib
*  @since 2.1
*/
class CCSSImageListEntry : public CBase
{
public:

   /**
    * Two-phased constructor.
    * @return CCSSImageListEntry*
	  */
    static CCSSImageListEntry* NewL( NW_Text_t* aUrl, TBool aListItem );

    /**
    * Two-phased constructor.
    * @return CCSSImageListEntry*
	  */
    static CCSSImageListEntry* NewLC( NW_Text_t* aUrl, TBool aListItem );

    /**
    * Destructor.
    */
    virtual ~CCSSImageListEntry();

  public: // set-get functions
    
    /**
    * This method sets the image and its content type
    * @since 2.1
    * @param aImage: image object
    * @param aContentType: content type string
    * @return void
    */
    void SetAbstractImage( NW_Image_AbstractImage_t* aImage, NW_Http_ContentTypeString_t aContentType );

    /**
    * This method returns the listItem member variable
    * @since 2.1
    * @return TBool EFalse if the image is background image
    */
    TBool ListItem( ) { return iListItem; }

    /**
    * This method returns the "main" image which is the base of every
    * virtual images in the list
    * @since 2.1
    * @return NW_Image_AbstractImage_t* main image
    */
    NW_Image_AbstractImage_t* AbstractImage( ) { return iImage; }

    /**
    * This method returns the URL of the image. It is also the ID of the list.
    * @since 2.1
    * @return NW_Text_t* url
    */
    NW_Text_t* ImageUrl( ) { return iUrl; }

    /**
    * This method returns the content type of the image
    * @since 2.1
    * @return NW_Http_ContentTypeString_t content type
    */
    NW_Http_ContentTypeString_t ImageContentType( ) { return iContentTypeString; }
    
    /**
    * This method returns the virtual node-image list associated with this entry
    * @since 2.1
    * @return CVirtualNodeImageList* virtual node-image pair list
    */
    CVirtualNodeImageList* VirtualNodeImageList() { return iVirtualNodeImageList; }

    /**
    * This method appends a new virtual-node pair to the list
    * @since 2.1
    * @param aVirtualImageNodeEntry: virtual image-node pair entry
    * @return void
    */
    void AddVirtualImageNodeEntryL( CVirtualNodeImageEntry* aVirtualImageNodeEntry ) 
              { iVirtualNodeImageList->AppendL( aVirtualImageNodeEntry ); }

  private: // New functions

    /**
    * C++ default constructor.
    */
    CCSSImageListEntry( NW_Text_t* aUrl, TBool aListItem );

    /**
    * By default Symbian 2nd phase constructor is private.
    */
    void ConstructL();

  private: // members    
    
    // url of Image. owned
  NW_Text_t* iUrl;
    // content type of image. owned
    NW_Http_ContentTypeString_t iContentTypeString;
    // either background or list image
    TBool iListItem;
    // "main" image. owned
  NW_Image_AbstractImage_t* iImage;
    // list of virtual node-image pairs
    CVirtualNodeImageList* iVirtualNodeImageList;
};
// CLASS DECLARATION

/**
*  This class has different CSS images that can be used by the document
*  @lib css.lib
*  @since 2.1
*/
class CCSSImageList : public CBase
{
  public:  // Constructors and destructor
        
   /**
    * Two-phased constructor.
    * @return CCSSHandler*
	  */
    static CCSSImageList* NewL( NW_CSS_Processor_t& aProcessor );

    /**
    * Destructor.
    */
    virtual ~CCSSImageList();

  public: // New functions
        
    /**
    * This method creates a new image entry for a given URL
    * @since 2.1
    * @param aUrl: url of the image
    * @param aImageNode: associated DOM node
    * @param aListItem: image can be either list item or background image
    * @return void
    */
    void CreateImageEntryL( NW_Text_t* aUrl, NW_DOM_ElementNode_t* aImageNode, TBool aListItem );

    /**
    * This method add a new virtual node for a given URL
    * @since 2.1
    * @param aUrl: url of the image
    * @param aVirtualImageNode: virtual node
    * @return void
    */
    NW_Image_AbstractImage_t* AddVirtualNodeToImageEntryL( NW_Text_t* aUrl, NW_DOM_ElementNode_t* aVirtualImageNode );

    /**
    * This method sets the image for a given URL
    * @since 2.1
    * @param aUrl: url of the image
    * @param aData: image data
    * @param aLength: image length
    * @param aContentTypeString: content type of image
    * @return image object 
    */
    NW_Image_AbstractImage_t* SetImageL(NW_Text_t* aUrl, NW_Byte* aData, NW_Uint32 aLength, 
              NW_Http_ContentTypeString_t aContentTypeString );

    /**
    * This method returns the image corresponding to a given URL
    * @since 2.1
    * @param aUrl: url of the image
    * @param aFound: denotes if entry exists
    * @return corresponding image
    */
    NW_Image_AbstractImage_t* GetImageL( NW_Text_t* aUrl, TBool& aFound );

    /**
    * This method returns the image list entry corresponding to a given virtual image
    * @since 2.1
    * @param aVirtualImage: image
    * @param aImageNode: corresponding node 
    * @return CCSSImageListEntry* corresponding image list entry
    */
    CCSSImageListEntry* EntryByVirtualImage( NW_Image_AbstractImage_t* aVirtualImage, 
                                                            NW_DOM_ElementNode_t** aImageNode );
    /**
    * This method removes the virtual image ownership.
    * @since 2.1
    * @param aImageEnrty: image enrty that holds the virtual image
    * @param aVirtualImage: image to be removed
    * @return void
    */
    void RemoveVirtualImageOwnership( CCSSImageListEntry& aImageEnrty, NW_Image_AbstractImage_t* aVirtualImage );

    /**
    * This method removes the virtual image.
    * @since 2.1
    * @param aImageEnrty: image enrty that holds the virtual image
    * @param aVirtualImage: image to be removed
    * @return void
    */
    void VirtualImageDestroyed( CCSSImageListEntry& aImageEnrty, NW_Image_AbstractImage_t* aVirtualImage );

    /**
    * This method Write CSS image components to a file in the form of multipart segments.
    * Each segment consists of:
    *                  header length (including content type length)
    *                  image data length
    *                  content type (including character encoding)
    *                  headers
    *                  image
    * @since 2.1
    * @param aFh: file name
    * @return KBrsrSuccess, KBrsrOutOfMemory, KBrsrFailure, or KBrsrSavedPageFailed
    */
    TBrowserStatusCode WriteMultipartSegments(NW_Osu_File_t aFh);

    /**
    * This method returns the size of the imagelist
    * @since 2.1
    * @return size of the imageList
    */
    TInt GetNumImages();

    /**
    * This method issues load request for urls which don't have image
    * @since 2.1
    * @return KBrsrSuccess or KBrsrOutOfMemory
    */
    TBrowserStatusCode ShowImages();

  private: // New functions

    /**
    * C++ default constructor.
    */
    CCSSImageList( NW_CSS_Processor_t& aProcessor );

    /**
    * By default Symbian 2nd phase constructor is private.
    */
    void ConstructL();

    /**
    * This method gets CSS image for a given URL
    * @since 2.1
    * @param aUrl: url of the image to be fetched
    * @param aRetEntry: image
    * @return KBrsrSuccess, KBrsrOutOfMemory, KBrsrNotFound
    */
    TBool QueryEntryL (NW_Text_t* aUrl, CCSSImageListEntry*& aRetEntry);

    /**
    * This method changes the ownership status of a virtual image.
    * @since 2.1
    * @param aImageEnrty: image enrty that holds the virtual image
    * @param aVirtualImage: image to be removed
    * @param aDestroyed: ETrue if the image was destroyed
    * @return void
    */
    void VirtualImageOwnershipChanged( CCSSImageListEntry& aImageEnrty, NW_Image_AbstractImage_t* aVirtualImage, 
                                       TBool aDestroyed );
  
  
    typedef CArrayPtrFlat<CCSSImageListEntry> CImageListArray;

  private:    // Data

    // vector containing the images. owned
    CImageListArray* iImageList;
    // CSS processor. not owned
    NW_CSS_Processor_t* iProcessor;
};

#endif /* CCSSImageList_H */
