XDMEngine/XdmSettingsApi/src/XdmSettingsApi.cpp
changeset 0 c8caa15ef882
child 8 aca99fb8a3dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/XDMEngine/XdmSettingsApi/src/XdmSettingsApi.cpp	Tue Feb 02 01:05:17 2010 +0200
@@ -0,0 +1,525 @@
+/*
+* Copyright (c) 2005 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:   XDM Engine settings API
+*
+*/
+
+
+
+#include <flogger.h>
+#include <centralrepository.h>
+#include "XdmSettingsApi.h"
+#include "XdmSettingsProperty.h"
+#include "XdmSettingsCollection.h"
+
+// ---------------------------------------------------------
+// TXdmSettingsApi::CreateCollectionL
+//
+// ---------------------------------------------------------
+//
+EXPORT_C TInt TXdmSettingsApi::CreateCollectionL( const CXdmSettingsCollection& aCollection )
+    {
+    #ifdef _DEBUG
+        WriteToLog( _L8( "TXdmSettingsApi::CreateCollectionL()" ) );
+    #endif
+    TInt error = KErrArgument;
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    TInt row = LastRow( repository );
+    TInt count = aCollection.Count();
+    __ASSERT_DEBUG( count > 0, User::Leave( KErrArgument ) );
+    for( TInt i = 0;i < count;i++ )
+        {
+        const CXdmSettingsProperty& prop = aCollection.Property( i );
+        TInt32 column = prop.PropertyName();
+        //Don't let the client set the settings ID, since
+        //this might create conflicting IDs in the repository
+        if( column != KXdmSettingsId )
+            {
+            //Now merge row & column
+            TInt32 newKey = ( row * 0x100 ) | column;
+            error = repository->Create( newKey, prop.PropertyValue() );
+            #ifdef _DEBUG
+                HBufC8* buf = HBufC8::NewLC( prop.PropertyValue().Length() );
+                buf->Des().Copy( prop.PropertyValue() );
+                TPtrC8 des( buf->Des() );
+                WriteToLog( _L8( " New key [0x%08x] created - Name: %d  Value: %S" ), newKey, column, &des );
+                CleanupStack::PopAndDestroy();  //buf
+            #endif
+            }
+        }
+    error = CreateUniqueIdL( repository, row );
+    #ifdef _DEBUG
+        WriteToLog( _L8( " New settings ID created - ID: %d  Error: %d" ), row, error );
+    #endif
+    CleanupStack::PopAndDestroy();  //repository
+    return error == KErrNone ? row : error;
+    }
+
+// ---------------------------------------------------------
+// TXdmSettingsApi::RemoveCollectionL
+//
+// ---------------------------------------------------------
+//
+EXPORT_C void TXdmSettingsApi::RemoveCollectionL( TInt aSettingsId )
+    {
+    #ifdef _DEBUG
+        WriteToLog( _L8( "TXdmSettingsApi::RemoveCollectionL() - ID: %d" ), aSettingsId );
+    #endif
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    TInt row = FindRowL( aSettingsId, repository );
+    if( row >= KErrNone )
+        {
+        TInt32 key = -1;
+        TInt error = KErrNone;
+        for( TInt i = 0;i < KXdmPropertyCount;i++ )
+            {
+            key = ( row * 0x100 ) | i;
+            error = repository->Delete( key );
+            #ifdef _DEBUG
+                WriteToLog( _L8( " Key %x deleted - Error: %d" ), key, error );
+            #endif
+            }
+        }
+    else User::Leave( KErrNotFound );
+    CleanupStack::PopAndDestroy();
+    }
+    
+// ---------------------------------------------------------
+// TXdmSettingsApi::CreatePropertyL
+//
+// ---------------------------------------------------------
+//   
+EXPORT_C void TXdmSettingsApi::CreatePropertyL( TInt aSettingsId,
+                                                const TDesC& aPropertyValue,
+                                                TXdmSettingsProperty aPropertyName )
+    {
+    #ifdef _DEBUG
+        WriteToLog( _L8( "TXdmSettingsApi::UpdatePropertyL()" ) );
+        WriteToLog( _L8( "  Property:           %d" ), aPropertyName );
+        WriteToLog( _L8( "  Property set ID:    %d" ), aSettingsId );
+        WriteToLog( _L8( "  Property value:     %S" ), &aPropertyValue );
+    #endif
+    TInt error = KErrNotFound;
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    TInt row = FindRowL( aSettingsId, repository );
+    if( row >= 0 )      
+        {
+        TInt32 key = ( row * 0x100 ) | aPropertyName;
+        error = repository->Create( key, aPropertyValue );
+        if( error != KErrNone )
+            {
+            #ifdef _DEBUG
+                WriteToLog( _L8( "  Create() failed with %d" ), error );
+            #endif
+            User::Leave( error );
+            }
+        }
+    else                            //No keys or too many
+        {
+        #ifdef _DEBUG
+            WriteToLog( _L8( "  Property set not found - Error: %d" ), row );
+        #endif
+        User::Leave( error );
+        } 
+    CleanupStack::PopAndDestroy();  //repository
+    }
+
+// ---------------------------------------------------------
+// TXdmSettingsApi::UpdatePropertyL
+//
+// ---------------------------------------------------------
+//   
+EXPORT_C void TXdmSettingsApi::UpdatePropertyL( TInt aSettingsId,
+                                                const TDesC& aPropertyValue,
+                                                TXdmSettingsProperty aPropertyName )
+
+    {
+    #ifdef _DEBUG
+        HBufC8* value = HBufC8::NewLC( aPropertyValue.Length() );
+        TPtr8 prop( value->Des() );
+        prop.Copy( aPropertyValue ); 
+        WriteToLog( _L8( "TXdmSettingsApi::UpdatePropertyL()" ) );
+        WriteToLog( _L8( "  Settings ID:      %d" ), aSettingsId );
+        WriteToLog( _L8( "  Property name:    %d" ), aPropertyName );
+        WriteToLog( _L8( "  Property value:   %S" ), &prop );
+        CleanupStack::PopAndDestroy();  //value
+    #endif
+    TInt error = KErrAlreadyExists;
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    RArray<TUint32> keys = FindByIdL( aSettingsId, repository );
+    CleanupClosePushL( keys );
+    TInt count = keys.Count();
+    if( count == 1 )      
+        {
+        TInt32 row = ( keys[0] & 0xFFFFFF00 ) / 0x100;
+        TInt32 key = ( row * 0x100 ) | aPropertyName;
+        #ifdef _DEBUG
+            WriteToLog( _L8( "  Key to update:    0x%08x" ), key );
+        #endif
+        error = repository->Set( key, aPropertyValue );
+        if( error != KErrNone )
+            {
+            #ifdef _DEBUG
+                WriteToLog( _L8( "  Set() failed with %d, try Create()" ), error );
+            #endif
+            error = repository->Create( key, aPropertyValue );
+            #ifdef _DEBUG
+                WriteToLog( _L8( "  Create() completed with %d" ), error );
+            #endif
+            }
+        }
+    else                            //No keys or too many
+        {
+        #ifdef _DEBUG
+            TBuf<32> errBuf;
+            count > 0 ? errBuf.Append( _L( "Too many results" ) ) :
+                        errBuf.Append( _L( "No results found" ) );
+            WriteToLog( _L8( "  * Error - %S: %d" ), &errBuf, count );
+        #endif
+        TInt error = count > 0 ? KErrGeneral : KErrNotFound;
+        User::Leave( error );
+        } 
+    CleanupStack::PopAndDestroy( 2 );  //keys, repository
+    }
+
+// ---------------------------------------------------------
+// TXdmSettingsApi::RemovePropertyL
+//
+// ---------------------------------------------------------
+//
+EXPORT_C void TXdmSettingsApi::RemovePropertyL( TInt aSettingsId,
+                                                TXdmSettingsProperty aPropertyName )
+    {
+    #ifdef _DEBUG
+        WriteToLog( _L8( "TXdmSettingsApi::RemovePropertyL() - ID: %d" ), aSettingsId );
+    #endif
+    TInt error = KErrNotFound;
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    TInt row = FindRowL( aSettingsId, repository );
+    if( row >= 0 )      
+        {
+        TInt32 key = ( row * 0x100 ) | aPropertyName;
+        error = repository->Delete( key );
+        if( error != KErrNone )
+            {
+            #ifdef _DEBUG
+                WriteToLog( _L8( "  Delete() failed with %d" ), error );
+            #endif
+            User::Leave( error );
+            }
+        }
+    else                            //No keys or too many
+        {
+        #ifdef _DEBUG
+            WriteToLog( _L8( "  Property set not found - Error: %d" ), row );
+        #endif
+        User::Leave( error );
+        } 
+    CleanupStack::PopAndDestroy();  //repository
+    }
+    
+// ---------------------------------------------------------
+// TXdmSettingsApi::CreateUniqueIdL
+//
+// ---------------------------------------------------------
+//
+TInt TXdmSettingsApi::CreateUniqueIdL( CRepository* aRepository, TInt aRow )
+    {
+    TBuf<10> numBuf;
+    numBuf.Zero();
+    numBuf.AppendNum( aRow );
+    TInt error = KErrNone;
+    RArray<TUint32> keys;
+    CleanupClosePushL( keys );
+    const TInt32 KPartialIdMask = 0x000000FF;
+    error = aRepository->FindEqL( KXdmSettingsId, KPartialIdMask, numBuf, keys );
+    __ASSERT_DEBUG( error == KErrNotFound, User::Panic( _L( "CXdmSettingsApi" ), 1 ) );
+    TInt32 newKey = ( aRow * 0x100 ) | KXdmSettingsId;
+    error = aRepository->Create( newKey, numBuf );
+    CleanupStack::PopAndDestroy();  //keys 
+    return error;
+    }
+    
+// ---------------------------------------------------------
+// TXdmSettingsApi::LastRow
+//
+// ---------------------------------------------------------
+//
+TInt TXdmSettingsApi::LastRow( CRepository* aRepository )
+    {
+    RArray<TUint32> keys;
+    CleanupClosePushL( keys );
+    const TInt32 KPartialNameMask = 0x000000FF;
+    TInt error = aRepository->FindL( KXdmSettingsId, KPartialNameMask, keys );
+    TInt count = keys.Count();
+    //Must check for existing IDs
+    if( count > 0 )
+        {
+        TInt exists = FindRowL( count, aRepository );
+        while( exists != KErrNotFound )
+            {
+            count++;
+            exists = FindRowL( count, aRepository );
+            }
+        }
+    CleanupStack::PopAndDestroy();  //keys
+    return count;
+    }
+
+// ---------------------------------------------------------
+// TXdmSettingsApi::FindRowL
+//
+// ---------------------------------------------------------
+//
+TInt TXdmSettingsApi::FindRowL( TInt aSettingsId,
+                                CRepository* aRepository )
+    {
+    TUint32 rowNum = 0;
+    RArray<TUint32> keys;
+    CleanupClosePushL( keys );
+    TBuf<10> numBuf;
+    numBuf.AppendNum( aSettingsId );
+    const TInt32 KPartialNameMask = 0x000000FF;
+    TInt error = aRepository->FindEqL( KXdmSettingsId, KPartialNameMask, numBuf, keys );
+    if( error == KErrNone && keys.Count() == 1 )
+        {
+        //Extract row part from the key
+        TInt row = keys[0] & 0xFFFFFF00;
+        //e.g. 0x00000400 => 0x00000004
+        rowNum = row / 0x100;
+        }
+    CleanupStack::PopAndDestroy();  //keys
+    return error == KErrNone ? rowNum : error;
+    }
+           
+// ---------------------------------------------------------
+// TXdmSettingsApi::FindByIdL
+//
+// ---------------------------------------------------------
+//
+RArray<TUint32> TXdmSettingsApi::FindByIdL( TInt aSettingsId, CRepository* aRepository )
+    {
+    const TInt32 KPartialKeyMask = 0x000000FF;
+    RArray<TUint32> keys;
+    CleanupClosePushL( keys );
+    TBuf<15> numBuf;
+    numBuf.AppendNum( aSettingsId );
+    TInt error = aRepository->FindEqL( KXdmSettingsId, KPartialKeyMask, numBuf, keys );
+    CleanupStack::Pop();  //keys
+    return keys;
+    }
+
+// ---------------------------------------------------------
+// TXdmSettingsApi::FindByTypeL
+//
+// ---------------------------------------------------------
+//
+RArray<TUint32> TXdmSettingsApi::FindByTypeL( CRepository* aRepository,
+                                              TXdmSettingsProperty aSingleProp )
+    {
+    const TInt32 KPartialKeyMask = 0x000000FF;
+    RArray<TUint32> keys;
+    CleanupClosePushL( keys );
+    TInt error = aRepository->FindL( aSingleProp, KPartialKeyMask, keys );
+    CleanupStack::Pop();  //keys
+    return keys;
+    }
+
+// ----------------------------------------------------------
+// TXdmSettingsApi::WriteToLog
+// 
+// ----------------------------------------------------------
+//
+void TXdmSettingsApi::WriteToLog( TRefByValue<const TDesC8> aFmt,... )                                 
+    {
+    VA_LIST list;
+    VA_START( list, aFmt );
+    TBuf8<KXdmSettingsLogBufferMaxSize> buf;
+    buf.FormatList( aFmt, list );
+    RFileLogger::Write( KXdmSettingsLogDir, KXdmSettingsLogFile, 
+                        EFileLoggingModeAppend, buf );
+    }
+
+// ---------------------------------------------------------
+// TXdmSettingsApi::CollectionNamesL
+//
+// ---------------------------------------------------------
+//
+EXPORT_C CDesCArray* TXdmSettingsApi::CollectionNamesLC( RArray<TInt>& aSettingIds )
+    {
+    #ifdef _DEBUG
+        WriteToLog( _L8( "TXdmSettingsApi::CollectionNamesL()" ) );
+    #endif
+    TInt error = KErrNone;
+    CDesCArrayFlat* propertySet = new ( ELeave ) CDesCArrayFlat( 10 );
+    CleanupStack::PushL( propertySet );
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    RArray<TUint32> nameKeys = FindByTypeL( repository, EXdmPropName );
+    CleanupClosePushL( nameKeys );
+    RArray<TUint32> idKeys = FindByTypeL( repository, EXdmPropSettingsId );
+    CleanupClosePushL( idKeys );
+    #ifdef _DEBUG
+        WriteToLog( _L8( "  ID key count: %d" ), idKeys.Count() );
+        WriteToLog( _L8( "  Name key count: %d" ), nameKeys.Count() );
+    #endif
+    TInt count = nameKeys.Count();
+    if( count > 0 )
+        {
+        TInt numId = 0; 
+        HBufC* name = NULL;
+        TBuf<10> identifier;
+        for( TInt i = 0;i < count;i++ )
+            {
+            identifier.Zero();
+            name = HBufC::NewLC( NCentralRepositoryConstants::KMaxUnicodeStringLength );
+            TPtr desc( name->Des());
+            error = repository->Get( nameKeys[i], desc );
+            error = repository->Get( idKeys[i], identifier );
+            if( error == KErrNone && desc.Length() > 0 && identifier.Length() > 0 )
+                {
+                #ifdef _DEBUG
+                    HBufC8* eightName = HBufC8::NewLC( desc.Length() );
+                    TPtr8 eightDesc( eightName->Des() );
+                    eightDesc.Copy( desc );
+                    WriteToLog( _L8( " Collection no. %d - Name: %S  ID: %S" ), i, &eightDesc, &identifier );
+                    CleanupStack::PopAndDestroy();  //eightName
+                #endif
+                propertySet->AppendL( desc );
+                TLex id( identifier );
+                error = id.Val( numId );
+                aSettingIds.Append( error == KErrNone ? numId : error );
+                }
+            else
+                {
+                #ifdef _DEBUG
+                    WriteToLog( _L8( " Fetching of the name no. %d failed with: %d" ), i, error );
+                #endif
+                }
+            CleanupStack::PopAndDestroy();  //name
+            }
+        }
+    CleanupStack::PopAndDestroy( 3 );   //idKeys, nameKeys, repository
+    return propertySet;
+    }
+                                            
+// ---------------------------------------------------------
+// TXdmSettingsApi::SettingsCollectionLC
+//
+// ---------------------------------------------------------
+//
+EXPORT_C CXdmSettingsCollection* TXdmSettingsApi::SettingsCollectionL( TInt aSettingsId )
+    {
+    #ifdef _DEBUG
+        WriteToLog( _L8( "TXdmSettingsApi::SettingsCollectionL() - ID: %d" ), aSettingsId );
+    #endif
+    CXdmSettingsCollection* collection = NULL;
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    TInt row = FindRowL( aSettingsId, repository );
+    if( row >= KErrNone )
+        {
+        TInt32 key = -1;
+        HBufC* buf = NULL;
+        TInt error = KErrNone;
+        collection = new ( ELeave ) CXdmSettingsCollection();
+        CleanupStack::PushL( collection );
+        #ifdef _DEBUG
+            WriteToLog( _L8( " Data in the specified colletion: " ) );
+        #endif
+        for( TInt i = 0;i < KXdmPropertyCount;i++ )
+            {
+            key = ( row * 0x100 ) | i;
+            buf = HBufC::NewLC( NCentralRepositoryConstants::KMaxUnicodeStringLength );
+            TPtr desc( buf->Des() );
+            error = repository->Get( key, desc );
+            if( error == KErrNone )
+                {
+                #ifdef _DEBUG
+                    HBufC8* eight = HBufC8::NewLC( desc.Length() );
+                    TPtr8 eightDesc( eight->Des() );
+                    eightDesc.Copy( desc );
+                    WriteToLog( _L8( "  Property %d [0x%08x]: %S" ), i, key, &eightDesc );
+                    CleanupStack::PopAndDestroy();   //eight
+                #endif
+                collection->AppendL( desc, ( TXdmSettingsProperty )i );
+                }
+            CleanupStack::PopAndDestroy();  //buf
+            }
+        CleanupStack::Pop();  //collection
+        }
+    else
+        {
+        #ifdef _DEBUG
+            WriteToLog( _L8( "  Could not find the collection, leaves with KErrNotFound" ) );
+        #endif
+        User::Leave( KErrNotFound );
+        }
+    CleanupStack::PopAndDestroy();  //repository
+    return collection;
+    }
+        
+// ---------------------------------------------------------
+// TXdmSettingsApi::PropertyL
+//
+// ---------------------------------------------------------
+//                                     
+EXPORT_C HBufC* TXdmSettingsApi::PropertyL( TInt aSettingsId,
+                                            TXdmSettingsProperty aSingleProp )
+    {
+    #ifdef _DEBUG
+        WriteToLog( _L8( "TXdmSettingsApi::PropertyLC()" ) );
+        WriteToLog( _L8( "  Property:           %d" ), &aSingleProp );
+        WriteToLog( _L8( "  Property set ID:    %d" ), aSettingsId );
+    #endif
+    HBufC* buf = NULL;
+    TInt error = KErrGeneral;
+    CRepository* repository = CRepository::NewL( KCRUidXdmEngine );
+    CleanupStack::PushL( repository );
+    RArray<TUint32> keys = FindByIdL( aSettingsId, repository );
+    CleanupClosePushL( keys );
+    TInt count = keys.Count();
+    if( count == 1 )                //This is the normal case
+        {
+        TInt32 row = ( keys[0] & 0xFFFFFF00 ) / 0x100;
+        TInt32 key = ( row * 0x100 ) | aSingleProp;
+        buf = HBufC::NewL( NCentralRepositoryConstants::KMaxUnicodeStringLength );
+        TPtr desc( buf->Des() );
+        error = repository->Get( key, desc );
+        #ifdef _DEBUG
+            WriteToLog( _L8( "  Error:    %d" ), error );
+        #endif
+        }
+    else                            //No keys or too many
+        {
+        #ifdef _DEBUG
+            TBuf8<32> errBuf;
+            count > 0 ? errBuf.Append( _L8( "Too many results" ) ) :
+                        errBuf.Append( _L8( "No results found" ) );
+            WriteToLog( _L8( "  * Error - %S: %d" ), &errBuf, count );
+        #endif
+        error = count > 0 ? KErrGeneral : KErrNotFound;
+        User::Leave( error );
+        }
+    CleanupStack::PopAndDestroy( 2 );  //keys, repository
+    return buf;
+    }
+            
+// End of File
+