core/src/commands.cpp
changeset 59 c9dfb364c2d1
parent 58 377ac716dabb
child 66 2a78c4ff2eab
--- a/core/src/commands.cpp	Tue Sep 14 09:49:39 2010 +0100
+++ b/core/src/commands.cpp	Wed Sep 15 18:07:34 2010 +0100
@@ -4731,14 +4731,17 @@
 
 CCmdDialog::~CCmdDialog()
 	{
+	Cancel();
+	iNotifier.Close();
 	delete iTitle;
 	delete iBody;
 	delete iButton1;
 	delete iButton2;
 	}
 
-CCmdDialog::CCmdDialog() : CCommandBase(EManualComplete)
-	{
+CCmdDialog::CCmdDialog() : CCommandBase(EManualComplete|ECaptureCtrlC)
+	{
+	SetExtension(this);
 	}
 
 const TDesC& CCmdDialog::Name() const
@@ -4747,34 +4750,6 @@
 	return KName;
 	}
 
-CCmdDialog::TMode CCmdDialog::ModeL() const
-	{
-	_LIT(KDialogImpl, "DIALOG_IMPL");
-	_LIT(KImplNotifier, "notifier");
-	_LIT(KImplConsole, "console");
-	_LIT(KImplNull, "null");
-
-	TMode mode = EModeNotifier;
-	if (Env().IsDefined(KDialogImpl))
-		{
-		const TDesC& impl = Env().GetAsDesL(KDialogImpl);
-		if (impl == KImplNotifier)
-			{
-			mode = EModeNotifier;
-			}
-		else if (impl == KImplConsole)
-			{
-			mode = EModeConsole;
-			}
-		else if (impl == KImplNull)
-			{
-			mode = EModeNull;
-			}
-		}
-
-	return mode;
-	}
-
 void CCmdDialog::DoRunL()
 	{
 	if (iTitle == NULL)
@@ -4803,21 +4778,14 @@
 		Stdin().ReadL(ptr);
 		}
 	
-	switch (ModeL())
+	switch (iMode)
 		{
 		case EModeNotifier:
 			{
 			RNotifier notifier;
-			User::LeaveIfError(notifier.Connect());
-			CleanupClosePushL(notifier);
-
-			TInt buttonValue;
-			TRequestStatus status;
-			notifier.Notify(*iTitle, *iBody, *iButton1, *iButton2, buttonValue, status);
-			User::WaitForRequest(status);
-			Complete(buttonValue);
-
-			CleanupStack::PopAndDestroy(&notifier);
+			LeaveIfErr(iNotifier.Connect(), _L("Couldn't connect to RNotifier"));
+			iNotifier.Notify(*iTitle, *iBody, *iButton1, *iButton2, iReturnValue, iStatus);
+			SetActive();
 			break;
 			}
 		case EModeConsole:
@@ -4894,10 +4862,12 @@
 	_LIT(KOptTitle, "title");
 	_LIT(KOptButton1, "first-button");
 	_LIT(KOptButton2, "second-button");
+	_LIT(KOptMode, "mode");
 
 	aOptions.AppendStringL(iTitle, KOptTitle);
 	aOptions.AppendStringL(iButton1, KOptButton1);
 	aOptions.AppendStringL(iButton2, KOptButton2);
+	aOptions.AppendEnumL((TInt&)iMode, KOptMode);
 	}
 
 void CCmdDialog::ArgumentsL(RCommandArgumentList& aArguments)
@@ -4906,6 +4876,33 @@
 	aArguments.AppendStringL(iBody, KArgBody);
 	}
 
+void CCmdDialog::DoCancel()
+	{
+	iNotifier.NotifyCancel();
+	}
+
+void CCmdDialog::RunL()
+	{
+	// text notifier gets the buttons the wrong way round, so check if it's running and if so swap the return value around
+	_LIT(KTextWindowServerName, "EWSRV.EXE[100000bf]0001"); // This is the same on winscw and target. The gui windowserver has a different UID
+	RProcess ewsrv;
+	TInt err = ewsrv.Open(KTextWindowServerName);
+	if (err == KErrNone)
+		{
+		if (iReturnValue) iReturnValue = 0;
+		else iReturnValue = 1;
+		ewsrv.Close();
+		}
+
+	Complete(iReturnValue);
+	}
+
+void CCmdDialog::CtrlCPressed()
+	{
+	//Cancel();
+	//Complete(KErrNone);
+	Printf(_L("Sorry, clients of RNotifier cannot safely be killed, and RNotifier::NotifyCancel() doesn't work. If you really want to risk it hit CTRL-Z and run \"kill -Tm *dialog*\". Otherwise you must dismiss the dialog on the device.\r\n"));
+	}
 
 //
 // CCmdJit.