upnpmediaserver/contentdirectoryservice/inc/upnpcontentdirectory.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:16:49 +0100
branchRCL_3
changeset 13 e0762c15653a
parent 12 cdcbf344a1d3
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201012 Kit: 201035

/** @file
* Copyright (c) 2005-2006 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:  Declares ContentDirectory class.
*
*/


#ifndef C_CUPNPCONTENTDIRECTORY_H
#define C_CUPNPCONTENTDIRECTORY_H


// INCLUDES
#include "upnpserviceimplementation.h"
#include "upnpelementfactory.h"

// new xml
#include <xmlengdom.h>

#include "upnpfiletransfer.h"
#include "upnpcontentdirectorydatafinder.h"
#include "upnpthumbnailcreator.h"
#include "upnpcdsettings.h"
#include "upnptransferobserver.h"
#include "upnphttpservertransactioncreator.h"
#include "upnphttpserverobserver.h"

// FORWARD DECLARATIONS

class CUpnpElementFactory;
class TUpnpContainerUpdateId;
class CUpnpFileTransferTimerObserver;
class CUpnpObject;
class CUpnpItem;
class CUpnpContentDirectoryDb;
class CProtocolInfo;
class CUpnpMetadataStorage;
class CUpnpAutoDestroyObjectList;
class MUpnpContentDirectoryEventObserver;
class CUpnpFileTransferEvent;
class MUpnpCdsSender;
class CUpnpStateHandler;
class CUpnpTransferUploader;
class CUpnpMimeMapper;
class CUpnpTransferController;
class MUpnpTransferInterface;
class CUpnpDlnaFilter;
class CUpnpHttpServerSession;
class CUpnpSecurityManager;

// CONSTANTS
static const TInt KMaxImportExportTransfers = 3;
_LIT8( KContentDirectoryType, "ContentDirectory:1" );

// CLASS DECLARATION

