simpleengine/presencesettingsapi/src/pressettingsapi.cpp
changeset 0 c8caa15ef882
child 25 e53c01f160bc
--- /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