--- 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 <uriutils.h>
-
-// ============================ 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<CUpnpItem*>( 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<TInt> refList;
- CleanupClosePushL(refList);
- if ( iMetadataStorage->DeleteObjectL( aId, refList, ETrue, ETrue ) == ENoSuchObject )
- {
- User::Leave( KErrNotFound );
- }
-
- // eventing
- if ( iStateHandler )
- {
- TBuf8<KMaxIntegerLen> parentRefID;
- iStateHandler->IncreaseSystemUpdateIdL();
- iStateHandler->IncreaseContainerUpdateIdL( *containerId );
- for (TInt i(0);i<refList.Count();i++)
- {
- iStateHandler->IncreaseSystemUpdateIdL();
- 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<TInt> refList;
- CleanupClosePushL(refList);
- if ( iMetadataStorage->DeleteObjectL( aId,refList, ETrue, ETrue ) == ENoSuchObject )
- {
- User::Leave( KErrNotFound );
- }
-
- // eventing
- if ( iStateHandler )
- {
- iStateHandler->IncreaseSystemUpdateIdL();
- iStateHandler->IncreaseContainerUpdateIdL( *containerId );
- TBuf8<KMaxIntegerLen> parentRefID;
- for (TInt i(0);i<refList.Count();i++)
- {
- parentRefID.Num( refList[i] );
- if ( containerId->Compare( 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; j<KCommitEveryNum; j++ )
- {
- iStateHandler->IncreaseSystemUpdateIdL();
- 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; j<itemCommited; j++ )
- {
- iStateHandler->IncreaseSystemUpdateIdL();
- 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<TInt>& aObjList,
- TInt* aExecutionStatus )
- {
- // list of resources
- RArray<TInt> refList;
- RArray<TInt> resList;
- RArray<TInt> 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;j<objCommitedList.Count();j++)
- {
- iStateHandler->IncreaseSystemUpdateIdL();
- TBuf8<KMaxIntegerLen> containerId;
- containerId.Num( objCommitedList[j] );
- iStateHandler->IncreaseContainerUpdateIdL( containerId );
- }
- objCommitedList.Reset();
- TBuf8<KMaxIntegerLen> parentRefID;
- for ( TInt i(0); i<refList.Count(); i++ )
- {
- iStateHandler->IncreaseSystemUpdateIdL();
- 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<objCommitedList.Count(); j++ )
- {
- if ( objCommitedList[j]>=0 )
- {
- TBuf8<KMaxIntegerLen> containerId;
- containerId.Num(objCommitedList[j]);
- iStateHandler->IncreaseSystemUpdateIdL();
- iStateHandler->IncreaseContainerUpdateIdL( containerId );
- }
- }
- objCommitedList.Reset();
- TBuf8<KMaxIntegerLen> parentRefID;
- for ( TInt i(0); i<refList.Count(); i++ )
- {
- iStateHandler->IncreaseSystemUpdateIdL();
- 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<TInt> 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<TInt> 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<KMaxIntegerLen> 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<KMaxIntegerLen> 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 <uriutils.h>
+
+// ============================ 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<CUpnpItem*>( 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<TInt> refList;
+ CleanupClosePushL(refList);
+ if ( iMetadataStorage->DeleteObjectL( aId, refList, ETrue, ETrue ) == ENoSuchObject )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ // eventing
+ if ( iStateHandler )
+ {
+ TBuf8<KMaxIntegerLen> parentRefID;
+ iStateHandler->IncreaseSystemUpdateIdL();
+ iStateHandler->IncreaseContainerUpdateIdL( *containerId );
+ for (TInt i(0);i<refList.Count();i++)
+ {
+ iStateHandler->IncreaseSystemUpdateIdL();
+ 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<TInt> refList;
+ CleanupClosePushL(refList);
+ if ( iMetadataStorage->DeleteObjectL( aId,refList, ETrue, ETrue ) == ENoSuchObject )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ // eventing
+ if ( iStateHandler )
+ {
+ iStateHandler->IncreaseSystemUpdateIdL();
+ iStateHandler->IncreaseContainerUpdateIdL( *containerId );
+ TBuf8<KMaxIntegerLen> parentRefID;
+ for (TInt i(0);i<refList.Count();i++)
+ {
+ parentRefID.Num( refList[i] );
+ if ( containerId->Compare( 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; j<KCommitEveryNum; j++ )
+ {
+ iStateHandler->IncreaseSystemUpdateIdL();
+ 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; j<itemCommited; j++ )
+ {
+ iStateHandler->IncreaseSystemUpdateIdL();
+ 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<TInt>& aObjList,
+ TInt* aExecutionStatus )
+ {
+ // list of resources
+ RArray<TInt> refList;
+ RArray<TInt> resList;
+ RArray<TInt> 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;j<objCommitedList.Count();j++)
+ {
+ iStateHandler->IncreaseSystemUpdateIdL();
+ TBuf8<KMaxIntegerLen> containerId;
+ containerId.Num( objCommitedList[j] );
+ iStateHandler->IncreaseContainerUpdateIdL( containerId );
+ }
+ objCommitedList.Reset();
+ TBuf8<KMaxIntegerLen> parentRefID;
+ for ( TInt i(0); i<refList.Count(); i++ )
+ {
+ iStateHandler->IncreaseSystemUpdateIdL();
+ 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<objCommitedList.Count(); j++ )
+ {
+ if ( objCommitedList[j]>=0 )
+ {
+ TBuf8<KMaxIntegerLen> containerId;
+ containerId.Num(objCommitedList[j]);
+ iStateHandler->IncreaseSystemUpdateIdL();
+ iStateHandler->IncreaseContainerUpdateIdL( containerId );
+ }
+ }
+ objCommitedList.Reset();
+ TBuf8<KMaxIntegerLen> parentRefID;
+ for ( TInt i(0); i<refList.Count(); i++ )
+ {
+ iStateHandler->IncreaseSystemUpdateIdL();
+ 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<TInt> 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<TInt> 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<KMaxIntegerLen> 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<KMaxIntegerLen> 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
+