diff -r 000000000000 -r e6b17d312c8b imservices/xmppsettingsapi/src/xmppsettingsrecord.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imservices/xmppsettingsapi/src/xmppsettingsrecord.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,204 @@ +/* +* Copyright (c) 2007 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: This class is used for data table manipulations. +* +*/ + + +#include + +//XMPP includes +// #include "// GFLOGger.h" + +#include "xmppsettingsrecord.h" +#include "xmppsettingsapicommon.h" + +// ======== MEMBER FUNCTIONS ======== + +CXmppSettingsRecord::CXmppSettingsRecord( + CRepository& aRepository ): + iRepository( aRepository ) + { + + } + +CXmppSettingsRecord* CXmppSettingsRecord::NewL( + CRepository& aRepository ) + { + CXmppSettingsRecord* self = CXmppSettingsRecord::NewLC( aRepository ); + CleanupStack::Pop( self ); + return self; + } + +CXmppSettingsRecord* CXmppSettingsRecord::NewLC( + CRepository& aRepository ) + { + CXmppSettingsRecord* self + = new( ELeave ) CXmppSettingsRecord( aRepository ); + CleanupStack::PushL( self ); + return self; + } + + +CXmppSettingsRecord::~CXmppSettingsRecord() + { + // GFLOG1("CXmppSettingsRecord::~CXmppSettingsRecord"); + iSettingsRecordKeyArray.Reset(); + iSettingsRecordKeyArray.Close(); + } + + +// --------------------------------------------------------------------------- +// Finds settingsRecord key. Leaves if not found. +// --------------------------------------------------------------------------- +// +void CXmppSettingsRecord::FindSettingsRecordKeyL( + TUint32 aSettingsRecordId, + TUint32& aSettingsRecordKey ) + { + GetSettingsRecordkeysL(); + + TInt counter( iSettingsRecordKeyArray.Count() ); + TInt key = KErrNotFound; + for (TInt i = 0; i< counter; i++) + { + TInt id( 0 ); + User::LeaveIfError( iRepository.Get( iSettingsRecordKeyArray[i], + id ) ); + if ( id == aSettingsRecordId ) + { + key = iSettingsRecordKeyArray[i]; + break; + } + } + aSettingsRecordKey = key; + + } + +// --------------------------------------------------------------------------- +// returns list of all id keys. +// --------------------------------------------------------------------------- +// +void CXmppSettingsRecord::GetSettingsRecordkeysL( + RArray& aResults ) + { + GetSettingsRecordkeysL(); + + TInt count( iSettingsRecordKeyArray.Count() ); + for ( TInt i=0; i < count; i++ ) + { + aResults.Append( iSettingsRecordKeyArray[i] ); + } + } + +// --------------------------------------------------------------------------- +// This method creates new settings id. +// --------------------------------------------------------------------------- +// +void CXmppSettingsRecord::CreateSettingsRecordIdL( + TUint32& aNewSettingId ) + { + // GFLOG1("CXmppSettingsRecord::CreateSettingsRecordIdL - IN"); + + TUint32 nextFreeSlot( 0 ); + + NextFreeSlotL( nextFreeSlot ); + + TInt settingId( 0 ); + + TInt error( iRepository.Get( KCurrentSettingIdIndex, settingId ) ); + // LOGERR("CXmppSettingsRecord::CreateSettingsRecordIdL - iRepository.Get( KCurrentSettingIdIndex ) - error: %d", error); + + if ( !error ) + { + settingId++; + // GFLOG3("CXmppSettingsRecord::CreateSettingsRecordIdL - nextFreeSlot: 0x%08x, settingId: %d",nextFreeSlot, settingId); + error = iRepository.Create( nextFreeSlot, settingId ); + // LOGERR("CXmppSettingsRecord::CreateSettingsRecordIdL - iRepository.Create( nextFreeSlot ) - error: %d", error); + if ( !error ) + { + error = iRepository.Set( KCurrentSettingIdIndex, settingId ); + aNewSettingId = settingId; + } + } + User::LeaveIfError( error ); + // GFLOG1("CXmppSettingsRecord::CreateSettingsRecordIdL - OUT"); + } + + +// PRIVATE + + +// --------------------------------------------------------------------------- +// returns next free slot key. +// --------------------------------------------------------------------------- +// +void CXmppSettingsRecord::NextFreeSlotL( + TUint32& aFreekey ) + { + // First, find all rows and get count. + const TUint32 shift = 0x00010000; + + GetSettingsRecordkeysL(); + + const TInt count( iSettingsRecordKeyArray.Count() ); + // GFLOG2("CXmppSettingsRecord::NextFreeSlotL - count: %d",count); + + if ( count == 0 ) + { + aFreekey = KXmppKeyDataTable; + } + // check for free slots + else + { + TBool foundFreeSlot( EFalse ); + + // go through all indexes and try to find free one. + for ( TInt i=0; i < count; i++ ) + { + TUint32 tmpKey( KXmppKeyDataTable | ( i * shift ) ); + TInt answer( iSettingsRecordKeyArray.Find( tmpKey ) ); + + if ( answer == KErrNotFound ) + { + foundFreeSlot = ETrue; + aFreekey = tmpKey; + break; + } + } + if ( !foundFreeSlot ) + { + // GFLOG1("CXmppSettingsRecord::NextFreeSlotL - no free slots, creating new"); + aFreekey = KXmppKeyDataTable | ( count * shift ); + } + } + // GFLOG2("CXmppSettingsRecord::NextFreeSlotL - aFreekey: 0x%08x",aFreekey); + + } + +// --------------------------------------------------------------------------- +// Find all unique settings ids. +// --------------------------------------------------------------------------- +// +void CXmppSettingsRecord::GetSettingsRecordkeysL() + { + iSettingsRecordKeyArray.Reset(); + + TInt error = iRepository.FindL( KXmppKeyDataTable, + KXmppMaskAllRows, + iSettingsRecordKeyArray ); + + // GFLOG2("CXmppSettingsRecord::GetSettingsRecordkeysL - iSettingsRecordKeyArray.Count(): %d",iSettingsRecordKeyArray.Count()); + + }