diff -r 9f5ae1728557 -r db3f5fa34ec7 messagingfw/sendas/server/src/csendasmtmmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/sendas/server/src/csendasmtmmanager.cpp Wed Nov 03 22:41:46 2010 +0530 @@ -0,0 +1,170 @@ +// Copyright (c) 2004-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 "csendasmtmmanager.h" + +#include +#include +#include +#include + +#include "csendasserver.h" + +// constants +const TInt KSendAsArrayGranularity = 8; // should be big enough to hold all standard mtms + +CSendAsMtmManager* CSendAsMtmManager::NewL(CSendAsServer& aServer) + { + CSendAsMtmManager* self = new(ELeave) CSendAsMtmManager(aServer); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CSendAsMtmManager::~CSendAsMtmManager() + { + // free resources + iClientMtmArray.ResetAndDestroy(); + iClientMtmArray.Close(); + iMtmUidArray.Close(); + delete iClientRegistry; + } + +CSendAsMtmManager::CSendAsMtmManager(CSendAsServer& aServer) : + iServer(aServer), iMtmUidArray(KSendAsArrayGranularity), + iClientMtmArray(KSendAsArrayGranularity) + { + } + +void CSendAsMtmManager::ConstructL() + { + iClientRegistry = CClientMtmRegistry::NewL(iServer.GetMsvSessionL()); + PopulateL(); + } + +/** Populates the array of available MTMs capable of sending messages + +*/ +void CSendAsMtmManager::PopulateL() + { + TInt count = iClientRegistry->NumRegisteredMtmDlls(); + for( TInt i=0; iMtmTypeUid(i); + const CMtmDllInfo& dllInfo = iClientRegistry->RegisteredMtmDllInfo(mtmUid); + if( dllInfo.CapabilitiesAvailable() ) + { + if( dllInfo.MessagingCapability() ) + { + addMtmInfo = ETrue; + } + } + else + { + CBaseMtm* mtm = NULL; + TRAPD(err, mtm = FindStoredMtmL(mtmUid)); + if( err != KErrPermissionDenied ) + { + if( err == KErrNone ) + { + TInt ignored = 0; + if( mtm->QueryCapability(KUidMtmQueryCanSendMsg, ignored) != KErrNotSupported ) + { + addMtmInfo = ETrue; + } + } + else if( err != KErrNotFound ) + { + User::Leave(err); + } + } + } + if( addMtmInfo ) + { + iMtmUidArray.AppendL(mtmUid); + } + } + } + +/** Requests creation of a Client-side MTM object for the specified MTM UID. + +@param aMtmUid +The client MTM UID. + +@return +CBaseMtm pointer to the created MTM. +*/ +CBaseMtm* CSendAsMtmManager::GetClientMtmL(TUid aMtmUid) + { + return iClientRegistry->NewMtmL(aMtmUid); + } + +RArray& CSendAsMtmManager::GetMtmUidArray() + { + return iMtmUidArray; + } + +CClientMtmRegistry* CSendAsMtmManager::GetClientMtmRegistry() + { + return iClientRegistry; + } + +/** Searches for previously loaded MTM. + +The client MTM array is searched for MTM matching the requested UID. +If the MTM is not found, an attempt is made to create it. + +@param aMtmUid +The client MTM UID. + +@return +CBaseMtm pointer to the requested MTM. +*/ +CBaseMtm* CSendAsMtmManager::FindStoredMtmL(TUid aMtmUid) + { + // search mtm array for matching mtm by uid + CBaseMtm* mtm = NULL; + TInt count = iClientMtmArray.Count(); + for( TInt i=0; iType() == aMtmUid ) + { + return mtm; + } + } + + // not found in mtm array so attempt to create it + mtm = GetClientMtmL(aMtmUid); + CleanupStack::PushL(mtm); + + // add to mtm array + iClientMtmArray.AppendL(mtm); + CleanupStack::Pop(mtm); + return mtm; + } + +/** Empties and repopulates the client MTM array. + +*/ +void CSendAsMtmManager::RefreshMtmUidArrayL() + { + // empty list of mtm uids + iMtmUidArray.Reset(); + // repopulate list + PopulateL(); + }