/**
*  @brief Main Content Directory Service Class
*
*  @lib ServiceFramework.lib
*  @since Series60 2.6
*/
class CUpnpContentDirectory :             
                public CUpnpServiceImplementation, 
                public MUpnpContentDirectoryDataFinder,
                public MUpnpThumbnailCreatorObserver,
                public MUpnpTransferObserver,
                public MUpnpHttpServerTransactionCreator,
                public MUpnpHttpServerObserver
{
public: // Constructors and destructors
    
    /**
    * Two-phased constructor for creating Content Directory Service (CDS).
    * @since Series60 2.6
    * @param aService Parent service 
    */
    static CUpnpContentDirectory* NewL( TUpnpCdSettings aSettings, 
                                        CUpnpMetadataStorage* aMetadataStorage,
                                        MUpnpTransferInterface* aTransfer );

    /**
    * Destructor function; called automatically from the destructor of a 
    * derived class
    **/
    virtual ~CUpnpContentDirectory();
    IMPORT_C void SetSender(MUpnpCdsSender* aSender);
            

public: //from CUpnpServiceImplementation
    
    CUpnpStateHandler* CUpnpContentDirectory::StateHandler();
    /**
    * Handles auto destroy events.
    * @since Series 60 2.6
    * @param aObjIdn id of evented upnp object
    */
    void AutoDestroyEventL(TInt aObjId, TBool aDeleteObj);

    /**
    * This functions is a entry point for actions. See coments in base class
    * @since Series 60 2.6
    * @param aAction Action received by CDS.
    */
    void ActionReceivedLD( CUpnpAction* aAction );
    
    /**
    * Hnadle unknown http event
    * Export for interneal use only    
    */
    IMPORT_C void UnknownHttpEventReceivedL( CUpnpHttpMessage& aHttpMsg );
    
    /**
    * Handles address change event    
    */
    void AddressChangeL();
    
    /**
    * This function is for informing service from evented statevariables.
    * @since Series 60 2.6
    * @param aVariableName Name of the evented statevariable.
    */
    void StateVariableEvented(const TDesC8& aVariableName);
      
    /**
    * Checks if specified importUri is in database still active.
    * @param aImportUri uri to be searched in databse. 
    * @return objId if successful
    */
    TInt CheckImportUriL(const TDesC8& aImportUri);

    /**
    * Inserts Ip and Port
    * @since Series S60 3.1
    * @param aString
    */
    void InsertRealIpAndPortL(TDes8& aString);
    
    /**
    *
    * @since Series S60 3.1
    * @param aString
    * @return descriptor pointer
    */  
    HBufC8* InsertIpAndPortPlaceholderL(const TDesC8& aString);
    
    /**
    * Find protocolInfo by importUri (Not by importUri).
    * @param aImportUri uri to be searched in database (Value of resource).
    * @return aProtocolInfo related to resorce which has been founded 
    */  
    CUpnpDlnaProtocolInfo* GetProtocolInfoByImportUriL(const TDesC8& aImportUri);
    
    /**
    * Gets infomation about protocol
    * @since Series S60 3.1
    * @param aContentUri
    * @parma aProtocolInfo
    * @return
    */
    TInt GetProtocolInfoL(const TDesC8& aContentUri, CUpnpDlnaProtocolInfo*& aProtocolInfo);
        
    /**
    * Gets title of the object with given id from ContentDirectory service. 
    * @since Series60 2.6
    * @param aObjectId id of the object.
    * @param aValue pointer to buffer in which the tilte of the object will be returned.
    *       Buffer for aValue has to allocated first.
    **/
    void GetTitleForUriL( TInt aObjectId, TPtr& aValue );
        
    /**
    *
    * @since Series S60 3.1
    * @param aUrlPath
    * @param aFileName
    * @param aSystemPath
    */
    TInt FindSharedFolderL( const TDesC& aUrlPath, const TDesC& aFileName, HBufC*& aSystemPath);
        
    /**
    *
    * @since Series S60 3.1
    * @return TPtrC
    */
    const TPtrC MediaRealDir();
        
        
    /**
    * Sets download directory
    * @since Series S60 3.1
    * @param aDownloadDir this directory is going to be set as download directory
    * @return TInt
    */
    void SetDownloadDirectoryL(const TDesC& aDownloadDir);
        
    /**
    * Sets thumbnail directory
    * @since Series S60 3.1
    * @param aDownloadDir this directory is going to be set as thumbnail directory
    * @return TInt
    */
    void SetThumbnailDirectoryL(const TDesC& aDownloadDir);    
    
    TInetAddr GetAddress();
    IMPORT_C void SendActionL(CUpnpAction* aAction, TUpnpErrorCode aError);
    IMPORT_C void SendMessageL( CUpnpHttpMessage* aMessage );
    CUpnpAutoDestroyObjectList* GetAutoDestroyObjectList();
    
    // For internal use only
    IMPORT_C void HttpTransferEventReceivedL(CUpnpHttpMessage& aHttpMsg);
    
    /**
    * Sends transfer failed event to Media Server       
    * @param aSessionId transaction identifier
    * @param aStatusCode HTTP Status code
    */
    void NotifyTransferFailL(TInt aSessionId, TInt aStatusCode);
    
    /**
    * Sends transfer stopped event to Media Server       
    * @param aSessionId transaction identifier
    * @param aType import/export
    */
    void NotifyTransferStoppedL( TInt aSessionId, CUpnpFileTransfer::TTransferType aType);

     // new functions for httptransfer.dll intergration
    void HttpGetStartedSoapNotifyL(TInt aSessionId);    
    void HttpPostStartedL(TInt aSessionId);   
              

    // helper functions
    TCurrentAction ExecutedAction();
    void SetExecutedAction(TCurrentAction aAction);
    
    
    /**
    * This function is a entry point for http messages.
    * received from Symbian HTTP Stack
    * @since Series 60 3.2
    * @param aSessionId identifier of the HTTP request.
    * @param aHttpStatusCode HTTP error code.
    */
    void HttpResponseReceivedL( TInt aSessionId,
                                TInt aStatusCode);   
    
    /**
    * Getter
    * @since Series 60 3.2
    * @return Event Observer
    */
    MUpnpContentDirectoryEventObserver* EventObserver();
    
public://temporary public methods

    void TransferCompleteL(TInt aResId, TInt aObjId);
    
    void TransferProgress( TInt aId, TInt aBytes, TInt aTotalBytes );
    
    void TransferStartL(const TDesC8& aImpUri);

    /** 
    * This fuction removes a TransferID from the TransferIDs Statevariable
    * @since Series 60 2.6
    * @param aTransferID a id of file transfer
    **/
    void RemoveFileTransferFromTransferIDsStateVariableL(TInt aTransferID);
    
    /** 
    * This fuction adds a TransferID to the TransferIDs Statevariable
    * @since Series 60 2.6
    * @param aTransferID a id of file transfer
    **/
    void AddFileTransferToTransferIDsStateVariableL( TInt aTransferID );
    
    /**
    *
    * @since Series S60 3.1
    * @param aFileName
    * @return boolean whether given file is drmfile
    */
    TBool IsDrmFileL(const TDesC& aFileName);
    
    /**
    *
    * @since Series S60 3.1
    * @param aFileName
    * @return boolean whether given file is drmfile
    */
    TBool IsDrmFileL(const TDesC8& aFileName);
    

     /** 
    * This functions is used for generating correct res tags for finished downloads.
    * @param aOnlyThumbnail  this method is used during two action - ImportResource and CreateObject. 
    *                           In CreateObject case res can be created by passed argument so we only thumbail has to be created
    * @since Series 60 2.6
    * @return error code. KErrNone if no errors.
    **/
    TInt CreateResTagL( TInt aSessionId, 
                       TDesC8& aFilePath, 
                        TInt aImportNumber,
                        TBool aOnlyThumbnail = EFalse  );


    /**
    * Notify transfer          
    * @param aSessionId HTTP transaction identifier 
    */    
    void NotifyOutgoingTransferL (TInt aSessionId); 
    
    
    CUpnpContentDirectoryDb*  ContentDirectoryDb();
    
    MUpnpTransferInterface* TransferHandler();
    
public: //from MUpnpTransferObserver
    
    virtual void TransferCompletedL( TInt akey, TInt aResultCode );

public: //from MUpnpHttpServerTransactionCreator

        IMPORT_C virtual void NewTransactionL(
        const TDesC8& aMethod, const TDesC8& aUri, 
        const TInetAddr& aSender, CUpnpHttpServerTransaction*& aResultTrans );

private: //form MUpnpHttpServerObserver
    virtual void HttpEventLD( CUpnpHttpMessage* aMessage );
    
private://private methods


    void PrepareAutoDestroyObjectL(TXmlEngElement aObject, TInt aObjId);

    /**
    * Gets ip and port number
    * @since Series S60 3.1
    * @return descriptor pointer
    */
    HBufC8* GetIpAndPortDes8L();

    /**
    * Sets size
    * @since Series S60 3.1
    * @parma aSize
    * @parma aFilePath
    */
    void SetResSizeL(TXmlEngAttr aSize, const TDesC& aFilePath);
        
    /**
    * Adds Import URI to Element
    * @since Series S60 3.1
    * @param aElement
    */
    void AddImportUriToElL(TXmlEngElement aElement);
        
    /**
    *
    * @since Series S60 3.1
    * @return descriptor pointer
    */
    HBufC8* BuildImportUriLC();
    HBufC8* BuildImportUriShorterLC();
        
    /**
    * Checking whether thumbnail is available
    * @since Series S60 3.1
    * @param aFile
    * @return 
    **/
    TBool IsThumbnailAvailableL(const TDesC& aFile);
    
    /**
    * Checking whether thumbnail is available
    * @since Series S60 3.1
    * @param aFile 
    * @return
    */
    TBool IsThumbnailAvailableL(const TDesC8& aFile);
    
    /**
    * Creates thumbnail
    * @since Series S60 3.1
    * @param a SrcFile
    * @param aObjId
    */
    void CreateThumbnailL(const TDesC& aSrcFile, TInt aObjId);
    
    /**
    * Adds new res tag
    * @since Series S60 3.1
    * @param aObjEl 
    */
    void AddNewResTagL(TXmlEngElement aObjEl);
    
    /**
    * Creates a name for thumbnail
    * @since Series S60 3.1
    * @param aFileName
    * @return descriptor pointer
    */
    HBufC* CreateNameForThumbnailL(const TDesC& aFileName);
    
    /**
    *
    * @since Series S60 3.1
    * @param aRes
    */      
    void HandleLocalResourcesL(TXmlEngElement aRes, TInt aObjectId);
    
    /**
    *
    * @since Series S60 3.1
    * @parma aFileName
    * @return descriptor pointer
    */
    HBufC8* BuildContentUriL(const TDesC& aFileExt, TInt aObjectId);  
    
    /**
    *
    * @since Series S60 3.1
    * @param aAction  
    * @param aSenAndDestroy
    * @return
    */
    TInt DoActionReceivedL( CUpnpAction* aAction );
    
    /**
    * 
    * since Series S60 3.1
    * @param aObjs
    * return descriptor pointer
    */
    HBufC8* SerializeObjectsListL(const RArray<RXmlEngDocument>& aObjs);
              
    /**
    *
    * @since Series S60 3.1
    * @param aObj
    * @param aImportUri
    * @param ANewFile
    */
    void DeleteOldResourcesL( RXmlEngDocument& aObj, const TDesC8& aImportUri,
                              const TDesC& aNewFile );
    
    /**
    *
    * @since Series S60 3.1
    * @parma aMessage
    * return descriptor pointer
    */
    HBufC8* GetImportUriLC(CUpnpHttpMessage* aMessage);     
       
    /**
    *
    * @since Series S60 3.1
    * @param aFileName
    * @param aNextKey
    * @return descriptor pointer
    */
    HBufC* BuildThumbnailUrlPathL(const TDesC& aFilename, const TDesC& aNextKey);

    /**
    * This function gets mime type for specified file. 
    * @since Series 60 3.1
    * @param aFilename -  filename, for which mimeType will be taken.
    * @return pointer to variable storing mimeType. 
    */
    HBufC8* GetMimeTypeLC(const TDesC8& aFilename);    

    /**
    * Removes thumbnail creator and corresponding objectId from lists. 
    * @since Series 60 3.1
    * @param aThCreator - thumbnail creator for which the information will be deleted.
    */
    void RemoveThCreatorAndObjectIdLD( CUpnpThumbnailCreator* aThCreator);

    /**
    * Gives object id for specified thumbnail creator. 
    * @since Series 60 3.1
    * @param aThCreator - thumbnail creator for which object id will be searched for. 
    * @return object id for specified thumbnail creator. 
    */
    TInt GetObjectIdFromThCreator( CUpnpThumbnailCreator* aThCreator);

    /**
    * Gives this server address in predefined format. 
    * @since Series 60 3.1
    * @return pointer to address. 
    */
    HBufC8* CreateAddressValueLC();

    /**
    * This function creates ProtocolInfo object for further use. 
    * @since Series 60 3.1
    * @param aMimeType - mime type, for which ProtocolInfo will be created.
    * @param aAddInfo - additional information which can be choosen according to mime type and image size. 
    * @return pointer to CProtocolInfo object, which describes all protocolInfo values for this element.
    */
    CUpnpDlnaProtocolInfo* CreateProtocolInfoFromMimeL(const TDesC8& aMimeType, TInt aAddInfo );

    /**
    * This function retrieves title from object description. 
    * @since Series 60 3.1
    * @param aObjId - objecty id for which title will be retrieved. 
    * @return pointer to HBufC, with specified value. 
    */
    HBufC* GetFileNameL( TInt aObjId );    
    HBufC* GetFileNameWithoutPathL( TInt aObjId );
    
    /**
    * This function add underscore and number to existing filename. 
    * @since Series 60 3.2
    * @param aFileName - file that probably exist. 
    * @return pointer to HBufC, with specified value. 
    */
    HBufC* CreateFileNameL( const TDesC16& aFileName );
   
    /**
    * This function puts on stack upnp:class value for specific mime type.  
    * @since Series 60 3.1
    * @param aMimeType - mime type from which additional information will be retrieved. 
    * @return pointer to HBufC8 object with new value, if the type is unknown there is null returned.
    * Mapping: 
    * image/* - object.item.imageItem
    * video/* - object.item.videoItem 
    * audio/* - object.item.audioItem 
    * text/* - object.item.textItem 
    */ 
    HBufC8* GetItemTypeFromMimeTypeLC(const TDesC8& aMimeType);
        
    /**
    * This function compares upnp:class tag value, with value denoted by aMimeType. 
    * @since Series 60 3.1
    * @param obj - object for which needed changes will be applied.
    * @param aMimeType - mime type from which additional information will be retrieved. 
    */ 
    void CheckItemTypeForObjectL( RXmlEngDocument& obj, const TDesC8&  aMimeType );
        
  
    /**
    * This function returns a XML fragment containing the XML in the parameter
    * @since Series 60 2.6
    * @param aBuffer the XML is in this buffer
    * @return A new CSenDomFragment that is on the cleanup stack
    */
    RXmlEngDocument XmlFragmentL(const TDesC8& aBuffer);
        
    /**
    * This fuctions converts one XML element to a string 
    * @since Series 60 2.6
    * @param aResp XML string
    * @param aSen an Sen element to be converted to string
    */
    void BrowseElementL( HBufC8*& aResp, TXmlEngElement& aSen );

    /**
    * This fuctions is a getter for container updateID. 
    * @since Series 60 2.6
    * @param aID ID of the container which updateID is returned
    * @return a updateId of container
    */
    TInt ContainerUpdateId( const TDesC8& aContainerID );


    /**
    * Function to add data to metadb
    * @param aFragment fragment to add to db
    * @param aContainer container where to add data
    * @param aId parameter returned by AddToMetaDbL method, stands for item id
    * @return upnperrorcode descriping situation
    */
    TUpnpErrorCode AddToMetaDbL( RXmlEngDocument& aFragment, TInt aContainer, TInt* aId,
                                 TBool aIsLocal );

    /*
    *
    * @since Series S60 3.1
    * @param aFragment
    * @param aImportUris
    * @param aRess
    * @param aLocal
    * @param aCreateThumbnailRes
    * @param aNextKey
    * @return upnperrorcode descriping situation
    */
    TUpnpErrorCode PrepareCreateOperationL( RXmlEngDocument& aFragment, 
        RArray<TXmlEngAttr>& aImportUris, RArray<TXmlEngElement>& aRess, TBool& aLocal,
        TBool& aCreateThumbnailRes, TInt& aNextKey );

    /**
    * Related to CreateObject, resultset of create is created here
    * @since Series 60 2.6
    * @param aAction action data structure is needed here
    * @param aElement element added to db
    * @param aId element's id
    **/
    void ConstructCreateResultsetL( CUpnpAction*& aAction, 
                                    RXmlEngDocument aElement, 
                                    TInt aId );

 
    /** 
    * Function for creating a new object
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode CreateObjectL( CUpnpAction*& aAction );
    /** 
    * Function for browsing values of objects
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode BrowseL( CUpnpAction*& aAction );

    /** 
    * Function for destroying objects
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode DestroyObjectL( CUpnpAction*& aAction );

    /** 
    * Function for creating refense items
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode CreateReferenceL( CUpnpAction*& aAction );

    /** 
    * Function to solve CDS's search capabilities
    * @since Series 60 2.6
    * @param aAction received action
    * @retrun upnperrorcode descriping situation
    **/
    TUpnpErrorCode GetSearchCapabilitiesL( CUpnpAction*& aAction );

    /** 
    * Function to solve CDS's sort capabilities
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode GetSortCapabilitiesL( CUpnpAction*& aAction );

    /** 
    * Getter for CDS's SystemUpdateID
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode GetSystemUpdateIdL( CUpnpAction*& aAction );

    /** 
    * Function for importing resources
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode ImportResourceL( CUpnpAction*& aAction );

    /** 
    * Function for exporting resources
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    */
    TUpnpErrorCode ExportResourceL( CUpnpAction*& aAction );

    /** 
    * Function for stopping ongoing file transfer (import / export)
    * @since Series 60 2.6
    * @param aAction received action
    * @retrun upnperrorcode descriping situation
    **/
    TUpnpErrorCode StopTransferResourceL( CUpnpAction*& aAction );

    /** 
    * Function for getting information about ongoing file transfer
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode GetTransferProgressL( CUpnpAction*& aAction );

    /** 
    * This functions removes a "res" tag from a object
    * @since Series 60 2.6
    * @param aAction received action
    * @return upnperrorcode descriping situation
    **/
    TUpnpErrorCode DeleteResourceL( CUpnpAction*& aAction );

    /**
    * This function changes file name and its extension. 
    * @since Series 60 3.1
    * @param aFilePath - the target file. 
    * @param aMimeType - mime type, for which file extension will be choosen. 
    */
    HBufC8* ChangeFileNameWithExtensionL(TDesC8& aFilePath, const TDesC8& aMimeType );
 
 
   
    /**
    * @param aOnlyThumbnail  this method is used during two action - ImportResource and CreateObject. 
    *           In CreateObject case res can be created by passed argument so we only thumbail has to be created
    */
    TInt CreateResTagInternalL( TInt aSessionId, 
                                TDesC8& aFilePath,
                                HBufC8* aImportUri, 
                                TBool aOnlyThumbnail );

    /**
    * calls CreateResTagInternalL but KErrCorrupted is TRAPed in order to invoke recovery on DB
    */
    TInt CreateResTagInternalWithDBRecoveryL( TInt aSessionId,
                                              TDesC8& aFilePath, 
                                              HBufC8* aImportUri, 
                                              TBool aOnlyThumbnail = EFalse );
    
private:    // New functions    

   
    void DoSendActionL(CUpnpAction* aAction, TUpnpErrorCode aError);
    void DoSendMessageL(CUpnpHttpMessage* aMessage);
    TBool IsValidUrlPath(const TDesC& aUrlPath);
    
    /**
    * Gets protocolInfo from mimeType.
    * @param aMimeType mime type for which protocolInfo will be created.
    * @return string with protocolInfo
    */
    HBufC8* ProtocolInfoFromMimeL( const TDesC8& aMimeType, TInt aAddInfo, TBool aOpRangeParam,
                                   TBool aCiParam = EFalse );

    HBufC8* ProtocolInfoFromMimeL(const TDesC8& aMimeType, TXmlEngElement& aResEl);
    
    /**
    * Notify message when the thumbnail creation has been finished. 
    * From MUpnpThumbnailCreatorObserver interface.
    * @param aThCreator this is a thumbnail creator.
    * @param aResult result from thumbnail creation.
    */
    void NotifyThumbnailResultL( CUpnpThumbnailCreator* aThCreator, TInt aResult );

    /**
    * Notify message when the thumbnail creation has been finished. 
    * From MUpnpThumbnailCreatorObserver interface.
    * @param aThCreator this is a thumbnail creator.
    * @param aResult result from thumbnail creation.
    */
    CUpnpThumbnailCreator* CreateThumbnailCreatorL(TInt aObjectId);
    
    /**
    * Cheks if object exists.
    * @param aObjectId
    */
    TBool IsObjectExistL( TInt aObjectId );
    
    /**
    * Cheks if object is valid.
    * if object doesn't exist or has no parent 
    * object is removed from autodestoy table and EFalse is returned
    * @param aObjectId
    */
    TBool ValidateObjectL( TInt aObjectId );
         
    /**
    * Handles DB error
    * Tries to recover, if fails tries to recreate
    * @since Series S60 3.2
    * @return TInt - KErrNone if succeed
    */
    TInt HandleDbError( TInt aError );
    
    /**
    * Checks DB and disk Space
    * Tries to recover DB, if fails tries to recreate
    * @since Series S60 3.2
    * @param aAction received action
    * @return EFalse if succeed
    */
    TBool IsDbOrDiskProblemL( CUpnpAction* aAction );
    
    /**
    * Determines if DB has benn recovered successfully
    * returns ETrue if yes
    * @param a Error - DB is revovered only if aError equal KErrCorrupted
    * @since Series S60 3.2
    * @returns ETrue if succeed 
    */
    TBool DataBaseHasBeenRecoveredL( TInt aError );
    
    /**
    * Returns DB creation status
    * @since Series S60 3.2
    * @return TBool
    */
    TBool IsDbCreated(); 

    /**
    * Updates import URI
    * @since Series S60 3.2
    * @return TPtrC8
    */
    TPtrC8 UpdateImportUriL( const TDesC8& aImportUri );
    
private: // Constructors
    
    /**
    * C++ default constructor.
    */
    CUpnpContentDirectory( CUpnpDevice& aDevice, 
                           MUpnpThumbnailCreatorObserver* aThmbObs,
                           MUpnpTransferInterface* aTransfer
                         );

    /**
    * Second phase of the constructor.
    * Initialises a DOM tree.
    * By default Symbian 2nd phase constructor is private.
    * @param service Parent service
    */
    void ConstructL( TUpnpCdSettings aSettings, 
                     CUpnpMetadataStorage* aMetadataStorage 
                   );
    
    void ConstructHttpL();
    
private:
    
    //Array containing objects ids, which will be updated after Thumbnail creation.
    RArray<TInt> iThObjectIds;
    
    // Array of thumbnail creators in which creators can be searched for.
    RPointerArray<CUpnpThumbnailCreator> iThumbnailCreators;

    // Next free object ID, owned
    TInt iNextFreeID;

    // Pointerarray for pending actions (used in Import and Export), owned
    //RPointerArray<CUpnpAction> iPendingActions;

    // Elementfactory, owned
    CUpnpElementFactory* iElementdb;
    
       
    // Database
    CUpnpContentDirectoryDb* iContentDirectoryDb;
        
    // file session
    RFs iFs;
    
    // Download directory
    HBufC* iDownloadDir;
    
   // Thumbnail directory
    HBufC* iThumbDir;
    // connection try to bitmap and font server. 
    // if there is no such connection there will be no thumbcreated. 
    TInt iBitmapServerConnection;
        
    TBool iEcomUsed;
        
    // Thumbnail creator observer
    MUpnpThumbnailCreatorObserver* iThmbObs;

    // auto-destroy object list    
    CUpnpAutoDestroyObjectList* iAutoDestroyObjects;

    
    // Event observer
    MUpnpContentDirectoryEventObserver* iEventObserver;
    
    // Thumbnail creation flag
    TBool iCreateThumbnails; 
    
    // Max number of browsed object
    TInt iMaxRequestCount;

    TCurrentAction iCurrentAction;
    
    RXmlEngDOMImplementation iDOMImpl;
    
    MUpnpCdsSender* iSender; // not owned
        
    CUpnpMimeMapper* iMimeToExtMap;
        
    HBufC* iObjectsXmlPath;
    
    CUpnpStateHandler* iStateHandler;
         

    CUpnpTransferController* iTransferController;
    
    MUpnpTransferInterface* iTransferHandler;
    
    CUpnpDlnaFilter* iDlnaFilter;
    
    CUpnpHttpServerSession* iHttpServerSession;
    
    CUpnpSecurityManager* iSecurityManager;
    
    };

#endif  // C_CUPNPCONTENTDIRECTORY_H

// End Of File