messagingfw/msgsrvnstore/mtmbase/src/mturutils.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/mtmbase/src/mturutils.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,202 @@
+// Copyright (c) 2000-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 <eikenv.h>
+#include <msvapi.h>
+#include <mtclreg.h>
+#include <mtuireg.h>
+#include <mtclbase.h>
+#include <eikappui.h>
+#include <mturutils.h>
+#include "MTMUIBAS.H"
+#include "MTUDPAN.H"
+
+_LIT(KThreadName, "LaunchEditor");
+const TInt KLaunchMinHeapSize=0x1000;
+const TInt KLaunchMaxHeapSize=0x80000;
+
+//**********************************
+// CMturEnv
+//**********************************
+
+class CMturEnv : public CEikonEnv
+	{
+public:
+	void DestroyEnvironment();
+	void ConstructL();
+	};
+
+void CMturEnv::DestroyEnvironment()
+	{
+	CEikonEnv::DestroyEnvironment();
+	}
+
+void CMturEnv::ConstructL()
+	{
+	CEikonEnv::ConstructL();
+	SetAutoForwarding(ETrue);
+	}
+
+//**********************************
+// CMturAppUi
+//**********************************
+
+class CMturAppUi : public CEikAppUi
+	{
+public:
+	~CMturAppUi();
+	void ConstructL();
+	};
+
+CMturAppUi::~CMturAppUi()
+	{
+	}
+
+void CMturAppUi::ConstructL()
+	{
+	CEikAppUi::BaseConstructL(ENoAppResourceFile);
+	}
+
+//**********************************
+// CDummyObserver
+//**********************************
+
+class CDummyObserver : public CBase, public MMsvSessionObserver
+	{
+public:
+	void HandleSessionEventL(TMsvSessionEvent, TAny*, TAny*, TAny*) {};
+	};
+
+//**********************************
+// Global
+//**********************************
+
+static void DoLaunchEditorL(TMsvId aId)
+	{
+	// Create an observer
+	CDummyObserver* ob = new(ELeave)CDummyObserver;
+	CleanupStack::PushL(ob);
+
+	// Create a message server session
+	CMsvSession* session = CMsvSession::OpenSyncL(*ob);
+	CleanupStack::PushL(session);
+
+	// Create a client registry
+	CClientMtmRegistry* clientReg = CClientMtmRegistry::NewL(*session);
+	CleanupStack::PushL(clientReg);
+
+	// Create a client entry sitting on the message
+	CMsvEntry* cEntry = CMsvEntry::NewL(*session, aId, TMsvSelectionOrdering());
+	CleanupStack::PushL(cEntry);
+
+	// Create the required client Mtm
+	CBaseMtm* client = clientReg->NewMtmL(cEntry->Entry().iMtm);
+	CleanupStack::PushL(client);
+
+	// Create a UI registry
+	CMtmUiRegistry* uiReg = CMtmUiRegistry::NewL(*session);
+	CleanupStack::PushL(uiReg);
+
+	// Create the required UI
+	CBaseMtmUi* ui = uiReg->NewMtmUiL(*client);
+	CleanupStack::PushL(ui);
+
+	// Give the client entry to the UI
+	CleanupStack::Pop(); // cEntry
+	client->SetCurrentEntryL(cEntry);
+
+	// Start the waiter
+	CMsvOperationWait* wait = CMsvOperationWait::NewLC();
+	wait->Start();
+
+	// Launch the editor
+	CMsvOperation* op = NULL;
+	TRAPD(error, op = ui->EditL(wait->iStatus));
+	if (error)
+		{
+		TRequestStatus* status = &(wait->iStatus);
+		User::RequestComplete(status, KErrNone);
+		}
+
+	// Compete the operation
+	CActiveScheduler::Start();
+	delete op;
+
+	// Tidy up
+	CleanupStack::Pop(7); // wait, ui, uiReg, client, clientReg, session, ob
+	
+	// Order of deletion is significant
+	delete wait;
+	delete ui;
+	delete client;
+	delete uiReg;
+	delete clientReg;
+	delete session;
+	delete ob;
+	}
+
+static TInt LaunchEditor(TMsvId aId)
+	{
+	TRAPD(error, DoLaunchEditorL(aId));
+	return error;
+	}
+
+static TInt DoThreadStart(TAny* aParam)
+	{
+	CMturEnv* env = new CMturEnv;
+	__ASSERT_ALWAYS(env, Panic(EMturThreadStartPanic1));
+	CMturAppUi* ui = new CMturAppUi;
+	__ASSERT_ALWAYS(ui, Panic(EMturThreadStartPanic2));
+
+	TRAPD(error, env->ConstructL(); ui->ConstructL());
+	__ASSERT_ALWAYS(!error, Panic(EMturThreadStartPanic3));
+	env->DisableExitChecks(ETrue);
+
+	LaunchEditor((TMsvId)aParam);
+
+	ui->PrepareToExit();
+	env->DestroyEnvironment();
+	return KErrNone;
+	}	
+
+//**********************************
+// MturUtils
+//**********************************
+
+EXPORT_C void MturUtils::LaunchEditorL(TMsvId aId)
+	{
+	RThread thread;
+	User::LeaveIfError(thread.Create(KThreadName, DoThreadStart, KDefaultStackSize, KLaunchMinHeapSize, KLaunchMaxHeapSize, (TAny*)aId, EOwnerThread));
+	thread.Resume();
+	thread.Close();
+	}
+
+EXPORT_C void MturUtils::LaunchEditorAndWaitL(TMsvId aId)
+	{
+	TRequestStatus aStatus;
+	RThread thread;
+	User::LeaveIfError(thread.Create(KThreadName, DoThreadStart, KDefaultStackSize, KLaunchMinHeapSize, KLaunchMaxHeapSize, (TAny*)aId, EOwnerThread));
+	thread.Logon(aStatus);
+	thread.Resume();
+	User::WaitForRequest(aStatus);
+	thread.Close();
+	}
+
+EXPORT_C void MturUtils::LaunchEditorL(TMsvId aId, RThread& aThread, TRequestStatus& aStatus)
+	{
+	User::LeaveIfError(aThread.Create(KThreadName, DoThreadStart, KDefaultStackSize, KLaunchMinHeapSize, KLaunchMaxHeapSize, (TAny*)aId, EOwnerThread));
+	aThread.Logon(aStatus);
+	aThread.Resume();
+	}