diff -r 3785f754ee62 -r 5360b7ddc251 upnpmediaserver/contentdirectoryservice/src/upnpmetadatastorage.cpp --- 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 -#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& aList ) - { - TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists - if ( ret != ENoSuchObject && ret != ENoContainer ) - { - // prepare query - TBuf 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& aList ) - { - TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists - if ( ret != ENoSuchObject ) - { - // prepare query - TBuf 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& aList ) - { - TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists - if ( ret != ENoSuchObject ) - { - // prepare query - TBuf 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 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 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 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 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 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 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 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 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& 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 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& aRefList, TBool aDeleteResource, TBool aLocal, - TBool aDeleteRef ) - { - TUpnpErrorCode ret = ENoSuchObject; - - // start transaction - BeginTransactionL( ); - - RArray 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 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& aRefList, RArray& aResList, TBool aDeleteResource, - TBool aLocal, TBool aDeleteRef ) - { - TInt numberDeleted = NULL; - RArray 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& 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& aObjList, RArray& aResList, TBool aLocal ) - { - // number of restricted objects in the subtree - TInt mustRemain = 0; - - // direct children - RArray 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 num; - TBuf 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; iCount( ); 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 +#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& aList ) + { + TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists + if ( ret != ENoSuchObject && ret != ENoContainer ) + { + // prepare query + TBuf 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& aList ) + { + TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists + if ( ret != ENoSuchObject ) + { + // prepare query + TBuf 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& aList ) + { + TUpnpErrorCode ret = CheckObjectRestrictionL( aParentId ); // make sure the parent exists + if ( ret != ENoSuchObject ) + { + // prepare query + TBuf 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 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 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 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 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 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 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 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 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& 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 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& aRefList, TBool aDeleteResource, TBool aLocal, + TBool aDeleteRef ) + { + TUpnpErrorCode ret = ENoSuchObject; + + // start transaction + BeginTransactionL( ); + + RArray 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 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& aRefList, RArray& aResList, TBool aDeleteResource, + TBool aLocal, TBool aDeleteRef ) + { + TInt numberDeleted = NULL; + RArray 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& 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& aObjList, RArray& aResList, TBool aLocal ) + { + // number of restricted objects in the subtree + TInt mustRemain = 0; + + // direct children + RArray 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 num; + TBuf 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; iCount( ); 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