/*
* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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:  
*
*  Xuikon CXnResource-class defines all information what is needed to maintain
*  resources of Application Theme. Every CXnResource-objects defines just one 
*  resource source, however, the same resource source could be referenced
*  multiple times inside a theme - resources are usually shared. 
*  Xuikon Application Theme Management system supports theme resourcing by 
*  offering resource conversations and storing services, and offering Rendering
*  Engines the following services:
*  1) the way to match a resource quoted in xml- or css-module to the 
*  corresponding resource source, and 2) a secure way to access a resource 
*  through the Symbian Platform Security's process separation wall.
*
*
*/


#ifndef XNRESOURCE_H
#define XNRESOURCE_H

#include <e32base.h>
#include <apmstd.h> // MIME
#include <s32mem.h> // streams
 
/**
* TXnLockingPolicy
* Locking policy flag-definitions for Xuikon. These are bit-masked.
*/
enum TXnLockingPolicy
  {
  EXnUnlocked           = 0x0000, //0b0000000000000000,
  EXnLocked             = 0x0001  //0b0000000000000001,
  };
    
/**
* TXnCacheType
* Cache-type definitions for Xuikon.
*/
enum TXnCacheType
    {
    /**
    * ECacheNone. Resource is not cached = direct file access in resources original format.
    *
    */
    ECacheNone,
    
    /**
    * ECacheFile. Resource is externalized to file stream - it can be internalized from given 
    *               file stream on construct. 
    */
    ECacheFile, 
    
    /**
    * ECacheNone. Resource is externalized in to iBuffer - it can be internalized from this
    *               buffer on construct.
    */  
    ECacheMemory
    };

/**
*   Resource file extension definitions for Xuikon.
*/
_LIT(KRLBFileExtension,".r");
_LIT(KODTFileExtension,".o");
_LIT(KDTDFileExtension,".dtd");
_LIT(KXMLFileExtension,".xml");
_LIT(KCSSFileExtension,".css");
_LIT(KDATFileExtension,".dat");

_LIT(KFBSFileExtension,".fbs");
_LIT(KMBMFileExtension,".mbm");
_LIT(KMIFFileExtension,".mif");
_LIT(KBMPFileExtension,".bmp");
_LIT(KJPGFileExtension,".jpg");
_LIT(KJPEGFileExtension,".jpeg");
_LIT(KPNGFileExtension,".png");
_LIT(KGIFFileExtension,".gif");
_LIT(KAACFileExtension,".aac");
_LIT(KWAVFileExtension,".wav");
_LIT(KMIDFileExtension,".mid");
_LIT(KMP3FileExtension,".mp3");
_LIT(KM3GFileExtension,".m3g");
_LIT(KSVGFileExtension,".svg");
_LIT(KSWFFileExtension,".swf");
_LIT(KTXTFileExtension,".txt");

