--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/simpleengine/presencesettingsapi/src/pressettingsapi.cpp Tue Feb 02 01:05:17 2010 +0200
@@ -0,0 +1,510 @@
+/*
+* Copyright (c) 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: Presence Settings API designed for creating and editing
+* setting sets for presence. Usually used by UI components.
+*
+*/
+
+
+
+
+// Includes
+#include <centralrepository.h>
+
+#include "pressettingsapi.h"
+#include "pressettingsapilogger.h"
+
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::GetAllSetsNamesLC
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CDesCArray* PresSettingsApi::GetAllSetsNamesLC( RArray<TInt>& aSetIds )
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::GetAllSetsNamesLC"));
+
+ CDesCArrayFlat* sets = new ( ELeave ) CDesCArrayFlat(KPresNormalListLength);
+ CleanupStack::PushL( sets );
+
+ CRepository* repository = CRepository::NewL( KCRUIDSimpleOTA );
+ CleanupStack::PushL( repository );
+
+ RArray<TUint32> idKeys;
+ TInt error = repository->FindL( KSimpleSetId, KOnlyColumnInfo, idKeys );
+ CleanupClosePushL( idKeys );
+
+ TInt idCount = idKeys.Count();
+
+ OPENG_DP(D_OPENG_LIT( " idCount = %d"), idCount);
+
+ TBuf<KPresSetNameMaxLength> setName;
+ TInt setId(NULL);
+
+ TInt errID(KErrNone);
+ TInt errName(KErrNone);
+ TUint32 error2(KErrNone);
+ TUint32 row;
+
+ for( TInt i = 0;i < idCount;i++ )
+ {
+ // avoid the 0th and 256th rows
+ if ((idKeys[i]<KUnitRow) || (idKeys[i]>KLastUseableRow))
+ continue;
+
+ row = idKeys[i] & KOnlyRowInfo;
+
+ errName = repository->Get( row + KSimpleSetName, setName );
+ errID = repository->Get( idKeys[i], setId );
+
+ if( (errName != KErrNone) || (errID != KErrNone)) // if some error in getting
+ {
+ // try deleting the troubled row
+ repository->Delete( row, KOnlyRowInfo, error2);
+ OPENG_DP(D_OPENG_LIT( " Error in Get(name): i = %d"),i);
+ OPENG_DP(D_OPENG_LIT( " Error in Get(id) : i = %d"),i);
+ continue;
+ }
+ else
+ {
+ sets->AppendL(setName);
+ aSetIds.Append(setId);
+ }
+ setName.Zero();
+ }
+
+ CleanupStack::PopAndDestroy(&idKeys); //idKeys
+ CleanupStack::PopAndDestroy(repository); //repository
+ return sets;
+
+ }
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::CreateSetL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt PresSettingsApi::CreateSetL(TPresSettingsSet aSet )
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::CreateSetL"));
+ CRepository* repository = CRepository::NewL( KCRUIDSimpleOTA );
+ CleanupStack::PushL( repository );
+
+ TUint32 row = GetFreshRawInHex(repository);
+ OPENG_DP(D_OPENG_LIT( " row: %d"),row);
+ TInt error(KErrNone);
+ TUint32 error2(KErrNone);
+
+
+ // Create the set id in different way
+ TInt id = CreateUniqueIdL( repository, row );
+
+ OPENG_DP(D_OPENG_LIT( " id: %d"),id);
+
+ error = error + repository->Create( row+KSimpleSetName, aSet.iSetName);
+ error = error + repository->Create( row+KSimpleSipProfile, aSet.iSipProfile );
+ error = error + repository->Create( row+KSimpleXDMSet, aSet.iXDMSetting );
+ error = error + repository->Create( row+KSimpleClientObjDataLimit, aSet.iObjectSize );
+ error = error + repository->Create( row+KSimpleContentSvrAdd, aSet.iContSrvrAdd );
+ error = error + repository->Create( row+KSimpleStatusofProps, aSet.iStatusOfProps );
+ error = error + repository->Create( row+KSimpleSourceThrottlePublish, aSet.iPublicationInt );
+ error = error + repository->Create( row+KSimpleMaxNbrPresenceSubs, aSet.iMaxSubscriptions );
+ error = error + repository->Create( row+KSimpleMaxNbrSubsInList, aSet.iMaxContactsInList );
+ error = error + repository->Create( row+KSimpleServiceUriTemplate, aSet.iDomainSyntax );
+ error = error + repository->Create( row+KSimpleProviderID, aSet.iProviderID );
+
+ if (error<0) // was there one of more errors then try deleting this currupt row
+ {
+ error = repository->Delete( row, KOnlyRowInfo, error2);
+ User::Leave(KErrCorrupt);
+ }
+
+ CleanupStack::PopAndDestroy(repository); //repository
+
+ OPENG_DP(D_OPENG_LIT( " id: %d"),id);
+ return id;
+ }
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::UpdateSetL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt PresSettingsApi::UpdateSetL(TPresSettingsSet aSet, TInt aSetID)
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::UpdateSetL(%d)"),aSetID);
+
+ CRepository* repository = CRepository::NewL( KCRUIDSimpleOTA );
+ CleanupStack::PushL( repository );
+
+ TInt ret(KErrNotFound);
+ TInt error(KErrNone);
+ TUint32 error2(KErrNone);
+
+ TUint32 row = PresSettingsApi::GetRawInHexL(repository,aSetID);
+ OPENG_DP(D_OPENG_LIT( " row: %d, id: %d"),row, aSetID);
+ if(row>0) // if a valid row is found
+ {
+ error = error + repository->Set( row+KSimpleSetName, aSet.iSetName);
+ error = error + repository->Set( row+KSimpleSipProfile, aSet.iSipProfile );
+ error = error + repository->Set( row+KSimpleXDMSet, aSet.iXDMSetting );
+ error = error + repository->Set( row+KSimpleClientObjDataLimit, aSet.iObjectSize );
+ error = error + repository->Set( row+KSimpleContentSvrAdd, aSet.iContSrvrAdd );
+ error = error + repository->Set( row+KSimpleStatusofProps, aSet.iStatusOfProps );
+ error = error + repository->Set( row+KSimpleSourceThrottlePublish, aSet.iPublicationInt );
+ error = error + repository->Set( row+KSimpleMaxNbrPresenceSubs, aSet.iMaxSubscriptions );
+ error = error + repository->Set( row+KSimpleMaxNbrSubsInList, aSet.iMaxContactsInList );
+ error = error + repository->Set( row+KSimpleServiceUriTemplate, aSet.iDomainSyntax );
+ error = error + repository->Set( row+KSimpleProviderID, aSet.iProviderID );
+
+
+ if (error<0) // was there one of more errors then try deleting this currupt row
+ {
+ error = repository->Delete( row, KOnlyRowInfo, error2);
+ ret = KErrCorrupt;
+ }
+ else
+ ret = KErrNone;
+ }
+
+ CleanupStack::PopAndDestroy(repository); //repository
+
+ OPENG_DP(D_OPENG_LIT( " ret: %d"),ret);
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::RemoveSetL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt PresSettingsApi::RemoveSetL( TInt aSetID )
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::RemoveSetL"));
+
+ CRepository* repository = CRepository::NewL( KCRUIDSimpleOTA );
+ CleanupStack::PushL( repository );
+
+ TInt ret(KErrNotFound);
+ TUint32 error(KErrNone);
+ TUint32 error2(KErrNone);
+
+ TUint32 row = PresSettingsApi::GetRawInHexL(repository,aSetID);
+ OPENG_DP(D_OPENG_LIT( " row: %d, id: %d"),row, aSetID);
+ if(row>0) // if a valid row is found
+ {
+ //Delete all entries on the row
+ TInt retError = repository->Delete( row, KOnlyRowInfo, error);
+ if (retError<0) // was there one of more errors then try deleting this currupt row
+ {
+ error = repository->Delete( row, KOnlyRowInfo, error2);
+ ret = KErrCorrupt;
+ }
+ else
+ ret = KErrNone;
+ }
+
+ CleanupStack::PopAndDestroy(repository); //repository
+
+ OPENG_DP(D_OPENG_LIT( " ret: %d"),ret);
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::UpdatePropertyL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt PresSettingsApi::UpdatePropertyL( TInt aSetID,
+ TPresSettingsProperty aPropertyName,
+ TInt aPropValueInt
+ )
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::UpdatePropertyL"));
+
+ CRepository* repository = CRepository::NewL( KCRUIDSimpleOTA );
+ CleanupStack::PushL( repository );
+
+ TInt ret(KErrNotFound);
+ TInt error(KErrNone);
+ TUint32 error2(KErrNone);
+
+ TUint32 row = PresSettingsApi::GetRawInHexL(repository,aSetID);
+ OPENG_DP(D_OPENG_LIT( " row: %d, id: %d"),row, aSetID);
+ if(row>0) // if a valid row is found
+ {
+ if((IsStr(aPropertyName))||(aPropertyName==EPresPropSetID))
+ {
+ // because property and its value doesnt match
+ ret = KErrArgument;
+ }
+ else
+ {
+ error = repository->Set( row+aPropertyName, aPropValueInt );
+ if (error<0) // was there one of more errors then try deleting this currupt row
+ {
+ error = repository->Delete( row, KOnlyRowInfo, error2);
+ ret = KErrCorrupt;
+ }
+ else
+ ret = KErrNone;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(repository); //repository
+
+ OPENG_DP(D_OPENG_LIT( " ret: %d"),ret);
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::UpdatePropertyL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt PresSettingsApi::UpdatePropertyL( TInt aSetID,
+ TPresSettingsProperty aPropertyName,
+ const TDesC& aPropValueDes
+ )
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::UpdatePropertyL"));
+
+ CRepository* repository = CRepository::NewL( KCRUIDSimpleOTA );
+ CleanupStack::PushL( repository );
+
+ TInt ret(KErrNotFound);
+ TInt error(KErrNone);
+ TUint32 error2(KErrNone);
+
+ TUint32 row = PresSettingsApi::GetRawInHexL(repository,aSetID);
+ OPENG_DP(D_OPENG_LIT( " row: %d, id: %d"),row, aSetID);
+ if(row>0) // if a valid row is found
+ {
+ if((!IsStr(aPropertyName))||(aPropertyName==EPresPropSetID))
+ {
+ // because property and its value doesnt match
+ ret = KErrArgument;
+ }
+ else
+ {
+ error = repository->Set( row+aPropertyName, aPropValueDes );
+ if (error<0) // was there one of more errors then try deleting this currupt row
+ {
+ error = repository->Delete( row, KOnlyRowInfo, error2);
+ ret = KErrCorrupt;
+ }
+ else
+ ret = KErrNone;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(repository); //repository
+ OPENG_DP(D_OPENG_LIT( " ret: %d"),ret);
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::SettingsSetL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt PresSettingsApi::SettingsSetL(TInt aSetID, TPresSettingsSet& aSet)
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::SettingsSetL"));
+
+ CRepository* repository = CRepository::NewL( KCRUIDSimpleOTA );
+ CleanupStack::PushL( repository );
+
+ TInt ret(KErrNotFound);
+ TInt error(KErrNone);
+ TUint32 error2(KErrNone);
+
+ TUint32 row = PresSettingsApi::GetRawInHexL(repository,aSetID);
+ OPENG_DP(D_OPENG_LIT( " row: %d, id: %d"),row, aSetID);
+ if(row>0) // if a valid row is found
+ {
+ error = error + repository->Get( row+KSimpleSetName, aSet.iSetName);
+ error = error + repository->Get( row+KSimpleSipProfile, aSet.iSipProfile );
+ error = error + repository->Get( row+KSimpleXDMSet, aSet.iXDMSetting );
+ error = error + repository->Get( row+KSimpleClientObjDataLimit, aSet.iObjectSize );
+ error = error + repository->Get( row+KSimpleContentSvrAdd, aSet.iContSrvrAdd );
+ error = error + repository->Get( row+KSimpleStatusofProps, aSet.iStatusOfProps );
+ error = error + repository->Get( row+KSimpleSourceThrottlePublish, aSet.iPublicationInt );
+ error = error + repository->Get( row+KSimpleMaxNbrPresenceSubs, aSet.iMaxSubscriptions );
+ error = error + repository->Get( row+KSimpleMaxNbrSubsInList, aSet.iMaxContactsInList );
+ error = error + repository->Get( row+KSimpleServiceUriTemplate, aSet.iDomainSyntax );
+ error = error + repository->Get( row+KSimpleProviderID, aSet.iProviderID );
+
+ if (error<0) // was there one of more errors then try deleting this currupt row
+ {
+ error = repository->Delete( row, KOnlyRowInfo, error2);
+ ret = KErrCorrupt;
+ }
+ else
+ ret = KErrNone;
+ }
+
+ CleanupStack::PopAndDestroy(repository); //repository
+ OPENG_DP(D_OPENG_LIT( " ret: %d"),ret);
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// PresSettingsApi::DecodePropertyStatus
+// ---------------------------------------------------------
+//
+EXPORT_C TPresPropStatus PresSettingsApi::DecodePropertyStatus(TInt aStatusOfProps,
+ TPresSettingsProperty aPropertyName)
+ {
+ TInt shiftNumber = (aPropertyName-1) * 2;
+ TInt maskNumber = 0x3 << shiftNumber;
+ return TPresPropStatus((aStatusOfProps & maskNumber)>>shiftNumber);
+ }
+
+// ---------------------------------------------------------
+// PresSettingsApi::EncodePropertyStatus
+// ---------------------------------------------------------
+//
+EXPORT_C void PresSettingsApi::EncodePropertyStatus(TInt& aStatusOfProps,
+ TPresPropStatus aPropertyStatus,
+ TPresSettingsProperty aPropertyName)
+ {
+ TInt shiftNumber = (aPropertyName-1) * 2;
+ TInt maskNumber = (0x3 << shiftNumber)^KFullValue;
+ aStatusOfProps = (aStatusOfProps & maskNumber) | (aPropertyStatus << shiftNumber);
+ }
+
+// ---------------------------------------------------------
+// PresSettingsApi::IsStr
+// ---------------------------------------------------------
+//
+EXPORT_C TBool PresSettingsApi::IsStr( TPresSettingsProperty aProperty )
+ {
+ OPENG_DP(D_OPENG_LIT( "PresSettingsApi::IsStr"));
+ TBool ret(EFalse);
+ if((aProperty==KSimpleSetName)||(aProperty==KSimpleContentSvrAdd)||
+ (aProperty==KSimpleProviderID)||(aProperty==KSimpleServiceUriTemplate))
+ ret = ETrue;
+
+ OPENG_DP(D_OPENG_LIT( " ret: %d"),ret);
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// PresSettingsApi::GetRawInHexL
+// ---------------------------------------------------------------------------
+//
+TUint32 PresSettingsApi::GetRawInHexL( CRepository* aRepository, TInt aSetID )
+ {
+ OPENG_DP(D_OPENG_LIT( " PresSettingsApi::GetRawInHexL"));
+ TInt error(KErrNone);
+ TInt tempValue(0);
+ TUint32 ret(0);
+
+ // Find all SetId keys
+ RArray<TUint32> idKeys;
+ error = aRepository->FindL( KSimpleSetId, KOnlyColumnInfo, idKeys );
+ CleanupClosePushL( idKeys );
+ User::LeaveIfError(error);
+
+ TInt count = idKeys.Count();
+ OPENG_DP(D_OPENG_LIT( " count: %d"),count);
+
+ // start from 1st row and search the whole range of rows
+ for (TInt i=0; i<count; i++)
+ {
+ // avoid the 0th and 256th rows
+ if ((idKeys[i]<KUnitRow) || (idKeys[i]>KLastUseableRow))
+ continue;
+ error = aRepository->Get(idKeys[i], tempValue);
+ User::LeaveIfError(error);
+
+ if(tempValue == aSetID)
+ {
+ ret = idKeys[i] & KOnlyRowInfo; // remove column info and return
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); //idKeys
+ OPENG_DP(D_OPENG_LIT( " ret: %d"),ret);
+ return ret;
+ }
+
+// ---------------------------------------------------------
+// PresSettingsApi::CreateUniqueIdL
+// ---------------------------------------------------------
+//
+TInt PresSettingsApi::CreateUniqueIdL( CRepository* aRepository,
+ TUint32 aRowInHex )
+ {
+ OPENG_DP(D_OPENG_LIT( " PresSettingsApi::CreateUniqueIdL aRowInHex:%d"),aRowInHex);
+
+ TInt error(KErrNone);
+
+ // At row = KLastRow(0x10000), column = KSimpleSetId, we store the Set Ids which have been allocated
+ // each time we +1 to get a fresh Set Id
+ TInt setId(0);
+ error = aRepository->Get(KLastRow+KSimpleSetId, setId);
+ if (error==KErrNotFound) // first time writing
+ {
+ error = aRepository->Create(KLastRow+KSimpleSetId, setId);
+ }
+ //if we cant create nor get then leave
+ User::LeaveIfError(error);
+
+ //increase the id to have the next one
+ setId++;
+
+ // set this id back to allocated ids storage
+ error = aRepository->Set(KLastRow+KSimpleSetId, setId);
+ User::LeaveIfError(error);
+
+ //put id to the provided row
+ error = aRepository->Create( aRowInHex+KSimpleSetId, setId );
+ User::LeaveIfError(error);
+
+ OPENG_DP(D_OPENG_LIT( " setId: %d"),setId);
+ return setId;
+ }
+
+// ---------------------------------------------------------
+// PresSettingsApi::GetFreshRawInHex
+// ---------------------------------------------------------
+//
+TUint32 PresSettingsApi::GetFreshRawInHex( CRepository* aRepository )
+ {
+ OPENG_DP(D_OPENG_LIT( " PresSettingsApi::GetFreshRawInHex"));
+ TInt error(KErrNone);
+ TInt tempValue(NULL);
+ TUint32 i(NULL);
+
+ //search for ids on all rows
+ for (i=KUnitRow+KSimpleSetId; i<KLastRow; i+=KUnitRow)
+ {
+ error = aRepository->Get(i, tempValue);
+
+ // if this value is 0 or row doesnt exists
+ if((tempValue==0)||(error==KErrNotFound))
+ {
+ OPENG_DP(D_OPENG_LIT( " found at, error:%d, i:%d"),error, i);
+ error = KErrNone;
+ break;
+ }
+
+ tempValue = NULL;
+
+ //break if there is any other error
+ if(error<0)
+ return error;
+ }
+ i = i & KOnlyRowInfo; // remove the column info from row
+ OPENG_DP(D_OPENG_LIT( " i: %d"),i);
+ return i;
+ }
+
+//end of file