--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/favouritesengine/ClientServer/src/FavouritesDb.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,739 @@
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* Implementation of class RFavouritesDb
+*
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <s32std.h>
+#include "FavouritesDb.h"
+#include "FavouritesMsg.h"
+#include "FavouritesBuf.h"
+#include "FavouritesFilter.h"
+#include "FavouritesItemImpl.h"
+#include "FavouritesItemList.h"
+#include "FavouritesItemData.h"
+#include "FavouritesUtil.h"
+#include "UidMap.h"
+#include "FavouritesLogger.h"
+#include <rfsApMapper.h>
+
+// CONSTANTS
+
+/// Granularity of AP map in RFS.
+LOCAL_D const TInt KApMapGranularity = 4;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// RFavouritesDb::Open
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Open
+( RFavouritesSession& aSess, const TDesC& aName )
+ {
+ __ASSERT_DEBUG( !iHandle, FavouritesPanic( EFavouritesAlreadyOpen ) );
+ TInt ret = aSess.SendReceive( EFavengOpenDatabase, TIpcArgs( &aName ) );
+ if ( ret > 0 )
+ {
+ iSess = aSess;
+ iHandle = ret;
+ ret = KErrNone;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Version
+// ---------------------------------------------------------
+//
+EXPORT_C TVersion RFavouritesDb::Version() const
+ {
+ return RFavouritesSession::Version();
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::IsDamaged
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::IsDamaged( TBool& aIsDamaged )
+ {
+ TInt ret = SendReceive( EFavengIsDamaged );
+ if ( ret >= 0 )
+ {
+ aIsDamaged = ret;
+ ret = KErrNone;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Recover
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Recover()
+ {
+ return SendReceive( EFavengRecover );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Compact
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Compact()
+ {
+ return SendReceive( EFavengCompact );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Size
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Size( RDbDatabase::TSize& aSize ) const
+ {
+ TPckg<RDbDatabase::TSize> size( aSize );
+ return SendReceive( EFavengSize, TIpcArgs( &size ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::UpdateStats
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::UpdateStats()
+ {
+ return SendReceive( EFavengUpdateStats );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Begin
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Begin( TBool aWrite /*=EFalse*/ )
+ {
+ return SendReceive( EFavengBegin, TIpcArgs( aWrite ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Commit
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Commit()
+ {
+ return SendReceive( EFavengCommit );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Rollback
+// ---------------------------------------------------------
+//
+EXPORT_C void RFavouritesDb::Rollback()
+ {
+ (void) SendReceive( EFavengRollback );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::CleanupRollbackPushL
+// ---------------------------------------------------------
+//
+EXPORT_C void RFavouritesDb::CleanupRollbackPushL()
+ {
+ CleanupStack::PushL( TCleanupItem( StaticRollback, this ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Get
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Get( TInt aUid, CFavouritesItem& aItem )
+ {
+ TInt err;
+
+ // Special items which are creted in memory dynamically,
+ // are filled up here at the client side.
+ if( aUid <= KFavouritesStartPageUid )
+ {
+ switch( aUid )
+ {
+ case KFavouritesStartPageUid:
+ {
+ aItem.iImpl->SetUid( KFavouritesStartPageUid );
+ return KErrNone;
+ }
+ case KFavouritesAdaptiveItemsFolderUid:
+ {
+ aItem.iImpl->SetUid( KFavouritesAdaptiveItemsFolderUid );
+ aItem.SetType( CFavouritesItem::EFolder );
+ aItem.SetParentFolder( KFavouritesRootUid );
+ return KErrNone;
+ }
+ case KFavouritesRSSItemUid:
+ {
+ aItem.iImpl->SetUid( KFavouritesRSSItemUid );
+ aItem.SetParentFolder( KFavouritesRootUid );
+ return KErrNone;
+ }
+ case KFavouritesSavedDeckItemUid:
+ {
+ aItem.iImpl->SetUid( KFavouritesSavedDeckItemUid );
+ aItem.SetType( CFavouritesItem::EFolder );
+ aItem.SetParentFolder( KFavouritesRootUid );
+ return KErrNone;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+ // Other UIDs are handled at the server side.
+ RFavouritesBuf buf;
+ TIpcArgs args( aUid );
+ err = buf.Open( *this, EFavengGet, args );
+ if( !err )
+ {
+ RReadStream stream( &buf );
+ TRAP( err, aItem.InternalizeL( stream ) );
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::GetAll
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::GetAll
+ (
+ CFavouritesItemList& aItemList,
+ TInt aParentFolderFilter /*=KFavouritesNullUid*/,
+ CFavouritesItem::TType aTypeFilter /*=CFavouritesItem::ENone*/,
+ const TDesC* aNameFilter /*=NULL*/,
+ TInt32 aContextIdFilter /*=KFavouritesNullContextId*/
+ )
+ {
+ RFavouritesBuf buf;
+ TFavouritesFilter filter
+ ( aParentFolderFilter, aTypeFilter, aNameFilter, aContextIdFilter );
+ TPckg<TFavouritesFilter> filterPckg( filter );
+ TIpcArgs args( &filterPckg );
+ TInt err = buf.Open( *this, EFavengGetAll, args );
+ if( !err )
+ {
+ RReadStream stream( &buf );
+ TRAP( err, aItemList.InternalizeL( stream ) );
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::PreferredUid
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::PreferredUid( TInt aFolder, TInt& aPreferredUid )
+{
+ TPckg<TInt> prefUid( aPreferredUid );
+ return SendReceive( EFavengPreferredUid, TIpcArgs( aFolder, &prefUid ) );
+}
+
+// ---------------------------------------------------------
+// RFavouritesDb::GetUids
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::GetUids
+ (
+ CArrayFix<TInt>& aUids,
+ TInt aParentFolderFilter /*=KFavouritesNullUid*/,
+ CFavouritesItem::TType aTypeFilter /*=CFavouritesItem::ENone*/,
+ const TDesC* aNameFilter /*=NULL*/,
+ TInt32 aContextIdFilter /*=KFavouritesNullContextId*/
+ )
+ {
+ RFavouritesBuf buf;
+ TFavouritesFilter filter
+ ( aParentFolderFilter, aTypeFilter, aNameFilter, aContextIdFilter );
+ TPckg<TFavouritesFilter> filterPckg( filter );
+ TIpcArgs args( &filterPckg );
+ TInt err = buf.Open( *this, EFavengGetUids, args );
+ if( !err )
+ {
+ RReadStream stream( &buf );
+ TRAP( err, FavouritesUtil::InternalizeL( aUids, stream ) );
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Delete
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Delete( TInt aUid )
+ {
+ return SendReceive( EFavengDelete, TIpcArgs( aUid ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Update
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Update
+( CFavouritesItem& aItem, TInt aUid, TBool aAutoRename )
+ {
+ RFavouritesBuf buf;
+ TInt err = buf.Open( iSess );
+ if ( !err )
+ {
+ RWriteStream stream( &buf );
+ TRAP( err, aItem.ExternalizeL( stream ) );
+ if ( !err )
+ {
+ TRAP( err, stream.CommitL() );
+ if ( !err )
+ {
+ err = SendReceive( EFavengUpdate, TIpcArgs
+ ( buf.Handle(), aUid, aAutoRename ) );
+ if ( !err )
+ {
+ RReadStream readStream( &buf );
+ TRAP( err, aItem.iImpl->InternalizeUpdateDeltaL
+ ( readStream ) );
+ }
+ }
+ }
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Add
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Add( CFavouritesItem& aItem, TBool aAutoRename )
+ {
+ RFavouritesBuf buf;
+ TInt err = buf.Open( iSess );
+ if ( !err )
+ {
+ RWriteStream stream( &buf );
+ TRAP( err, aItem.ExternalizeL( stream ) );
+ if ( !err )
+ {
+ TRAP( err, stream.CommitL() );
+ if ( !err )
+ {
+ err = SendReceive( EFavengAdd, TIpcArgs
+ ( buf.Handle(), aAutoRename ) );
+ if ( !err )
+ {
+ RReadStream readStream( &buf );
+ TRAP( err, aItem.iImpl->InternalizeUpdateDeltaL
+ ( readStream ) );
+ }
+ }
+ }
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetHomepage
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetHomepage( CFavouritesItem& aItem )
+ {
+ return SetSpecialItem( aItem, KFavouritesHomepageUid );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetLastVisited
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetLastVisited( CFavouritesItem& aItem )
+ {
+ return SetSpecialItem( aItem, KFavouritesLastVisitedUid );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetFactoryItem
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetFactoryItem( TInt aUid, TBool aFactoryItem )
+ {
+ return SendReceive
+ ( EFavengSetFactoryItem, TIpcArgs( aUid, aFactoryItem ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetReadOnly
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetReadOnly( TInt aUid, TBool aReadOnly )
+ {
+ return SendReceive( EFavengSetReadOnly, TIpcArgs( aUid, aReadOnly ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetModified
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetModified( TInt aUid, TTime aModified )
+ {
+ return SendReceive( EFavengSetModified, TIpcArgs
+ ( aUid, I64HIGH( aModified.Int64() ), I64LOW( aModified.Int64() ) ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetPreferredUid
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetPreferredUid( TInt aFolder, TInt aUid )
+ {
+ return SendReceive( EFavengSetPreferredUid, TIpcArgs( aFolder, aUid ) );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::ItemExists
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::ItemExists( TInt aUid, TBool& aItemExists )
+ {
+ TInt ret = SendReceive( EFavengItemExists, TIpcArgs( aUid ) );
+ if ( ret >= 0 )
+ {
+ aItemExists = ret;
+ ret = KErrNone;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::FolderExists
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::FolderExists( TInt aFolder, TBool& aFolderExists )
+ {
+ TInt ret = SendReceive( EFavengFolderExists, TIpcArgs( aFolder ) );
+ if ( ret >= 0 )
+ {
+ aFolderExists = ret;
+ ret = KErrNone;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::Count
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::Count
+ (
+ TInt& aCount,
+ TInt aParentFolderFilter /*=KFavouritesNullUid*/,
+ CFavouritesItem::TType aTypeFilter /*=CFavouritesItem::ENone*/,
+ const TDesC* aNameFilter /*=NULL*/,
+ TInt32 aContextIdFilter /*=KFavouritesNullContextId*/
+ )
+ {
+ TFavouritesFilter filter
+ ( aParentFolderFilter, aTypeFilter, aNameFilter, aContextIdFilter );
+ TPckg<TFavouritesFilter> filterPckg( filter );
+ TInt ret = SendReceive( EFavengCount, TIpcArgs( &filterPckg ) );
+ if ( ret >= 0 )
+ {
+ aCount = ret;
+ ret = KErrNone;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetData
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetData
+( TInt aUid, const MFavouritesItemData& aData )
+ {
+ return SetData( EFavengSetData, aUid, aData );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::GetData
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::GetData( TInt aUid, MFavouritesItemData& aData )
+ {
+ return GetData( EFavengGetData, aUid, aData );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetBrowserData
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::SetBrowserData
+( TInt aUid, const MFavouritesItemData& aData )
+ {
+ return SetData( EFavengSetBrowserData, aUid, aData );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::GetBrowserData
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::GetBrowserData
+( TInt aUid, MFavouritesItemData& aData )
+ {
+ return GetData( EFavengGetBrowserData, aUid, aData );
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::MakeUniqueName
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::MakeUniqueName( TDes& aName, TInt aFolder )
+ {
+ __ASSERT_ALWAYS( aName.MaxLength() >= Min\
+ ( aName.Length() + KFavouritesMaxPostfix, KFavouritesMaxName ), \
+ FavouritesPanic( EFavouritesBufferTooSmall ) );
+ TInt ret = SendReceive( EFavengMakeUniqueName,
+ TIpcArgs( &aName, aName.Length(), aFolder ) );
+ if ( ret >= 0 )
+ {
+ __ASSERT_DEBUG( aName.MaxLength() >= ret, \
+ FavouritesPanic( EFavouritesInternal ) );
+ aName.SetLength( ret );
+ ret = KErrNone;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::MakeUniqueName
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::MakeUniqueName( CFavouritesItem& aItem )
+ {
+ TBuf<KFavouritesMaxName> name = aItem.Name();
+ TInt err = MakeUniqueName( name, aItem.ParentFolder() );
+ if ( !err )
+ {
+ TRAP( err, aItem.SetNameL( name ) );
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::CreateStartPageItemL
+// ---------------------------------------------------------
+//
+EXPORT_C CFavouritesItem* RFavouritesDb::CreateStartPageItemL()
+ {
+ CFavouritesItem* item = CFavouritesItem::NewL();
+ item->iImpl->SetUid( KFavouritesStartPageUid );
+ return item;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::CreateAdaptiveItemsFolder
+// ---------------------------------------------------------
+//
+EXPORT_C CFavouritesItem* RFavouritesDb::CreateAdaptiveItemsFolderL()
+ {
+ CFavouritesItem* item = CFavouritesItem::NewL();
+ item->iImpl->SetUid( KFavouritesAdaptiveItemsFolderUid );
+ item->SetType( CFavouritesItem::EFolder );
+ item->SetParentFolder( KFavouritesRootUid );
+ return item;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::DeleteFile
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RFavouritesDb::DeleteFile( TInt aUid )
+ {
+ return SendReceive( EFavengFileDelete, TIpcArgs( aUid ) );
+ }
+
+
+
+// ---------------------------------------------------------
+// RFavouritesDb::RestoreFactorySettingsL
+// ---------------------------------------------------------
+//
+EXPORT_C void RFavouritesDb::RestoreFactorySettingsL
+( const TDesC& aName, const TDesC& aReferenceDbPath, MRfsApMapper& aApMapper )
+ {
+ FLOG(( _L("rstore:FavouritesDb.cpp RFavouritesDb::RestoreFactorySettingsL with param") ));
+
+ RFavouritesSession sess;
+ RFavouritesDb db;
+ User::LeaveIfError( sess.Connect() );
+ CleanupClosePushL<RFavouritesSession>( sess );
+ User::LeaveIfError( db.Open( sess, aName ) );
+ CleanupClosePushL<RFavouritesDb>( db );
+ db.DoRestoreFactorySettingsL( aReferenceDbPath, aApMapper );
+ CleanupStack::PopAndDestroy( 2 ); // Close db, close session
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetSpecialItem
+// ---------------------------------------------------------
+//
+TInt RFavouritesDb::SetSpecialItem( CFavouritesItem& aItem, TInt aUid )
+ {
+ RFavouritesBuf buf;
+ TInt err = buf.Open( iSess );
+ if ( !err )
+ {
+ RWriteStream stream( &buf );
+ TRAP( err, aItem.ExternalizeL( stream ) );
+ if ( !err )
+ {
+ TRAP( err, stream.CommitL() );
+ if ( !err )
+ {
+ err = SendReceive( EFavengSetSpecialItem, TIpcArgs
+ ( buf.Handle(), aUid ) );
+ if ( !err )
+ {
+ RReadStream readStream( &buf );
+ TRAP( err, aItem.iImpl->InternalizeUpdateDeltaL
+ ( readStream ) );
+ }
+ }
+ }
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::SetData
+// ---------------------------------------------------------
+//
+TInt RFavouritesDb::SetData
+( TInt aFunction, TInt aUid, const MFavouritesItemData& aData )
+ {
+ RFavouritesBuf buf;
+ TInt err = buf.Open( iSess );
+ if ( !err )
+ {
+ RWriteStream stream( &buf );
+ TRAP( err, aData.ExternalizeL( stream ) );
+ if ( !err )
+ {
+ TRAP( err, stream.CommitL() );
+ if ( !err )
+ {
+ err = SendReceive( aFunction, TIpcArgs
+ ( buf.Handle(), aUid ) );
+ }
+ }
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::GetData
+// ---------------------------------------------------------
+//
+TInt RFavouritesDb::GetData
+( TInt aFunction, TInt aUid, MFavouritesItemData& aData )
+ {
+ RFavouritesBuf buf;
+ TIpcArgs args( aUid );
+ TInt err = buf.Open( *this, aFunction, args );
+ if( !err )
+ {
+ RReadStream stream( &buf );
+ TRAP( err, aData.InternalizeL( stream ) );
+ buf.Close();
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::DoRestoreFactorySettingsL
+// ---------------------------------------------------------
+//
+void RFavouritesDb::DoRestoreFactorySettingsL
+( const TDesC& aReferenceDbPath, MRfsApMapper& aApMapper )
+ {
+ // Start transaction.
+ // As AP mapping functionality is an M class, it cannot be sent over to
+ // the server. Because of this, RFS is split into two phases (RFS of
+ // items and mapping AP-s). Therefore, the transaction has to be made here
+ // on client side.
+ User::LeaveIfError( Begin( /*aWrite=*/ ETrue ) );
+ CleanupRollbackPushL();
+
+ // Step 1: do the restore and collect AP-s to be mapped.
+ RFavouritesBuf buf;
+ TIpcArgs args( &aReferenceDbPath, aReferenceDbPath.Length() );
+ User::LeaveIfError
+ ( buf.Open( *this, EFavengRestoreFactorySettings, args ) );
+ CleanupClosePushL<RFavouritesBuf>( buf );
+ CUidMap* apMap = new (ELeave) CUidMap( KApMapGranularity );
+ CleanupStack::PushL( apMap );
+ RReadStream rs( &buf );
+ apMap->InternalizeL( rs );
+
+ // Step 2: map AP-s. (Omitted if there are no AP-s to map).
+ if ( apMap->Count() )
+ {
+ // Do the mapping.
+ TUint srcAp;
+ TUint tgtAp;
+ for ( TInt i = 0; i < apMap->Count(); i++ )
+ {
+ srcAp = STATIC_CAST( TUint, apMap->At( i ).iUid2 );
+ if ( aApMapper.MapAccessPoint( srcAp, tgtAp ) )
+ {
+ apMap->At( i ).iUid2 = STATIC_CAST( TInt, tgtAp );
+ }
+ }
+
+ // Send back mapped AP-s. Reusing existing buffer.
+ RWriteStream ws( &buf );
+ apMap->ExternalizeL( ws );
+ ws.CommitL();
+ User::LeaveIfError( SendReceive
+ ( EFavengSetAccessPoints, TIpcArgs( buf.Handle() ) ) );
+ }
+ CleanupStack::PopAndDestroy( 2 ); // apMap, close buf.
+
+ // Commit changes.
+ User::LeaveIfError( Commit() );
+ CleanupStack::Pop(); // Pop the rollback.
+ }
+
+// ---------------------------------------------------------
+// RFavouritesDb::StaticRollback
+// ---------------------------------------------------------
+//
+void RFavouritesDb::StaticRollback( TAny* aPtr )
+ {
+ STATIC_CAST( RFavouritesDb*, aPtr )->Rollback();
+ }
+
+// End of File