/**
* TXnResourceType
* Resource-type definitions for Xuikon.
*/
enum TXnResourceType
    {
    /**
    * EResourceNone. No type at all - juts a file path.
    */
    EResourceNone,
    
    /**
    * EResourceRLB.
    */
    EResourceRLB,
    
    /**
    * EResourceODT. Resource is ODT (Xuikon Application Theme's binary format)
    */
    EResourceODT,
    
    /**
    * EResourceDTD.
    */
    EResourceDTD,
    
    /**
    * EResourceXML.
    */
    EResourceXML,
    
    /**
    * EResourceCSS.
    */
    EResourceCSS,
    
    /**
    * EResourceDAT.
    */
    EResourceDAT,
    
    /**
    * EResourceRES. Resource is some media content.
    */
    EResourceRES,
    
    /**
    * EResourceFBS. Resource is externalized CFbsBitmap.
    */
    EResourceFBS,
    
    /**
    * EResourceMBM. Resource is Symbian MBM-multiple-image.
    */
    EResourceMBM,
    
    /**
    * EResourceMIF. Resource is Symbian MIF.
    */
    
    EResourceMIF,
    
    /**
    * EResourceBMP. Resource is BMP-image.
    */
    EResourceBMP,
    
    /**
    * EResourceJPG and EResourceJPEG. Resource is JPEG-compliant image.
    */
    EResourceJPG,
    EResourceJPEG,
    
    /**
    * EResourcePNG. Resource is in PNG-format.
    */
    EResourcePNG,
    
    /**
    * EResourceGIF. Resourec is in GIF-format. 
    */
    EResourceGIF,  
    
    /**
    * EResourceAAC. Resource is a AAC audio file.
    */
    EResourceAAC, 
    
    /**
    * EResourceWAV. Resource is a WAV audio file
    */
    EResourceWAV,
    
    /**
    * EResourceMID. Resource is a MID audio file.
    */
    EResourceMID,
    
    /**
    * EResourceMP3. Resource is a MP3 audio file.
    */
    EResourceMP3,
        
    /**
    * EResourceM3G. Resource is M3G.
    */
    EResourceM3G,
    
    /**
    * EResourceSVG. Resource is SVG. 
    */
    EResourceSVG,
       
    /**
    * EResourceSWF. Resource is a Macromedia shock wave i.e. flash file
    */
    EResourceSWF,
    
    /**
    * EResourceMIME. Resource is in Symbian OS 9.x supported MIME-type format.
    */
    EResourceMIME,

    /**
    * EResourceTXT. Resource is TXT.
    */
    EResourceTXT
    
    };


