diff -r 000000000000 -r 7f85d04be362 upnpmediaserver/contentdirectoryservice/inc/upnpcontentdirectorydb.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpmediaserver/contentdirectoryservice/inc/upnpcontentdirectorydb.h Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,591 @@ +/** @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: Database for MediaServer +* +*/ + + + +#ifndef C_CUPNPCONTENTDIRECTORYDB_H +#define C_CUPNPCONTENTDIRECTORYDB_H + +// INCLUDES +#include +#include +#include +#include +#include +#include + + +// CLASS DECLARATION +class CUpnpElementBean; +class CUpnpFilterElement; +class CUpnpAttributeBean; +class CUpnpObjectBean; +class CUpnpDlnaProtocolInfo; +class CUpnpShareMapBean; +class CUpnpResourcesBean; +class CUpnpMetadataStorage; + + + +/** +* Database for AVContentDirectory. +* Implements a database which is used to store descriptors of shared content. +* +* @lib ContentDirectoryDb.lib +* @since Series 60 3.0 +*/ +class CUpnpContentDirectoryDb : public CBase +{ + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CUpnpContentDirectoryDb* NewLC(CUpnpMetadataStorage* aMetadataStorage); + static CUpnpContentDirectoryDb* NewL(CUpnpMetadataStorage* aMetadataStorage); + + /** + * Destructor + */ + ~CUpnpContentDirectoryDb(); + + public: // New functions + + /** + * Checks if object with the given id exists, is a container and its 'restricted' attribute has value of 'false' + * @since Series S60 3.0 + * @param aObjId id of the object to be checked + * @return returns EUpnpOk if object with the given id exists in database and is a "non restricted conainer" + */ + TUpnpErrorCode CheckObjectRestrictionL(TInt aObjId); + + /** + * Inserts object into database + * @since Series S60 3.0 + * @param aFragment RDocuemnt of the document to be added to database + * @param aId id of the object + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode InsertObjectL( RXmlEngDocument& aFragment, TInt aContainer, TInt* aId); + + /** + * Function returns DIDL-Lite XML fragment with metadata for requested object. + * IMPORTANT: 1. Caller takes responsibility for returned document and is + * obliged to close it. + * 2. The root element of the document is element and + * the object's element is its direct, onluy child. + * @param aObjectID id of requested object. + * @param aDoc handler to document containing object's metadata. + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode GetObjectL( TInt aObjectID, RXmlEngDocument& aDoc, + const TDesC8& aFilterString); + + /** + * Gets id of reffered object + * @since Series S60 3.0 + * @param aObjectId object id + * @return reffered object id. + */ + TInt ReferedObjectIdL( TInt aObjectId ); + + /** + * Gets object list + * @since Series S60 3.1 + * @param aParentId + * @parem aList + * @return upnperrorcode descriping situation + */ + TUpnpErrorCode GetObjectListL(TInt aParentId, RArray& aList); + + /** + * Deletes object from database + * @since Series S60 3.0 + * @param aObjId id of the object to be deleted + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode DeleteObjectL(TInt aObjId,RArray& aRefList, TBool aDeleteResource=ETrue); + + /** + * Updates the metadata of the object with specified id + * @since Series S60 3.0 + * @param aObjId id of the object to be updated + * @param aFragment XML DOM tree with the updated object's metadata + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode UpdateObjectL(TInt aObjId, RXmlEngDocument& aFragment); + + + /** + * Deletes the res elements with the specified value. + * @since Series S60 3.0 + * @param aResVal value of the res element which is to be deleted + * @param aTumbailResVal value of the thumbail res element which is to be deleted + */ + void DeleteResourceL(const TDesC8& aResVal, RArray& aContIds); + + /** + * Gets object by its attribute value. + * @since Series S60 3.0 + * @param aDoc on return, it contains the object's data + * @param aObjId on, return it contains the object's id + * @param aAttrName attribute's name + * @param aAttrVal attribute's value + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode GetObjectByAttrL(RXmlEngDocument& aDoc, TInt* aObjId, + const TDesC8& aAttrName, const TDesC8& aAttrVal); + + /** + * Checks the restrictions of the parent object of the given object. + * @since Series S60 3.0 + * @param aObjId object's id + * @return returns EUpnpOk if object with the given id exists in database and is a "non restricted conainer" + */ + TUpnpErrorCode CheckParentRestrictionL(TInt aObjId); + + /** + * Gets the object id by its attribute value. + * @since Series S60 3.0 + * @param aAttrName attribute's name + * @param aAttrVal attribute's value + * @return object's id + */ + TInt GetObjIdByAttrL(const TDesC8& aAttrName, const TDesC8& aAttrVal); + + /** + * Gets the object id by its attribute value. Uses LIKE operator for comparison + * @since Series S60 3.0 + * @param aAttrName attribute's name + * @param aAttrVal attribute's value + * @return object's id + */ + TInt GetObjIdByAttrLikeL(const TDesC8& aAttrName, const TDesC8& aAttrVal); + + + /** + * Prepares a new RXmlEngDocument with DIDL-Lite element + * @since Series S60 3.0 + * @return Returns just created document + */ + RXmlEngDocument PrepareDidlDocumentL(); + + + /** + * Find protocolInfo by contentUri (Not by importUri). + * @param aContentUri uri to be searched in database (Value of resource). + * @param aProtocolInfo ProtocolInfo related to resorce which has been founded. Ownership is transfered to the caller. + * @return KErrNone if successful, otherwise another of the system-wide error codes + */ + TInt GetProtocolInfoL(const TDesC8& aContentUri, CUpnpDlnaProtocolInfo*& aProtocolInfo); // virtual + + + /** + * Gets object list + * @since Series S60 3.1 + * @param aIds + * @param aFilter + * @param aObjs + * @return upnperrorcode descriping situation + */ + void GetObjectListL(const RArray& aIds, const TDesC8& aFilter, RArray& aObjs); + + /** + * + * @since Series S60 3.1 + * @param aObjId + * @return boolean whether can be nested + */ + TBool CanBeNestedL(TInt aObjId); + + /** + * + * @since Series S60 3.1 + * @param aResBean + */ + void AddResourceL(CUpnpResourcesBean* aResBean, TInt aObjId); + + /** + * Deletes resource + * @since Series S60 3.1 + * @param aResId + * @param aDeleteFile + */ + void DeleteResourceByResIdL(TInt64 aResId, TBool aDeleteFile = ETrue); + + /** + * Deletes resource + * @since Series S60 3.1 + * @param aResId + * @param aDeleteFile + */ + void DeleteResourceByObjIdL(TInt aObjId, TBool aDeleteFile = ETrue); + + /** + * + * @since Series S60 3.1 + * @param aOldDir + */ + void NewMediaDirectoryL(const TDesC& aOldDir); + + /** + * Gets resource + * @since Series S60 3.1 + * @param aResId + * @return pointer to CUpnpResourceBean + */ + CUpnpResourcesBean* GetResourceL(TInt64 aResId); + + /** + * Gets attribute + * @since Series S60 3.1 + * @param aElmId + * @param aAttrName + * @param aAttrVal + * @return pointer to CUpnpAttributesBean + */ + CUpnpAttributeBean* GetAttrByNameL(TInt aElmId, const TDesC8& aAttrName, HBufC8*& aAttrVal); + + /** + * Gets attribute + * @since Series S60 3.1 + * @param aAttrName + * @param aAttrVal + * @return pointer to CUpnpAttributeBean + */ + CUpnpAttributeBean* GetAttrByValueL(const TDesC8& aAttrName, const TDesC8& aAttrVal); + + /** + * Gest protocol info + * @since Series S60 3,1 + * @param aImportUri + * @return descriptor pointer + */ + HBufC8* GetProtocolInfoByImportUriL(const TDesC8& aImportUri); + + + /** + * Getter + * @since Series S60 3.1 + * @return TInt + */ + TInt GetKeyForUriL(); + + /** + * Gets first object ID by element value + * @param aElmName - element name + * @param aElmValue - element value + * @return object ID + */ + TInt GetObjectIdByElementValueLikeL(const TDesC8& aElmName, const TDesC8& aElmValue); + + /** + * Gets the parent object's id of the object with given id. + * @since Series S60 3.1 + * @param aObjectId child object id + * @return parentid + */ + TInt GetParentIdL(TInt aObjectId); + /** + * Gets the next object's id . + * @since Series S60 3.1 + * @return id + */ + TInt GetObjectIdL(); + /** + * Gets the next object's id . + * @since Series S60 3.1 + * @return id + */ + HBufC8* GetObjectTitleL(TInt aId); + + /** + * Checks if database have propper columns in each table. + * If not it leaves with KErrCorrupt. + * @since Series S60 3.2 + */ + void CheckDatabaseL(); + + /** + * Handles DB error + * Tries to recover, if fails tries to recreate + * @since Series S60 3.2 + * @return TInt - KErrNone if succed + */ + TInt HandleDbError( TInt aError ); + + /** + * Recreates the database file. + * @since Series S60 3.1 + */ + TInt RecreateDatabaseFile(); + + /** + * Returns DB creation status + * @since Series S60 3.2 + * @return TBool + */ + TBool IsDbCreated(); + + private: + + /** + * Getter + * @since Series S60 3.1 + * @param aObjId + * @return pointer to CUpnpObjectBean + */ + CUpnpObjectBean* GetObjBeanLC(TInt aObjId); + + /** + * Gets object + * @since Series S60 3.1 + * @param aIns + * @param AresVal + */ + void GetObjectsByResourceL(RArray& aIds, const TDesC& aResVal); + + + /** + * Gets element + * @since Series S60 3.1 + * @param aElmName + * @param ElmValue + * @return TInt + */ + TInt GetElmIdByNameAndValL(const TDesC& aElmName, const TDesC& aElmValue); + + /** + * Gets attribute + * @since Series S60 3.1 + * @param aElmId + * @param aAttrName + * @param aAttrValue + */ + void GetAttrValueByNameL(TInt aElmId, const TDesC8& aAttrName, HBufC8*& aAttrVal); + + /** + * Performs resource deletion of the object being destroyed + * @since Series S60 3.0 + * @param aObjId aObjId id of the object being destroyed + * @param aObjId aCd pointer to the ContentDirectory object - it provides a function which deletes + * a file from the private directory + */ + void DeleteResourcesL(TInt aObjId); + + /** + * Performs the DeleteResource operation. + * Deletes each res element with the value of aResVal and corresponding thumnail res elements + * @since Series S60 3.0 + * @param aResVal value of the res whis is to be deleted + * @param aThumbailResVal value of the thumbail res whis is to be deleted + */ + void DoDeleteResourceL(const TDesC8& aResVal, RArray& aContIds); + + + /** + * Sets the childCount attribute in the given object's element. + * @since Series S60 3.0 + * @param aElement object's element + * @param aId object's id + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + void SetChildCountL(TXmlEngElement aElement, TInt aId); + + /** + * Adds all (existing in the database) properties to the object's element. + * @since Series S60 3.0 + * @param aElement object's element + * @param aObjBean object table description object + */ + void AddAllPropertiesL(TXmlEngElement aElement, CUpnpObjectBean* aObjBean); + + /** + * Adds new attribute to the element. + * @since Series S60 3.0 + * @param aElement object's element + * @param aAttrName the name of the attribute which is to be added + * @param aElementId id of the element which the attribute belongs to + * @param aObjectId id of the object which the elements belongs to + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + void AddAttributeL( TXmlEngElement aElement, const TDesC8& aAttrName, TInt aElementId, TInt aObjectId ); + + /** + * Adds a requested properties to the object's element. + * @since Series S60 3.0 + * @param aObjectID object's id + * @param aElement an array containing filter elements of the requested property + * @param aFilterElements ?description + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode AddRequestedPropertiesL(TInt aObjectID,TXmlEngElement aElement, + const RPointerArray& aFilterElements); + + /** + * Adds requested element to the object's element. + * @since Series S60 3.0 + * @param aElement an element wich we want to add a new element to + * @param aObjectID id of the object + * @param aReqElement filter object of the element to be added + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + void AddElementL(TXmlEngElement aElement, TInt aObjectID, const CUpnpFilterElement* aReqElement); + + /** + * Adds required property to the object. + * @since Series S60 3.0 + * @param aElement TXmlEngElement of the object which is to be added the required property + * @param aObjId id of the object being processed + * @param aFilterElement CUpnpFilterElement object of the property to be added + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode AddRequiredPropertyL(TXmlEngElement aElement, TInt aObjId, CUpnpFilterElement* aFilterElement); + + /** + * Parses filter string. + * @since Series S60 3.0 + * @param aFilter filter string to be parsed + * @param aList On return, contains CFilterElements objects of the filter string + */ + void ParseFilterStringL(const TDesC8& aFilter, RPointerArray& aList); + + /** + * Performs get object operation. + * @since Series S60 3.0 + * @param aObjectID id of requested object. + * @param aDoc handler to document containing object's metadata. + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode DoGetObjectL(TInt aObjectID, RXmlEngDocument& aDoc, TBool aAll); + + /** + * Inserts element into database + * @since Series S60 3.0 + * @param aElementel TXmlEngElement of the element to be inserted + * @param aObjId id of the object this element belongs to + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode InsertElementL(const TXmlEngElement& aElementel, TInt aObjId); + + /** + * Performs object update; a transaction should be started before calling this function + * @since Series S60 3.0 + * @param aObjId id of the object to be updated + * @param aFragment XML DOM tree with the updated object's metadata + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode DoUpdateObjectL(TInt aObjId, TXmlEngElement aFragment); + + /** + * Inserts updated object into database + * @since Series S60 3.0 + * @param aObjId id of the object + * @param aFragment XML DOM tree with the updated object's metadata + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode InsertUpdatedL(TInt aObjId, TXmlEngElement& aElement); + + /** + * Sets the id attribute in the given object; adds attribute if does not exist + * @since Series S60 3.0 + * @param aElement TXmlEngElement of the object + * @return value of the id + */ + TInt SetObjectIdL(TXmlEngElement& aElement); + + /** + * Inserts object into database; a transaction should be started before calling this function + * @since Series S60 3.0 + * @param param descr + * @return EUpnpOk, if successful; Leaves if the object could not be inserted into the database + * In case it leaves the transaction must be rolled back + */ + TUpnpErrorCode DoInsertObjectL( TXmlEngElement& aElement, TInt aContainerId, TInt* aId); + + + + /** + * Inserts attributes of the given element into the database + * @since Series S60 3.0 + * @param aElement TXmlEngElement of the element + * @param aElmId id of the element + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode InsertAttributesL(const TXmlEngElement aElement, TInt aElmId,TInt aObjId); + + + /** + * Checks if the given attribute has a corresponding marker attr in the given array + * @since Series S60 3.0 + * @param aAttr TXmlEngAttr of the attribute to be chceck + * @param aMarkers an array containing marker attributes + * @return ETrue if the attribute is required, otherwise EFalse + */ + TBool IsAttrRequiredL(const TXmlEngAttr& aAttr, RArray& aMarkers); + + /** + * C++ default constructor. + */ + CUpnpContentDirectoryDb(CUpnpMetadataStorage* aMetadataStorage); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + /** + * If data base file is present it just opens it, + * otherwise creates new database storage file. + * @since Series S60 3.0 + * @param aDatabaseFileName name of storage file + */ + void ConstructDbL(const TFileName& aDatabaseFileName); + + /** + * Opens existing database. + * @since Series S60 3.0 + * @param aDatabaseFileName name of storage file + */ + void OpenDbL( const TFileName& aDatabaseFileName ); + + /** + * Adds elements that are children of inquired object to passed DOM TXmlEngElement. + * @param aObjectID - id of the object, which child elements will be added. + * @param aObjectElement - element to which the elements will be added. + */ + void AddElementsL( TInt aObjectID, TXmlEngElement aObjectElement, TBool aAll ); + + /** + * Adds attributes to passed DOM TXmlEngElement. + * @param aElementID - id of the element, which attributes will be added. + * @param aObjectId id of the object which the elements belongs to + * @param aElement - element to which the attributes will be added. + */ + void AddAttributesL( TInt aElementID, TInt aObjectID, TXmlEngElement& aElement, TBool aAll ); + + + + + private: // Data + CUpnpMetadataStorage* iMetadataStorage; // not owned + RXmlEngDOMImplementation iDOMImpl; + }; + +#endif //CCONTENTDIRECTORYDB_H + +// End Of File