--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsengine/mmsserversettings/src/mmsregisteredapplications.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,402 @@
+/*
+* Copyright (c) 2005-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: mmsregisteredapplications implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <centralrepository.h>
+#include <msvids.h>
+
+// USERINCLUDE FILES
+#include "mmsregisteredapplications.h"
+#include "mmssettings.h"
+#include "mmsdebuglogging.h"
+#include "MmsEngineDomainCRKeys.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KMmsApplicationIdArrayGranularity = 4;
+const TInt KMmsApplicationNameDefaultLength = 64; // a reasonable guess for the length
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ============================== LOCAL FUNCTIONS ==============================
+
+// ============================== MEMBER FUNCTIONS =============================
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::NewL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMmsRegisteredApplications* CMmsRegisteredApplications::NewL()
+ {
+ CMmsRegisteredApplications* self = new(ELeave) CMmsRegisteredApplications();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::CMmsRegisteredApplications
+//
+// -----------------------------------------------------------------------------
+//
+CMmsRegisteredApplications::CMmsRegisteredApplications()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::~CMmsRegisteredApplications
+//
+// -----------------------------------------------------------------------------
+//
+CMmsRegisteredApplications::~CMmsRegisteredApplications()
+ {
+ LOG(_L("~CMmsRegisteredApplications"));
+ delete iUserFriendlyName;
+ delete iRepository;
+ delete iAppIdArray;
+ }
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CMmsRegisteredApplications::ConstructL()
+ {
+
+ iAppIdArray = new ( ELeave )CDesCArrayFlat( KMmsApplicationIdArrayGranularity );
+
+ iRepository = CRepository::NewL( KCRUidMMSApplicationRegistrations );
+ // The length may change later if the names are long.
+ iUserFriendlyName = HBufC::NewL( KMmsApplicationNameDefaultLength );
+ }
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::LoadRegisteredApplicationsL
+//
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C void CMmsRegisteredApplications::LoadRegisteredApplicationsL()
+ {
+ LOG(_L("CMmsRegisteredApplications::LoadRegisteredApplicationsL"));
+ iAppIdArray->Reset();
+ TInt count = 0;
+ TInt error = iRepository->Get( KMmsEngineNbrOfRegisteredApplications, count );
+ if ( error == KErrNotFound )
+ {
+ iRepository->Set( KMmsEngineNbrOfRegisteredApplications, 0 );
+ }
+
+ // KMaxUnicodeStringLength is the maximum length of string in repository -
+ // The strings will always fit into the bugger.
+ HBufC* buffer = HBufC::NewL( NCentralRepositoryConstants::KMaxUnicodeStringLength );
+ CleanupStack::PushL( buffer );
+ TPtr ptr = buffer->Des();
+ // We use the same buffer for reading everything - AppendL will always allocate
+ // a new buffer anyway. No need to keep allocating a new read buffer every time
+ for( TInt i = 0; i < count; i++ )
+ {
+ error = iRepository->Get( KMmsEngineRegisteredApplicationsArrayBase + i, ptr ) ;
+ if ( error == KErrNone )
+ {
+ iAppIdArray->AppendL( ptr );
+ }
+ else
+ {
+ LOG3(_L("- Loading registered appid array item %d returned error %d"), i, error );
+ }
+ }
+ CleanupStack::PopAndDestroy( buffer );
+ buffer = NULL;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::NumberOfRegisteredApplicationsL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMmsRegisteredApplications::NumberOfRegisteredApplicationsL() const
+ {
+ return iAppIdArray->MdcaCount();
+ }
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::RegisteredL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CMmsRegisteredApplications::RegisteredL( const TDesC& aApplicationId )
+ {
+ TInt index = -1;
+ return Registered( aApplicationId, index );
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::RegisterL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMmsRegisteredApplications::RegisterL( const TDesC& aApplicationId )
+ {
+ return RegisterL( aApplicationId, TPtrC() );
+ }
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::UnregisterL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMmsRegisteredApplications::UnregisterL( const TDesC& aApplicationId )
+ {
+ TInt index = 0;
+ if ( !Registered( aApplicationId, index ) )
+ {
+ return KErrNone;
+ }
+ LOG2(_L("CMmsRegisteredApplications::Unregister: array[%d]"), index );
+
+ TInt error = KErrNone;
+
+ // if item is not last one in the array. move the last item here.
+ TInt lastIndex = iAppIdArray->MdcaCount() - 1;
+ if ( index != lastIndex )
+ {
+ HBufC* buffer = HBufC::NewL( NCentralRepositoryConstants::KMaxUnicodeStringLength );
+ CleanupStack::PushL( buffer );
+ TPtr ptr = buffer->Des();
+
+ error = iRepository->Get(
+ KMmsEngineRegisteredApplicationsArrayBase + lastIndex, ptr );
+ if ( error == KErrNone )
+ {
+ error = iRepository->Set(
+ KMmsEngineRegisteredApplicationsArrayBase + index, ptr );
+ }
+ // local array has to follow the same order
+ if ( error == KErrNone )
+ {
+ // delete the old user friendly name.
+ // The new one will replace it in a moment, but we make sure
+ // there is no incorrect name left in place in case InsertL
+ // leaves because of lack of memory.
+ iRepository->Delete( KMmsEngineApplicationNameArrayBase + index );
+ // array index should be safe
+ iAppIdArray->InsertL( index, ptr );
+ iAppIdArray->Delete( index + 1 );
+ }
+ if ( error == KErrNone )
+ {
+ error = iRepository->Get( KMmsEngineApplicationNameArrayBase + lastIndex, ptr );
+ if ( error == KErrNone && ptr.Length() > 0 )
+ {
+ error = iRepository->Set(
+ KMmsEngineApplicationNameArrayBase + index, ptr );
+ }
+ // The setting of the name must not prevent final cleanup
+ error = KErrNone;
+ }
+
+ CleanupStack::PopAndDestroy( buffer );
+ buffer = NULL;
+ }
+ // delete the last item from the arrays
+ if ( error == KErrNone )
+ {
+ error = iRepository->Delete( KMmsEngineRegisteredApplicationsArrayBase + lastIndex );
+ if ( error == KErrNone )
+ {
+ iAppIdArray->Delete( lastIndex );
+ iAppIdArray->Compress();
+ SaveCount();
+ }
+ // The user friendly name of the last item is deleted in any case
+ // We are trying to make sure there are no friendly names pointing
+ // to incorrect application ids left over.
+ // The name can be fixed by trying to register the application again
+ // Even if the application is already registered, the user friedly name
+ // can be changed by registering the same application id again.
+ iRepository->Delete( KMmsEngineApplicationNameArrayBase + lastIndex );
+ }
+ return error;
+
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CDesCArray& CMmsRegisteredApplications::RegisteredApplicationList() const
+ {
+ return *iAppIdArray;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMmsRegisteredApplications::RegisterL(
+ const TDesC& aApplicationId,
+ const TDesC& aUserFriendlyName )
+ {
+ TInt error = KErrNone;
+ TInt index = -1;
+ if ( aApplicationId.Length() > NCentralRepositoryConstants::KMaxUnicodeStringLength )
+ {
+ // The application id is too long, it cannot be registerd
+ return KErrArgument;
+ }
+ if ( aUserFriendlyName.Length() > NCentralRepositoryConstants::KMaxUnicodeStringLength )
+ {
+ return KErrArgument;
+ }
+
+ if ( !Registered( aApplicationId, index ) )
+ {
+ // add new app id to last item in the array.
+ index = iAppIdArray->MdcaCount();
+ error = iRepository->Create(
+ KMmsEngineRegisteredApplicationsArrayBase + index, aApplicationId );
+ if ( error == KErrNone || error == KErrAlreadyExists )
+ {
+ // We should not get "already exists" unless someone has
+ // edited the registry behind our back...
+ error = KErrNone;
+ // The index now points to the newly created application id
+ iAppIdArray->AppendL( aApplicationId );
+ // update count in cenrep.
+ SaveCount();
+ }
+ }
+
+ // If index == -1 at this point, the registeration has failed.
+ if ( aUserFriendlyName.Length() > 0 && error == KErrNone && index != -1 )
+ {
+ error = iRepository->Set( KMmsEngineApplicationNameArrayBase + index,
+ aUserFriendlyName );
+ if ( error == KErrAlreadyExists )
+ {
+ error = KErrNone;
+ }
+ }
+
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC CMmsRegisteredApplications::UserFriendlyName( const TDesC& aApplicationId )
+ {
+ // This is a "best effort" function.
+ // If memory runs out or some other error occurs, an empty string is returned
+ TInt index = -1;
+ if ( !Registered( aApplicationId, index ) )
+ {
+ return TPtrC();
+ }
+
+ TInt error = KErrNone;
+ if ( !iUserFriendlyName )
+ {
+ // iUserFriendlyName may be NULL only if we have ran out of memory earlier
+ TRAP( error, iUserFriendlyName = HBufC::NewL( KMmsApplicationNameDefaultLength ) );
+ }
+ if ( error != KErrNone )
+ {
+ // If no memory, return empty string
+ return TPtrC();
+ }
+
+ TPtr ptr = iUserFriendlyName->Des();
+ TInt actualLength = 0;
+
+ error = iRepository->Get( KMmsEngineApplicationNameArrayBase + index, ptr, actualLength );
+ if ( error == KErrOverflow )
+ {
+ delete iUserFriendlyName;
+ iUserFriendlyName = NULL;
+ TRAP( error,
+ {
+ iUserFriendlyName = HBufC::NewL( actualLength );
+ ptr.Set( iUserFriendlyName->Des() );
+ error = iRepository->Get( KMmsEngineApplicationNameArrayBase + index, ptr );
+ });
+ }
+ if ( error == KErrNone )
+ {
+ return iUserFriendlyName->Des();
+ }
+ return TPtrC();
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::Registered
+// -----------------------------------------------------------------------------
+//
+TBool CMmsRegisteredApplications::Registered( const TDesC& aApplicationId, TInt& aIndex )
+ {
+ aIndex = -1;
+ TInt count = iAppIdArray->MdcaCount();
+ for( TInt i = 0; i < count && aIndex == -1; i++ )
+ {
+ TPtrC16 ptr = iAppIdArray->MdcaPoint( i );
+ if ( ptr.Compare( aApplicationId ) == 0 )
+ {
+ aIndex = i;
+ }
+ }
+ return ( aIndex != -1 );
+ }
+
+// -----------------------------------------------------------------------------
+// CMmsRegisteredApplications::SaveCount
+// -----------------------------------------------------------------------------
+//
+TInt CMmsRegisteredApplications::SaveCount()
+ {
+ TInt count = iAppIdArray->MdcaCount();
+ // Set also creates a new key if it does not exist
+ TInt error = iRepository->Set( KMmsEngineNbrOfRegisteredApplications, count );
+ if( error != KErrNone )
+ {
+ LOG3( _L("-ERROR saving appid count %d: %d"), KMmsEngineNbrOfRegisteredApplications, error );
+ }
+ return error;
+ }
+
+
+// =========================== OTHER EXPORTED FUNCTIONS ========================
+
+// End of File