diff -r 000000000000 -r 7f85d04be362 upnpmediaserver/contentdirectoryservice/inc/upnpmetadatastorage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpmediaserver/contentdirectoryservice/inc/upnpmetadatastorage.h Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,482 @@ +/** @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 UPNPMETADATASTORAGE_H +#define UPNPMETADATASTORAGE_H + +// INCLUDES +#include +#include +#include +#include +#include +#include + +// FORWARD DECLARATIONS +class CUpnpObjectBean; +class CUpnpElementBean; +class CUpnpAttributeBean; +class CUpnpResourcesBean; + +// CLASS DECLARATION + +/** +* Metadata storage +* +* @lib avcontentdirectory.lib +* @since Series 60 3.0 +*/ +class CUpnpMetadataStorage : public CBase +{ +public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CUpnpMetadataStorage* NewL(const TDesC& aDatabaseFileName); + static CUpnpMetadataStorage* NewLC(const TDesC& aDatabaseFileName); + + /** + * Destructor. + */ + virtual ~CUpnpMetadataStorage(); + +public: // New functions + + /** + * 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. + */ + TBool IsContainerL(TInt aObjId); + void DeleteResourcesL(RArray& aObjList); + void AddResourceL(CUpnpResourcesBean* aResBean, TInt aObjId); + TUpnpErrorCode DoDeleteObjectL(TInt aObjId, TBool aDeleteResource, TBool aDeleteRef=ETrue ); + void InsertIntoAttributeTableL(TInt aElmId, CUpnpAttributeBean* aAtrBn, TInt aObjId, TInt aAtrId); + TInt InsertIntoElementTableL(TInt aObjId, CUpnpElementBean* aElmBn, TInt aElmId); + TInt InsertIntoObjectTableL(TInt aContainer, CUpnpObjectBean* aObjBn); + /** + * @since Series S60 3.1 + * @param aObjId + * @return RDbView + */ + RDbView GetObjViewL(TInt aObjId); + + /** + * + * @since Series S60 3.1 + */ + void BeginTransactionL(); + + /** + * + * @since Series S60 3.1 + */ + void CommitTransactionL(); + + /** + * + * @since Series S60 3.1 + */ + void RollbackTransactionL(); + + /** + * Getter + * @since Series S30 3.1 + * @param aObjectID + * @param aAll + * @return RDbView + */ + RDbView GetElementsViewL(TInt aObjectID, TBool aAll); + + /** + * Getter + * @since Series S30 3.1 + * @param aElementID + * @param aAll + * @return RDbView + */ + RDbView GetAttributesViewL(TInt aElementID, TBool aAll); + + /** + * Getter + * @since Series S30 3.2 + * @param aObjectID + * @param aAll + * @return RDbView + */ + RDbView GetAttributesViewByObjectIdL( TInt aObjectID, TBool aAll ); + + /** + * Getter + * @since Series S30 3.1 + * @param aAttrNameID + * @param aAttrVal + * @return + */ + TInt GetElmIdForAttrL(const TDesC8& aAttrName, const TDesC8& aAttrVal); + + /** + * Getter + * @since Series S30 3.1 + * @param aAttrName + * @param aAttrVal + * @return + */ + TInt GetElmIdForAttrLikeL(const TDesC8& aAttrName, const TDesC8& aAttrVal); + + /** + * + * @since Series S30 3.1 + * @param aResVal + * @param aObjId + */ + void DeleteResElL(const TDesC& aResVal, TInt ObjId); + + /** + * Getter + * @since Series S30 3.1 + * @param aResVal + * @return RDbView + */ + RDbView GetViewOfObjectListForResL(const TDesC& aResVal); + + /** + * Getter + * @since Series S30 3.1 + * @param aElmName + * @param aElmValue + * @return RDbView + */ + RDbView GetViewOfElmIdByNameAndValL(const TDesC& aElmName, const TDesC& aElmValue); + + /** + * Getter + * @since Series S30 3.1 + * @param aAttrName + * @param aAttrVal + * @return RDbView + */ + RDbView GetAttrViewL(const TDesC8& aAttrName, const TDesC8& aAttrVal); + + /** + * Getter + * @since Series S30 3.1 + * @param aElmId + * @param aAttrName + * @return RDbView + */ + RDbView GetAttrViewL(TInt aElmId, const TDesC8& aAttrName); + + /** + * Getter + * @since Series S30 3.2 + * @param aBjectId + * @param aAttrName + * @return RDbView + */ + RDbView GetAttrViewByObjectIdL(TInt aBjectId, const TDesC8& aAttrName); + + /** + * + * @since Series S30 3.1 + * @param aSqlQuery + * @return RDbView + */ + RDbView PrepareViewL(const TDesC& aSqlQuery); + + /** + * Getter + * @since Series S30 3.1 + * @param aSqlQuery + * @return RDbView + */ + RDbView GetEvaluatedViewL(const TDesC& aSqlQuery); + HBufC8* GetObjectPathL(TInt aObjId); + HBufC8* GetObjectTitleL(TInt aObjId); + void ExecuteL(const TDesC& aSqlCommand); + CUpnpResourcesBean* GetResourceL(TInt64 aResId); + void DeleteResourceByObjIdL(TInt aObjId, TBool aDeleteFile=ETrue); + void DeleteResourceByResIdL(TInt64 aResId, TBool aDeleteFile=ETrue); + void DeleteObjectsL(TInt aObjId); + void DeleteElementsL(TInt aObjId); + void DeleteAttributesL(TInt aObjId); + void DeleteReferencesL(TInt aObjId,RArray& aRefList); + + /** + * Performs object deletion; a transaction should be started before calling this function + * @since Series S60 3.0 + * @param id of the object to be deleted + * @param aObjId aCd pointer to the ContentDirectory object - it provides a function which deletes + * a file from the private directory + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TInt DoDeleteObjectL(TInt aObjId,RArray& aRefList, + RArray& aResList, TBool aDeleteResource, TBool aLocal, TBool aDeleteRef = ETrue ); + + /** + * 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); + + /** + * 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, + TBool aLocal = EFalse, TBool aDeleteRef = ETrue ); + + + /** + * Gets the descriptor value of the specified column in the rowset. + * @since Series S60 3.0 + * @param aRowset rowset object + * @param aColNo the number of the column to be get the value of + * @return descriptor containing the value of the specified column, + * the caller should delete it when it is no longer needed + */ + HBufC8* GetColDesValFromRowSetL(RDbRowSet aRowset, TDbColNo aColNo); + + /** + * Gets the value of childCount property for the given object. + * @since Series S60 3.0 + * @param aObjId object's id + * @return value of childCount property + */ + TInt GetChildCountL(TInt aObjId); + + /** + * Gets the parent object's id of the object with given id. + * @since Series S60 3.0 + * @param aObjId child object id + * @return perent object id + */ + TInt GetParentIdL(TInt aObjId); + + /** + * Gets the id of the object which the element with given id belongs to. + * @since Series S60 3.0 + * @param aId element's id + * @return object's id + */ + TInt GetObjIdForElmIdL(TInt aId); + + /** + * Gets id of reffered object + * @since Series S60 3.0 + * @param aObjectId object id + * @return reffered object id. + */ + TInt ReferedObjectIdL( TInt aObjectId ); + + /** + * Gets the next free id in the specified table + * @since Series S60 3.0 + * @param aName name of the table + * @return TInt next free id in the specified table + */ + TInt GetNextKeyL(const TDesC8& aName); + TInt GetNextKeyL(const TDesC8& aName, TInt aAmount); + /** + * Gets the next free id in the specified table + * @since Series S60 3.0 + * @param aName name of the table + * @return TInt next free id in the specified table + */ + TInt NextKeyL(const TDesC8& aName); + + /** + * Insert object's data into 'object' table + * @since Series S60 3.0 + * @param aElement TXmlEngElement of the object to be added + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + void InsertObjectIntoObjectTableL(const TXmlEngElement& aElement); + + /** + * Inserts single attribute into the database + * @since Series S60 3.0 + * @param aAttr TXmlEngAttr of the attribute to be inserted + * @param aElmId id of the element this attribute belongs to + * 2param aIsRequired + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + void InsertAttributeL(const TXmlEngAttr aAttr, TInt aElmId, TBool aIsRequired, TInt aObjId); + + /** + * 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 + */ + TInt InsertElementL(const TXmlEngElement& aElementel, TInt aObjId); + + /** + * Gets the database view of the named element of the specified object. + * @since Series S60 3.0 + * @param aObjId object's id + * @param aElName name of the element which we want to get the view of + * @return ?description + */ + RDbView GetElementViewL(TInt aObjId, const TDesC8& aElName); + + /** + * Adds an attribute from object table to the object's main element. + * @since Series S60 3.0 + * @param aElement object's element + * @param aId object's id + * @param aName name of the attribute which is to be added + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode AddMainTagAttrL(TXmlEngElement aElement, TInt aId, const TDesC8& aName); + + + /** + * Gets the list direct children of object with specified id + * @since Series S60 3.0 + * @param aParentId id of the parent object + * @param aList an array to be filled with object + * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes. + */ + TUpnpErrorCode GetObjectListL(TInt aParentId, RArray& aList); + TUpnpErrorCode GetItemListL(TInt aParentId, RArray& aList); + TUpnpErrorCode GetContainerListL(TInt aParentId, RArray& aList); + + /** + * 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); + + /** + * Recovers the database. + * @since Series S60 3.1 + * @return Standard error code + */ + TInt RecoverDatabase(); + + /** + * Recreates the database file. + * @since Series S60 3.1 + */ + void RecreateDatabaseFileL(); + + /** + * Checks if all database columns in each table have propper definitions. + * 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 ); + + /** + * Returns DB creation status + * @since Series S60 3.2 + * @return TBool + */ + TBool IsDbCreated(); + + +private: + + /** + * C++ default constructor. + */ + CUpnpMetadataStorage(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(const TDesC& aDatabaseFileName); + +private: + + void CompactDbL(); + TInt AddSubObjectsL(TInt aObjId, RArray& aObjList, RArray& aResList, TBool aLocal); + + /** + * Compare two column sets (type, maxsize and attributes). Used by CheckDatabaseL() function. + * Leaves with KErrCorrupt when columns are not agree. + * @since Series S60 3.2 + * @param aColSet1 First column set to compare + * @param aColSet2 Second column set to compare + */ + void CompareDbColSetsL( CDbColSet *aColSet1, CDbColSet *aColSet2 ); + + /** + * Deletes the file + * @since Series S30 3.1 + * @param aPath + */ + void DeleteFileL(const TDesC& aPath); + + /** + * + * @since Series S30 3.1 + * @param aElement + * @return descriptor pointer + */ + HBufC8* CreatePathValL(const TXmlEngElement& aElement); + HBufC8* CreatePathValL(TInt aParentId); + /** + * Opens database + * @since Series S30 3.1 + * @param aDatabaseFileName + */ + void OpenDbL( const TFileName& aDatabaseFileName ); + + /** + * + * @since Series S30 3.1 + * @param aWeight + */ + void DbChangedL(TInt aWeight); + +private: + + // For use of iFileStore + RFs iFsSession; + // For database operations + RDbStoreDatabase iDatabase; + TBool iIsOpen; + // For creating and opening database files + CFileStore* iFileStore; + // compact counter + TInt iCompactCounter; + +}; + +#endif // UPNPMETADATASTORAGE_H + +// End of File