--- /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 <e32base.h>
+#include <f32file.h>
+#include <d32dbms.h>
+#include <s32file.h>
+#include <upnperrors.h>
+#include <xmlengdom.h>
+
+// 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<TInt>& 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<TInt>& 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<TInt>& aRefList,
+ RArray<TInt>& 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<TInt>& 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<TInt>& aList);
+ TUpnpErrorCode GetItemListL(TInt aParentId, RArray<TInt>& aList);
+ TUpnpErrorCode GetContainerListL(TInt aParentId, RArray<TInt>& 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<TInt>& aObjList, RArray<TInt>& 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