diff -r 3785f754ee62 -r 5360b7ddc251 upnpmediaserver/contentdirectoryservice/src/upnplocalstorage.cpp --- a/upnpmediaserver/contentdirectoryservice/src/upnplocalstorage.cpp Fri Sep 17 08:31:21 2010 +0300 +++ b/upnpmediaserver/contentdirectoryservice/src/upnplocalstorage.cpp Mon Nov 01 12:37:49 2010 +0200 @@ -1,1060 +1,1060 @@ -/** @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: Local interface - * -*/ - - -// INCLUDE FILES -#include "upnpcontainer.h" -#include "upnpitem.h" -#include "upnpelement.h" -#include "upnpattribute.h" -#include "upnpitemlist.h" -#include "upnpcontainerlist.h" -#include "upnpbrowsecriteria.h" -#include "upnplocalstorage.h" -#include "upnpobjectbean.h" -#include "upnpelementbean.h" -#include "upnpattributebean.h" -#include "upnpelementbean.h" -#include "upnpmetadatastorage.h" -#include "upnpcontentdirectoryglobals.h" -#include "upnpresourcesbean.h" -#include "upnpcdutils.h" -#include "upnpstatehandler.h" -#include "upnpstring.h" -#include "upnpcontentdirectory.h" -#include "upnpautodestroyobjectlist.h" -#include "upnpautodestroyobject.h" -#include - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::CUpnpLocalStorage -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CUpnpLocalStorage::CUpnpLocalStorage( CUpnpMetadataStorage* aMetadataStorage ) - { - iMetadataStorage = aMetadataStorage; - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::ConstructL() - { - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CUpnpLocalStorage* CUpnpLocalStorage::NewLC( - CUpnpMetadataStorage* aMetadataStorage ) - { - CUpnpLocalStorage* self = new ( ELeave ) CUpnpLocalStorage( aMetadataStorage ); - - CleanupStack::PushL( self ); - self->ConstructL(); - - return self; - } - -CUpnpLocalStorage* CUpnpLocalStorage::NewL( - CUpnpMetadataStorage* aMetadataStorage ) - { - CUpnpLocalStorage* self = CUpnpLocalStorage::NewLC( aMetadataStorage ); - - CleanupStack::Pop(); - - return self; - } - -void CUpnpLocalStorage::SetStateHandler( CUpnpStateHandler* aStateHandler ) - { - iStateHandler = aStateHandler; - } - -// Destructor -CUpnpLocalStorage::~CUpnpLocalStorage() - { - - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ShareObjectL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::ShareObjectL( CUpnpObject* aObj ) - { - TLex8 lexer( aObj->ParentId() ); - TPtrC8 parentId = aObj->ParentId(); - TInt containerId; - User::LeaveIfError( lexer.Val( containerId ) ); - // check parent - ValidateContainerL( containerId ); - - // start transaction - iMetadataStorage->BeginTransactionL(); - - TRAPD(err, DoShareObjectL( containerId, aObj ) ); - if ( err ) - { // rollback if error - iMetadataStorage->RollbackTransactionL(); - User::Leave( err ); - } - iMetadataStorage->CommitTransactionL(); - - // eventing - if (iStateHandler) - { - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( parentId ); - } - - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ShareReferenceL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::ShareReferenceL( CUpnpItem* aItem ) - { - // check whether container exists and is not restricted - TLex8 lexer( aItem->ParentId() ); - TPtrC8 parentId = aItem->ParentId(); - TInt containerId; - User::LeaveIfError( lexer.Val( containerId ) ); - - ValidateContainerL( containerId ); - - // if everything is OK -> start transaction - iMetadataStorage->BeginTransactionL(); - - TRAPD(err, DoShareReferenceL( containerId, aItem ) ); - if ( err ) - { // rollback if error - iMetadataStorage->RollbackTransactionL(); - User::Leave( err ); - } - iMetadataStorage->CommitTransactionL(); - - // eventing - if (iStateHandler) - { - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( parentId ); - } - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ShareReferenceListL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::ShareReferenceListL( CUpnpItemList* aItemList, - TInt* aExecutionStatus ) - { - //----- firstly - validate all containers upon which references are to be created. - for ( TInt i = 0; i < aItemList->ObjectCount(); i++ ) - { - TLex8 lex((*aItemList)[i]->ParentId()); - TInt containerId; - User::LeaveIfError( lex.Val(containerId) ); - - ValidateContainerL(containerId); - } - - //----- if containers are OK, do the following ... - - // varaible used to do the rest of eventing - TInt itemCommited=0; - - // start transaction - iMetadataStorage->BeginTransactionL(); - - // reset status - *aExecutionStatus = 0; - - // for each item in the list ... - for ( TInt i = 0; i < aItemList->ObjectCount(); i++ ) - { - // get parentId field value [upon which 'reference item' will be created] - TLex8 lexer((*aItemList)[i]->ParentId()); - TInt parentId = -1; - User::LeaveIfError( lexer.Val(parentId) ); - - // commit every KCommitEveryNum inserts - if ( !(i%KCommitEveryNum) ) - { - // ignore if i == 0; - if ( i ) - { - itemCommited=0; - // commit last transaction - iMetadataStorage->CommitTransactionL(); - - // success - update status - *aExecutionStatus = i; - if ( iStateHandler ) - { - for ( TInt j = 0; j < KCommitEveryNum; j++ ) - { - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( ( (*aItemList)[j]->ParentId() ) ); - } - } - // begin new transaction - iMetadataStorage->BeginTransactionL(); - } - } - - // insert object - CUpnpObject* object = ( *aItemList )[i]; - CUpnpItem* item = dynamic_cast( object ); - - TRAPD( err, DoShareReferenceL( parentId, item ) ); - if ( err ) - { // rollback if error - iMetadataStorage->RollbackTransactionL(); - User::Leave(err); - } - itemCommited++; - } - - // commit - iMetadataStorage->CommitTransactionL(); - - // success - update status - *aExecutionStatus = aItemList->ObjectCount(); - - //eventing - if ( iStateHandler ) - { - // do the rest of eventing if number of items were greater than KCommitEveryNum - for ( TInt j = 0; j < itemCommited; j++ ) - { - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( ( ( *aItemList )[j]->ParentId() ) ); - } - } - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::UnshareItemL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::UnshareItemL( TInt aId ) - { - // check id - ValidateItemL( aId ); - HBufC8* containerId = HBufC8::NewLC( KMaxIntegerLen ); - TInt containerIdInt = iMetadataStorage->GetParentIdL( aId ); - if ( containerIdInt == KErrGeneral ) - { - User::Leave( KErrNotFound ); - } - - containerId->Des().Num( containerIdInt ); - - if (aId <= KDownloadContId) - { - User::Leave( KErrArgument ); - } - RArray refList; - CleanupClosePushL(refList); - if ( iMetadataStorage->DeleteObjectL( aId, refList, ETrue, ETrue ) == ENoSuchObject ) - { - User::Leave( KErrNotFound ); - } - - // eventing - if ( iStateHandler ) - { - TBuf8 parentRefID; - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( *containerId ); - for (TInt i(0);iIncreaseSystemUpdateIdL(); - parentRefID.Num( refList[i] ); - iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); - } - } - - // clean up - CleanupStack::PopAndDestroy( &refList ); - CleanupStack::PopAndDestroy( containerId ); - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::UnshareContainerL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::UnshareContainerL( TInt aId ) - { - // check id - ValidateContainerL( aId ); - HBufC8* containerId = HBufC8::NewLC( KMaxIntegerLen ); - containerId->Des().Num(iMetadataStorage->GetParentIdL( aId ) ); - - if ( aId <= KDownloadContId ) - { - User::Leave( KErrArgument ); - } - RArray refList; - CleanupClosePushL(refList); - if ( iMetadataStorage->DeleteObjectL( aId,refList, ETrue, ETrue ) == ENoSuchObject ) - { - User::Leave( KErrNotFound ); - } - - // eventing - if ( iStateHandler ) - { - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( *containerId ); - TBuf8 parentRefID; - for (TInt i(0);iCompare( parentRefID ) ) - { - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); - } - } - refList.Reset(); - } - CleanupStack::PopAndDestroy( &refList ); - CleanupStack::PopAndDestroy( containerId ); - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::GetSharedItemL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CUpnpItem* CUpnpLocalStorage::GetSharedItemL( TInt aItemId ) - { - // new item - CUpnpItem* item = CUpnpItem::NewL(); - CleanupStack::PushL( item ); - - // get object - GetObjectL( aItemId, item ); - - // clean up - CleanupStack::Pop( item ); - - return item; - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ShareItemListL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::ShareItemListL(CUpnpItemList* aItemList, - TInt* aExecutionStatus ) - { - TInt itemCommited=0; - // check parent - TLex8 lexer((*aItemList)[0]->ParentId()); - TInt parentId; - User::LeaveIfError( lexer.Val(parentId) ); - ValidateContainerL(parentId); - - // start transaction - iMetadataStorage->BeginTransactionL(); - // reset status - *aExecutionStatus = 0; - - // for each item - for ( TInt i = 0; i < aItemList->ObjectCount(); i++ ) - { - // commit every KCommitEveryNum inserts - if ( !(i%KCommitEveryNum) ) - { - // ignore if i == 0; - if ( i ) - { - itemCommited=0; - // commit last transaction - iMetadataStorage->CommitTransactionL(); - - // success - update status - *aExecutionStatus = i; - if ( iStateHandler ) - { - for ( TInt j =0; jIncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( ( (*aItemList)[0]->ParentId() ) ); - } - } - // begin new transaction - iMetadataStorage->BeginTransactionL(); - } - } - - // insert object - TRAPD( err, DoShareObjectL( parentId, ( *aItemList )[i]) ); - if ( err ) - { // rollback if error - iMetadataStorage->RollbackTransactionL(); - User::Leave(err); - } - itemCommited++; - } - - // commit - iMetadataStorage->CommitTransactionL(); - // success - update status - *aExecutionStatus = aItemList->ObjectCount(); - - //eventing - if ( iStateHandler ) - { - for ( TInt j =0; jIncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( ( ( *aItemList )[0]->ParentId() ) ); - } - } - - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ValidateContainerL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::ValidateContainerL( TInt aContainerId ) - { - if ( !iMetadataStorage->IsContainerL( aContainerId ) ) - { - User::Leave( KErrNotFound ); - } - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ValidateItemL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::ValidateItemL( TInt aItemId ) - { - if ( iMetadataStorage->IsContainerL( aItemId ) ) - { - User::Leave( KErrNotFound ); - } - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::UnshareItemListL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::UnshareItemListL( RArray& aObjList, - TInt* aExecutionStatus ) - { - // list of resources - RArray refList; - RArray resList; - RArray objCommitedList; - CleanupClosePushL(objCommitedList); - CleanupClosePushL(resList); - CleanupClosePushL(refList); - TInt parentId(0); - // start transaction - iMetadataStorage->BeginTransactionL(); - // reset status - *aExecutionStatus = 0; - - // for each item - for (TInt i = 0; i < aObjList.Count(); i++ ) - { - parentId = iMetadataStorage->GetParentIdL( aObjList[i] ); - if ( parentId>=0 ) - { - objCommitedList.AppendL(parentId); - // commit every KCommitEveryNum inserts - if( !( i%KCommitEveryNum ) ) - { - // ignore if i == 0; - if ( i ) - { - // commit last transaction - iMetadataStorage->CommitTransactionL(); - - // everything went OK, delete files - iMetadataStorage->DeleteResourcesL(resList); - resList.Reset(); - - // success - update status - *aExecutionStatus = i; - - // eventing - if (iStateHandler) - { - for (TInt j =0;jIncreaseSystemUpdateIdL(); - TBuf8 containerId; - containerId.Num( objCommitedList[j] ); - iStateHandler->IncreaseContainerUpdateIdL( containerId ); - } - objCommitedList.Reset(); - TBuf8 parentRefID; - for ( TInt i(0); iIncreaseSystemUpdateIdL(); - parentRefID.Num( refList[i] ); - iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); - } - refList.Reset(); - } - - // begin new transaction - iMetadataStorage->BeginTransactionL(); - } - } - - // insert object - TRAPD( err, iMetadataStorage->DoDeleteObjectL( aObjList[i],refList, resList, - ETrue, ETrue) ); - if ( err ) - { // rollback if error - iMetadataStorage->RollbackTransactionL(); - User::Leave(err); - } - } - } - - // commit - iMetadataStorage->CommitTransactionL(); - - // everything went OK, delete files - iMetadataStorage->DeleteResourcesL( resList ); - - // success - update status - *aExecutionStatus = objCommitedList.Count(); - - // eventing - if ( iStateHandler ) - { - for ( TInt j =0; j=0 ) - { - TBuf8 containerId; - containerId.Num(objCommitedList[j]); - iStateHandler->IncreaseSystemUpdateIdL(); - iStateHandler->IncreaseContainerUpdateIdL( containerId ); - } - } - objCommitedList.Reset(); - TBuf8 parentRefID; - for ( TInt i(0); iIncreaseSystemUpdateIdL(); - parentRefID.Num( refList[i] ); - iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); - } - refList.Reset(); - } - - // clean up - CleanupStack::PopAndDestroy( &refList ); - CleanupStack::PopAndDestroy( &resList ); - CleanupStack::PopAndDestroy( &objCommitedList ); - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::GetItemListL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::GetItemListL(TInt aContainerId, - CUpnpBrowseCriteria* aBrowseCriteria, TInt* aTotalMatches, - CUpnpItemList* aItemList ) - { - // filter - TBool all = aBrowseCriteria->Filter().Length(); - - // get children ids - RArray items; - CleanupClosePushL( items ); - if ( iMetadataStorage->GetItemListL( aContainerId, items ) == ENoSuchObject || !items.Count() ) - { - User::Leave(KErrNotFound); - } - - // total matches - *aTotalMatches = items.Count(); - - // add wanted children - for ( TInt i = aBrowseCriteria->StartingIndex(); - i < *aTotalMatches && - i < aBrowseCriteria->StartingIndex() - + aBrowseCriteria->RequestedCount() ; - i++ - ) - { - // new item - CUpnpItem* item = CUpnpItem::NewL(); - CleanupStack::PushL(item); - - // get object - GetObjectL(items[i], item, all); - aItemList->AppendObjectL(*item); - - // pop item - CleanupStack::Pop(item); - } - - // clean up - CleanupStack::PopAndDestroy(&items); - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::GetContainerListL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::GetContainerListL(TInt aContainerId, - CUpnpBrowseCriteria* aBrowseCriteria, TInt* aTotalMatches, - CUpnpContainerList* aList ) - { - // filter - TBool all = aBrowseCriteria->Filter().Length(); - - // get children ids - RArray contrs; - CleanupClosePushL( contrs ); - if( iMetadataStorage->GetContainerListL( aContainerId, contrs ) == ENoSuchObject ) - { - User::Leave( KErrNotFound ); - } - - // total matches - *aTotalMatches = contrs.Count(); - - // add wanted children - for ( TInt i = aBrowseCriteria->StartingIndex(); - i < *aTotalMatches && - i < aBrowseCriteria->StartingIndex() - + aBrowseCriteria->RequestedCount() ; - i++ - ) - { - // new item - CUpnpContainer* contr = CUpnpContainer::NewL(); - CleanupStack::PushL( contr ); - - // get object - GetObjectL( contrs[i], contr, all ); - aList->AppendObjectL( *contr ); - - // pop item - CleanupStack::Pop( contr ); - } - - // clean up - CleanupStack::PopAndDestroy( &contrs ); - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::GetSingleContainerL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CUpnpContainer* CUpnpLocalStorage::GetSingleContainerL(TInt aContainerId ) - { - // new item - CUpnpContainer* cont = CUpnpContainer::NewL(); - CleanupStack::PushL(cont); - - // get object - GetObjectL( aContainerId, cont ); - - // clean up - CleanupStack::Pop( cont ); - - return cont; - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::CreateObjectBeanLC -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CUpnpObjectBean* CUpnpLocalStorage::CreateObjectBeanLC(CUpnpObject* aItem ) - { - CUpnpObjectBean* objBn = CUpnpObjectBean::NewLC(); - - // restricted - objBn->SetObjRestricted( aItem->Restricted() ); - - // searchable - objBn->SetObjSearchable( ETrue ); - - // class - objBn->SetObjClassL( aItem->ObjectClass() ); - - // title - objBn->SetObjTitleL( aItem->Title() ); - - return objBn; - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::CreateElementBeanLC -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CUpnpElementBean* CUpnpLocalStorage::CreateElementBeanLC(CUpnpElement& aElement ) - { - CUpnpElementBean* elmBn = CUpnpElementBean::NewLC(); - - // name - elmBn->SetElmNameL( aElement.Name() ); - - // value - elmBn->SetElmValueL( aElement.Value() ); - - // is required - elmBn->SetElmIsRequired( aElement.IsRequired() ); - - TBool hasAttribute = aElement.GetAttributes().Count() > 0; - elmBn->SetElmHasAttribute( hasAttribute ); - return elmBn; - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::CreateAttributeBeanLC -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CUpnpAttributeBean* CUpnpLocalStorage::CreateAttributeBeanLC( - CUpnpAttribute& aAttr ) - { - CUpnpAttributeBean* atrBn = CUpnpAttributeBean::NewLC(); - - // name - atrBn->SetAtrNameL( aAttr.Name() ); - - // value - atrBn->SetAtrValueL( aAttr.Value() ); - - // set required - if ( aAttr.Name() == KprotocolInfo ) - { - atrBn->SetAtrIsRequired( ETrue ); - } - - return atrBn; - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::DoShareItemL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::DoShareObjectL(TInt aContainer, CUpnpObject* aObject ) - { - - // object table - CUpnpObjectBean* objBn = CreateObjectBeanLC( aObject ); - TInt objId = iMetadataStorage->InsertIntoObjectTableL( aContainer, objBn ); - CleanupStack::PopAndDestroy( objBn ); - - // set id - HBufC8* id = HBufC8::NewLC( KMaxIntegerLen ); - id->Des().Num( objId ); - aObject->SetIdL( *id ); - CleanupStack::PopAndDestroy( id ); - - // add resources - HandleResourcesL( aObject ); - - // elements - const RUPnPElementsArray& elms = aObject->GetElements ( ); - TInt elmId = iMetadataStorage->GetNextKeyL(KElementTableName8,elms.Count()); - for (TInt i = 0; i < elms.Count ( ); i++ ) - { - CUpnpElementBean* elm = CreateElementBeanLC( *elms[i] ); - iMetadataStorage->InsertIntoElementTableL( objId, elm, elmId ); - CleanupStack::PopAndDestroy( elm ); - - // attributes - const RUPnPAttributesArray& attrs = elms[i]->GetAttributes ( ); - TInt atrId = iMetadataStorage->GetNextKeyL( KAttributeTableName8, attrs.Count() ); - for( TInt j = 0; j < attrs.Count(); j++ ) - { - CUpnpAttributeBean* attr = CreateAttributeBeanLC (*attrs[j] ); - iMetadataStorage->InsertIntoAttributeTableL(elmId, attr, objId,atrId); - atrId++; - CleanupStack::PopAndDestroy (attr ); - } - elmId++; - } - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::DoShareReferenceL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::DoShareReferenceL( TInt aContainerId, CUpnpItem* aRefItem ) - { - // prepare for a while main object to get some data from it - CUpnpItem* mainObj = CUpnpItem::NewL(); - CleanupStack::PushL( mainObj ); - - TLex8 lexer( aRefItem->RefId() ); - TInt mainObjId; - User::LeaveIfError(lexer.Val(mainObjId)); - - // try to get 'real object', not e.g reference to reference - mainObjId = ReferedObjectIdL( mainObjId ); - - // set new refID, pointing onto real object - TBuf8 newRefIdBuf; - newRefIdBuf.Num( mainObjId ); - aRefItem->SetRefIdL( newRefIdBuf ); - // get all data from main object - GetObjectL( mainObjId, mainObj ); - - // setting: title and class in reference object, basing on info from main object - aRefItem->SetTitleL( mainObj->Title() ); - aRefItem->SetObjectClassL( mainObj->ObjectClass() ); - - CleanupStack::PopAndDestroy( mainObj ); - - // setting 'restricted' field - aRefItem->SetRestricted(EFalse); - - // creating new 'object bean' basing on 'reference object' - CUpnpObjectBean* refBn = CreateObjectBeanLC( aRefItem ); - refBn->SetObjRefId( mainObjId ); - refBn->SetObjParentId( aContainerId ); - - // inserting newly created reference object onto 'object table' - TInt id = iMetadataStorage->InsertIntoObjectTableL( aContainerId, refBn ); - CleanupStack::PopAndDestroy( refBn ); - - // setting new id in created reference object - TBuf8 idBuf; - idBuf.Num( id ); - aRefItem->SetIdL( idBuf ); - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::HandleResourcesL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::HandleResourcesL(CUpnpObject* aItem ) - { - // - const RUPnPElementsArray& elms = aItem->GetElements(); - for ( TInt i = 0; i < elms.Count(); i++ ) - { - if ( elms[i]->Name() == KRes ) - { - - // get file name - TParse fp; - fp.Set( elms[i]->FilePath(), 0, 0 ); - - TPtrC8 itemId = aItem->Id(); - HBufC8* contUri = UpnpCdUtils::BuildContentUriL( - iMetadataStorage->GetNextKeyL( KImportUriId8 ), fp.Ext(), - itemId ); - CleanupStack::PushL(contUri); - - // add resource to the database - CUpnpResourcesBean* resBn = CUpnpResourcesBean::NewLC(); - resBn->SetId( UpnpCdUtils::ResIdFromUriL( *contUri ) ); - resBn->SetPathL( elms[i]->FilePath() ); - resBn->SetIsReadonly( ETrue ); - resBn->SetIsThumbnail( EFalse ); - - TInt objectId; - TLex8 lexer( aItem->Id() ); - User::LeaveIfError( lexer.Val( objectId ) ); - iMetadataStorage->AddResourceL( resBn, objectId ); - - // update object - HBufC8* uri = ValAsUriL( *contUri ); - CleanupStack::PushL( uri ); - elms[i]->SetValueL( *uri ); - CleanupStack::PopAndDestroy( uri ); - CleanupStack::PopAndDestroy( resBn ); - CleanupStack::PopAndDestroy( contUri ); - } - - } - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::GetObjectL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::GetObjectL( TInt aObjId, CUpnpObject* aObj, TBool aAll ) - { - // get view - RDbView view = iMetadataStorage->GetObjViewL( aObjId ); - CleanupClosePushL( view ); - - if ( view.FirstL() ) - { - // get row - view.GetL(); - - // create bean - CUpnpObjectBean* objBn = CUpnpObjectBean::NewLC( view ); - - // add values - objBn->CopyToUpnpObjectL( aObj ); - - if ( aAll ) - { // add elements - AddElementsL( aObjId, aObj ); - } - - CleanupStack::PopAndDestroy( objBn ); - } - else - { // no such object - User::Leave( KErrNotFound ); - } - // clean up - CleanupStack::PopAndDestroy( &view ); - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::AddElementsL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::AddElementsL( TInt aObjectID, CUpnpObject* aObj ) - { - RDbView view = iMetadataStorage->GetElementsViewL( aObjectID, ETrue ); - CleanupClosePushL( view ); - // Iterate through elements - while( view.NextL() ) - { - view.GetL(); - CUpnpElementBean* elBean = CUpnpElementBean::NewLC( view ); - - // add new element - CUpnpElement* elm = elBean->AttachElmL( aObj ); - - // add attributes - AddAttributesL( elBean->ElmId(), elm ); - - if( elBean->ElmName() == KRes && - elBean->ElmValue().Length() ) // ignore if empty res - { // add file path - CUpnpResourcesBean* resBn = - iMetadataStorage->GetResourceL( - UpnpCdUtils::ResIdFromUriL( elBean->ElmValue() ) ); - CleanupStack::PushL(resBn); - - // set file path - elm->SetFilePathL( resBn->Path() ); - - CleanupStack::PopAndDestroy( resBn ); - } - - // clean up - CleanupStack::PopAndDestroy( elBean ); - } - // clean up - CleanupStack::PopAndDestroy( &view ); - } -// ----------------------------------------------------------------------------- -// CUpnpElementBean::ValAsUriL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -HBufC8* CUpnpLocalStorage::ValAsUriL( const TDesC8& aElmValue ) const - { - // uris have to be properly escaped - HBufC8* uriDes = NULL; - HBufC* tmp = UpnpCdUtils::Des8ToDesLC( aElmValue ); - TUriParser uripar; - uripar.Parse( *tmp ); - CUri8* uri = uri = UriUtils::ConvertToInternetFormL( uripar ); - CleanupStack::PopAndDestroy( tmp ); - CleanupStack::PushL(uri); - if ( uri->Uri().UriDes().Length() ) - { - uriDes = UpnpString::StringReplaceL( uri->Uri().UriDes(), KHash8, KHashASCII8 ); - } - else - { - uriDes = uri->Uri().UriDes().AllocL(); - } - CleanupStack::PopAndDestroy( uri ); - return uriDes; - } -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::AddAttributesL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CUpnpLocalStorage::AddAttributesL( TInt aElmId, CUpnpElement* aElm ) - { - RDbView view = iMetadataStorage->GetAttributesViewL( aElmId, ETrue ); - CleanupClosePushL(view); - - // Iterate through attributes - while ( view.NextL() ) - { - view.GetL(); - CUpnpAttributeBean* atr = CUpnpAttributeBean::NewLC( view ); - atr->AttachAttrL( aElm ); - CleanupStack::PopAndDestroy( atr ); - } - // clean up - CleanupStack::PopAndDestroy( &view ); - } - -// ----------------------------------------------------------------------------- -// CUpnpLocalStorage::ReferedObjectIdL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CUpnpLocalStorage::ReferedObjectIdL(TInt aObjectId) -{ - TInt ret = KErrNotFound; - - TInt refId = iMetadataStorage->ReferedObjectIdL(aObjectId); - - if( refId != KErrNotFound ) - { - ret = ReferedObjectIdL( refId ); - } - else - { - ret = aObjectId; - } - - return ret; -} - -// 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: Local interface + * +*/ + + +// INCLUDE FILES +#include "upnpcontainer.h" +#include "upnpitem.h" +#include "upnpelement.h" +#include "upnpattribute.h" +#include "upnpitemlist.h" +#include "upnpcontainerlist.h" +#include "upnpbrowsecriteria.h" +#include "upnplocalstorage.h" +#include "upnpobjectbean.h" +#include "upnpelementbean.h" +#include "upnpattributebean.h" +#include "upnpelementbean.h" +#include "upnpmetadatastorage.h" +#include "upnpcontentdirectoryglobals.h" +#include "upnpresourcesbean.h" +#include "upnpcdutils.h" +#include "upnpstatehandler.h" +#include "upnpstring.h" +#include "upnpcontentdirectory.h" +#include "upnpautodestroyobjectlist.h" +#include "upnpautodestroyobject.h" +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::CUpnpLocalStorage +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CUpnpLocalStorage::CUpnpLocalStorage( CUpnpMetadataStorage* aMetadataStorage ) + { + iMetadataStorage = aMetadataStorage; + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CUpnpLocalStorage* CUpnpLocalStorage::NewLC( + CUpnpMetadataStorage* aMetadataStorage ) + { + CUpnpLocalStorage* self = new ( ELeave ) CUpnpLocalStorage( aMetadataStorage ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +CUpnpLocalStorage* CUpnpLocalStorage::NewL( + CUpnpMetadataStorage* aMetadataStorage ) + { + CUpnpLocalStorage* self = CUpnpLocalStorage::NewLC( aMetadataStorage ); + + CleanupStack::Pop(); + + return self; + } + +void CUpnpLocalStorage::SetStateHandler( CUpnpStateHandler* aStateHandler ) + { + iStateHandler = aStateHandler; + } + +// Destructor +CUpnpLocalStorage::~CUpnpLocalStorage() + { + + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ShareObjectL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::ShareObjectL( CUpnpObject* aObj ) + { + TLex8 lexer( aObj->ParentId() ); + TPtrC8 parentId = aObj->ParentId(); + TInt containerId; + User::LeaveIfError( lexer.Val( containerId ) ); + // check parent + ValidateContainerL( containerId ); + + // start transaction + iMetadataStorage->BeginTransactionL(); + + TRAPD(err, DoShareObjectL( containerId, aObj ) ); + if ( err ) + { // rollback if error + iMetadataStorage->RollbackTransactionL(); + User::Leave( err ); + } + iMetadataStorage->CommitTransactionL(); + + // eventing + if (iStateHandler) + { + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( parentId ); + } + + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ShareReferenceL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::ShareReferenceL( CUpnpItem* aItem ) + { + // check whether container exists and is not restricted + TLex8 lexer( aItem->ParentId() ); + TPtrC8 parentId = aItem->ParentId(); + TInt containerId; + User::LeaveIfError( lexer.Val( containerId ) ); + + ValidateContainerL( containerId ); + + // if everything is OK -> start transaction + iMetadataStorage->BeginTransactionL(); + + TRAPD(err, DoShareReferenceL( containerId, aItem ) ); + if ( err ) + { // rollback if error + iMetadataStorage->RollbackTransactionL(); + User::Leave( err ); + } + iMetadataStorage->CommitTransactionL(); + + // eventing + if (iStateHandler) + { + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( parentId ); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ShareReferenceListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::ShareReferenceListL( CUpnpItemList* aItemList, + TInt* aExecutionStatus ) + { + //----- firstly - validate all containers upon which references are to be created. + for ( TInt i = 0; i < aItemList->ObjectCount(); i++ ) + { + TLex8 lex((*aItemList)[i]->ParentId()); + TInt containerId; + User::LeaveIfError( lex.Val(containerId) ); + + ValidateContainerL(containerId); + } + + //----- if containers are OK, do the following ... + + // varaible used to do the rest of eventing + TInt itemCommited=0; + + // start transaction + iMetadataStorage->BeginTransactionL(); + + // reset status + *aExecutionStatus = 0; + + // for each item in the list ... + for ( TInt i = 0; i < aItemList->ObjectCount(); i++ ) + { + // get parentId field value [upon which 'reference item' will be created] + TLex8 lexer((*aItemList)[i]->ParentId()); + TInt parentId = -1; + User::LeaveIfError( lexer.Val(parentId) ); + + // commit every KCommitEveryNum inserts + if ( !(i%KCommitEveryNum) ) + { + // ignore if i == 0; + if ( i ) + { + itemCommited=0; + // commit last transaction + iMetadataStorage->CommitTransactionL(); + + // success - update status + *aExecutionStatus = i; + if ( iStateHandler ) + { + for ( TInt j = 0; j < KCommitEveryNum; j++ ) + { + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( ( (*aItemList)[j]->ParentId() ) ); + } + } + // begin new transaction + iMetadataStorage->BeginTransactionL(); + } + } + + // insert object + CUpnpObject* object = ( *aItemList )[i]; + CUpnpItem* item = dynamic_cast( object ); + + TRAPD( err, DoShareReferenceL( parentId, item ) ); + if ( err ) + { // rollback if error + iMetadataStorage->RollbackTransactionL(); + User::Leave(err); + } + itemCommited++; + } + + // commit + iMetadataStorage->CommitTransactionL(); + + // success - update status + *aExecutionStatus = aItemList->ObjectCount(); + + //eventing + if ( iStateHandler ) + { + // do the rest of eventing if number of items were greater than KCommitEveryNum + for ( TInt j = 0; j < itemCommited; j++ ) + { + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( ( ( *aItemList )[j]->ParentId() ) ); + } + } + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::UnshareItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::UnshareItemL( TInt aId ) + { + // check id + ValidateItemL( aId ); + HBufC8* containerId = HBufC8::NewLC( KMaxIntegerLen ); + TInt containerIdInt = iMetadataStorage->GetParentIdL( aId ); + if ( containerIdInt == KErrGeneral ) + { + User::Leave( KErrNotFound ); + } + + containerId->Des().Num( containerIdInt ); + + if (aId <= KDownloadContId) + { + User::Leave( KErrArgument ); + } + RArray refList; + CleanupClosePushL(refList); + if ( iMetadataStorage->DeleteObjectL( aId, refList, ETrue, ETrue ) == ENoSuchObject ) + { + User::Leave( KErrNotFound ); + } + + // eventing + if ( iStateHandler ) + { + TBuf8 parentRefID; + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( *containerId ); + for (TInt i(0);iIncreaseSystemUpdateIdL(); + parentRefID.Num( refList[i] ); + iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); + } + } + + // clean up + CleanupStack::PopAndDestroy( &refList ); + CleanupStack::PopAndDestroy( containerId ); + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::UnshareContainerL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::UnshareContainerL( TInt aId ) + { + // check id + ValidateContainerL( aId ); + HBufC8* containerId = HBufC8::NewLC( KMaxIntegerLen ); + containerId->Des().Num(iMetadataStorage->GetParentIdL( aId ) ); + + if ( aId <= KDownloadContId ) + { + User::Leave( KErrArgument ); + } + RArray refList; + CleanupClosePushL(refList); + if ( iMetadataStorage->DeleteObjectL( aId,refList, ETrue, ETrue ) == ENoSuchObject ) + { + User::Leave( KErrNotFound ); + } + + // eventing + if ( iStateHandler ) + { + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( *containerId ); + TBuf8 parentRefID; + for (TInt i(0);iCompare( parentRefID ) ) + { + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); + } + } + refList.Reset(); + } + CleanupStack::PopAndDestroy( &refList ); + CleanupStack::PopAndDestroy( containerId ); + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::GetSharedItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CUpnpItem* CUpnpLocalStorage::GetSharedItemL( TInt aItemId ) + { + // new item + CUpnpItem* item = CUpnpItem::NewL(); + CleanupStack::PushL( item ); + + // get object + GetObjectL( aItemId, item ); + + // clean up + CleanupStack::Pop( item ); + + return item; + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ShareItemListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::ShareItemListL(CUpnpItemList* aItemList, + TInt* aExecutionStatus ) + { + TInt itemCommited=0; + // check parent + TLex8 lexer((*aItemList)[0]->ParentId()); + TInt parentId; + User::LeaveIfError( lexer.Val(parentId) ); + ValidateContainerL(parentId); + + // start transaction + iMetadataStorage->BeginTransactionL(); + // reset status + *aExecutionStatus = 0; + + // for each item + for ( TInt i = 0; i < aItemList->ObjectCount(); i++ ) + { + // commit every KCommitEveryNum inserts + if ( !(i%KCommitEveryNum) ) + { + // ignore if i == 0; + if ( i ) + { + itemCommited=0; + // commit last transaction + iMetadataStorage->CommitTransactionL(); + + // success - update status + *aExecutionStatus = i; + if ( iStateHandler ) + { + for ( TInt j =0; jIncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( ( (*aItemList)[0]->ParentId() ) ); + } + } + // begin new transaction + iMetadataStorage->BeginTransactionL(); + } + } + + // insert object + TRAPD( err, DoShareObjectL( parentId, ( *aItemList )[i]) ); + if ( err ) + { // rollback if error + iMetadataStorage->RollbackTransactionL(); + User::Leave(err); + } + itemCommited++; + } + + // commit + iMetadataStorage->CommitTransactionL(); + // success - update status + *aExecutionStatus = aItemList->ObjectCount(); + + //eventing + if ( iStateHandler ) + { + for ( TInt j =0; jIncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( ( ( *aItemList )[0]->ParentId() ) ); + } + } + + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ValidateContainerL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::ValidateContainerL( TInt aContainerId ) + { + if ( !iMetadataStorage->IsContainerL( aContainerId ) ) + { + User::Leave( KErrNotFound ); + } + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ValidateItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::ValidateItemL( TInt aItemId ) + { + if ( iMetadataStorage->IsContainerL( aItemId ) ) + { + User::Leave( KErrNotFound ); + } + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::UnshareItemListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::UnshareItemListL( RArray& aObjList, + TInt* aExecutionStatus ) + { + // list of resources + RArray refList; + RArray resList; + RArray objCommitedList; + CleanupClosePushL(objCommitedList); + CleanupClosePushL(resList); + CleanupClosePushL(refList); + TInt parentId(0); + // start transaction + iMetadataStorage->BeginTransactionL(); + // reset status + *aExecutionStatus = 0; + + // for each item + for (TInt i = 0; i < aObjList.Count(); i++ ) + { + parentId = iMetadataStorage->GetParentIdL( aObjList[i] ); + if ( parentId>=0 ) + { + objCommitedList.Append(parentId); + // commit every KCommitEveryNum inserts + if( !( i%KCommitEveryNum ) ) + { + // ignore if i == 0; + if ( i ) + { + // commit last transaction + iMetadataStorage->CommitTransactionL(); + + // everything went OK, delete files + iMetadataStorage->DeleteResourcesL(resList); + resList.Reset(); + + // success - update status + *aExecutionStatus = i; + + // eventing + if (iStateHandler) + { + for (TInt j =0;jIncreaseSystemUpdateIdL(); + TBuf8 containerId; + containerId.Num( objCommitedList[j] ); + iStateHandler->IncreaseContainerUpdateIdL( containerId ); + } + objCommitedList.Reset(); + TBuf8 parentRefID; + for ( TInt i(0); iIncreaseSystemUpdateIdL(); + parentRefID.Num( refList[i] ); + iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); + } + refList.Reset(); + } + + // begin new transaction + iMetadataStorage->BeginTransactionL(); + } + } + + // insert object + TRAPD( err, iMetadataStorage->DoDeleteObjectL( aObjList[i],refList, resList, + ETrue, ETrue) ); + if ( err ) + { // rollback if error + iMetadataStorage->RollbackTransactionL(); + User::Leave(err); + } + } + } + + // commit + iMetadataStorage->CommitTransactionL(); + + // everything went OK, delete files + iMetadataStorage->DeleteResourcesL( resList ); + + // success - update status + *aExecutionStatus = objCommitedList.Count(); + + // eventing + if ( iStateHandler ) + { + for ( TInt j =0; j=0 ) + { + TBuf8 containerId; + containerId.Num(objCommitedList[j]); + iStateHandler->IncreaseSystemUpdateIdL(); + iStateHandler->IncreaseContainerUpdateIdL( containerId ); + } + } + objCommitedList.Reset(); + TBuf8 parentRefID; + for ( TInt i(0); iIncreaseSystemUpdateIdL(); + parentRefID.Num( refList[i] ); + iStateHandler->IncreaseContainerUpdateIdL( parentRefID ); + } + refList.Reset(); + } + + // clean up + CleanupStack::PopAndDestroy( &refList ); + CleanupStack::PopAndDestroy( &resList ); + CleanupStack::PopAndDestroy( &objCommitedList ); + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::GetItemListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::GetItemListL(TInt aContainerId, + CUpnpBrowseCriteria* aBrowseCriteria, TInt* aTotalMatches, + CUpnpItemList* aItemList ) + { + // filter + TBool all = aBrowseCriteria->Filter().Length(); + + // get children ids + RArray items; + CleanupClosePushL( items ); + if ( iMetadataStorage->GetItemListL( aContainerId, items ) == ENoSuchObject || !items.Count() ) + { + User::Leave(KErrNotFound); + } + + // total matches + *aTotalMatches = items.Count(); + + // add wanted children + for ( TInt i = aBrowseCriteria->StartingIndex(); + i < *aTotalMatches && + i < aBrowseCriteria->StartingIndex() + + aBrowseCriteria->RequestedCount() ; + i++ + ) + { + // new item + CUpnpItem* item = CUpnpItem::NewL(); + CleanupStack::PushL(item); + + // get object + GetObjectL(items[i], item, all); + aItemList->AppendObjectL(*item); + + // pop item + CleanupStack::Pop(item); + } + + // clean up + CleanupStack::PopAndDestroy(&items); + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::GetContainerListL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::GetContainerListL(TInt aContainerId, + CUpnpBrowseCriteria* aBrowseCriteria, TInt* aTotalMatches, + CUpnpContainerList* aList ) + { + // filter + TBool all = aBrowseCriteria->Filter().Length(); + + // get children ids + RArray contrs; + CleanupClosePushL( contrs ); + if( iMetadataStorage->GetContainerListL( aContainerId, contrs ) == ENoSuchObject ) + { + User::Leave( KErrNotFound ); + } + + // total matches + *aTotalMatches = contrs.Count(); + + // add wanted children + for ( TInt i = aBrowseCriteria->StartingIndex(); + i < *aTotalMatches && + i < aBrowseCriteria->StartingIndex() + + aBrowseCriteria->RequestedCount() ; + i++ + ) + { + // new item + CUpnpContainer* contr = CUpnpContainer::NewL(); + CleanupStack::PushL( contr ); + + // get object + GetObjectL( contrs[i], contr, all ); + aList->AppendObjectL( *contr ); + + // pop item + CleanupStack::Pop( contr ); + } + + // clean up + CleanupStack::PopAndDestroy( &contrs ); + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::GetSingleContainerL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CUpnpContainer* CUpnpLocalStorage::GetSingleContainerL(TInt aContainerId ) + { + // new item + CUpnpContainer* cont = CUpnpContainer::NewL(); + CleanupStack::PushL(cont); + + // get object + GetObjectL( aContainerId, cont ); + + // clean up + CleanupStack::Pop( cont ); + + return cont; + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::CreateObjectBeanLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CUpnpObjectBean* CUpnpLocalStorage::CreateObjectBeanLC(CUpnpObject* aItem ) + { + CUpnpObjectBean* objBn = CUpnpObjectBean::NewLC(); + + // restricted + objBn->SetObjRestricted( aItem->Restricted() ); + + // searchable + objBn->SetObjSearchable( ETrue ); + + // class + objBn->SetObjClassL( aItem->ObjectClass() ); + + // title + objBn->SetObjTitleL( aItem->Title() ); + + return objBn; + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::CreateElementBeanLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CUpnpElementBean* CUpnpLocalStorage::CreateElementBeanLC(CUpnpElement& aElement ) + { + CUpnpElementBean* elmBn = CUpnpElementBean::NewLC(); + + // name + elmBn->SetElmNameL( aElement.Name() ); + + // value + elmBn->SetElmValueL( aElement.Value() ); + + // is required + elmBn->SetElmIsRequired( aElement.IsRequired() ); + + TBool hasAttribute = aElement.GetAttributes().Count() > 0; + elmBn->SetElmHasAttribute( hasAttribute ); + return elmBn; + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::CreateAttributeBeanLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CUpnpAttributeBean* CUpnpLocalStorage::CreateAttributeBeanLC( + CUpnpAttribute& aAttr ) + { + CUpnpAttributeBean* atrBn = CUpnpAttributeBean::NewLC(); + + // name + atrBn->SetAtrNameL( aAttr.Name() ); + + // value + atrBn->SetAtrValueL( aAttr.Value() ); + + // set required + if ( aAttr.Name() == KprotocolInfo ) + { + atrBn->SetAtrIsRequired( ETrue ); + } + + return atrBn; + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::DoShareItemL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::DoShareObjectL(TInt aContainer, CUpnpObject* aObject ) + { + + // object table + CUpnpObjectBean* objBn = CreateObjectBeanLC( aObject ); + TInt objId = iMetadataStorage->InsertIntoObjectTableL( aContainer, objBn ); + CleanupStack::PopAndDestroy( objBn ); + + // set id + HBufC8* id = HBufC8::NewLC( KMaxIntegerLen ); + id->Des().Num( objId ); + aObject->SetIdL( *id ); + CleanupStack::PopAndDestroy( id ); + + // add resources + HandleResourcesL( aObject ); + + // elements + const RUPnPElementsArray& elms = aObject->GetElements ( ); + TInt elmId = iMetadataStorage->GetNextKeyL(KElementTableName8,elms.Count()); + for (TInt i = 0; i < elms.Count ( ); i++ ) + { + CUpnpElementBean* elm = CreateElementBeanLC( *elms[i] ); + iMetadataStorage->InsertIntoElementTableL( objId, elm, elmId ); + CleanupStack::PopAndDestroy( elm ); + + // attributes + const RUPnPAttributesArray& attrs = elms[i]->GetAttributes ( ); + TInt atrId = iMetadataStorage->GetNextKeyL( KAttributeTableName8, attrs.Count() ); + for( TInt j = 0; j < attrs.Count(); j++ ) + { + CUpnpAttributeBean* attr = CreateAttributeBeanLC (*attrs[j] ); + iMetadataStorage->InsertIntoAttributeTableL(elmId, attr, objId,atrId); + atrId++; + CleanupStack::PopAndDestroy (attr ); + } + elmId++; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::DoShareReferenceL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::DoShareReferenceL( TInt aContainerId, CUpnpItem* aRefItem ) + { + // prepare for a while main object to get some data from it + CUpnpItem* mainObj = CUpnpItem::NewL(); + CleanupStack::PushL( mainObj ); + + TLex8 lexer( aRefItem->RefId() ); + TInt mainObjId; + User::LeaveIfError(lexer.Val(mainObjId)); + + // try to get 'real object', not e.g reference to reference + mainObjId = ReferedObjectIdL( mainObjId ); + + // set new refID, pointing onto real object + TBuf8 newRefIdBuf; + newRefIdBuf.Num( mainObjId ); + aRefItem->SetRefIdL( newRefIdBuf ); + // get all data from main object + GetObjectL( mainObjId, mainObj ); + + // setting: title and class in reference object, basing on info from main object + aRefItem->SetTitleL( mainObj->Title() ); + aRefItem->SetObjectClassL( mainObj->ObjectClass() ); + + CleanupStack::PopAndDestroy( mainObj ); + + // setting 'restricted' field + aRefItem->SetRestricted(EFalse); + + // creating new 'object bean' basing on 'reference object' + CUpnpObjectBean* refBn = CreateObjectBeanLC( aRefItem ); + refBn->SetObjRefId( mainObjId ); + refBn->SetObjParentId( aContainerId ); + + // inserting newly created reference object onto 'object table' + TInt id = iMetadataStorage->InsertIntoObjectTableL( aContainerId, refBn ); + CleanupStack::PopAndDestroy( refBn ); + + // setting new id in created reference object + TBuf8 idBuf; + idBuf.Num( id ); + aRefItem->SetIdL( idBuf ); + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::HandleResourcesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::HandleResourcesL(CUpnpObject* aItem ) + { + // + const RUPnPElementsArray& elms = aItem->GetElements(); + for ( TInt i = 0; i < elms.Count(); i++ ) + { + if ( elms[i]->Name() == KRes ) + { + + // get file name + TParse fp; + fp.Set( elms[i]->FilePath(), 0, 0 ); + + TPtrC8 itemId = aItem->Id(); + HBufC8* contUri = UpnpCdUtils::BuildContentUriL( + iMetadataStorage->GetNextKeyL( KImportUriId8 ), fp.Ext(), + itemId ); + CleanupStack::PushL(contUri); + + // add resource to the database + CUpnpResourcesBean* resBn = CUpnpResourcesBean::NewLC(); + resBn->SetId( UpnpCdUtils::ResIdFromUriL( *contUri ) ); + resBn->SetPathL( elms[i]->FilePath() ); + resBn->SetIsReadonly( ETrue ); + resBn->SetIsThumbnail( EFalse ); + + TInt objectId; + TLex8 lexer( aItem->Id() ); + User::LeaveIfError( lexer.Val( objectId ) ); + iMetadataStorage->AddResourceL( resBn, objectId ); + + // update object + HBufC8* uri = ValAsUriL( *contUri ); + CleanupStack::PushL( uri ); + elms[i]->SetValueL( *uri ); + CleanupStack::PopAndDestroy( uri ); + CleanupStack::PopAndDestroy( resBn ); + CleanupStack::PopAndDestroy( contUri ); + } + + } + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::GetObjectL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::GetObjectL( TInt aObjId, CUpnpObject* aObj, TBool aAll ) + { + // get view + RDbView view = iMetadataStorage->GetObjViewL( aObjId ); + CleanupClosePushL( view ); + + if ( view.FirstL() ) + { + // get row + view.GetL(); + + // create bean + CUpnpObjectBean* objBn = CUpnpObjectBean::NewLC( view ); + + // add values + objBn->CopyToUpnpObjectL( aObj ); + + if ( aAll ) + { // add elements + AddElementsL( aObjId, aObj ); + } + + CleanupStack::PopAndDestroy( objBn ); + } + else + { // no such object + User::Leave( KErrNotFound ); + } + // clean up + CleanupStack::PopAndDestroy( &view ); + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::AddElementsL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::AddElementsL( TInt aObjectID, CUpnpObject* aObj ) + { + RDbView view = iMetadataStorage->GetElementsViewL( aObjectID, ETrue ); + CleanupClosePushL( view ); + // Iterate through elements + while( view.NextL() ) + { + view.GetL(); + CUpnpElementBean* elBean = CUpnpElementBean::NewLC( view ); + + // add new element + CUpnpElement* elm = elBean->AttachElmL( aObj ); + + // add attributes + AddAttributesL( elBean->ElmId(), elm ); + + if( elBean->ElmName() == KRes && + elBean->ElmValue().Length() ) // ignore if empty res + { // add file path + CUpnpResourcesBean* resBn = + iMetadataStorage->GetResourceL( + UpnpCdUtils::ResIdFromUriL( elBean->ElmValue() ) ); + CleanupStack::PushL(resBn); + + // set file path + elm->SetFilePathL( resBn->Path() ); + + CleanupStack::PopAndDestroy( resBn ); + } + + // clean up + CleanupStack::PopAndDestroy( elBean ); + } + // clean up + CleanupStack::PopAndDestroy( &view ); + } +// ----------------------------------------------------------------------------- +// CUpnpElementBean::ValAsUriL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +HBufC8* CUpnpLocalStorage::ValAsUriL( const TDesC8& aElmValue ) const + { + // uris have to be properly escaped + HBufC8* uriDes = NULL; + HBufC* tmp = UpnpCdUtils::Des8ToDesLC( aElmValue ); + TUriParser uripar; + uripar.Parse( *tmp ); + CUri8* uri = uri = UriUtils::ConvertToInternetFormL( uripar ); + CleanupStack::PopAndDestroy( tmp ); + CleanupStack::PushL(uri); + if ( uri->Uri().UriDes().Length() ) + { + uriDes = UpnpString::StringReplaceL( uri->Uri().UriDes(), KHash8, KHashASCII8 ); + } + else + { + uriDes = uri->Uri().UriDes().AllocL(); + } + CleanupStack::PopAndDestroy( uri ); + return uriDes; + } +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::AddAttributesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpLocalStorage::AddAttributesL( TInt aElmId, CUpnpElement* aElm ) + { + RDbView view = iMetadataStorage->GetAttributesViewL( aElmId, ETrue ); + CleanupClosePushL(view); + + // Iterate through attributes + while ( view.NextL() ) + { + view.GetL(); + CUpnpAttributeBean* atr = CUpnpAttributeBean::NewLC( view ); + atr->AttachAttrL( aElm ); + CleanupStack::PopAndDestroy( atr ); + } + // clean up + CleanupStack::PopAndDestroy( &view ); + } + +// ----------------------------------------------------------------------------- +// CUpnpLocalStorage::ReferedObjectIdL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CUpnpLocalStorage::ReferedObjectIdL(TInt aObjectId) +{ + TInt ret = KErrNotFound; + + TInt refId = iMetadataStorage->ReferedObjectIdL(aObjectId); + + if( refId != KErrNotFound ) + { + ret = ReferedObjectIdL( refId ); + } + else + { + ret = aObjectId; + } + + return ret; +} + +// End of File +