--- a/upnpmediaserver/contentdirectoryservice/src/upnpmetadatastorage.cpp Fri Sep 17 08:31:21 2010 +0300
+++ b/upnpmediaserver/contentdirectoryservice/src/upnpmetadatastorage.cpp Mon Nov 01 12:37:49 2010 +0200
@@ -1,2353 +1,2353 @@
-/** @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: Metadata storage
- *
-*/
-
-
-// INCLUDE FILES
-#include <upnpdominterface.h>
-#include "upnpmetadatastorage.h"
-#include "upnpcontentdirectoryglobals.h"
-#include "upnpobjectbean.h"
-#include "upnpelementbean.h"
-#include "upnpcdutils.h"
-#include "upnpresourcesbean.h"
-#include "upnpitem.h"
-#include "upnpelement.h"
-#include "upnpattributebean.h"
-#include "upnpcddbfactory.h"
-
-#define KLogFile _L("ContentDirectoryDb.log")
-#include "upnpcustomlog.h"
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CUpnpMetadataStorage
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CUpnpMetadataStorage::CUpnpMetadataStorage()
- {
-
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::ConstructL( const TDesC& aDatabaseFileName )
- {
- User::LeaveIfError( iFsSession.Connect( ) );
- OpenDbL( aDatabaseFileName );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CUpnpMetadataStorage* CUpnpMetadataStorage::NewLC(
- const TDesC& aDatabaseFileName )
- {
- CUpnpMetadataStorage* self = new( ELeave ) CUpnpMetadataStorage();
-
- CleanupStack::PushL( self );
- self->ConstructL( aDatabaseFileName );
-
- return self;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CUpnpMetadataStorage* CUpnpMetadataStorage::NewL(
- const TDesC& aDatabaseFileName )
- {
- CUpnpMetadataStorage* self =
- CUpnpMetadataStorage::NewLC( aDatabaseFileName );
-
- CleanupStack::Pop( self );
-
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::~CUpnpMetadataStorage
-// Destructor
-// -----------------------------------------------------------------------------
-//
-CUpnpMetadataStorage::~CUpnpMetadataStorage()
- {
- if ( iIsOpen )
- {
- iDatabase.Compact( );
- }
- iDatabase.Close( );
- delete iFileStore;
- iFsSession.Close( );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::OpenDbL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::OpenDbL( const TFileName& aDatabaseFileName )
- {
- iFileStore = CPermanentFileStore::OpenL( iFsSession, aDatabaseFileName,
- EFileRead|EFileWrite );
- iFileStore->SetTypeL( iFileStore->Layout( ) );
- iDatabase.OpenL( iFileStore, iFileStore->Root( ) );
- CheckDatabaseL( );
- iIsOpen = ETrue;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DbChangedL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::DbChangedL( TInt aWeight )
- {
- iCompactCounter += aWeight;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DbChangedL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::CompactDbL()
- {
- if ( iCompactCounter >= KCompactWeight )
- {
- iCompactCounter = 0;
- User::LeaveIfError( iDatabase.Compact( ) );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::BeginTransactionL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::BeginTransactionL()
- {
- iDatabase.Begin( );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CommitTransactionL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::CommitTransactionL()
- {
- TInt err = iDatabase.Commit( );
- if ( err != KErrNone )
- {
- iDatabase.Rollback( );
- User::LeaveIfError( iDatabase.Recover( ) );
- User::Leave( err );
- }
- CompactDbL( );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::RollbackTransactionL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::RollbackTransactionL()
- {
- iDatabase.Rollback( );
- User::LeaveIfError( iDatabase.Recover( ) );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetObjectListL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUpnpErrorCode CUpnpMetadataStorage::GetObjectListL( TInt aParentId,
- RArray<TInt>& aList )
- {
- TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists
- if ( ret != ENoSuchObject && ret != ENoContainer )
- {
- // prepare query
- TBuf<sizeof(KGetObjectListSqlCmd)/KCharSize + KMaxIntegerLen> query;
- query.Format( KGetObjectListSqlCmd, aParentId );
- // prepare view
- RDbView view;
- User::LeaveIfError( view.Prepare( iDatabase, TDbQuery( query ),
- view.EReadOnly ) );
- CleanupClosePushL( view );
- // evaluate
- User::LeaveIfError( view.EvaluateAll( ) );
- // for each object
- const TInt KIdColNo=1;
-
- while ( view.NextL( ) )
- {
- view.GetL( );
- // get object
- TInt childId = view.ColInt( KIdColNo );
- aList.AppendL( childId );
- }
- //clean up
- CleanupStack::PopAndDestroy( &view );
- ret = EUpnpOk;
- }
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetObjectListL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUpnpErrorCode CUpnpMetadataStorage::GetItemListL( TInt aParentId,
- RArray<TInt>& aList )
- {
- TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists
- if ( ret != ENoSuchObject )
- {
- // prepare query
- TBuf<sizeof(KGetItemListSqlCmd)/KCharSize + KMaxIntegerLen> query;
- query.Format( KGetItemListSqlCmd, aParentId );
- // prepare view
- RDbView view;
- User::LeaveIfError( view.Prepare( iDatabase, TDbQuery( query ),
- view.EReadOnly ) );
- CleanupClosePushL( view );
- // evaluate
- User::LeaveIfError( view.EvaluateAll( ) );
- // for each object
- const TInt KIdColNo=1;
- while ( view.NextL( ) )
- {
- view.GetL( );
- // get object
- TInt childId = view.ColInt( KIdColNo );
- aList.AppendL( childId );
- }
- //clean up
- CleanupStack::PopAndDestroy( &view );
- ret = EUpnpOk;
- }
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetContainerListL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUpnpErrorCode CUpnpMetadataStorage::GetContainerListL( TInt aParentId,
- RArray<TInt>& aList )
- {
- TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists
- if ( ret != ENoSuchObject )
- {
- // prepare query
- TBuf<sizeof(KGetContainerListSqlCmd)/KCharSize + KMaxIntegerLen> query;
- query.Format( KGetContainerListSqlCmd, aParentId );
- // prepare view
- RDbView view;
- User::LeaveIfError( view.Prepare( iDatabase, TDbQuery( query ),
- view.EReadOnly ) );
- CleanupClosePushL( view );
- // evaluate
- User::LeaveIfError( view.EvaluateAll( ) );
- // for each object
- const TInt KIdColNo=1;
- while ( view.NextL( ) )
- {
- view.GetL( );
- // get object
- TInt childId = view.ColInt( KIdColNo );
- aList.AppendL( childId );
- }
- //clean up
- CleanupStack::PopAndDestroy( &view );
- ret = EUpnpOk;
- }
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CheckObjectRestrictionL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUpnpErrorCode CUpnpMetadataStorage::CheckObjectRestrictionL( TInt aObjId )
- {
- TUpnpErrorCode ret = EUpnpUndefined;
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aObjId);
- User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
- table.EReadOnly ) );
- User::LeaveIfError( table.SetIndex( KObjIdIndexName ) ); // use index
- if ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
-
- CDbColSet* colSet = table.ColSetL( );
- TDbColNo colNo(colSet->ColNo( KObjRestrictedColName ) );
- if ( !table.ColUint8( colNo ) ) // is restricted?
- { // OK
- TDbColNo colNo(colSet->ColNo( KObjClassColName ) );
- if ( table.ColDes8(colNo).Find( KContainerClass8 ) == 0 ) // check whether the object is a container
- { // this is a container
- ret = EUpnpOk;
- }
- else
- { // there is such object but this is not a container
- ret = ENoContainer;
- }
- }
- else
- {
- ret = ERestrictedObject;
- }
- delete colSet;
- }
- else
- { // no such object
- ret = ENoSuchObject;
- }
-
- CleanupStack::PopAndDestroy( &table );
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CheckObjectRestrictionL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CUpnpMetadataStorage::IsContainerL( TInt aObjId )
- {
- TBool ret = EFalse;
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aObjId);
- User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
- table.EReadOnly ) );
- User::LeaveIfError( table.SetIndex( KObjIdIndexName ) ); // use index
-
- if ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
-
- CDbColSet* colSet = table.ColSetL( );
- TDbColNo colNo(colSet->ColNo( KObjClassColName ) );
- if ( table.ColDes8(colNo).Find( KContainerClass8 ) == 0 ) // check whether the object is a container
- { // this is a container
- ret = ETrue;
- }
- delete colSet;
- }
- // clean up
- CleanupStack::PopAndDestroy( &table );
-
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::AddMainTagAttrL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-TUpnpErrorCode CUpnpMetadataStorage::AddMainTagAttrL(
- TXmlEngElement aElement, TInt aId, const TDesC8& aName )
- {
- TUpnpErrorCode ret = EUpnpUndefined;
- // xml string of name
-
- // is the attr exist?
- TXmlEngAttr atr = aElement.AttributeNodeL( aName );
- if ( atr.IsNull( ) )
- { // attr does not exist - add
- TBuf<sizeof(KSelectFromObjectSqlCmd)/KCharSize +
- KMaxIntegerLen + KColNameMaxLenth> query;
- query.Format( KSelectFromObjectSqlCmd, &aName, aId );
-
- // Execute command
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( query ),
- view.EReadOnly );
- LOGSQL( "CUpnpContentDirectoryDb::AddMainTagAttrL",
- "RDbView::Prepare", dbErr, &query );
- if ( dbErr == KErrNone )
- {
- CleanupClosePushL( view );
- User::LeaveIfError( view.EvaluateAll( ) );
-
- // if there is a row, add attribute
- if ( view.FirstL( ) )
- {
- // get row
- view.GetL( );
- // col's val as Des
- HBufC8* buff = GetColDesValFromRowSetL( view, 1 );
- CleanupStack::PushL( buff );
- // prepare xml string of value
- // add attributes
- aElement.AddNewAttributeL( aName, *buff );
- ret = EUpnpOk;
- // clean up
- CleanupStack::PopAndDestroy( buff );
- }
- else
- { // no such object in the database
- ret = ENoSuchObject;
- }
- }
- else
- { // probably the name of the attr was wrong - ignore
- ret = ENoSuchObject;
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- }
- else // if(!atr.IsNull())
- { // already exists - it is OK, do not need to do anything
- ret = EUpnpOk;
- }
-
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetElementViewL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-RDbView CUpnpMetadataStorage::GetElementViewL( TInt aObjId,
- const TDesC8& aElName )
- {
- // convert to TDesC
- HBufC* elName = HBufC::NewLC( aElName.Length( ) );
- elName->Des().Copy( aElName );
-
- // Prepare SQL command
- HBufC* query = HBufC::NewLC( KSelectElmFromElmSqlCmd().Length( )
- + KNamedElFromElement().Length( )
- + KMaxIntegerLen
- + elName->Length( ) );
- TPtr queryPtr(query->Des( ));
- queryPtr.Format( KSelectElmFromElmSqlCmd, aObjId );
- queryPtr.AppendFormat( KNamedElFromElement, elName );
-
-
- // Execute command
- RDbView view = GetEvaluatedViewL( queryPtr );
- LOGSQL( "CUpnpContentDirectoryDb::GetElementViewL", "RDbView::Prepare",
- 0, &queryPtr );
- CleanupStack::PopAndDestroy( query );
- CleanupStack::PopAndDestroy( elName );
-
- return view;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::AddAttributeL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-
-RDbView CUpnpMetadataStorage::GetObjViewL( TInt aObjId )
- {
- // Get data from object table
- // Prepare SQL command
- TBuf<sizeof(KSelectObjectFromObjSqlCmd)/KCharSize
- + KMaxIntegerLen> query;
- query.Format( KSelectObjectFromObjSqlCmd, aObjId );
-
- LOGSQL( "CUpnpContentDirectoryDb::GetObjectL", "", 0, &query );
-
- return GetEvaluatedViewL( query );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::AddAttributeL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetElementsViewL( TInt aObjectID, TBool aAll )
- {
- // Get data from element table
- // Prepare SQL command
- TBuf<sizeof(KSelectElmFromElmSqlCmd)/KCharSize
- + sizeof(KOnlyRequiredFromElement)/KCharSize + KMaxIntegerLen> query;
- query.Format( KSelectElmFromElmSqlCmd, aObjectID );
-
- query.Format( KSelectElmFromElmSqlCmd, aObjectID );
- if ( !aAll )
- { // only required properties
- query.Append( KOnlyRequiredFromElement );
- }
-
- LOGSQL( "CUpnpContentDirectoryDb::GetElementsViewL", "", 0, &query );
-
- return GetEvaluatedViewL( query );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::AddAttributeL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetAttributesViewL( TInt aElementID, TBool aAll )
- {
- // Get data from element table
- // Prepare SQL command
- TBuf<sizeof(KSelectAtrFromAttrSqlCmd)/KCharSize
- + sizeof(KOnlyRequiredFromAtr)/KCharSize + KMaxIntegerLen> query;
- query.Format( KSelectAtrFromAttrSqlCmd, aElementID );
- if ( !aAll )
- { // only required attr are wanted
- query.Append( KOnlyRequiredFromAtr );
- }
-
- LOGSQL( "CUpnpContentDirectoryDb::GetAttributesViewL", "", 0, &query );
-
- return GetEvaluatedViewL( query );
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetAttributesViewByObjectIdL
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetAttributesViewByObjectIdL( TInt aObjectID,
- TBool aAll )
- {
- // Get data from element table
- // Prepare SQL command
- TBuf<sizeof(KSelectAtrFromAttrByObjSqlCmd)/KCharSize
- + sizeof(KOnlyRequiredFromAtr)/KCharSize + KMaxIntegerLen> query;
- query.Format( KSelectAtrFromAttrByObjSqlCmd, aObjectID );
- if ( !aAll )
- { // only required attr are wanted
- query.Append( KOnlyRequiredFromAtr );
- }
-
- LOGSQL( "CUpnpContentDirectoryDb::GetAttributesViewByObjectIdL", "", 0,
- &query );
-
- return GetEvaluatedViewL( query );
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::InsertElementL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::InsertElementL( const TXmlEngElement& aElement,
- TInt aObjId )
- {
- // open table
- RDbTable table;
- User::LeaveIfError( table.Open( iDatabase, KElementTableName,
- table.EUpdatable ) );
- CleanupClosePushL( table );
-
- // CdbColSet
- CDbColSet* objColSet = table.ColSetL( );
- CleanupStack::PushL( objColSet );
-
- // rowset cursor to the beginning position
- table.Reset( );
-
- // insert empty row
- table.InsertL( );
-
- // elm_id
- TInt elmId = GetNextKeyL( KElementTableName8 );
- table.SetColL( objColSet->ColNo( KElmIdColName ), elmId );
-
- // elm_name
- HBufC8 * elmName = UpnpCdUtils::GetElmNameWithNsL( aElement );
- CleanupStack::PushL( elmName );
- table.SetColL( objColSet->ColNo( KElmNameColName ), *elmName );
- CleanupStack::PopAndDestroy( elmName );
-
- // elm_value
- if ( aElement.Value().Length( ) )
- {
- TPtrC8 elmValue(aElement.Value( ) );
- if ( elmValue.Length( ) > KMaxUpnpLongStringLen )
- { // too long
- User::Leave( EActionFailed );
- }
- // use write stream
- RDbColWriteStream ws;
- ws.OpenLC( table, objColSet->ColNo( KElmValueColName ) );
- ws.WriteL( elmValue ); // write value
- ws.CommitL( );
- CleanupStack::PopAndDestroy( &ws );
- }
-
- // elm_has_attribute
- table.SetColL( objColSet->ColNo( KElmHasAttrColName ),
- aElement.HasAttributes( ) );
-
- // elm_obj_id
- table.SetColL( objColSet->ColNo( KElmObjIdColName ), aObjId );
-
- // elm_is_required
- table.SetColL( objColSet->ColNo( KElmIsRequiredColName ),
- UpnpCdUtils::IsElementRequiredL( aElement ) );
-
- // complete insertion
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- // clean up
- CleanupStack::PopAndDestroy( objColSet );
- CleanupStack::PopAndDestroy( &table );
-
- return elmId;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CreatePathValL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-HBufC8* CUpnpMetadataStorage::CreatePathValL( const TXmlEngElement& aElement )
- {
- TPtrC8
- parentIdPtr(UpnpDomInterface::GetAttrValueL( aElement, KParentID ));
- TLex8 lexer(parentIdPtr);
- TInt parentId;
- User::LeaveIfError( lexer.Val( parentId ) );
-
- return CreatePathValL( parentId );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CreatePathValL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-HBufC8* CUpnpMetadataStorage::CreatePathValL( TInt aParentId )
- {
- HBufC8* path = NULL;
- User::LeaveIfNull( path = GetObjectPathL( aParentId ) );
-
- CleanupStack::PushL( path );
-
- HBufC8* tmp = HBufC8::NewL( path->Length( )
- + KPathSeparator().Length( )
- + KMaxIntegerLen );
- TPtr8 tmpPtr(tmp->Des( ));
- tmpPtr.Copy( *path );
- tmpPtr.Append( KPathSeparator );
-
- TBuf<KMaxIntegerLen> num;
- num.Num( aParentId );
- tmpPtr.Append( num );
-
- CleanupStack::PopAndDestroy( path );
-
- return tmp;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::InsertAttributeL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::InsertAttributeL( const TXmlEngAttr aAttr,
- TInt aElmId, TBool aIsRequired, TInt aObjId )
- {
-
- // open table
- RDbTable table;
- User::LeaveIfError( table.Open( iDatabase, KAttributeTableName,
- table.EUpdatable ) );
- CleanupClosePushL( table );
-
- // CdbColSet
- CDbColSet* objColSet = table.ColSetL( );
- CleanupStack::PushL( objColSet );
-
- // rowset cursor to the beginning position
- table.Reset( );
-
- // insert empty row
- table.InsertL( );
-
- // atr_id
- table.SetColL( objColSet->ColNo( KAtrIdColName ),
- GetNextKeyL( KAttributeTableName8 ) ); // leaves if error
-
- // atr_name
- table.SetColL( objColSet->ColNo( KAtrNameColName ), aAttr.Name( ) ); // name cannot be null
-
- // atr_value
- if ( aAttr.Value().Length( ) )
- {
- TPtrC8 atrValue(aAttr.Value( ) );
- if ( atrValue.Length( ) > KMaxUpnpLongStringLen )
- { // too long
- User::Leave( EActionFailed );
- }
- // use write stream
- RDbColWriteStream ws;
- ws.OpenLC( table, objColSet->ColNo( KAtrValueColName ) );
- ws.WriteL( atrValue ); // write value
- ws.CommitL( );
- CleanupStack::PopAndDestroy( &ws );
- }
-
- // atr_elm_id
- table.SetColL( objColSet->ColNo( KAtrElmIdColName ), aElmId );
-
- // atr_is_required
- table.SetColL( objColSet->ColNo( KAtrIsRequiredColName ), aIsRequired );
-
- // atr_obj_id
- table.SetColL( objColSet->ColNo( KAtrIdObjColName ), aObjId );
-
- // complete insertion
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- // clean up
- CleanupStack::PopAndDestroy( objColSet );
- CleanupStack::PopAndDestroy( &table );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::InsertObjectIntoObjectTableL
-// ?implementation_description
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::InsertObjectIntoObjectTableL(
- const TXmlEngElement& aElement )
- {
- // open table
- RDbTable table;
- User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
- table.EUpdatable ) );
- CleanupClosePushL( table );
-
- // CdbColSet
- CDbColSet* objColSet = table.ColSetL( );
- CleanupStack::PushL( objColSet );
-
- // rowset cursor to the beginning position
- table.Reset( );
-
- // insert empty row
- table.InsertL( );
-
- // set attributes
- RXmlEngNodeList<TXmlEngAttr> attrList;
- CleanupClosePushL( attrList );
- aElement.GetAttributes( attrList );
- while ( attrList.HasNext( ) )
- {
- // get next
- TXmlEngAttr attr = attrList.Next( );
-
- // col ordinal
- HBufC* colName = HBufC::NewLC( attr.Name().Length( ) );
- colName->Des().Copy( attr.Name( ) );
- TDbColNo colNo = objColSet->ColNo( *colName );
- CleanupStack::PopAndDestroy( colName );
-
- // insert if exists
- if ( colNo != KDbNullColNo )
- { // (not any string attribute in the main element)
- HBufC8* tmp = attr.Value().AllocLC( );
- UpnpCdUtils::ReplaceTrueFalse( tmp );// true -> 1, false -> 0
- TLex8 lexer(*tmp);
- TInt num;
- User::LeaveIfError( lexer.Val( num ) ); // string -> integer
- // set value
- table.SetColL( colNo, num );
- CleanupStack::PopAndDestroy( tmp );
- }
- }
- CleanupStack::Check( &attrList );
-
- // set title
- TXmlEngElement objTitle;
- UpnpDomInterface::GetElementL( aElement, objTitle, KObjTiltleColName8( ) );
- table.SetColL( objColSet->ColNo( KObjTiltleColName ), objTitle.Value( ) );
- CleanupStack::Check( &attrList );
-
- // set class
- TXmlEngElement objClass;
- UpnpDomInterface::GetElementL( aElement, objClass, KObjClassColName8( ) );
- table.SetColL( objColSet->ColNo( KObjClassColName ), objClass.Value( ) );
- CleanupStack::Check( &attrList );
-
- // set path
- HBufC8* path = CreatePathValL( aElement );
- CleanupStack::PushL( path );
- table.SetColL( objColSet->ColNo( KObjPathColName ), *path );
- CleanupStack::PopAndDestroy( path );
- CleanupStack::Check( &attrList );
-
- // complete insertion
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- // clean up
- CleanupStack::PopAndDestroy( &attrList );
- CleanupStack::PopAndDestroy( objColSet );
- CleanupStack::PopAndDestroy( &table );
-
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetNextKeyForTableL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::GetNextKeyL( const TDesC8& aName )
- {
- TInt ret = KErrNotFound;
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aName);
- User::LeaveIfError( table.Open( iDatabase, KSequencesTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KSeqColNameIndexName ) ); // use index
- if ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
- CDbColSet* colSet = table.ColSetL( );
- CleanupStack::PushL( colSet );
- TDbColNo colNo(colSet->ColNo( KSeqNextKeyColName ) );
- ret = table.ColInt( colNo );
- table.UpdateL( );
- table.SetColL( colNo, ret + 1 );
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- CleanupStack::PopAndDestroy( colSet );
- }
- else
- { // no such object
- User::Leave( KErrCorrupt );
- }
- // clean up
- CleanupStack::PopAndDestroy( &table );
-
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetNextKeyForTableL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::GetNextKeyL( const TDesC8& aName, TInt aAmount )
- {
- TInt ret = KErrNotFound;
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aName);
- User::LeaveIfError( table.Open( iDatabase, KSequencesTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KSeqColNameIndexName ) ); // use index
- if ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
- CDbColSet* colSet = table.ColSetL( );
- CleanupStack::PushL( colSet );
- TDbColNo colNo(colSet->ColNo( KSeqNextKeyColName ) );
- ret = table.ColInt( colNo );
- table.UpdateL( );
- table.SetColL( colNo, ret + aAmount );
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- CleanupStack::PopAndDestroy( colSet );
- }
- else
- { // no such object
- User::Leave( KErrCorrupt );
- }
- // clean up
- CleanupStack::PopAndDestroy( &table );
-
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::NextKeyL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::NextKeyL( const TDesC8& aName )
- {
- TInt ret = KErrNotFound;
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aName);
- User::LeaveIfError( table.Open( iDatabase, KSequencesTableName,
- table.EReadOnly ) );
- User::LeaveIfError( table.SetIndex( KSeqColNameIndexName ) ); // use index
- if ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
- CDbColSet* colSet = table.ColSetL( );
- CleanupStack::PushL( colSet );
- TDbColNo colNo(colSet->ColNo( KSeqNextKeyColName ) );
- ret = table.ColInt( colNo );
-
- CleanupStack::PopAndDestroy( colSet );
- }
- else
- { // no such object
- User::Leave( KErrCorrupt );
- }
- // clean up
- CleanupStack::PopAndDestroy( &table );
-
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::ReferedObjectIdL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::ReferedObjectIdL( TInt aObjectId )
- {
- TInt ret = KErrNotFound;
- TBuf<sizeof(KSelectFromObjectSqlCmd)/KCharSize
- + KMaxIntegerLen + KColNameMaxLenth> query;
- query.Format( KSelectFromObjectSqlCmd, &KObjRefIdColName, aObjectId );
-
- // Execute command
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( query ), view.EReadOnly );
- LOGSQL( "CUpnpContentDirectoryDb::ReferedObjectIdL", "RDbView::Prepare",
- dbErr, &query );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.Evaluate( ) );
- if ( view.FirstL( ) )
- {
- // get col number - there can by only one column but just in case get by name
- CDbColSet* colSet = view.ColSetL( );
- const TInt colNo = colSet->ColNo( KObjRefIdColName );
- delete colSet;
-
- view.GetL( );
- if ( !view.IsColNull( colNo ) )
- {
- ret = view.ColInt( colNo );
- }
- }
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
-
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetElmIdForAttrL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::GetElmIdForAttrL( const TDesC8& aAttrName,
- const TDesC8& aAttrVal )
- {
- // convert to unicode
- HBufC* attrName = UpnpCdUtils::Des8ToDesLC( aAttrName );
- HBufC* attrVal = UpnpCdUtils::Des8ToDesLC( aAttrVal );
-
- TInt elmId = KErrNotFound;
- HBufC* query = HBufC::NewLC( aAttrVal.Length( )
- + KSelectFromSqlCmd().Length( )
- + KAtrElmIdColName().Length( )
- + KAttributeTableName().Length( )
- + KAtrValueColName().Length( )
- + KAndConditionSqlCmd().Length( )
- + KAtrNameColName().Length( )
- + aAttrName.Length( ) );
- TPtr queryPtr(query->Des( ));
- // prepare format string
- HBufC* fmt = HBufC::NewLC( KSelectFromSqlCmd().Length( ) + KAndConditionSqlCmd().Length( ) );
- TPtr fmtPtr(fmt->Des( ));
- fmtPtr.Copy( KSelectFromSqlCmd );
- fmtPtr.Append( KAndConditionSqlCmd );
- // format query
- queryPtr.Format( fmtPtr, &KAtrElmIdColName, &KAttributeTableName,
- &KAtrNameColName, attrName, &KAtrValueColName, attrVal );
- // clean up format string
- CleanupStack::PopAndDestroy( fmt );
-
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
- view.EReadOnly );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.Evaluate( ) );
- if ( view.FirstL( ) )
- {
- // get col number - there can by only one column but just in case get by name
- CDbColSet* colSet = view.ColSetL( );
- const TInt colNo = colSet->ColNo( KAtrElmIdColName );
- delete colSet;
-
- view.GetL( );
- if ( !view.IsColNull( colNo ) )
- {
- elmId = view.ColInt( colNo );
- }
- }
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- CleanupStack::PopAndDestroy( query );
- CleanupStack::PopAndDestroy( attrVal );
- CleanupStack::PopAndDestroy( attrName );
- return elmId;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetObjIdForElmIdL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::GetObjIdForElmIdL( TInt aId )
- {
- TInt objId = KErrNotFound;
- HBufC* query = HBufC::NewLC( KMaxIntegerLen + KSelectFromNumSqlCmd().Length( )
- + KElementTableName().Length( )
- + KElmObjIdColName().Length( )
- + KElmIdColName().Length( ) );
- TPtr queryPtr(query->Des( ));
- queryPtr.Format( KSelectFromNumSqlCmd, &KElmObjIdColName,
- &KElementTableName, &KElmIdColName, aId );
-
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
- view.EReadOnly );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.Evaluate( ) );
- if ( view.FirstL( ) )
- {
- // get col number - there can by only one column but just in case get by name
- CDbColSet* colSet = view.ColSetL( );
- const TInt colNo = colSet->ColNo( KElmObjIdColName );
- delete colSet;
-
- view.GetL( );
- if ( !view.IsColNull( colNo ) )
- {
- objId = view.ColInt( colNo );
- }
- }
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- CleanupStack::PopAndDestroy( query );
- return objId;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetObjIdByAttrLikeL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::GetElmIdForAttrLikeL( const TDesC8& aAttrName,
- const TDesC8& aAttrVal )
- {
- //convert to unicode
- HBufC* attrVal = UpnpCdUtils::Des8ToDesLC( aAttrVal );
- HBufC* attrName = UpnpCdUtils::Des8ToDesLC( aAttrName );
-
- // query buf
- TInt elmId = KErrNotFound;
- HBufC* query = HBufC::NewLC( attrVal->Length( )
- + KSelectFromSqlCmd().Length( )
- + KAtrElmIdColName().Length( )
- + KAttributeTableName().Length( )
- + KAtrValueColName().Length( )
- + KAndLikeConditionSqlCmd().Length( )
- + KAtrNameColName().Length( )
- + attrName->Length( ) );
- TPtr queryPtr(query->Des( ));
- // prepare format string
- HBufC* fmt = HBufC::NewLC( KSelectFromSqlCmd().Length( ) + KAndLikeConditionSqlCmd().Length( ) );
- TPtr fmtPtr(fmt->Des( ));
- fmtPtr.Copy( KSelectFromSqlCmd );
- fmtPtr.Append( KAndLikeConditionSqlCmd );
- // format query
- queryPtr.Format( fmtPtr, &KAtrElmIdColName, &KAttributeTableName,
- &KAtrNameColName, attrName, &KAtrValueColName, attrVal );
- // clean up format string
- CleanupStack::PopAndDestroy( fmt );
-
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
- view.EReadOnly );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.Evaluate( ) );
- if ( view.FirstL( ) )
- {
- // get col number - there can by only one column but just in case get by name
- CDbColSet* colSet = view.ColSetL( );
- const TInt colNo = colSet->ColNo( KAtrElmIdColName );
- delete colSet;
-
- view.GetL( );
- if ( !view.IsColNull( colNo ) )
- {
- elmId = view.ColInt( colNo );
- }
- }
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- CleanupStack::PopAndDestroy( query );
- CleanupStack::PopAndDestroy( attrName );
- CleanupStack::PopAndDestroy( attrVal );
- return elmId;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetParentIdL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::GetParentIdL( TInt aObjId )
- {
- TInt objId=KErrGeneral;
- HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
- + KObjParentIdColName().Length( )
- + KObjectTableName().Length( )
- + KObjIdColName().Length( )
- + KMaxIntegerLen );
- TPtr queryPtr(query->Des( ));
- queryPtr.Format( KSelectFromNumSqlCmd, &KObjParentIdColName,
- &KObjectTableName, &KObjIdColName, aObjId );
-
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
- view.EReadOnly );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.Evaluate( ) );
- if ( view.FirstL( ) )
- {
- CDbColSet* colSet = view.ColSetL( );
- const TInt colNo = colSet->ColNo( KObjParentIdColName );
- delete colSet;
-
- view.GetL( );
- if ( !view.IsColNull( colNo ) )
- {
- objId = view.ColInt( colNo );
- }
- }
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- CleanupStack::PopAndDestroy( query );
- return objId;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetChildCountL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::GetChildCountL( TInt aObjId )
- {
- TInt childCount = KErrGeneral;
-
- HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
- + KObjIdColName().Length( )
- + KObjectTableName().Length( )
- + KObjParentIdColName().Length( )
- + KMaxIntegerLen );
- TPtr queryPtr(query->Des( ));
- queryPtr.Format( KSelectFromNumSqlCmd, &KObjIdColName, &KObjectTableName,
- &KObjParentIdColName, aObjId );
-
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
- view.EReadOnly );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.EvaluateAll( ) );
- childCount = view.CountL( );
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- CleanupStack::PopAndDestroy( query );
- return childCount;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteResElL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::DeleteResElL( const TDesC& aResVal, TInt ObjId )
- {
- HBufC* query = HBufC::NewLC( KDeleteResElSqlCmd().Length( ) + aResVal.Length( ) + KMaxIntegerLen );
- TPtr SqlCmd(query->Des( ));
- SqlCmd.Format( KDeleteResElSqlCmd, &aResVal, ObjId );
-
- // execute
- ExecuteL( SqlCmd );
-
- // clean up
- CleanupStack::PopAndDestroy( query );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteResElL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::ExecuteL( const TDesC& aSqlCmd )
- {
- // execute
- TInt err = iDatabase.Execute( aSqlCmd );
- LOGSQL( "CUpnpContentDirectoryDb::DeleteResElL", "iDataBase.Execute",
- err, &aSqlCmd );
- User::LeaveIfError( err );
-
- // db compact
- DbChangedL( KExecuteWeight );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteResElL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetViewOfObjectListForResL( const TDesC& aResVal )
- {
- HBufC* query = HBufC::NewLC( KSelectFromSqlCmd().Length( )
- + KElmObjIdColName().Length( )
- + KElementTableName().Length( )
- + KElmValueColName().Length( )
- + aResVal.Length( )
- + KNamedElFromElement().Length()
- + KRes16().Length());
- TPtr queryPtr(query->Des( ));
- queryPtr.Format( KSelectFromSqlCmd, &KElmObjIdColName,
- &KElementTableName, &KElmValueColName, &aResVal );
- queryPtr.AppendFormat( KNamedElFromElement, &KRes16 );
-
- RDbView view = GetEvaluatedViewL( queryPtr );
-
- CleanupStack::PopAndDestroy( query );
-
- return view;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetViewOfElmIdByNameAndValLC
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetViewOfElmIdByNameAndValL(
- const TDesC& aElmName, const TDesC& aElmValue )
- {
- HBufC* resValReplaced16 = UpnpCdUtils::EscapeAposL( aElmValue );
- HBufC* query = HBufC::NewLC( KSelectFromSqlCmd().Length( )
- + KElmIdColName().Length( )
- + KElementTableName().Length( )
- + KElmNameColName().Length( )
- + aElmName.Length( )
- + KAndConditionSqlCmd().Length( )
- + KElmValueColName().Length( )
- + resValReplaced16->Des().Length( ) );
- TPtr queryPtr(query->Des( ));
-
- // format query
- queryPtr.Format( KSelectFromSqlCmd, &KElmIdColName, &KElementTableName,
- &KElmNameColName, &aElmName );
- queryPtr.AppendFormat( KAndConditionSqlCmd, &KElmValueColName,
- resValReplaced16 );
-
- RDbView view = GetEvaluatedViewL( queryPtr );
-
- CleanupStack::PopAndDestroy( query );
-
- delete resValReplaced16;
- return view;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetAttrViewL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetAttrViewL( const TDesC8& aAttrName,
- const TDesC8& aAttrVal )
- {
- HBufC* attrNameBuf = UpnpCdUtils::Des8ToDesLC( aAttrName );
- HBufC* attrValueBuf = UpnpCdUtils::Des8ToDesLC( aAttrVal );
-
- HBufC* query = HBufC::NewLC( KSelectAttributeByValueSqlCmd().Length( ) + aAttrName.Length( ) + aAttrVal.Length( )
-
- );
- TPtr queryPtr(query->Des( ));
-
- // format query
- queryPtr.Format( KSelectAttributeByValueSqlCmd( ), attrValueBuf,
- attrNameBuf );
-
- RDbView view = GetEvaluatedViewL( queryPtr );
-
- CleanupStack::PopAndDestroy( query );
- CleanupStack::PopAndDestroy( attrValueBuf );
- CleanupStack::PopAndDestroy( attrNameBuf );
-
- return view;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetAttrViewL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetAttrViewL( TInt aElmId,
- const TDesC8& aAttrName )
- {
- // convert ot unicode
- HBufC* attrNameBuf = UpnpCdUtils::Des8ToDesLC( aAttrName );
-
- HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
- + KAtrValueColName().Length( )
- + KAttributeTableName().Length( )
- + KAtrElmIdColName().Length( )
- + KMaxIntegerLen
- + KAndConditionSqlCmd().Length( )
- + KAtrNameColName().Length( )
- + aAttrName.Length( ) );
- TPtr queryPtr(query->Des( ));
- // prepare format string
- HBufC* fmt = HBufC::NewLC( KSelectFromNumSqlCmd().Length( ) + KAndConditionSqlCmd().Length( ) );
- TPtr fmtPtr(fmt->Des( ));
- fmtPtr.Copy( KSelectFromNumSqlCmd );
- fmtPtr.Append( KAndConditionSqlCmd );
- // format query
- queryPtr.Format( fmtPtr, &KAsterisk, &KAttributeTableName,
- &KAtrElmIdColName, aElmId, &KAtrNameColName, attrNameBuf );
-
- CleanupStack::PopAndDestroy( fmt );
-
- RDbView view = GetEvaluatedViewL( queryPtr );
-
- CleanupStack::PopAndDestroy( query );
- CleanupStack::PopAndDestroy( attrNameBuf );
-
- return view;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetAttrViewByObjectIdL
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetAttrViewByObjectIdL( TInt aObjectId,
- const TDesC8& aAttrName )
- {
- // convert ot unicode
- HBufC* attrNameBuf = UpnpCdUtils::Des8ToDesLC( aAttrName );
-
- HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
- + KAtrValueColName().Length( )
- + KAttributeTableName().Length( )
- + KAtrIdObjColName().Length( )
- + KMaxIntegerLen
- + KAndConditionSqlCmd().Length( )
- + KAtrNameColName().Length( )
- + aAttrName.Length( ) );
- TPtr queryPtr(query->Des( ));
- // prepare format string
- HBufC* fmt = HBufC::NewLC( KSelectFromNumSqlCmd().Length( ) + KAndConditionSqlCmd().Length( ) );
- TPtr fmtPtr(fmt->Des( ));
- fmtPtr.Copy( KSelectFromNumSqlCmd );
- fmtPtr.Append( KAndConditionSqlCmd );
- // format query
- queryPtr.Format( fmtPtr, &KAsterisk, &KAttributeTableName,
- &KAtrIdObjColName, aObjectId, &KAtrNameColName, attrNameBuf );
-
- CleanupStack::PopAndDestroy( fmt );
-
- RDbView view = GetEvaluatedViewL( queryPtr );
-
- CleanupStack::PopAndDestroy( query );
- CleanupStack::PopAndDestroy( attrNameBuf );
-
- return view;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpContentDirectoryDb::PrepareViewL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::PrepareViewL( const TDesC& aSqlQuery )
- {
- RDbView view;
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( aSqlQuery ),
- view.EReadOnly );
- LOGSQL( "CUpnpMetadataStorage::GetViewL", "RDbView::Prepare", dbErr,
- &aSqlQuery );
- User::LeaveIfError( dbErr );
-
- return view;
- }
-// -----------------------------------------------------------------------------
-// CUpnpContentDirectoryDb::GetEvaluatedViewL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-RDbView CUpnpMetadataStorage::GetEvaluatedViewL( const TDesC& aSqlQuery )
- {
- RDbView view = PrepareViewL( aSqlQuery );
-
- // evaluate
- TInt dbErr = view.EvaluateAll( );
- LOGCD( "CUpnpMetadataStorage::GetViewLC", "RDbView::EvaluateAll", dbErr,
- "" );
- User::LeaveIfError( dbErr );
-
- return view;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetObjectPathL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-HBufC8* CUpnpMetadataStorage::GetObjectPathL( TInt aObjId )
- {
- HBufC8* ret = NULL;
- HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
- + KObjPathColName().Length( )
- + KObjectTableName().Length( )
- + KObjIdColName().Length( )
- + KMaxIntegerLen );
- TPtr queryPtr(query->Des( ));
- // format query
- queryPtr.Format( KSelectFromNumSqlCmd, &KObjPathColName,
- &KObjectTableName, &KObjIdColName, aObjId );
-
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
- view.EReadOnly );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.EvaluateAll( ) );
-
- CDbColSet* colSet = view.ColSetL( );
- const TInt colNo = colSet->ColNo( KObjPathColName );
- delete colSet;
-
- if ( view.FirstL( ) )
- {
- view.GetL( );
- if ( !view.IsColNull( colNo ) )
- {
- ret = view.ColDes8( colNo ).AllocL( );
- }
- }
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- CleanupStack::PopAndDestroy( query );
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetObjectTitleL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-HBufC8* CUpnpMetadataStorage::GetObjectTitleL( TInt aObjId )
- {
- HBufC8* ret = NULL;
- HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
- + KObjTiltleColName().Length( )
- + KObjectTableName().Length( )
- + KObjIdColName().Length( )
- + KMaxIntegerLen );
- TPtr queryPtr(query->Des( ));
- // format query
- queryPtr.Format( KSelectFromNumSqlCmd, &KObjTiltleColName,
- &KObjectTableName, &KObjIdColName, aObjId );
-
- RDbView view;
- CleanupClosePushL( view );
- TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
- view.EReadOnly );
- if ( dbErr == KErrNone )
- {
- User::LeaveIfError( view.EvaluateAll( ) );
-
- CDbColSet* colSet = view.ColSetL( );
- const TInt colNo = colSet->ColNo( KObjTiltleColName );
- delete colSet;
-
- if ( view.FirstL( ) )
- {
- view.GetL( );
- if ( !view.IsColNull( colNo ) )
- {
- ret = view.ColDes8( colNo ).AllocL( );
- }
- }
- }
- // clean up
- CleanupStack::PopAndDestroy( &view );
- CleanupStack::PopAndDestroy( query );
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetResourceL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-CUpnpResourcesBean* CUpnpMetadataStorage::GetResourceL( TInt64 aResId )
- {
- CUpnpResourcesBean* resBn = NULL;
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aResId);
- User::LeaveIfError( table.Open( iDatabase, KResourcesTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KRscIdIndexName ) ); // use index
- if ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
- // table bean
- resBn = CUpnpResourcesBean::NewL( table );
- }
- // clean up
- CleanupStack::PopAndDestroy( &table );
- return resBn;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteResourceL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::DeleteResourceByObjIdL( TInt aObjId,
- TBool aDeleteFile )
- {
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aObjId);
- User::LeaveIfError( table.Open( iDatabase, KResourcesTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KRscIdObjIndexName ) ); // use index
- while ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
-
- // table bean
- CUpnpResourcesBean* resBn = CUpnpResourcesBean::NewLC( table );
-
- if ( aDeleteFile && !resBn->IsReadonly( ) && resBn->IsThumbnail( ) )
- { // delete the file
- DeleteFileL( resBn->Path( ) );
- }
-
- // clean up
- CleanupStack::PopAndDestroy( resBn );
-
- // delete the row
- table.DeleteL( );
- }
- // clean up
- CleanupStack::PopAndDestroy( &table );
-
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteResourceByResIdL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::DeleteResourceByResIdL( TInt64 aResId,
- TBool aDeleteFile )
- {
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aResId);
- User::LeaveIfError( table.Open( iDatabase, KResourcesTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KRscIdIndexName ) ); // use index
- while ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
-
- // table bean
- CUpnpResourcesBean* resBn = CUpnpResourcesBean::NewLC( table );
-
- if ( aDeleteFile && !resBn->IsReadonly( ) && resBn->IsThumbnail( ) )
- { // delete the file
- DeleteFileL( resBn->Path( ) );
- }
-
- // clean up
- CleanupStack::PopAndDestroy( resBn );
-
- // delete the row
- table.DeleteL( );
- }
- // clean up
- CleanupStack::PopAndDestroy( &table );
-
- }
-//
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteObjectsL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-void CUpnpMetadataStorage::DeleteObjectsL( TInt aObjId )
- {
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aObjId);
- User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KObjIdIndexName ) ); // use index
- if ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
-
- // delete the row
- table.DeleteL( );
- }
- CleanupStack::PopAndDestroy( &table );
- }
-//
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteReferencesL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-void CUpnpMetadataStorage::DeleteReferencesL( TInt aObjId,
- RArray<TInt>& aRefList )
- {
- RDbTable table;
- TInt ret( KErrNotFound );
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aObjId);
- User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KRefIdIndexName ) ); // use index
- while ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
- CDbColSet* colSet = table.ColSetL( );
- CleanupStack::PushL( colSet );
- TDbColNo colNo(colSet->ColNo( KObjParentIdColName ) );
- ret = table.ColInt( colNo );
- aRefList.AppendL( ret );
- CleanupStack::PopAndDestroy( colSet );
- // delete the row
- table.DeleteL( );
- }
- CleanupStack::PopAndDestroy( &table );
- }
-//
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteElementsL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-void CUpnpMetadataStorage::DeleteElementsL( TInt aObjId )
- {
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aObjId);
- User::LeaveIfError( table.Open( iDatabase, KElementTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KElmObjIdIndexName ) ); // use index
- while ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
-
- // delete the row
- table.DeleteL( );
- }
- CleanupStack::PopAndDestroy( &table );
- }
-//
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteAttributesL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-void CUpnpMetadataStorage::DeleteAttributesL( TInt aObjId )
- {
- RDbTable table;
- CleanupClosePushL( table );
- TDbSeekKey seekKey(aObjId);
- User::LeaveIfError( table.Open( iDatabase, KAttributeTableName,
- table.EUpdatable ) );
- User::LeaveIfError( table.SetIndex( KAtrElmIdIndexName ) ); // use index
- while ( table.SeekL( seekKey ) ) // find object
- { // object found
- table.GetL( );
-
- // delete the row
- table.DeleteL( );
- }
- CleanupStack::PopAndDestroy( &table );
- }
-//
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::GetColDesValFromRowSetL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-HBufC8* CUpnpMetadataStorage::GetColDesValFromRowSetL( RDbRowSet aRowset,
- TDbColNo aColNo )
- {
- TDbColType colType = aRowset.ColType( aColNo );
- TBuf8<KMaxIntegerLen> val;
- switch ( colType )
- // so far only 2 types are possible
- {
- case EDbColBit:
- val.Num( aRowset.ColUint8( aColNo ) );
- break;
- case EDbColInt32:
- case EDbColInt16:
- case EDbColInt8:
- val.Num( aRowset.ColInt( aColNo ) );
- break;
- default:
- User::Leave( KErrGeneral );
- }
- return val.AllocL( );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteFileL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::DeleteFileL( const TDesC& aPath )
- {
- iFsSession.Delete( aPath );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::InsertIntoObjectTableL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::InsertIntoObjectTableL( TInt aContainerId,
- CUpnpObjectBean* aObjBn )
- {
- // open table
- RDbTable table;
- User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
- table.EUpdatable ) );
- CleanupClosePushL( table );
-
- // CdbColSet
- CDbColSet* objColSet = table.ColSetL( );
- CleanupStack::PushL( objColSet );
-
- // rowset cursor to the beginning position
- table.Reset( );
-
- // insert empty row
- table.InsertL( );
-
- // object id
- TInt objId = GetNextKeyL( KObjectTableName8 );
- table.SetColL( objColSet->ColNo( KObjIdColName ), objId );
-
- // parent id
- table.SetColL( objColSet->ColNo( KObjParentIdColName ), aContainerId );
-
- // restricted
- table.SetColL( objColSet->ColNo( KObjRestrictedColName ),
- aObjBn->ObjRestricted( ) );
-
- // set title
- table.SetColL( objColSet->ColNo( KObjTiltleColName ), aObjBn->ObjTitle( ) );
-
- // set class
- table.SetColL( objColSet->ColNo( KObjClassColName ), aObjBn->ObjClass( ) );
-
- table.SetColL( objColSet->ColNo( KObjRefIdColName ), aObjBn->ObjRefId( ) );
- // set path
- HBufC8* path = CreatePathValL( aContainerId );
- CleanupStack::PushL( path );
- table.SetColL( objColSet->ColNo( KObjPathColName ), *path );
-
- // complete insertion
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- // clean up
- CleanupStack::PopAndDestroy( path );
- CleanupStack::PopAndDestroy( objColSet );
- CleanupStack::PopAndDestroy( &table );
-
- return objId;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::InsertIntoElementTableL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::InsertIntoElementTableL( TInt aObjId,
- CUpnpElementBean* aElmBn, TInt aElmId )
- {
- // open table
- RDbTable table;
- User::LeaveIfError( table.Open( iDatabase, KElementTableName,
- table.EUpdatable ) );
- CleanupClosePushL( table );
-
- // CdbColSet
- CDbColSet* objColSet = table.ColSetL( );
- CleanupStack::PushL( objColSet );
-
- // rowset cursor to the beginning position
- table.Reset( );
-
- // insert empty row
- table.InsertL( );
-
- // elm_id
- table.SetColL( objColSet->ColNo( KElmIdColName ), aElmId );
-
- // elm_name
- table.SetColL( objColSet->ColNo( KElmNameColName ), aElmBn->ElmName( ) );
-
- // elm_value
- if ( aElmBn->ElmValue().Length( ) )
- {
- // use write stream
- RDbColWriteStream ws;
- ws.OpenLC( table, objColSet->ColNo( KElmValueColName ) );
- ws.WriteL( aElmBn->ElmValue( ) ); // write value
- ws.CommitL( );
- CleanupStack::PopAndDestroy( &ws );
- }
-
- // elm_has_attribute
- table.SetColL( objColSet->ColNo( KElmHasAttrColName ),
- aElmBn->ElmHasAttribute( ) );
-
- // elm_obj_id
- table.SetColL( objColSet->ColNo( KElmObjIdColName ), aObjId );
-
- // elm_is_required
- table.SetColL( objColSet->ColNo( KElmIsRequiredColName ),
- aElmBn->ElmIsRequired( ) );
-
- // complete insertion
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- // clean up
- CleanupStack::PopAndDestroy( objColSet );
- CleanupStack::PopAndDestroy( &table );
-
- return aElmId;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::InsertIntoAttributeTableL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::InsertIntoAttributeTableL( TInt aElmId,
- CUpnpAttributeBean* aAtrBn, TInt aObjId, TInt aAtrId )
- {
- // open table
- RDbTable table;
- User::LeaveIfError( table.Open( iDatabase, KAttributeTableName,
- table.EUpdatable ) );
- CleanupClosePushL( table );
-
- // CdbColSet
- CDbColSet* objColSet = table.ColSetL( );
- CleanupStack::PushL( objColSet );
-
- // rowset cursor to the beginning position
- table.Reset( );
-
- // insert empty row
- table.InsertL( );
-
- // atr_id
- table.SetColL( objColSet->ColNo( KAtrIdColName ), aAtrId ); // leaves if error
-
- // atr_name
- table.SetColL( objColSet->ColNo( KAtrNameColName ), aAtrBn->AtrName( ) ); // name cannot be null
-
- // atr_value
- if ( aAtrBn->AtrValue().Length( ) )
- {
- // use write stream
- RDbColWriteStream ws;
- ws.OpenLC( table, objColSet->ColNo( KAtrValueColName ) );
- ws.WriteL( aAtrBn->AtrValue( ) ); // write value
- ws.CommitL( );
- CleanupStack::PopAndDestroy( &ws );
- }
-
- // atr_elm_id
- table.SetColL( objColSet->ColNo( KAtrElmIdColName ), aElmId );
-
- // atr_is_required
- table.SetColL( objColSet->ColNo( KAtrIsRequiredColName ),
- aAtrBn->AtrIsRequired( ) );
-
- // atr_obj_id
- table.SetColL( objColSet->ColNo( KAtrIdObjColName ), aObjId );
-
- // complete insertion
- table.PutL( );
-
- DbChangedL( KExecuteWeight );
-
- // clean up
- CleanupStack::PopAndDestroy( objColSet );
- CleanupStack::PopAndDestroy( &table );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteObjectL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUpnpErrorCode CUpnpMetadataStorage::DeleteObjectL( TInt aObjId,
- RArray<TInt>& aRefList, TBool aDeleteResource, TBool aLocal,
- TBool aDeleteRef )
- {
- TUpnpErrorCode ret = ENoSuchObject;
-
- // start transaction
- BeginTransactionL( );
-
- RArray<TInt> resList;
- CleanupClosePushL( resList );
- TInt delNumber = NULL;
- TRAPD( err, delNumber = DoDeleteObjectL( aObjId, aRefList, resList,
- aDeleteResource, aLocal, aDeleteRef ) );
- if ( err )
- { // rollback - error
- RollbackTransactionL( );
- User::Leave( err );
- }
- // commit if success
- CommitTransactionL( );
-
- // everything went OK, delete files
- DeleteResourcesL( resList );
-
- // clean up
- CleanupStack::PopAndDestroy( &resList );
-
- if ( delNumber )
- {
- ret = EUpnpOk;
- }
-
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DoDeleteObjectL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUpnpErrorCode CUpnpMetadataStorage::DoDeleteObjectL( TInt aObjId,
- TBool aDeleteResource, TBool aDeleteRef )
- {
- TUpnpErrorCode ret = ENoSuchObject;
- RArray<TInt> ignore;
- CleanupClosePushL( ignore );
- if ( DoDeleteObjectL( aObjId, ignore, ignore, aDeleteResource, EFalse,
- aDeleteRef ) )
- {
- ret = EUpnpOk;
- }
- CleanupStack::PopAndDestroy( &ignore );
- return ret;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DoDeleteObjectL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::DoDeleteObjectL( TInt aObjId,
- RArray<TInt>& aRefList, RArray<TInt>& aResList, TBool aDeleteResource,
- TBool aLocal, TBool aDeleteRef )
- {
- TInt numberDeleted = NULL;
- RArray<TInt> objList;
- CleanupClosePushL( objList );
-
- // prepare list of object and resources in the object to be deleted
- if ( aDeleteResource )
- {
- AddSubObjectsL( aObjId, objList, aResList, aLocal );
- }
- else
- {
- objList.AppendL( aObjId );
- }
-
- // error if nothing can be deleted
- if ( !objList.Count( ) )
- {
- User::Leave( ERestrictedObject );
- }
-
- // delete each object
- for ( TInt i = 0; i < objList.Count( ); i++ )
- {
- DeleteObjectsL( objList[i] );
- DeleteElementsL( objList[i] );
- DeleteAttributesL( objList[i] );
- if ( aDeleteRef )
- {
- DeleteReferencesL( objList[i], aRefList );
- }
-
- numberDeleted++;
- }
- CleanupStack::PopAndDestroy( &objList );
-
- return numberDeleted;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::DeleteResourcesL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::DeleteResourcesL( RArray<TInt>& aObjList )
- {
- for ( TInt i = 0; i < aObjList.Count( ); i++ )
- {
- DeleteResourceByObjIdL( aObjList[i] );
- }
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::AddSubObjectsL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::AddSubObjectsL( TInt aObjId,
- RArray<TInt>& aObjList, RArray<TInt>& aResList, TBool aLocal )
- {
- // number of restricted objects in the subtree
- TInt mustRemain = 0;
-
- // direct children
- RArray<TInt> children;
- CleanupClosePushL( children );
- GetObjectListL( aObjId, children );
-
- // for each children
- for ( TInt i = 0; i < children.Count( ); i++ )
- {
- // next level
- mustRemain
- += AddSubObjectsL( children[i], aObjList, aResList, aLocal );
- }
-
- // clean up
- CleanupStack::PopAndDestroy( &children );
-
- if ( !aLocal ) // local api can delete even restricted objects
- {
- // restricted?
- if ( CheckObjectRestrictionL( aObjId ) == ERestrictedObject )
- {
- mustRemain++;
- }
-
- // restricted parent?
- if ( CheckParentRestrictionL( aObjId ) == ERestrictedObject )
- {
- mustRemain++;
- }
- }
-
- // can be deleted?
- if ( !mustRemain )
- { // delete the object
- // add currrent object
- aObjList.AppendL( aObjId );
- aResList.AppendL( aObjId );
- }
- return mustRemain;
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CheckParentRestrictionL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUpnpErrorCode CUpnpMetadataStorage::CheckParentRestrictionL( TInt aObjId )
- {
- TInt parentId = GetParentIdL( aObjId );
- return CheckObjectRestrictionL( parentId );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::AddResourceL
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::AddResourceL( CUpnpResourcesBean* aResBean,
- TInt aObjId )
- {
- HBufC* resValReplaced16 = UpnpCdUtils::EscapeAposL( aResBean->Path( ) );
-
- // prepare command
- HBufC* sqlCommand = HBufC::NewLC( KInsertInto().Length( )
- + KResourcesTableName().Length( )
- + KOpenParant().Length( )
- + KRscIdColName().Length( )
- + KRscPathColName().Length( )
- + KRscReadonlyColName().Length( )
- + KRscThumbnailColName().Length( )
- + KRscIdObjColName().Length( )
- + KCloseParant().Length( )
- + KValuesOpen().Length( )
- + KMaxIntegerLen
- + resValReplaced16->Des().Length( )
- + KMaxBoolLen
- + KMaxBoolLen
- + KMaxLongIntegerLen
- + KCloseParant().Length( )
- + 2 * KQuot().Length( )
- + 8 * KCommaStr().Length( ) ); // we need 4 commas and 2 quotation-marks
-
- TPtr sqlCmdPtr(sqlCommand->Des( ));
-
- TBuf<KMaxIntegerLen> num;
- TBuf<KMaxLongIntegerLen> numLong;
-
- sqlCmdPtr.Append( KInsertInto );
- sqlCmdPtr.Append( KResourcesTableName );
- sqlCmdPtr.Append( KOpenParant );
- sqlCmdPtr.Append( KRscIdColName );
- sqlCmdPtr.Append( KCommaStr );
- sqlCmdPtr.Append( KRscPathColName );
- sqlCmdPtr.Append( KCommaStr );
- sqlCmdPtr.Append( KRscReadonlyColName );
- sqlCmdPtr.Append( KCommaStr );
- sqlCmdPtr.Append( KRscThumbnailColName );
- sqlCmdPtr.Append( KCommaStr );
- sqlCmdPtr.Append( KRscIdObjColName );
- sqlCmdPtr.Append( KCloseParant );
- sqlCmdPtr.Append( KValuesOpen );
- numLong.Num( aResBean->Id( ) );
- sqlCmdPtr.Append( numLong );
- sqlCmdPtr.Append( KCommaStr );
- sqlCmdPtr.Append( KQuot );
- sqlCmdPtr.Append( *resValReplaced16 );
- sqlCmdPtr.Append( KQuot );
- sqlCmdPtr.Append( KCommaStr );
- num.Num( aResBean->IsReadonly( ) );
- sqlCmdPtr.Append( num );
- sqlCmdPtr.Append( KCommaStr );
- num.Num( aResBean->IsThumbnail( ) );
- sqlCmdPtr.Append( num );
- sqlCmdPtr.Append( KCommaStr );
- num.Num( aObjId );
- sqlCmdPtr.Append( num );
- sqlCmdPtr.Append( KCloseParant );
-
- delete resValReplaced16;
- // execute
- ExecuteL( sqlCmdPtr );
- // clean up
- CleanupStack::PopAndDestroy( sqlCommand );
-
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::RecoverDatabase
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::RecoverDatabase()
- {
- return iDatabase.Recover( );
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::RecreateDatabaseFileL
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::RecreateDatabaseFileL()
- {
- iDatabase.Close( );
- iIsOpen = EFalse;
-
- delete iFileStore;
- iFileStore = NULL;
-
- CUpnpCdDbFactory* cdf = CUpnpCdDbFactory::NewLC( );
-
- // database file name
- RFs fs;
- CleanupClosePushL( fs );
- User::LeaveIfError( fs.Connect( ) );
-
- TFileName path;
- User::LeaveIfError( fs.PrivatePath( path ) );
- TParse fp;
- fp.Set( KDatabaseFileName( ), &path, 0 );
- path = fp.FullName( );
-
- // recreate database file
- cdf->CreateDatabaseFileL( path );
-
- CleanupStack::PopAndDestroy( &fs );
- CleanupStack::PopAndDestroy( cdf );
-
- OpenDbL( path );
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CompareDbColSetsL
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::CompareDbColSetsL( CDbColSet *aColSet1,
- CDbColSet *aColSet2 )
- {
- if ( !aColSet1 || !aColSet1 )
- User::Leave( KErrCorrupt );
- if ( aColSet1->Count( ) != aColSet1->Count( ) )
- User::Leave( KErrCorrupt );
-
- for ( TInt i=1; i<=aColSet1->Count( ); i++ )
- {
- TBool foundColumn = EFalse;
- const TDbCol& col1 = (*aColSet1)[i];
-
- for ( TInt j=1; j<=aColSet2->Count( ); j++ )
- {
- const TDbCol& col2 = (*aColSet2)[j];
- TInt cmpResult = col1.iName.Compare( col2.iName );
-
- if ( cmpResult == 0 && !foundColumn )
- {
- foundColumn = ETrue;
- if ( col1.iType != col2.iType )
- User::Leave( KErrCorrupt );
- if ( !col1.IsLong( col1.iType ) && col1.iMaxLength
- != col2.iMaxLength )
- User::Leave( KErrCorrupt );
- if ( col1.iAttributes != col2.iAttributes )
- User::Leave( KErrCorrupt );
- }
- else if ( cmpResult == 0 && foundColumn )
- User::Leave( KErrCorrupt );
- }
- if ( !foundColumn )
- User::Leave( KErrCorrupt );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::CheckDatabaseL
-// -----------------------------------------------------------------------------
-//
-void CUpnpMetadataStorage::CheckDatabaseL()
- {
- CDbTableNames *tableNames = iDatabase.TableNamesL( );
- CleanupStack::PushL( tableNames );
-
- if ( !tableNames )
- User::Leave( KErrCorrupt );
- CUpnpCdDbFactory* cdf = CUpnpCdDbFactory::NewLC( );
-
- for ( TInt i=0; i<tableNames->Count( ); i++ )
- {
- CDbColSet *colSetRef = NULL;
-
- if ( (*tableNames)[i].Compare( KObjectTableName ) == 0 )
- {
- colSetRef = cdf->CreateObjectTableColumnSequenceLC( );
- }
- else if ( (*tableNames)[i].Compare( KElementTableName ) == 0 )
- {
- colSetRef = cdf->CreateElementTableColumnSequenceLC( );
- }
- else if ( (*tableNames)[i].Compare( KAttributeTableName ) == 0 )
- {
- colSetRef = cdf->CreateAttributeTableColumnSequenceLC( );
- }
- else if ( (*tableNames)[i].Compare( KResourcesTableName ) == 0 )
- {
- colSetRef = cdf->CreateResourceTableColumnSequenceLC( );
- }
- else if ( (*tableNames)[i].Compare( KSequencesTableName ) == 0 )
- {
- colSetRef = cdf->CreateSequenceTableColumnSequenceLC( );
- }
- else
- User::Leave( KErrCorrupt );
-
- CDbColSet *colSet = iDatabase.ColSetL( (*tableNames)[i] );
- CleanupStack::PushL( colSet );
-
- CompareDbColSetsL( colSet, colSetRef );
-
- CleanupStack::PopAndDestroy( colSet );
- CleanupStack::PopAndDestroy( colSetRef );
- }
-
- CleanupStack::PopAndDestroy( cdf );
- CleanupStack::PopAndDestroy( tableNames );
- }
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::HandleDbError
-// -----------------------------------------------------------------------------
-//
-TInt CUpnpMetadataStorage::HandleDbError( TInt aError )
- {
- TInt err = aError;
- if ( err == KErrCorrupt )
- {
- if ( iIsOpen )
- {
- err = RecoverDatabase( );
- }
- if ( err!=KErrNone && err!=KErrDiskFull && err!=KErrNoMemory )
- {
- TRAP( err, RecreateDatabaseFileL( ) );
- if ( err )
- {
- iIsOpen = EFalse;
- err = KErrCorrupt;
- }
- else
- {
- iIsOpen = ETrue;
- }
- }
- }
- return err;
- }
-
-// -----------------------------------------------------------------------------
-// CUpnpMetadataStorage::IsDbCreated
-// -----------------------------------------------------------------------------
-//
-TBool CUpnpMetadataStorage::IsDbCreated()
- {
- return iIsOpen;
- }
-
-// End of File
+/** @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: Metadata storage
+ *
+*/
+
+
+// INCLUDE FILES
+#include <upnpdominterface.h>
+#include "upnpmetadatastorage.h"
+#include "upnpcontentdirectoryglobals.h"
+#include "upnpobjectbean.h"
+#include "upnpelementbean.h"
+#include "upnpcdutils.h"
+#include "upnpresourcesbean.h"
+#include "upnpitem.h"
+#include "upnpelement.h"
+#include "upnpattributebean.h"
+#include "upnpcddbfactory.h"
+
+#define KLogFile _L("ContentDirectoryDb.log")
+#include "upnpcustomlog.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CUpnpMetadataStorage
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CUpnpMetadataStorage::CUpnpMetadataStorage()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::ConstructL( const TDesC& aDatabaseFileName )
+ {
+ User::LeaveIfError( iFsSession.Connect( ) );
+ OpenDbL( aDatabaseFileName );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpMetadataStorage* CUpnpMetadataStorage::NewLC(
+ const TDesC& aDatabaseFileName )
+ {
+ CUpnpMetadataStorage* self = new( ELeave ) CUpnpMetadataStorage();
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aDatabaseFileName );
+
+ return self;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpMetadataStorage* CUpnpMetadataStorage::NewL(
+ const TDesC& aDatabaseFileName )
+ {
+ CUpnpMetadataStorage* self =
+ CUpnpMetadataStorage::NewLC( aDatabaseFileName );
+
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::~CUpnpMetadataStorage
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CUpnpMetadataStorage::~CUpnpMetadataStorage()
+ {
+ if ( iIsOpen )
+ {
+ iDatabase.Compact( );
+ }
+ iDatabase.Close( );
+ delete iFileStore;
+ iFsSession.Close( );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::OpenDbL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::OpenDbL( const TFileName& aDatabaseFileName )
+ {
+ iFileStore = CPermanentFileStore::OpenL( iFsSession, aDatabaseFileName,
+ EFileRead|EFileWrite );
+ iFileStore->SetTypeL( iFileStore->Layout( ) );
+ iDatabase.OpenL( iFileStore, iFileStore->Root( ) );
+ CheckDatabaseL( );
+ iIsOpen = ETrue;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DbChangedL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::DbChangedL( TInt aWeight )
+ {
+ iCompactCounter += aWeight;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DbChangedL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::CompactDbL()
+ {
+ if ( iCompactCounter >= KCompactWeight )
+ {
+ iCompactCounter = 0;
+ User::LeaveIfError( iDatabase.Compact( ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::BeginTransactionL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::BeginTransactionL()
+ {
+ iDatabase.Begin( );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CommitTransactionL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::CommitTransactionL()
+ {
+ TInt err = iDatabase.Commit( );
+ if ( err != KErrNone )
+ {
+ iDatabase.Rollback( );
+ User::LeaveIfError( iDatabase.Recover( ) );
+ User::Leave( err );
+ }
+ CompactDbL( );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::RollbackTransactionL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::RollbackTransactionL()
+ {
+ iDatabase.Rollback( );
+ User::LeaveIfError( iDatabase.Recover( ) );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetObjectListL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUpnpErrorCode CUpnpMetadataStorage::GetObjectListL( TInt aParentId,
+ RArray<TInt>& aList )
+ {
+ TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists
+ if ( ret != ENoSuchObject && ret != ENoContainer )
+ {
+ // prepare query
+ TBuf<sizeof(KGetObjectListSqlCmd)/KCharSize + KMaxIntegerLen> query;
+ query.Format( KGetObjectListSqlCmd, aParentId );
+ // prepare view
+ RDbView view;
+ User::LeaveIfError( view.Prepare( iDatabase, TDbQuery( query ),
+ view.EReadOnly ) );
+ CleanupClosePushL( view );
+ // evaluate
+ User::LeaveIfError( view.EvaluateAll( ) );
+ // for each object
+ const TInt KIdColNo=1;
+
+ while ( view.NextL( ) )
+ {
+ view.GetL( );
+ // get object
+ TInt childId = view.ColInt( KIdColNo );
+ aList.AppendL( childId );
+ }
+ //clean up
+ CleanupStack::PopAndDestroy( &view );
+ ret = EUpnpOk;
+ }
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetObjectListL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUpnpErrorCode CUpnpMetadataStorage::GetItemListL( TInt aParentId,
+ RArray<TInt>& aList )
+ {
+ TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists
+ if ( ret != ENoSuchObject )
+ {
+ // prepare query
+ TBuf<sizeof(KGetItemListSqlCmd)/KCharSize + KMaxIntegerLen> query;
+ query.Format( KGetItemListSqlCmd, aParentId );
+ // prepare view
+ RDbView view;
+ User::LeaveIfError( view.Prepare( iDatabase, TDbQuery( query ),
+ view.EReadOnly ) );
+ CleanupClosePushL( view );
+ // evaluate
+ User::LeaveIfError( view.EvaluateAll( ) );
+ // for each object
+ const TInt KIdColNo=1;
+ while ( view.NextL( ) )
+ {
+ view.GetL( );
+ // get object
+ TInt childId = view.ColInt( KIdColNo );
+ aList.AppendL( childId );
+ }
+ //clean up
+ CleanupStack::PopAndDestroy( &view );
+ ret = EUpnpOk;
+ }
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetContainerListL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUpnpErrorCode CUpnpMetadataStorage::GetContainerListL( TInt aParentId,
+ RArray<TInt>& aList )
+ {
+ TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists
+ if ( ret != ENoSuchObject )
+ {
+ // prepare query
+ TBuf<sizeof(KGetContainerListSqlCmd)/KCharSize + KMaxIntegerLen> query;
+ query.Format( KGetContainerListSqlCmd, aParentId );
+ // prepare view
+ RDbView view;
+ User::LeaveIfError( view.Prepare( iDatabase, TDbQuery( query ),
+ view.EReadOnly ) );
+ CleanupClosePushL( view );
+ // evaluate
+ User::LeaveIfError( view.EvaluateAll( ) );
+ // for each object
+ const TInt KIdColNo=1;
+ while ( view.NextL( ) )
+ {
+ view.GetL( );
+ // get object
+ TInt childId = view.ColInt( KIdColNo );
+ aList.AppendL( childId );
+ }
+ //clean up
+ CleanupStack::PopAndDestroy( &view );
+ ret = EUpnpOk;
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CheckObjectRestrictionL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUpnpErrorCode CUpnpMetadataStorage::CheckObjectRestrictionL( TInt aObjId )
+ {
+ TUpnpErrorCode ret = EUpnpUndefined;
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aObjId);
+ User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
+ table.EReadOnly ) );
+ User::LeaveIfError( table.SetIndex( KObjIdIndexName ) ); // use index
+ if ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+
+ CDbColSet* colSet = table.ColSetL( );
+ TDbColNo colNo(colSet->ColNo( KObjRestrictedColName ) );
+ if ( !table.ColUint8( colNo ) ) // is restricted?
+ { // OK
+ TDbColNo colNo(colSet->ColNo( KObjClassColName ) );
+ if ( table.ColDes8(colNo).Find( KContainerClass8 ) == 0 ) // check whether the object is a container
+ { // this is a container
+ ret = EUpnpOk;
+ }
+ else
+ { // there is such object but this is not a container
+ ret = ENoContainer;
+ }
+ }
+ else
+ {
+ ret = ERestrictedObject;
+ }
+ delete colSet;
+ }
+ else
+ { // no such object
+ ret = ENoSuchObject;
+ }
+
+ CleanupStack::PopAndDestroy( &table );
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CheckObjectRestrictionL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CUpnpMetadataStorage::IsContainerL( TInt aObjId )
+ {
+ TBool ret = EFalse;
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aObjId);
+ User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
+ table.EReadOnly ) );
+ User::LeaveIfError( table.SetIndex( KObjIdIndexName ) ); // use index
+
+ if ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+
+ CDbColSet* colSet = table.ColSetL( );
+ TDbColNo colNo(colSet->ColNo( KObjClassColName ) );
+ if ( table.ColDes8(colNo).Find( KContainerClass8 ) == 0 ) // check whether the object is a container
+ { // this is a container
+ ret = ETrue;
+ }
+ delete colSet;
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &table );
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::AddMainTagAttrL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+TUpnpErrorCode CUpnpMetadataStorage::AddMainTagAttrL(
+ TXmlEngElement aElement, TInt aId, const TDesC8& aName )
+ {
+ TUpnpErrorCode ret = EUpnpUndefined;
+ // xml string of name
+
+ // is the attr exist?
+ TXmlEngAttr atr = aElement.AttributeNodeL( aName );
+ if ( atr.IsNull( ) )
+ { // attr does not exist - add
+ TBuf<sizeof(KSelectFromObjectSqlCmd)/KCharSize +
+ KMaxIntegerLen + KColNameMaxLenth> query;
+ query.Format( KSelectFromObjectSqlCmd, &aName, aId );
+
+ // Execute command
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( query ),
+ view.EReadOnly );
+ LOGSQL( "CUpnpContentDirectoryDb::AddMainTagAttrL",
+ "RDbView::Prepare", dbErr, &query );
+ if ( dbErr == KErrNone )
+ {
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.EvaluateAll( ) );
+
+ // if there is a row, add attribute
+ if ( view.FirstL( ) )
+ {
+ // get row
+ view.GetL( );
+ // col's val as Des
+ HBufC8* buff = GetColDesValFromRowSetL( view, 1 );
+ CleanupStack::PushL( buff );
+ // prepare xml string of value
+ // add attributes
+ aElement.AddNewAttributeL( aName, *buff );
+ ret = EUpnpOk;
+ // clean up
+ CleanupStack::PopAndDestroy( buff );
+ }
+ else
+ { // no such object in the database
+ ret = ENoSuchObject;
+ }
+ }
+ else
+ { // probably the name of the attr was wrong - ignore
+ ret = ENoSuchObject;
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ }
+ else // if(!atr.IsNull())
+ { // already exists - it is OK, do not need to do anything
+ ret = EUpnpOk;
+ }
+
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetElementViewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+RDbView CUpnpMetadataStorage::GetElementViewL( TInt aObjId,
+ const TDesC8& aElName )
+ {
+ // convert to TDesC
+ HBufC* elName = HBufC::NewLC( aElName.Length( ) );
+ elName->Des().Copy( aElName );
+
+ // Prepare SQL command
+ HBufC* query = HBufC::NewLC( KSelectElmFromElmSqlCmd().Length( )
+ + KNamedElFromElement().Length( )
+ + KMaxIntegerLen
+ + elName->Length( ) );
+ TPtr queryPtr(query->Des( ));
+ queryPtr.Format( KSelectElmFromElmSqlCmd, aObjId );
+ queryPtr.AppendFormat( KNamedElFromElement, elName );
+
+
+ // Execute command
+ RDbView view = GetEvaluatedViewL( queryPtr );
+ LOGSQL( "CUpnpContentDirectoryDb::GetElementViewL", "RDbView::Prepare",
+ 0, &queryPtr );
+ CleanupStack::PopAndDestroy( query );
+ CleanupStack::PopAndDestroy( elName );
+
+ return view;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::AddAttributeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+
+RDbView CUpnpMetadataStorage::GetObjViewL( TInt aObjId )
+ {
+ // Get data from object table
+ // Prepare SQL command
+ TBuf<sizeof(KSelectObjectFromObjSqlCmd)/KCharSize
+ + KMaxIntegerLen> query;
+ query.Format( KSelectObjectFromObjSqlCmd, aObjId );
+
+ LOGSQL( "CUpnpContentDirectoryDb::GetObjectL", "", 0, &query );
+
+ return GetEvaluatedViewL( query );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::AddAttributeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetElementsViewL( TInt aObjectID, TBool aAll )
+ {
+ // Get data from element table
+ // Prepare SQL command
+ TBuf<sizeof(KSelectElmFromElmSqlCmd)/KCharSize
+ + sizeof(KOnlyRequiredFromElement)/KCharSize + KMaxIntegerLen> query;
+ query.Format( KSelectElmFromElmSqlCmd, aObjectID );
+
+ query.Format( KSelectElmFromElmSqlCmd, aObjectID );
+ if ( !aAll )
+ { // only required properties
+ query.Append( KOnlyRequiredFromElement );
+ }
+
+ LOGSQL( "CUpnpContentDirectoryDb::GetElementsViewL", "", 0, &query );
+
+ return GetEvaluatedViewL( query );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::AddAttributeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetAttributesViewL( TInt aElementID, TBool aAll )
+ {
+ // Get data from element table
+ // Prepare SQL command
+ TBuf<sizeof(KSelectAtrFromAttrSqlCmd)/KCharSize
+ + sizeof(KOnlyRequiredFromAtr)/KCharSize + KMaxIntegerLen> query;
+ query.Format( KSelectAtrFromAttrSqlCmd, aElementID );
+ if ( !aAll )
+ { // only required attr are wanted
+ query.Append( KOnlyRequiredFromAtr );
+ }
+
+ LOGSQL( "CUpnpContentDirectoryDb::GetAttributesViewL", "", 0, &query );
+
+ return GetEvaluatedViewL( query );
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetAttributesViewByObjectIdL
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetAttributesViewByObjectIdL( TInt aObjectID,
+ TBool aAll )
+ {
+ // Get data from element table
+ // Prepare SQL command
+ TBuf<sizeof(KSelectAtrFromAttrByObjSqlCmd)/KCharSize
+ + sizeof(KOnlyRequiredFromAtr)/KCharSize + KMaxIntegerLen> query;
+ query.Format( KSelectAtrFromAttrByObjSqlCmd, aObjectID );
+ if ( !aAll )
+ { // only required attr are wanted
+ query.Append( KOnlyRequiredFromAtr );
+ }
+
+ LOGSQL( "CUpnpContentDirectoryDb::GetAttributesViewByObjectIdL", "", 0,
+ &query );
+
+ return GetEvaluatedViewL( query );
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::InsertElementL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::InsertElementL( const TXmlEngElement& aElement,
+ TInt aObjId )
+ {
+ // open table
+ RDbTable table;
+ User::LeaveIfError( table.Open( iDatabase, KElementTableName,
+ table.EUpdatable ) );
+ CleanupClosePushL( table );
+
+ // CdbColSet
+ CDbColSet* objColSet = table.ColSetL( );
+ CleanupStack::PushL( objColSet );
+
+ // rowset cursor to the beginning position
+ table.Reset( );
+
+ // insert empty row
+ table.InsertL( );
+
+ // elm_id
+ TInt elmId = GetNextKeyL( KElementTableName8 );
+ table.SetColL( objColSet->ColNo( KElmIdColName ), elmId );
+
+ // elm_name
+ HBufC8 * elmName = UpnpCdUtils::GetElmNameWithNsL( aElement );
+ CleanupStack::PushL( elmName );
+ table.SetColL( objColSet->ColNo( KElmNameColName ), *elmName );
+ CleanupStack::PopAndDestroy( elmName );
+
+ // elm_value
+ if ( aElement.Value().Length( ) )
+ {
+ TPtrC8 elmValue(aElement.Value( ) );
+ if ( elmValue.Length( ) > KMaxUpnpLongStringLen )
+ { // too long
+ User::Leave( EActionFailed );
+ }
+ // use write stream
+ RDbColWriteStream ws;
+ ws.OpenLC( table, objColSet->ColNo( KElmValueColName ) );
+ ws.WriteL( elmValue ); // write value
+ ws.CommitL( );
+ CleanupStack::PopAndDestroy( &ws );
+ }
+
+ // elm_has_attribute
+ table.SetColL( objColSet->ColNo( KElmHasAttrColName ),
+ aElement.HasAttributes( ) );
+
+ // elm_obj_id
+ table.SetColL( objColSet->ColNo( KElmObjIdColName ), aObjId );
+
+ // elm_is_required
+ table.SetColL( objColSet->ColNo( KElmIsRequiredColName ),
+ UpnpCdUtils::IsElementRequiredL( aElement ) );
+
+ // complete insertion
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ // clean up
+ CleanupStack::PopAndDestroy( objColSet );
+ CleanupStack::PopAndDestroy( &table );
+
+ return elmId;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CreatePathValL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC8* CUpnpMetadataStorage::CreatePathValL( const TXmlEngElement& aElement )
+ {
+ TPtrC8
+ parentIdPtr(UpnpDomInterface::GetAttrValueL( aElement, KParentID ));
+ TLex8 lexer(parentIdPtr);
+ TInt parentId;
+ User::LeaveIfError( lexer.Val( parentId ) );
+
+ return CreatePathValL( parentId );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CreatePathValL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC8* CUpnpMetadataStorage::CreatePathValL( TInt aParentId )
+ {
+ HBufC8* path = NULL;
+ User::LeaveIfNull( path = GetObjectPathL( aParentId ) );
+
+ CleanupStack::PushL( path );
+
+ HBufC8* tmp = HBufC8::NewL( path->Length( )
+ + KPathSeparator().Length( )
+ + KMaxIntegerLen );
+ TPtr8 tmpPtr(tmp->Des( ));
+ tmpPtr.Copy( *path );
+ tmpPtr.Append( KPathSeparator );
+
+ TBuf<KMaxIntegerLen> num;
+ num.Num( aParentId );
+ tmpPtr.Append( num );
+
+ CleanupStack::PopAndDestroy( path );
+
+ return tmp;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::InsertAttributeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::InsertAttributeL( const TXmlEngAttr aAttr,
+ TInt aElmId, TBool aIsRequired, TInt aObjId )
+ {
+
+ // open table
+ RDbTable table;
+ User::LeaveIfError( table.Open( iDatabase, KAttributeTableName,
+ table.EUpdatable ) );
+ CleanupClosePushL( table );
+
+ // CdbColSet
+ CDbColSet* objColSet = table.ColSetL( );
+ CleanupStack::PushL( objColSet );
+
+ // rowset cursor to the beginning position
+ table.Reset( );
+
+ // insert empty row
+ table.InsertL( );
+
+ // atr_id
+ table.SetColL( objColSet->ColNo( KAtrIdColName ),
+ GetNextKeyL( KAttributeTableName8 ) ); // leaves if error
+
+ // atr_name
+ table.SetColL( objColSet->ColNo( KAtrNameColName ), aAttr.Name( ) ); // name cannot be null
+
+ // atr_value
+ if ( aAttr.Value().Length( ) )
+ {
+ TPtrC8 atrValue(aAttr.Value( ) );
+ if ( atrValue.Length( ) > KMaxUpnpLongStringLen )
+ { // too long
+ User::Leave( EActionFailed );
+ }
+ // use write stream
+ RDbColWriteStream ws;
+ ws.OpenLC( table, objColSet->ColNo( KAtrValueColName ) );
+ ws.WriteL( atrValue ); // write value
+ ws.CommitL( );
+ CleanupStack::PopAndDestroy( &ws );
+ }
+
+ // atr_elm_id
+ table.SetColL( objColSet->ColNo( KAtrElmIdColName ), aElmId );
+
+ // atr_is_required
+ table.SetColL( objColSet->ColNo( KAtrIsRequiredColName ), aIsRequired );
+
+ // atr_obj_id
+ table.SetColL( objColSet->ColNo( KAtrIdObjColName ), aObjId );
+
+ // complete insertion
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ // clean up
+ CleanupStack::PopAndDestroy( objColSet );
+ CleanupStack::PopAndDestroy( &table );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::InsertObjectIntoObjectTableL
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::InsertObjectIntoObjectTableL(
+ const TXmlEngElement& aElement )
+ {
+ // open table
+ RDbTable table;
+ User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
+ table.EUpdatable ) );
+ CleanupClosePushL( table );
+
+ // CdbColSet
+ CDbColSet* objColSet = table.ColSetL( );
+ CleanupStack::PushL( objColSet );
+
+ // rowset cursor to the beginning position
+ table.Reset( );
+
+ // insert empty row
+ table.InsertL( );
+
+ // set attributes
+ RXmlEngNodeList<TXmlEngAttr> attrList;
+ CleanupClosePushL( attrList );
+ aElement.GetAttributes( attrList );
+ while ( attrList.HasNext( ) )
+ {
+ // get next
+ TXmlEngAttr attr = attrList.Next( );
+
+ // col ordinal
+ HBufC* colName = HBufC::NewLC( attr.Name().Length( ) );
+ colName->Des().Copy( attr.Name( ) );
+ TDbColNo colNo = objColSet->ColNo( *colName );
+ CleanupStack::PopAndDestroy( colName );
+
+ // insert if exists
+ if ( colNo != KDbNullColNo )
+ { // (not any string attribute in the main element)
+ HBufC8* tmp = attr.Value().AllocLC( );
+ UpnpCdUtils::ReplaceTrueFalse( tmp );// true -> 1, false -> 0
+ TLex8 lexer(*tmp);
+ TInt num;
+ User::LeaveIfError( lexer.Val( num ) ); // string -> integer
+ // set value
+ table.SetColL( colNo, num );
+ CleanupStack::PopAndDestroy( tmp );
+ }
+ }
+ CleanupStack::Check( &attrList );
+
+ // set title
+ TXmlEngElement objTitle;
+ UpnpDomInterface::GetElementL( aElement, objTitle, KObjTiltleColName8( ) );
+ table.SetColL( objColSet->ColNo( KObjTiltleColName ), objTitle.Value( ) );
+ CleanupStack::Check( &attrList );
+
+ // set class
+ TXmlEngElement objClass;
+ UpnpDomInterface::GetElementL( aElement, objClass, KObjClassColName8( ) );
+ table.SetColL( objColSet->ColNo( KObjClassColName ), objClass.Value( ) );
+ CleanupStack::Check( &attrList );
+
+ // set path
+ HBufC8* path = CreatePathValL( aElement );
+ CleanupStack::PushL( path );
+ table.SetColL( objColSet->ColNo( KObjPathColName ), *path );
+ CleanupStack::PopAndDestroy( path );
+ CleanupStack::Check( &attrList );
+
+ // complete insertion
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ // clean up
+ CleanupStack::PopAndDestroy( &attrList );
+ CleanupStack::PopAndDestroy( objColSet );
+ CleanupStack::PopAndDestroy( &table );
+
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetNextKeyForTableL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::GetNextKeyL( const TDesC8& aName )
+ {
+ TInt ret = KErrNotFound;
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aName);
+ User::LeaveIfError( table.Open( iDatabase, KSequencesTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KSeqColNameIndexName ) ); // use index
+ if ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+ CDbColSet* colSet = table.ColSetL( );
+ CleanupStack::PushL( colSet );
+ TDbColNo colNo(colSet->ColNo( KSeqNextKeyColName ) );
+ ret = table.ColInt( colNo );
+ table.UpdateL( );
+ table.SetColL( colNo, ret + 1 );
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ CleanupStack::PopAndDestroy( colSet );
+ }
+ else
+ { // no such object
+ User::Leave( KErrCorrupt );
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &table );
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetNextKeyForTableL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::GetNextKeyL( const TDesC8& aName, TInt aAmount )
+ {
+ TInt ret = KErrNotFound;
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aName);
+ User::LeaveIfError( table.Open( iDatabase, KSequencesTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KSeqColNameIndexName ) ); // use index
+ if ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+ CDbColSet* colSet = table.ColSetL( );
+ CleanupStack::PushL( colSet );
+ TDbColNo colNo(colSet->ColNo( KSeqNextKeyColName ) );
+ ret = table.ColInt( colNo );
+ table.UpdateL( );
+ table.SetColL( colNo, ret + aAmount );
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ CleanupStack::PopAndDestroy( colSet );
+ }
+ else
+ { // no such object
+ User::Leave( KErrCorrupt );
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &table );
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::NextKeyL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::NextKeyL( const TDesC8& aName )
+ {
+ TInt ret = KErrNotFound;
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aName);
+ User::LeaveIfError( table.Open( iDatabase, KSequencesTableName,
+ table.EReadOnly ) );
+ User::LeaveIfError( table.SetIndex( KSeqColNameIndexName ) ); // use index
+ if ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+ CDbColSet* colSet = table.ColSetL( );
+ CleanupStack::PushL( colSet );
+ TDbColNo colNo(colSet->ColNo( KSeqNextKeyColName ) );
+ ret = table.ColInt( colNo );
+
+ CleanupStack::PopAndDestroy( colSet );
+ }
+ else
+ { // no such object
+ User::Leave( KErrCorrupt );
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &table );
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::ReferedObjectIdL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::ReferedObjectIdL( TInt aObjectId )
+ {
+ TInt ret = KErrNotFound;
+ TBuf<sizeof(KSelectFromObjectSqlCmd)/KCharSize
+ + KMaxIntegerLen + KColNameMaxLenth> query;
+ query.Format( KSelectFromObjectSqlCmd, &KObjRefIdColName, aObjectId );
+
+ // Execute command
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( query ), view.EReadOnly );
+ LOGSQL( "CUpnpContentDirectoryDb::ReferedObjectIdL", "RDbView::Prepare",
+ dbErr, &query );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.Evaluate( ) );
+ if ( view.FirstL( ) )
+ {
+ // get col number - there can by only one column but just in case get by name
+ CDbColSet* colSet = view.ColSetL( );
+ const TInt colNo = colSet->ColNo( KObjRefIdColName );
+ delete colSet;
+
+ view.GetL( );
+ if ( !view.IsColNull( colNo ) )
+ {
+ ret = view.ColInt( colNo );
+ }
+ }
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetElmIdForAttrL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::GetElmIdForAttrL( const TDesC8& aAttrName,
+ const TDesC8& aAttrVal )
+ {
+ // convert to unicode
+ HBufC* attrName = UpnpCdUtils::Des8ToDesLC( aAttrName );
+ HBufC* attrVal = UpnpCdUtils::Des8ToDesLC( aAttrVal );
+
+ TInt elmId = KErrNotFound;
+ HBufC* query = HBufC::NewLC( aAttrVal.Length( )
+ + KSelectFromSqlCmd().Length( )
+ + KAtrElmIdColName().Length( )
+ + KAttributeTableName().Length( )
+ + KAtrValueColName().Length( )
+ + KAndConditionSqlCmd().Length( )
+ + KAtrNameColName().Length( )
+ + aAttrName.Length( ) );
+ TPtr queryPtr(query->Des( ));
+ // prepare format string
+ HBufC* fmt = HBufC::NewLC( KSelectFromSqlCmd().Length( ) + KAndConditionSqlCmd().Length( ) );
+ TPtr fmtPtr(fmt->Des( ));
+ fmtPtr.Copy( KSelectFromSqlCmd );
+ fmtPtr.Append( KAndConditionSqlCmd );
+ // format query
+ queryPtr.Format( fmtPtr, &KAtrElmIdColName, &KAttributeTableName,
+ &KAtrNameColName, attrName, &KAtrValueColName, attrVal );
+ // clean up format string
+ CleanupStack::PopAndDestroy( fmt );
+
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
+ view.EReadOnly );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.Evaluate( ) );
+ if ( view.FirstL( ) )
+ {
+ // get col number - there can by only one column but just in case get by name
+ CDbColSet* colSet = view.ColSetL( );
+ const TInt colNo = colSet->ColNo( KAtrElmIdColName );
+ delete colSet;
+
+ view.GetL( );
+ if ( !view.IsColNull( colNo ) )
+ {
+ elmId = view.ColInt( colNo );
+ }
+ }
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ CleanupStack::PopAndDestroy( query );
+ CleanupStack::PopAndDestroy( attrVal );
+ CleanupStack::PopAndDestroy( attrName );
+ return elmId;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetObjIdForElmIdL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::GetObjIdForElmIdL( TInt aId )
+ {
+ TInt objId = KErrNotFound;
+ HBufC* query = HBufC::NewLC( KMaxIntegerLen + KSelectFromNumSqlCmd().Length( )
+ + KElementTableName().Length( )
+ + KElmObjIdColName().Length( )
+ + KElmIdColName().Length( ) );
+ TPtr queryPtr(query->Des( ));
+ queryPtr.Format( KSelectFromNumSqlCmd, &KElmObjIdColName,
+ &KElementTableName, &KElmIdColName, aId );
+
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
+ view.EReadOnly );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.Evaluate( ) );
+ if ( view.FirstL( ) )
+ {
+ // get col number - there can by only one column but just in case get by name
+ CDbColSet* colSet = view.ColSetL( );
+ const TInt colNo = colSet->ColNo( KElmObjIdColName );
+ delete colSet;
+
+ view.GetL( );
+ if ( !view.IsColNull( colNo ) )
+ {
+ objId = view.ColInt( colNo );
+ }
+ }
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ CleanupStack::PopAndDestroy( query );
+ return objId;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetObjIdByAttrLikeL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::GetElmIdForAttrLikeL( const TDesC8& aAttrName,
+ const TDesC8& aAttrVal )
+ {
+ //convert to unicode
+ HBufC* attrVal = UpnpCdUtils::Des8ToDesLC( aAttrVal );
+ HBufC* attrName = UpnpCdUtils::Des8ToDesLC( aAttrName );
+
+ // query buf
+ TInt elmId = KErrNotFound;
+ HBufC* query = HBufC::NewLC( attrVal->Length( )
+ + KSelectFromSqlCmd().Length( )
+ + KAtrElmIdColName().Length( )
+ + KAttributeTableName().Length( )
+ + KAtrValueColName().Length( )
+ + KAndLikeConditionSqlCmd().Length( )
+ + KAtrNameColName().Length( )
+ + attrName->Length( ) );
+ TPtr queryPtr(query->Des( ));
+ // prepare format string
+ HBufC* fmt = HBufC::NewLC( KSelectFromSqlCmd().Length( ) + KAndLikeConditionSqlCmd().Length( ) );
+ TPtr fmtPtr(fmt->Des( ));
+ fmtPtr.Copy( KSelectFromSqlCmd );
+ fmtPtr.Append( KAndLikeConditionSqlCmd );
+ // format query
+ queryPtr.Format( fmtPtr, &KAtrElmIdColName, &KAttributeTableName,
+ &KAtrNameColName, attrName, &KAtrValueColName, attrVal );
+ // clean up format string
+ CleanupStack::PopAndDestroy( fmt );
+
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
+ view.EReadOnly );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.Evaluate( ) );
+ if ( view.FirstL( ) )
+ {
+ // get col number - there can by only one column but just in case get by name
+ CDbColSet* colSet = view.ColSetL( );
+ const TInt colNo = colSet->ColNo( KAtrElmIdColName );
+ delete colSet;
+
+ view.GetL( );
+ if ( !view.IsColNull( colNo ) )
+ {
+ elmId = view.ColInt( colNo );
+ }
+ }
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ CleanupStack::PopAndDestroy( query );
+ CleanupStack::PopAndDestroy( attrName );
+ CleanupStack::PopAndDestroy( attrVal );
+ return elmId;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetParentIdL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::GetParentIdL( TInt aObjId )
+ {
+ TInt objId=KErrGeneral;
+ HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
+ + KObjParentIdColName().Length( )
+ + KObjectTableName().Length( )
+ + KObjIdColName().Length( )
+ + KMaxIntegerLen );
+ TPtr queryPtr(query->Des( ));
+ queryPtr.Format( KSelectFromNumSqlCmd, &KObjParentIdColName,
+ &KObjectTableName, &KObjIdColName, aObjId );
+
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
+ view.EReadOnly );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.Evaluate( ) );
+ if ( view.FirstL( ) )
+ {
+ CDbColSet* colSet = view.ColSetL( );
+ const TInt colNo = colSet->ColNo( KObjParentIdColName );
+ delete colSet;
+
+ view.GetL( );
+ if ( !view.IsColNull( colNo ) )
+ {
+ objId = view.ColInt( colNo );
+ }
+ }
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ CleanupStack::PopAndDestroy( query );
+ return objId;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetChildCountL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::GetChildCountL( TInt aObjId )
+ {
+ TInt childCount = KErrGeneral;
+
+ HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
+ + KObjIdColName().Length( )
+ + KObjectTableName().Length( )
+ + KObjParentIdColName().Length( )
+ + KMaxIntegerLen );
+ TPtr queryPtr(query->Des( ));
+ queryPtr.Format( KSelectFromNumSqlCmd, &KObjIdColName, &KObjectTableName,
+ &KObjParentIdColName, aObjId );
+
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
+ view.EReadOnly );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.EvaluateAll( ) );
+ childCount = view.CountL( );
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ CleanupStack::PopAndDestroy( query );
+ return childCount;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteResElL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::DeleteResElL( const TDesC& aResVal, TInt ObjId )
+ {
+ HBufC* query = HBufC::NewLC( KDeleteResElSqlCmd().Length( ) + aResVal.Length( ) + KMaxIntegerLen );
+ TPtr SqlCmd(query->Des( ));
+ SqlCmd.Format( KDeleteResElSqlCmd, &aResVal, ObjId );
+
+ // execute
+ ExecuteL( SqlCmd );
+
+ // clean up
+ CleanupStack::PopAndDestroy( query );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteResElL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::ExecuteL( const TDesC& aSqlCmd )
+ {
+ // execute
+ TInt err = iDatabase.Execute( aSqlCmd );
+ LOGSQL( "CUpnpContentDirectoryDb::DeleteResElL", "iDataBase.Execute",
+ err, &aSqlCmd );
+ User::LeaveIfError( err );
+
+ // db compact
+ DbChangedL( KExecuteWeight );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteResElL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetViewOfObjectListForResL( const TDesC& aResVal )
+ {
+ HBufC* query = HBufC::NewLC( KSelectFromSqlCmd().Length( )
+ + KElmObjIdColName().Length( )
+ + KElementTableName().Length( )
+ + KElmValueColName().Length( )
+ + aResVal.Length( )
+ + KNamedElFromElement().Length()
+ + KRes16().Length());
+ TPtr queryPtr(query->Des( ));
+ queryPtr.Format( KSelectFromSqlCmd, &KElmObjIdColName,
+ &KElementTableName, &KElmValueColName, &aResVal );
+ queryPtr.AppendFormat( KNamedElFromElement, &KRes16 );
+
+ RDbView view = GetEvaluatedViewL( queryPtr );
+
+ CleanupStack::PopAndDestroy( query );
+
+ return view;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetViewOfElmIdByNameAndValLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetViewOfElmIdByNameAndValL(
+ const TDesC& aElmName, const TDesC& aElmValue )
+ {
+ HBufC* resValReplaced16 = UpnpCdUtils::EscapeAposL( aElmValue );
+ HBufC* query = HBufC::NewLC( KSelectFromSqlCmd().Length( )
+ + KElmIdColName().Length( )
+ + KElementTableName().Length( )
+ + KElmNameColName().Length( )
+ + aElmName.Length( )
+ + KAndConditionSqlCmd().Length( )
+ + KElmValueColName().Length( )
+ + resValReplaced16->Des().Length( ) );
+ TPtr queryPtr(query->Des( ));
+
+ // format query
+ queryPtr.Format( KSelectFromSqlCmd, &KElmIdColName, &KElementTableName,
+ &KElmNameColName, &aElmName );
+ queryPtr.AppendFormat( KAndConditionSqlCmd, &KElmValueColName,
+ resValReplaced16 );
+
+ RDbView view = GetEvaluatedViewL( queryPtr );
+
+ CleanupStack::PopAndDestroy( query );
+
+ delete resValReplaced16;
+ return view;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetAttrViewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetAttrViewL( const TDesC8& aAttrName,
+ const TDesC8& aAttrVal )
+ {
+ HBufC* attrNameBuf = UpnpCdUtils::Des8ToDesLC( aAttrName );
+ HBufC* attrValueBuf = UpnpCdUtils::Des8ToDesLC( aAttrVal );
+
+ HBufC* query = HBufC::NewLC( KSelectAttributeByValueSqlCmd().Length( ) + aAttrName.Length( ) + aAttrVal.Length( )
+
+ );
+ TPtr queryPtr(query->Des( ));
+
+ // format query
+ queryPtr.Format( KSelectAttributeByValueSqlCmd( ), attrValueBuf,
+ attrNameBuf );
+
+ RDbView view = GetEvaluatedViewL( queryPtr );
+
+ CleanupStack::PopAndDestroy( query );
+ CleanupStack::PopAndDestroy( attrValueBuf );
+ CleanupStack::PopAndDestroy( attrNameBuf );
+
+ return view;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetAttrViewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetAttrViewL( TInt aElmId,
+ const TDesC8& aAttrName )
+ {
+ // convert ot unicode
+ HBufC* attrNameBuf = UpnpCdUtils::Des8ToDesLC( aAttrName );
+
+ HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
+ + KAtrValueColName().Length( )
+ + KAttributeTableName().Length( )
+ + KAtrElmIdColName().Length( )
+ + KMaxIntegerLen
+ + KAndConditionSqlCmd().Length( )
+ + KAtrNameColName().Length( )
+ + aAttrName.Length( ) );
+ TPtr queryPtr(query->Des( ));
+ // prepare format string
+ HBufC* fmt = HBufC::NewLC( KSelectFromNumSqlCmd().Length( ) + KAndConditionSqlCmd().Length( ) );
+ TPtr fmtPtr(fmt->Des( ));
+ fmtPtr.Copy( KSelectFromNumSqlCmd );
+ fmtPtr.Append( KAndConditionSqlCmd );
+ // format query
+ queryPtr.Format( fmtPtr, &KAsterisk, &KAttributeTableName,
+ &KAtrElmIdColName, aElmId, &KAtrNameColName, attrNameBuf );
+
+ CleanupStack::PopAndDestroy( fmt );
+
+ RDbView view = GetEvaluatedViewL( queryPtr );
+
+ CleanupStack::PopAndDestroy( query );
+ CleanupStack::PopAndDestroy( attrNameBuf );
+
+ return view;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetAttrViewByObjectIdL
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetAttrViewByObjectIdL( TInt aObjectId,
+ const TDesC8& aAttrName )
+ {
+ // convert ot unicode
+ HBufC* attrNameBuf = UpnpCdUtils::Des8ToDesLC( aAttrName );
+
+ HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
+ + KAtrValueColName().Length( )
+ + KAttributeTableName().Length( )
+ + KAtrIdObjColName().Length( )
+ + KMaxIntegerLen
+ + KAndConditionSqlCmd().Length( )
+ + KAtrNameColName().Length( )
+ + aAttrName.Length( ) );
+ TPtr queryPtr(query->Des( ));
+ // prepare format string
+ HBufC* fmt = HBufC::NewLC( KSelectFromNumSqlCmd().Length( ) + KAndConditionSqlCmd().Length( ) );
+ TPtr fmtPtr(fmt->Des( ));
+ fmtPtr.Copy( KSelectFromNumSqlCmd );
+ fmtPtr.Append( KAndConditionSqlCmd );
+ // format query
+ queryPtr.Format( fmtPtr, &KAsterisk, &KAttributeTableName,
+ &KAtrIdObjColName, aObjectId, &KAtrNameColName, attrNameBuf );
+
+ CleanupStack::PopAndDestroy( fmt );
+
+ RDbView view = GetEvaluatedViewL( queryPtr );
+
+ CleanupStack::PopAndDestroy( query );
+ CleanupStack::PopAndDestroy( attrNameBuf );
+
+ return view;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryDb::PrepareViewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::PrepareViewL( const TDesC& aSqlQuery )
+ {
+ RDbView view;
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( aSqlQuery ),
+ view.EReadOnly );
+ LOGSQL( "CUpnpMetadataStorage::GetViewL", "RDbView::Prepare", dbErr,
+ &aSqlQuery );
+ User::LeaveIfError( dbErr );
+
+ return view;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryDb::GetEvaluatedViewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RDbView CUpnpMetadataStorage::GetEvaluatedViewL( const TDesC& aSqlQuery )
+ {
+ RDbView view = PrepareViewL( aSqlQuery );
+
+ // evaluate
+ TInt dbErr = view.EvaluateAll( );
+ LOGCD( "CUpnpMetadataStorage::GetViewLC", "RDbView::EvaluateAll", dbErr,
+ "" );
+ User::LeaveIfError( dbErr );
+
+ return view;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetObjectPathL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC8* CUpnpMetadataStorage::GetObjectPathL( TInt aObjId )
+ {
+ HBufC8* ret = NULL;
+ HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
+ + KObjPathColName().Length( )
+ + KObjectTableName().Length( )
+ + KObjIdColName().Length( )
+ + KMaxIntegerLen );
+ TPtr queryPtr(query->Des( ));
+ // format query
+ queryPtr.Format( KSelectFromNumSqlCmd, &KObjPathColName,
+ &KObjectTableName, &KObjIdColName, aObjId );
+
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
+ view.EReadOnly );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.EvaluateAll( ) );
+
+ CDbColSet* colSet = view.ColSetL( );
+ const TInt colNo = colSet->ColNo( KObjPathColName );
+ delete colSet;
+
+ if ( view.FirstL( ) )
+ {
+ view.GetL( );
+ if ( !view.IsColNull( colNo ) )
+ {
+ ret = view.ColDes8( colNo ).AllocL( );
+ }
+ }
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ CleanupStack::PopAndDestroy( query );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetObjectTitleL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC8* CUpnpMetadataStorage::GetObjectTitleL( TInt aObjId )
+ {
+ HBufC8* ret = NULL;
+ HBufC* query = HBufC::NewLC( KSelectFromNumSqlCmd().Length( )
+ + KObjTiltleColName().Length( )
+ + KObjectTableName().Length( )
+ + KObjIdColName().Length( )
+ + KMaxIntegerLen );
+ TPtr queryPtr(query->Des( ));
+ // format query
+ queryPtr.Format( KSelectFromNumSqlCmd, &KObjTiltleColName,
+ &KObjectTableName, &KObjIdColName, aObjId );
+
+ RDbView view;
+ CleanupClosePushL( view );
+ TInt dbErr = view.Prepare( iDatabase, TDbQuery( queryPtr ),
+ view.EReadOnly );
+ if ( dbErr == KErrNone )
+ {
+ User::LeaveIfError( view.EvaluateAll( ) );
+
+ CDbColSet* colSet = view.ColSetL( );
+ const TInt colNo = colSet->ColNo( KObjTiltleColName );
+ delete colSet;
+
+ if ( view.FirstL( ) )
+ {
+ view.GetL( );
+ if ( !view.IsColNull( colNo ) )
+ {
+ ret = view.ColDes8( colNo ).AllocL( );
+ }
+ }
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &view );
+ CleanupStack::PopAndDestroy( query );
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetResourceL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CUpnpResourcesBean* CUpnpMetadataStorage::GetResourceL( TInt64 aResId )
+ {
+ CUpnpResourcesBean* resBn = NULL;
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aResId);
+ User::LeaveIfError( table.Open( iDatabase, KResourcesTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KRscIdIndexName ) ); // use index
+ if ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+ // table bean
+ resBn = CUpnpResourcesBean::NewL( table );
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &table );
+ return resBn;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteResourceL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::DeleteResourceByObjIdL( TInt aObjId,
+ TBool aDeleteFile )
+ {
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aObjId);
+ User::LeaveIfError( table.Open( iDatabase, KResourcesTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KRscIdObjIndexName ) ); // use index
+ while ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+
+ // table bean
+ CUpnpResourcesBean* resBn = CUpnpResourcesBean::NewLC( table );
+
+ if ( aDeleteFile && !resBn->IsReadonly( ) && resBn->IsThumbnail( ) )
+ { // delete the file
+ DeleteFileL( resBn->Path( ) );
+ }
+
+ // clean up
+ CleanupStack::PopAndDestroy( resBn );
+
+ // delete the row
+ table.DeleteL( );
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &table );
+
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteResourceByResIdL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::DeleteResourceByResIdL( TInt64 aResId,
+ TBool aDeleteFile )
+ {
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aResId);
+ User::LeaveIfError( table.Open( iDatabase, KResourcesTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KRscIdIndexName ) ); // use index
+ while ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+
+ // table bean
+ CUpnpResourcesBean* resBn = CUpnpResourcesBean::NewLC( table );
+
+ if ( aDeleteFile && !resBn->IsReadonly( ) && resBn->IsThumbnail( ) )
+ { // delete the file
+ DeleteFileL( resBn->Path( ) );
+ }
+
+ // clean up
+ CleanupStack::PopAndDestroy( resBn );
+
+ // delete the row
+ table.DeleteL( );
+ }
+ // clean up
+ CleanupStack::PopAndDestroy( &table );
+
+ }
+//
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteObjectsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CUpnpMetadataStorage::DeleteObjectsL( TInt aObjId )
+ {
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aObjId);
+ User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KObjIdIndexName ) ); // use index
+ if ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+
+ // delete the row
+ table.DeleteL( );
+ }
+ CleanupStack::PopAndDestroy( &table );
+ }
+//
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteReferencesL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CUpnpMetadataStorage::DeleteReferencesL( TInt aObjId,
+ RArray<TInt>& aRefList )
+ {
+ RDbTable table;
+ TInt ret( KErrNotFound );
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aObjId);
+ User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KRefIdIndexName ) ); // use index
+ while ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+ CDbColSet* colSet = table.ColSetL( );
+ CleanupStack::PushL( colSet );
+ TDbColNo colNo(colSet->ColNo( KObjParentIdColName ) );
+ ret = table.ColInt( colNo );
+ aRefList.Append( ret );
+ CleanupStack::PopAndDestroy( colSet );
+ // delete the row
+ table.DeleteL( );
+ }
+ CleanupStack::PopAndDestroy( &table );
+ }
+//
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteElementsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CUpnpMetadataStorage::DeleteElementsL( TInt aObjId )
+ {
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aObjId);
+ User::LeaveIfError( table.Open( iDatabase, KElementTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KElmObjIdIndexName ) ); // use index
+ while ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+
+ // delete the row
+ table.DeleteL( );
+ }
+ CleanupStack::PopAndDestroy( &table );
+ }
+//
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteAttributesL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CUpnpMetadataStorage::DeleteAttributesL( TInt aObjId )
+ {
+ RDbTable table;
+ CleanupClosePushL( table );
+ TDbSeekKey seekKey(aObjId);
+ User::LeaveIfError( table.Open( iDatabase, KAttributeTableName,
+ table.EUpdatable ) );
+ User::LeaveIfError( table.SetIndex( KAtrElmIdIndexName ) ); // use index
+ while ( table.SeekL( seekKey ) ) // find object
+ { // object found
+ table.GetL( );
+
+ // delete the row
+ table.DeleteL( );
+ }
+ CleanupStack::PopAndDestroy( &table );
+ }
+//
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::GetColDesValFromRowSetL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+HBufC8* CUpnpMetadataStorage::GetColDesValFromRowSetL( RDbRowSet aRowset,
+ TDbColNo aColNo )
+ {
+ TDbColType colType = aRowset.ColType( aColNo );
+ TBuf8<KMaxIntegerLen> val;
+ switch ( colType )
+ // so far only 2 types are possible
+ {
+ case EDbColBit:
+ val.Num( aRowset.ColUint8( aColNo ) );
+ break;
+ case EDbColInt32:
+ case EDbColInt16:
+ case EDbColInt8:
+ val.Num( aRowset.ColInt( aColNo ) );
+ break;
+ default:
+ User::Leave( KErrGeneral );
+ }
+ return val.AllocL( );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteFileL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::DeleteFileL( const TDesC& aPath )
+ {
+ iFsSession.Delete( aPath );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::InsertIntoObjectTableL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::InsertIntoObjectTableL( TInt aContainerId,
+ CUpnpObjectBean* aObjBn )
+ {
+ // open table
+ RDbTable table;
+ User::LeaveIfError( table.Open( iDatabase, KObjectTableName,
+ table.EUpdatable ) );
+ CleanupClosePushL( table );
+
+ // CdbColSet
+ CDbColSet* objColSet = table.ColSetL( );
+ CleanupStack::PushL( objColSet );
+
+ // rowset cursor to the beginning position
+ table.Reset( );
+
+ // insert empty row
+ table.InsertL( );
+
+ // object id
+ TInt objId = GetNextKeyL( KObjectTableName8 );
+ table.SetColL( objColSet->ColNo( KObjIdColName ), objId );
+
+ // parent id
+ table.SetColL( objColSet->ColNo( KObjParentIdColName ), aContainerId );
+
+ // restricted
+ table.SetColL( objColSet->ColNo( KObjRestrictedColName ),
+ aObjBn->ObjRestricted( ) );
+
+ // set title
+ table.SetColL( objColSet->ColNo( KObjTiltleColName ), aObjBn->ObjTitle( ) );
+
+ // set class
+ table.SetColL( objColSet->ColNo( KObjClassColName ), aObjBn->ObjClass( ) );
+
+ table.SetColL( objColSet->ColNo( KObjRefIdColName ), aObjBn->ObjRefId( ) );
+ // set path
+ HBufC8* path = CreatePathValL( aContainerId );
+ CleanupStack::PushL( path );
+ table.SetColL( objColSet->ColNo( KObjPathColName ), *path );
+
+ // complete insertion
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ // clean up
+ CleanupStack::PopAndDestroy( path );
+ CleanupStack::PopAndDestroy( objColSet );
+ CleanupStack::PopAndDestroy( &table );
+
+ return objId;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::InsertIntoElementTableL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::InsertIntoElementTableL( TInt aObjId,
+ CUpnpElementBean* aElmBn, TInt aElmId )
+ {
+ // open table
+ RDbTable table;
+ User::LeaveIfError( table.Open( iDatabase, KElementTableName,
+ table.EUpdatable ) );
+ CleanupClosePushL( table );
+
+ // CdbColSet
+ CDbColSet* objColSet = table.ColSetL( );
+ CleanupStack::PushL( objColSet );
+
+ // rowset cursor to the beginning position
+ table.Reset( );
+
+ // insert empty row
+ table.InsertL( );
+
+ // elm_id
+ table.SetColL( objColSet->ColNo( KElmIdColName ), aElmId );
+
+ // elm_name
+ table.SetColL( objColSet->ColNo( KElmNameColName ), aElmBn->ElmName( ) );
+
+ // elm_value
+ if ( aElmBn->ElmValue().Length( ) )
+ {
+ // use write stream
+ RDbColWriteStream ws;
+ ws.OpenLC( table, objColSet->ColNo( KElmValueColName ) );
+ ws.WriteL( aElmBn->ElmValue( ) ); // write value
+ ws.CommitL( );
+ CleanupStack::PopAndDestroy( &ws );
+ }
+
+ // elm_has_attribute
+ table.SetColL( objColSet->ColNo( KElmHasAttrColName ),
+ aElmBn->ElmHasAttribute( ) );
+
+ // elm_obj_id
+ table.SetColL( objColSet->ColNo( KElmObjIdColName ), aObjId );
+
+ // elm_is_required
+ table.SetColL( objColSet->ColNo( KElmIsRequiredColName ),
+ aElmBn->ElmIsRequired( ) );
+
+ // complete insertion
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ // clean up
+ CleanupStack::PopAndDestroy( objColSet );
+ CleanupStack::PopAndDestroy( &table );
+
+ return aElmId;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::InsertIntoAttributeTableL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::InsertIntoAttributeTableL( TInt aElmId,
+ CUpnpAttributeBean* aAtrBn, TInt aObjId, TInt aAtrId )
+ {
+ // open table
+ RDbTable table;
+ User::LeaveIfError( table.Open( iDatabase, KAttributeTableName,
+ table.EUpdatable ) );
+ CleanupClosePushL( table );
+
+ // CdbColSet
+ CDbColSet* objColSet = table.ColSetL( );
+ CleanupStack::PushL( objColSet );
+
+ // rowset cursor to the beginning position
+ table.Reset( );
+
+ // insert empty row
+ table.InsertL( );
+
+ // atr_id
+ table.SetColL( objColSet->ColNo( KAtrIdColName ), aAtrId ); // leaves if error
+
+ // atr_name
+ table.SetColL( objColSet->ColNo( KAtrNameColName ), aAtrBn->AtrName( ) ); // name cannot be null
+
+ // atr_value
+ if ( aAtrBn->AtrValue().Length( ) )
+ {
+ // use write stream
+ RDbColWriteStream ws;
+ ws.OpenLC( table, objColSet->ColNo( KAtrValueColName ) );
+ ws.WriteL( aAtrBn->AtrValue( ) ); // write value
+ ws.CommitL( );
+ CleanupStack::PopAndDestroy( &ws );
+ }
+
+ // atr_elm_id
+ table.SetColL( objColSet->ColNo( KAtrElmIdColName ), aElmId );
+
+ // atr_is_required
+ table.SetColL( objColSet->ColNo( KAtrIsRequiredColName ),
+ aAtrBn->AtrIsRequired( ) );
+
+ // atr_obj_id
+ table.SetColL( objColSet->ColNo( KAtrIdObjColName ), aObjId );
+
+ // complete insertion
+ table.PutL( );
+
+ DbChangedL( KExecuteWeight );
+
+ // clean up
+ CleanupStack::PopAndDestroy( objColSet );
+ CleanupStack::PopAndDestroy( &table );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteObjectL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUpnpErrorCode CUpnpMetadataStorage::DeleteObjectL( TInt aObjId,
+ RArray<TInt>& aRefList, TBool aDeleteResource, TBool aLocal,
+ TBool aDeleteRef )
+ {
+ TUpnpErrorCode ret = ENoSuchObject;
+
+ // start transaction
+ BeginTransactionL( );
+
+ RArray<TInt> resList;
+ CleanupClosePushL( resList );
+ TInt delNumber = NULL;
+ TRAPD( err, delNumber = DoDeleteObjectL( aObjId, aRefList, resList,
+ aDeleteResource, aLocal, aDeleteRef ) );
+ if ( err )
+ { // rollback - error
+ RollbackTransactionL( );
+ User::Leave( err );
+ }
+ // commit if success
+ CommitTransactionL( );
+
+ // everything went OK, delete files
+ DeleteResourcesL( resList );
+
+ // clean up
+ CleanupStack::PopAndDestroy( &resList );
+
+ if ( delNumber )
+ {
+ ret = EUpnpOk;
+ }
+
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DoDeleteObjectL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUpnpErrorCode CUpnpMetadataStorage::DoDeleteObjectL( TInt aObjId,
+ TBool aDeleteResource, TBool aDeleteRef )
+ {
+ TUpnpErrorCode ret = ENoSuchObject;
+ RArray<TInt> ignore;
+ CleanupClosePushL( ignore );
+ if ( DoDeleteObjectL( aObjId, ignore, ignore, aDeleteResource, EFalse,
+ aDeleteRef ) )
+ {
+ ret = EUpnpOk;
+ }
+ CleanupStack::PopAndDestroy( &ignore );
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DoDeleteObjectL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::DoDeleteObjectL( TInt aObjId,
+ RArray<TInt>& aRefList, RArray<TInt>& aResList, TBool aDeleteResource,
+ TBool aLocal, TBool aDeleteRef )
+ {
+ TInt numberDeleted = NULL;
+ RArray<TInt> objList;
+ CleanupClosePushL( objList );
+
+ // prepare list of object and resources in the object to be deleted
+ if ( aDeleteResource )
+ {
+ AddSubObjectsL( aObjId, objList, aResList, aLocal );
+ }
+ else
+ {
+ objList.AppendL( aObjId );
+ }
+
+ // error if nothing can be deleted
+ if ( !objList.Count( ) )
+ {
+ User::Leave( ERestrictedObject );
+ }
+
+ // delete each object
+ for ( TInt i = 0; i < objList.Count( ); i++ )
+ {
+ DeleteObjectsL( objList[i] );
+ DeleteElementsL( objList[i] );
+ DeleteAttributesL( objList[i] );
+ if ( aDeleteRef )
+ {
+ DeleteReferencesL( objList[i], aRefList );
+ }
+
+ numberDeleted++;
+ }
+ CleanupStack::PopAndDestroy( &objList );
+
+ return numberDeleted;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::DeleteResourcesL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::DeleteResourcesL( RArray<TInt>& aObjList )
+ {
+ for ( TInt i = 0; i < aObjList.Count( ); i++ )
+ {
+ DeleteResourceByObjIdL( aObjList[i] );
+ }
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::AddSubObjectsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::AddSubObjectsL( TInt aObjId,
+ RArray<TInt>& aObjList, RArray<TInt>& aResList, TBool aLocal )
+ {
+ // number of restricted objects in the subtree
+ TInt mustRemain = 0;
+
+ // direct children
+ RArray<TInt> children;
+ CleanupClosePushL( children );
+ GetObjectListL( aObjId, children );
+
+ // for each children
+ for ( TInt i = 0; i < children.Count( ); i++ )
+ {
+ // next level
+ mustRemain
+ += AddSubObjectsL( children[i], aObjList, aResList, aLocal );
+ }
+
+ // clean up
+ CleanupStack::PopAndDestroy( &children );
+
+ if ( !aLocal ) // local api can delete even restricted objects
+ {
+ // restricted?
+ if ( CheckObjectRestrictionL( aObjId ) == ERestrictedObject )
+ {
+ mustRemain++;
+ }
+
+ // restricted parent?
+ if ( CheckParentRestrictionL( aObjId ) == ERestrictedObject )
+ {
+ mustRemain++;
+ }
+ }
+
+ // can be deleted?
+ if ( !mustRemain )
+ { // delete the object
+ // add currrent object
+ aObjList.AppendL( aObjId );
+ aResList.AppendL( aObjId );
+ }
+ return mustRemain;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CheckParentRestrictionL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUpnpErrorCode CUpnpMetadataStorage::CheckParentRestrictionL( TInt aObjId )
+ {
+ TInt parentId = GetParentIdL( aObjId );
+ return CheckObjectRestrictionL( parentId );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::AddResourceL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::AddResourceL( CUpnpResourcesBean* aResBean,
+ TInt aObjId )
+ {
+ HBufC* resValReplaced16 = UpnpCdUtils::EscapeAposL( aResBean->Path( ) );
+
+ // prepare command
+ HBufC* sqlCommand = HBufC::NewLC( KInsertInto().Length( )
+ + KResourcesTableName().Length( )
+ + KOpenParant().Length( )
+ + KRscIdColName().Length( )
+ + KRscPathColName().Length( )
+ + KRscReadonlyColName().Length( )
+ + KRscThumbnailColName().Length( )
+ + KRscIdObjColName().Length( )
+ + KCloseParant().Length( )
+ + KValuesOpen().Length( )
+ + KMaxIntegerLen
+ + resValReplaced16->Des().Length( )
+ + KMaxBoolLen
+ + KMaxBoolLen
+ + KMaxLongIntegerLen
+ + KCloseParant().Length( )
+ + 2 * KQuot().Length( )
+ + 8 * KCommaStr().Length( ) ); // we need 4 commas and 2 quotation-marks
+
+ TPtr sqlCmdPtr(sqlCommand->Des( ));
+
+ TBuf<KMaxIntegerLen> num;
+ TBuf<KMaxLongIntegerLen> numLong;
+
+ sqlCmdPtr.Append( KInsertInto );
+ sqlCmdPtr.Append( KResourcesTableName );
+ sqlCmdPtr.Append( KOpenParant );
+ sqlCmdPtr.Append( KRscIdColName );
+ sqlCmdPtr.Append( KCommaStr );
+ sqlCmdPtr.Append( KRscPathColName );
+ sqlCmdPtr.Append( KCommaStr );
+ sqlCmdPtr.Append( KRscReadonlyColName );
+ sqlCmdPtr.Append( KCommaStr );
+ sqlCmdPtr.Append( KRscThumbnailColName );
+ sqlCmdPtr.Append( KCommaStr );
+ sqlCmdPtr.Append( KRscIdObjColName );
+ sqlCmdPtr.Append( KCloseParant );
+ sqlCmdPtr.Append( KValuesOpen );
+ numLong.Num( aResBean->Id( ) );
+ sqlCmdPtr.Append( numLong );
+ sqlCmdPtr.Append( KCommaStr );
+ sqlCmdPtr.Append( KQuot );
+ sqlCmdPtr.Append( *resValReplaced16 );
+ sqlCmdPtr.Append( KQuot );
+ sqlCmdPtr.Append( KCommaStr );
+ num.Num( aResBean->IsReadonly( ) );
+ sqlCmdPtr.Append( num );
+ sqlCmdPtr.Append( KCommaStr );
+ num.Num( aResBean->IsThumbnail( ) );
+ sqlCmdPtr.Append( num );
+ sqlCmdPtr.Append( KCommaStr );
+ num.Num( aObjId );
+ sqlCmdPtr.Append( num );
+ sqlCmdPtr.Append( KCloseParant );
+
+ delete resValReplaced16;
+ // execute
+ ExecuteL( sqlCmdPtr );
+ // clean up
+ CleanupStack::PopAndDestroy( sqlCommand );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::RecoverDatabase
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::RecoverDatabase()
+ {
+ return iDatabase.Recover( );
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::RecreateDatabaseFileL
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::RecreateDatabaseFileL()
+ {
+ iDatabase.Close( );
+ iIsOpen = EFalse;
+
+ delete iFileStore;
+ iFileStore = NULL;
+
+ CUpnpCdDbFactory* cdf = CUpnpCdDbFactory::NewLC( );
+
+ // database file name
+ RFs fs;
+ CleanupClosePushL( fs );
+ User::LeaveIfError( fs.Connect( ) );
+
+ TFileName path;
+ User::LeaveIfError( fs.PrivatePath( path ) );
+ TParse fp;
+ fp.Set( KDatabaseFileName( ), &path, 0 );
+ path = fp.FullName( );
+
+ // recreate database file
+ cdf->CreateDatabaseFileL( path );
+
+ CleanupStack::PopAndDestroy( &fs );
+ CleanupStack::PopAndDestroy( cdf );
+
+ OpenDbL( path );
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CompareDbColSetsL
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::CompareDbColSetsL( CDbColSet *aColSet1,
+ CDbColSet *aColSet2 )
+ {
+ if ( !aColSet1 || !aColSet1 )
+ User::Leave( KErrCorrupt );
+ if ( aColSet1->Count( ) != aColSet1->Count( ) )
+ User::Leave( KErrCorrupt );
+
+ for ( TInt i=1; i<=aColSet1->Count( ); i++ )
+ {
+ TBool foundColumn = EFalse;
+ const TDbCol& col1 = (*aColSet1)[i];
+
+ for ( TInt j=1; j<=aColSet2->Count( ); j++ )
+ {
+ const TDbCol& col2 = (*aColSet2)[j];
+ TInt cmpResult = col1.iName.Compare( col2.iName );
+
+ if ( cmpResult == 0 && !foundColumn )
+ {
+ foundColumn = ETrue;
+ if ( col1.iType != col2.iType )
+ User::Leave( KErrCorrupt );
+ if ( !col1.IsLong( col1.iType ) && col1.iMaxLength
+ != col2.iMaxLength )
+ User::Leave( KErrCorrupt );
+ if ( col1.iAttributes != col2.iAttributes )
+ User::Leave( KErrCorrupt );
+ }
+ else if ( cmpResult == 0 && foundColumn )
+ User::Leave( KErrCorrupt );
+ }
+ if ( !foundColumn )
+ User::Leave( KErrCorrupt );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::CheckDatabaseL
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadataStorage::CheckDatabaseL()
+ {
+ CDbTableNames *tableNames = iDatabase.TableNamesL( );
+ CleanupStack::PushL( tableNames );
+
+ if ( !tableNames )
+ User::Leave( KErrCorrupt );
+ CUpnpCdDbFactory* cdf = CUpnpCdDbFactory::NewLC( );
+
+ for ( TInt i=0; i<tableNames->Count( ); i++ )
+ {
+ CDbColSet *colSetRef = NULL;
+
+ if ( (*tableNames)[i].Compare( KObjectTableName ) == 0 )
+ {
+ colSetRef = cdf->CreateObjectTableColumnSequenceLC( );
+ }
+ else if ( (*tableNames)[i].Compare( KElementTableName ) == 0 )
+ {
+ colSetRef = cdf->CreateElementTableColumnSequenceLC( );
+ }
+ else if ( (*tableNames)[i].Compare( KAttributeTableName ) == 0 )
+ {
+ colSetRef = cdf->CreateAttributeTableColumnSequenceLC( );
+ }
+ else if ( (*tableNames)[i].Compare( KResourcesTableName ) == 0 )
+ {
+ colSetRef = cdf->CreateResourceTableColumnSequenceLC( );
+ }
+ else if ( (*tableNames)[i].Compare( KSequencesTableName ) == 0 )
+ {
+ colSetRef = cdf->CreateSequenceTableColumnSequenceLC( );
+ }
+ else
+ User::Leave( KErrCorrupt );
+
+ CDbColSet *colSet = iDatabase.ColSetL( (*tableNames)[i] );
+ CleanupStack::PushL( colSet );
+
+ CompareDbColSetsL( colSet, colSetRef );
+
+ CleanupStack::PopAndDestroy( colSet );
+ CleanupStack::PopAndDestroy( colSetRef );
+ }
+
+ CleanupStack::PopAndDestroy( cdf );
+ CleanupStack::PopAndDestroy( tableNames );
+ }
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::HandleDbError
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadataStorage::HandleDbError( TInt aError )
+ {
+ TInt err = aError;
+ if ( err == KErrCorrupt )
+ {
+ if ( iIsOpen )
+ {
+ err = RecoverDatabase( );
+ }
+ if ( err!=KErrNone && err!=KErrDiskFull && err!=KErrNoMemory )
+ {
+ TRAP( err, RecreateDatabaseFileL( ) );
+ if ( err )
+ {
+ iIsOpen = EFalse;
+ err = KErrCorrupt;
+ }
+ else
+ {
+ iIsOpen = ETrue;
+ }
+ }
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataStorage::IsDbCreated
+// -----------------------------------------------------------------------------
+//
+TBool CUpnpMetadataStorage::IsDbCreated()
+ {
+ return iIsOpen;
+ }
+
+// End of File