messagingfw/msgsrvnstore/server/src/cmsvtechnologytypedefaultmtmsettings.cpp
changeset 0 8e480a14352b
child 22 d2c4c66342f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/server/src/cmsvtechnologytypedefaultmtmsettings.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,269 @@
+// Copyright (c) 2005-2009 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:
+//
+
+#include <centralrepository.h>
+#include <f32file.h>
+
+#include <cmsvtechnologytypedefaultmtmsettings.h>
+#include "MTSR.H"
+#include "MSVRUIDS.H"
+#include "MCLIENT.H"
+#include "MSVREG.H"
+
+const TInt KUidDefaultMtmRepositoryFileValue = 0x10274556;
+const TUid KUidDefaultMtmRepositoryFile = { KUidDefaultMtmRepositoryFileValue };
+			
+/** 
+Constructor. 
+
+@param aFs Reference to a RFs. The RFs should be connected. 
+*/
+CMsvTechnologyTypeDefaultMtmSettings::CMsvTechnologyTypeDefaultMtmSettings( RFs& aFs ) :
+	iFs( aFs )
+	{
+	}
+
+/** 
+Destructor. 
+*/
+EXPORT_C CMsvTechnologyTypeDefaultMtmSettings::~CMsvTechnologyTypeDefaultMtmSettings( )
+	{
+	delete iRepository;
+		
+	iTechnologyTypeDefaultMtmArray.Reset( );
+	iRemovedTechnologyTypes.Reset( );	
+	}
+
+/** 
+NewL factory function to create a CMsvTechnologyTypeDefaultMtmSettings object. 
+
+@param aFs Reference to a RFs. The RFs should be connected. 
+@return A newly created CMsvTechnologyTypeDefaultMtmSettings object
+*/
+EXPORT_C CMsvTechnologyTypeDefaultMtmSettings* CMsvTechnologyTypeDefaultMtmSettings::NewL(RFs& aFs)
+	{
+	CMsvTechnologyTypeDefaultMtmSettings* self = new(ELeave) CMsvTechnologyTypeDefaultMtmSettings(aFs);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);	
+	return self;	
+	}
+
+/**
+Second phase construction.
+*/
+void CMsvTechnologyTypeDefaultMtmSettings::ConstructL()
+	{
+	iRepository = CRepository::NewL(KUidDefaultMtmRepositoryFile);
+	}
+
+/** 
+Get the default MTM. 
+
+This function returns the UID of the default MTM that is set for the specified technology type.
+
+@param aTechnologyTypeUid UID of the Technology Type 
+@param aMtmUid returns the UID of the MTM that is set as default 
+@return KErrNone if successful, KErrNotFound if a default MTM is not set for the specified aTechnologyTypeUid 
+*/
+EXPORT_C TInt CMsvTechnologyTypeDefaultMtmSettings::DefaultMtm( TUid aTechnologyTypeUid, TUid& aMtmUid ) const
+	{
+	TMsvTechnologyTypeDefaultMtmInfo technologyTypeDefaultMtmInfo;
+	TInt error = FindDefaultMtm( aTechnologyTypeUid, technologyTypeDefaultMtmInfo );
+	if ( error >= KErrNone )
+		{
+		error = KErrNone;
+		}
+		
+	aMtmUid = technologyTypeDefaultMtmInfo.iMtmUid;
+	return error;
+	}
+
+/**
+Set the default MTM. 
+
+This function sets the default MTM for the specified technology type to the specified MTM UID.
+
+@param aTechnologyTypeUid UID of the Technology Type 
+@param aMtmUid UID of the MTM that is set as default
+@leave KErrArgument if aMtmUid is not part of the specified technology type group (aTechnologyTypeUid) 
+*/
+EXPORT_C void CMsvTechnologyTypeDefaultMtmSettings::SetDefaultMtmL( TUid aTechnologyTypeUid, TUid aMtmUid )
+	{
+	// Check whether the MTM with aMtmUid belongs to a group with aTechnologyTypeUid
+	// The function leaves if the test fails.
+	CheckIfMtmIsPartOfTechnologyTypeGroupL( aTechnologyTypeUid, aMtmUid, KUidMtmServerComponent );
+	
+	TMsvTechnologyTypeDefaultMtmInfo defaultTechnologyTypeMtm;
+	TInt indexAndErrorValue = FindDefaultMtm( aTechnologyTypeUid, defaultTechnologyTypeMtm );
+		
+	defaultTechnologyTypeMtm.iTechnologyTypeUid = aTechnologyTypeUid;	
+	defaultTechnologyTypeMtm.iMtmUid = aMtmUid;
+	
+	if ( indexAndErrorValue == KErrNotFound )
+		{
+		iTechnologyTypeDefaultMtmArray.AppendL( defaultTechnologyTypeMtm );
+		
+		// Remove aTechnologyTypeUid from the iRemovedTechnologyTypes, to ensure that the order
+		// in the Central Repository does not change (The key isn't deleted)
+		indexAndErrorValue = iRemovedTechnologyTypes.Find( aTechnologyTypeUid );
+		if ( indexAndErrorValue >= KErrNone )
+			{
+			iRemovedTechnologyTypes.Remove( indexAndErrorValue );
+			}
+		}
+	else
+		{
+		iTechnologyTypeDefaultMtmArray[ indexAndErrorValue ] = defaultTechnologyTypeMtm;
+		}	
+	}
+
+/** 
+Removes the default MTM. 
+
+This function removes the UID that is set as default MTM from the list. If DefaultMtm() is called
+after this function, KErrNotFound will be returned
+
+@param aTechnologyTypeUid UID of the Technology Type 
+@param aMtmUid returns the UID of the MTM that is set as default 
+@return KErrNone if successful 
+*/
+EXPORT_C TInt CMsvTechnologyTypeDefaultMtmSettings::RemoveDefaultMtm( TUid aTechnologyTypeUid )
+	{
+	TInt indexAndErrorValue = iRemovedTechnologyTypes.Append( aTechnologyTypeUid );
+	if ( indexAndErrorValue >= KErrNone )
+		{
+		TMsvTechnologyTypeDefaultMtmInfo technologyTypeDefaultMtmInfo;
+		indexAndErrorValue = FindDefaultMtm( aTechnologyTypeUid, 
+											 technologyTypeDefaultMtmInfo );
+		if ( indexAndErrorValue >= KErrNone )
+			{
+			iTechnologyTypeDefaultMtmArray.Remove( indexAndErrorValue );	
+			}
+		indexAndErrorValue = KErrNone;
+		}
+	return indexAndErrorValue;
+	}
+
+/** 
+Load the default MTM settings from the central repository. 
+
+This function loads the list of default MTMs that is stored in the central repository. The list
+is first emptied. 
+*/		
+EXPORT_C void CMsvTechnologyTypeDefaultMtmSettings::LoadSettingsL( )
+	{
+	iTechnologyTypeDefaultMtmArray.Reset( );
+	iRemovedTechnologyTypes.Reset( );
+		
+	RArray<TUint32> foundKeys;
+	CleanupClosePushL( foundKeys );
+
+	TInt error = iRepository->FindNeqL( 0, 0, 0, foundKeys );
+	if ( error < KErrNotFound )
+		{
+		User::Leave( error );
+		}
+	
+	TInt keyCount = foundKeys.Count( );
+	while ( keyCount-- != 0 )
+		{
+		TMsvTechnologyTypeDefaultMtmInfo technologyTypeDefaultMtmInfo;
+		technologyTypeDefaultMtmInfo.iTechnologyTypeUid.iUid = foundKeys[keyCount];
+		
+		User::LeaveIfError( iRepository->Get( (TUint32) technologyTypeDefaultMtmInfo.iTechnologyTypeUid.iUid, 
+											 (TInt&) technologyTypeDefaultMtmInfo.iMtmUid.iUid ) ) ;
+		iTechnologyTypeDefaultMtmArray.AppendL( technologyTypeDefaultMtmInfo );
+		}
+
+	CleanupStack::PopAndDestroy(&foundKeys);	
+	}	
+
+/** 
+Save the default MTM settings to the central repository. 
+
+This function saves the list of default MTMs that is stored in the central repository. Entries that 
+are set to delete will be removed first. The function will leave with error code 
+KErrLocked if another save is in progress. 
+*/
+EXPORT_C void CMsvTechnologyTypeDefaultMtmSettings::SaveSettingsL( )
+	{	
+	User::LeaveIfError(iRepository->StartTransaction(CRepository::EReadWriteTransaction));
+	iRepository->CleanupRollbackTransactionPushL( );
+
+	TInt mtmCount = iRemovedTechnologyTypes.Count( );
+	while ( mtmCount-- != 0 )
+		{
+		iRepository->Delete(iRemovedTechnologyTypes[mtmCount].iUid);
+		}
+		
+	TMsvTechnologyTypeDefaultMtmInfo technologyTypeDefaultMtmInfo;	
+	mtmCount = iTechnologyTypeDefaultMtmArray.Count( );
+	while ( mtmCount-- != 0 )
+		{
+		technologyTypeDefaultMtmInfo = iTechnologyTypeDefaultMtmArray[mtmCount];		
+		iRepository->Set((TUint32)technologyTypeDefaultMtmInfo.iTechnologyTypeUid.iUid, 
+						 		 			 (TInt)technologyTypeDefaultMtmInfo.iMtmUid.iUid);
+		}
+
+	CleanupStack::Pop();
+	TUint32 errorId = 0;	
+	User::LeaveIfError(iRepository->CommitTransaction(errorId));
+	}
+
+void CMsvTechnologyTypeDefaultMtmSettings::CheckIfMtmIsPartOfTechnologyTypeGroupL( const TUid aTechnologyTypeUid,
+																const TUid aMtmUid, const TUid aMtmTypeUid ) const	
+	{
+	CRegisteredMtmDllArray* regMtmDllArray = new (ELeave) CRegisteredMtmDllArray( );
+	CleanupStack::PushL( regMtmDllArray );
+
+	RMsvServerSession session;
+	session.Connect(iFs);
+	session.FillRegisteredMtmDllArray(aMtmTypeUid, *regMtmDllArray, KMsvDefaultTimeoutMicroSeconds32);
+	session.Close();
+	
+	CRegisteredMtmDll* regMtmDll = NULL;
+	TInt error = KErrArgument;
+	TInt mtmCount = regMtmDllArray->Count( );
+
+	while ( mtmCount-- != 0 && error != KErrNone)
+		{
+		regMtmDll = regMtmDllArray->At( mtmCount );
+		if ( regMtmDll->MtmTypeUid( ) == aMtmUid && regMtmDll->TechnologyTypeUid( ) == aTechnologyTypeUid )
+			{
+			error = KErrNone;
+			}
+		}
+	CleanupStack::PopAndDestroy( regMtmDllArray );	
+	User::LeaveIfError( error );
+	}
+
+TInt CMsvTechnologyTypeDefaultMtmSettings::FindDefaultMtm( const TUid aTechnologyTypeUid, 
+													 TMsvTechnologyTypeDefaultMtmInfo& aTechnologyTypeDefaultMtmInfo ) const
+	{
+	TMsvTechnologyTypeDefaultMtmInfo technologyTypeMtmInfo;
+	
+	TInt count = iTechnologyTypeDefaultMtmArray.Count( );
+	while ( count-- > 0 )
+		{
+		technologyTypeMtmInfo = iTechnologyTypeDefaultMtmArray[count];
+		if ( technologyTypeMtmInfo.iTechnologyTypeUid == aTechnologyTypeUid )
+			{
+			aTechnologyTypeDefaultMtmInfo = technologyTypeMtmInfo;
+			return KErrNone;
+			}
+		}
+	return KErrNotFound;
+	}