--- /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 <e32base.h>
+#include <d32dbms.h>
+#include <s32file.h>
+#include <flogger.h>
+#include <upnperrors.h>
+#include <xmlengdom.h>
+
+
+// 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 <DIDL-Lite> 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<TInt>& 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<TInt>& 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<TInt>& 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<TInt>& aIds, const TDesC8& aFilter, RArray<RXmlEngDocument>& 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<TInt>& 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<TInt>& 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<CUpnpFilterElement>& 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<CUpnpFilterElement>& 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<TXmlEngAttr>& 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