diff -r 000000000000 -r c8caa15ef882 simpleengine/presencesettingsapi/src/pressettingsapi.cpp --- /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 + +#include "pressettingsapi.h" +#include "pressettingsapilogger.h" + + +// --------------------------------------------------------------------------- +// PresSettingsApi::GetAllSetsNamesLC +// --------------------------------------------------------------------------- +// +EXPORT_C CDesCArray* PresSettingsApi::GetAllSetsNamesLC( RArray& 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 idKeys; + TInt error = repository->FindL( KSimpleSetId, KOnlyColumnInfo, idKeys ); + CleanupClosePushL( idKeys ); + + TInt idCount = idKeys.Count(); + + OPENG_DP(D_OPENG_LIT( " idCount = %d"), idCount); + + TBuf 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]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 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; iKLastUseableRow)) + 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; iGet(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