--- /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 <mtclreg.h>
+#include <mtclbase.h>
+#include <mtmuids.h>
+#include <csendasmessagetypes.h>
+
+#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; i<count; ++i )
+ {
+ TBool addMtmInfo = EFalse;
+ TUid mtmUid = iClientRegistry->MtmTypeUid(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<TUid>& 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; i<count; ++i )
+ {
+ mtm = iClientMtmArray[i];
+ if( mtm && mtm->Type() == 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();
+ }