/**
*  @ingroup group_xnresource
*  
*  CXnResource is Xuikon-utility class defining resource-structure.
*
*  @lib XnResource.lib
*  @since S60 3.1
*/
class CXnResource : public CBase
    {
    public:  // Constructors and destructor
        
        /**
        * Two-phased constructor.
        */
        IMPORT_C static CXnResource* NewL();
        /**
        * Two-phased constructor.
        * @param aStream The read stream
        */
        IMPORT_C static CXnResource* NewLC( RReadStream& aStream );
        
        /**
        * CXnResource::CloneL(). Makes a clone of this class.
        * @since S60 3.1
        * @return void
        */
        IMPORT_C CXnResource* CloneL();
        /**
        * Destructor.
        */
        virtual ~CXnResource();

    public: // New functions
        
        /**
        * CXnResource::SetLockingPolicy(). Sets value of iLockingPolicy data member.
        * @since S60 3.1
        * @param aLockingPolicy is new value for iLockingPolicy data member.
        * @return void
        */
        IMPORT_C void SetLockingPolicy( TXnLockingPolicy aLockingPolicy );
        
        /**
        * CXnResource::LockingPolicy(). Gets value of iLockingPolicy data member.
        * @since S60 3.1
        * @return TXnLockingPolicy iLockingPolicy.
        */
        IMPORT_C TXnLockingPolicy LockingPolicy() const;
        
        /**
        * CXnResource::SetCacheType(). Sets value of iCacheType data member.
        * @since S60 3.1
        * @param aCacheType is new value for iCacheType data member.
        * @return void
        */
        IMPORT_C void SetCacheType( TXnCacheType aCacheType );
        
        /**
        * CXnResource::CacheType(). Gets value of iCacheType data member.
        * @since S60 3.1
        * @return TXnCacheType iCacheType.
        */
        IMPORT_C TXnCacheType CacheType() const;
     
        /**
        * CXnResource::SetResourceType(). Sets value of iResourceType data member.
        * @since S60 3.1
        * @param aResourceType is new value of iResourceType data member.
        * @return void
        */    
        IMPORT_C void SetResourceType( TXnResourceType aResourceType );
        
        /**
        * CXnResource::ResourceType(). Gets value of iResourceType data member..
        * @since S60 3.1
        * @return TXnResourceType iResourceType.
        */
        IMPORT_C TXnResourceType ResourceType() const;
        
        /**
        * CXnResource::SetResourceIdL(). Sets value of iResourceId data member.
        * @since S60 3.1
        * @param aResourceId is new value of iResourceId data member.
        * @return void
        */
        
        IMPORT_C void SetResourceIdL( const TDesC& aResourceId );
        
        /**
        * CXnResource::ResourceId(). Gets value of iResourceId data member.
        * @since S60 3.1
        * @return TDesC& iResourceId.
        */
        IMPORT_C const TDesC& ResourceId() const;
        
        /**
        * CXnResource::SetNameSpaceL(). Sets value of iNameSpace data member.
        * @since S60 3.1
        * @param aNameSpace is new value of iNameSpace data member.
        * @return void
        */
        IMPORT_C void SetNameSpaceL( const TDesC& aNameSpace );
        
        /**
        * CXnResource::NameSpace(). Gets value of iNameSpace data member.
        * @since S60 3.1
        * @return TDesC& iNameSpace
        */
        IMPORT_C const TDesC& NameSpace() const;
        
        /**
        * CXnResource::SetFileNameL(). Sets value of iFileName data member.
        * @since S60 3.1
        * @param aFileName is new iFileName value.
        * @return void
        */
        IMPORT_C void SetFileNameL( const TDesC& aFileName );
        
        /**
        * CXnResource::FileName(). Gets value of iFileName data member.
        * @since S60 3.1
        * @return TDes& iFileName.
        */
        IMPORT_C const TDesC& FileName() const;
        
        /**
        * CXnResource::SetMimeTypeL(). Sets value of iMimeType data member. 
        * @since S60 3.1
        * @param aDataType is a new value of iMimeType.
        * @return void
        */
        IMPORT_C void SetMimeTypeL( const TDataType aDataType );
        
        /**
        * CXnResource::MimeType(). Get iMimeType of this CXnResource-object.
        * @since S60 3.1
        * @return TDataType iMimeType.
        */
        IMPORT_C TDataType MimeType() const;
        
        /**
        * CXnResource::WriteStream(). Gets write stream on iBuffer.
        * @since S60 3.1
        * @param aOffset a buffer position of iBuffer to write data.
        * @return RBufWriteStream& write stream.
        */
        IMPORT_C RBufWriteStream& CXnResource::WriteStream( TUint aOffset = 0 );      
        
        /**
        * CXnResource::ReadStream(). Gets read stream on iBuffer.
        * @since S60 3.1
        * @param aOffset a buffer position of iBuffer to read data. 
        * @return RBufReadStream& read stream
        */
        IMPORT_C RBufReadStream& CXnResource::ReadStream(TUint aOffset = 0 );

        /**
        * CXnResource::SetOffset(). Sets internal data pointer of iBuffer.
        * @since S60 3.1
        * @param aOffset is new offset of iBuffer data pointer.
        * @return void
        */
        IMPORT_C void SetOffset( TUint aOffset );
        
        /**
        * CXnResource::Offset(). Internal iBuffer data pointer position.
        * @since S60 3.1
        * @return TUint iOffset pointing iBuffer data pointer.
        */
        IMPORT_C TUint Offset() const;
        
        /**
        * CXnResource::ExternalizeL(). Externalizes CXnResource-object's member data.
        * @since S60 3.1
        * @param aStream is a write stream given.
        * @return void
        */
        IMPORT_C void ExternalizeL( RWriteStream& aStream) const;
        
        /**
        * CXnResource::InternalizeL(). Internalizes CXnResource-object's member data.
        * @since S60 3.1
        * @param aStream is data read stream given.
        * @return void
        */
        IMPORT_C void InternalizeL( RReadStream& aStream);
        
        /**
        * CXnResource::GetDataStreamLength().
        * @since S60 3.1
        * @return TInt data length of CXnResource-data members for streaming functions.
        */
        IMPORT_C TInt GetDataStreamLength() const;
        
    private:

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

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

    private:     // Data
        TXnLockingPolicy iLockingPolicy;
        TXnCacheType iCacheType;
        TXnResourceType iResourceType;
        TDesC* iResourceID;
        TDesC* iNameSpace;
        TDesC* iFileName;
        TDataType iMimeType;
        CBufSeg* iBuffer;
        TUint iOffset;
        RBufWriteStream iWriteStream;
        RBufReadStream iReadStream;

         // Reserved pointer for future extension
        TAny* iReserved;
    };

#endif      // XNRESOURCE_H   
// End of File
