--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/networkingdialogapi/agentnotifier/src/agentshellnotifier.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,277 @@
+// Copyright (c) 2003-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 <e32cons.h>
+
+#include <es_sock.h>
+
+#include "agentnotifierdefs.h"
+#include "agentshellnotifier.h"
+
+EXPORT_C CArrayPtr<MNotifierBase2>* NotifierArray()
+//
+// Lib main entry point
+//
+ {
+ CArrayPtrFlat<MNotifierBase2>* subjects=new (ELeave)CArrayPtrFlat<MNotifierBase2>(1);
+ CleanupStack::PushL(subjects);
+ subjects->AppendL(CAgentShellNotifier::NewL());
+ CleanupStack::Pop();//subjects
+ return(subjects);
+ }
+
+
+
+const TInt KAgentDialogWidth=38;
+const TInt KAgentDialogHeight=4;
+__FLOG_STMT(_LIT8(KDlgLogSubsys, "agentdialog");)
+__FLOG_STMT(_LIT8(KDlgLogComponent, "notifier");)
+
+CAgentDialogUpdate* CAgentDialogUpdate::NewL(const RMessagePtr2& aMessage)
+ {
+ CAgentDialogUpdate* self=new (ELeave) CAgentDialogUpdate(aMessage);
+ CleanupStack::PushL(self);
+ self->ConstructL(aMessage);
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CAgentDialogUpdate::Update(const RMessagePtr2& aMessage)
+ {
+ __FLOG(_L("CAgentDialogUpdate::Update Starting Agent Shell Dialog"));
+ iMessagePtr = aMessage;
+ TAgentDialogInputBuf agentDialogInputBuf;
+ aMessage.ReadL(1, agentDialogInputBuf);
+ TAgentDialogInput& agentdialogInput = agentDialogInputBuf();
+
+ iConsole->ClearScreen();
+ iConsole->SetTitle(agentdialogInput.iTitle);
+
+ TBuf<KAgentDialogWidth> buf1;
+ TBuf<KAgentDialogWidth> buf2;
+ buf1.Append(agentdialogInput.iLabel);
+ if(buf1.Length() >= 44 )
+ {
+ buf1.SetLength(40);
+ buf1.AppendFill('*',3);
+ }
+ buf1.Append(' ');
+
+ _LIT(KYesNoChoice, "Yes [y] No [n] Cancel[c]");
+ _LIT(KContinuePrompt, "Continue Yes [y]");
+
+ TInt operation = agentdialogInput.getDialogOperation();
+ switch ( operation )
+ {
+ case ENoYesDialog:
+ buf2.Append(KYesNoChoice);
+ break;
+ case EContinueDialog:
+ buf2.Append(KContinuePrompt);
+ break;
+ default:
+ __ASSERT_DEBUG(EFalse, _L("Illegal Agent UI operation type"));
+ }
+
+ TPoint point;
+ TInt x = (iConsole->ScreenSize().iWidth - buf1.Length()) / 2; // put the string in the middle
+ point.SetXY(x, 0);
+ iConsole->SetCursorPosAbs(point);
+
+ iConsole->Printf(buf1);
+ x = (iConsole->ScreenSize().iWidth - buf2.Length()) / 2; // put the string in the middle
+ point.SetXY(x, 1);
+ iConsole->SetCursorPosAbs(point);
+ iConsole->Printf(buf2);
+ }
+
+void CAgentDialogUpdate::DoCancel()
+ {
+ if (IsActive())
+ {
+ if (!iMessagePtr.IsNull())
+ {
+ iMessagePtr.Complete(KErrCancel);
+ }
+ iConsole->ReadCancel();
+ iConsole->Printf(_L("\ndialog cancelled.\nPress any key to continue...\n"));
+ }
+
+ }
+
+void CAgentDialogUpdate::RunL()
+ {
+ TInt key = iConsole->KeyCode();
+ __FLOG_1(_L("KeyPressed : %c"),key);
+ switch (key)
+ {
+ case 'y':
+ case 'Y':
+ iMessagePtr.Complete(EAgentYesPressed);
+ break;
+ case 'n':
+ case 'N':
+ iMessagePtr.Complete(EAgentNoPressed);
+ break;
+ case 'c':
+ case 'C':
+ iMessagePtr.Complete(KErrCancel);
+ break;
+ default:
+ iConsole->Printf(_L("\n Press 'y' 'n' or 'c'\n"));
+ iConsole->Read(iStatus);
+ SetActive();
+ }
+ }
+
+CAgentDialogUpdate::CAgentDialogUpdate(const RMessagePtr2& aMessage)
+: CActive(EPriorityStandard),
+ iMessagePtr(aMessage)
+ {
+ __FLOG_OPEN(KDlgLogSubsys, KDlgLogComponent);
+ }
+
+void CAgentDialogUpdate::ConstructL(const RMessagePtr2& /*aMessage*/)
+ {
+ TRAPD(r,iConsole = Console::NewL(_L("AgentDialog"), TSize(KAgentDialogWidth,KAgentDialogHeight)));
+ __FLOG_1(_L("CAgentDialogUpdate::ConstructL - Console::NewL returned %d"),r);
+
+ if (r < KErrNone) //So why not User::LeaveIfError - well Console::NewL is know to return 2
+ {
+ User::Leave(r);
+ }
+ if (iConsole == NULL)
+ {
+ User::Leave(KErrGeneral);
+ }
+ CActiveScheduler::Add(this);
+
+ // Read back the response
+ iConsole->Read(iStatus);
+ SetActive();
+ __FLOG_1(_L("Performed read for response should still be KRequestPending - %x"),iStatus.Int());
+
+ }
+
+CAgentDialogUpdate::~CAgentDialogUpdate()
+ {
+ Cancel();
+ delete iConsole;
+ __FLOG_CLOSE;
+ }
+
+
+
+CAgentShellNotifier* CAgentShellNotifier::NewL()
+ {
+ CAgentShellNotifier* self=new (ELeave) CAgentShellNotifier();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CAgentShellNotifier::ConstructL()
+ {
+ }
+
+CAgentShellNotifier::~CAgentShellNotifier()
+ {
+ delete iAgentShellDialog;
+ }
+ // From MNotifierBase
+
+void CAgentShellNotifier::Release()
+ {
+ delete this;
+ }
+
+CAgentShellNotifier::TNotifierInfo CAgentShellNotifier::RegisterL()
+ /**
+ * Called when a notifier is first loaded to allow any initial construction that is required.
+ */
+ {
+ iInfo.iUid=KUidAgentDialogNotifier;
+ iInfo.iChannel=KUidAgentDialogNotifier;
+ iInfo.iPriority=ENotifierPriorityLow;
+ return iInfo;
+ }
+
+CAgentShellNotifier::TNotifierInfo CAgentShellNotifier::Info() const
+ /**
+ * Start the notifier with data aBuffer and return an initial response.
+ */
+ {
+ return iInfo;
+ }
+
+TPtrC8 CAgentShellNotifier::StartL(const TDesC8& /*aBuffer*/)
+ /**
+ * Start the notifier with data aBuffer. aMessage should be completed when the notifier is deactivated.
+ * May be called multiple times if more than one client starts the notifier. The notifier is immediately
+ * responsible for completing aMessage.
+ */
+ {
+ TPtrC8 ret(KNullDesC8);
+ return (ret);
+ }
+
+void CAgentShellNotifier::StartL(const TDesC8& /*aBuffer*/, TInt /*aReplySlot*/, const RMessagePtr2& aMessage)
+ /**
+ * Start the notifier with data aBuffer. aMessage should be completed when the notifier is deactivated.
+ * May be called multiple times if more than one client starts the notifier. The notifier is immediately
+ * responsible for completing aMessage.
+ */
+ {
+ // Keep this short! Must schedule an update and return immediately
+ if (!aMessage.IsNull())
+ {
+ if (iAgentShellDialog)
+ {
+ delete iAgentShellDialog;
+ iAgentShellDialog = NULL;
+ }
+ iAgentShellDialog = CAgentDialogUpdate::NewL(aMessage);
+
+ iAgentShellDialog->Update(aMessage);
+ }
+ }
+
+
+void CAgentShellNotifier::Cancel()
+ /**
+ * The notifier has been deactivated so resources can be freed and outstanding messages completed.
+ */
+ {
+ if (iAgentShellDialog)
+ {
+ iAgentShellDialog->Cancel();
+ delete iAgentShellDialog;
+ iAgentShellDialog=NULL;
+ }
+ }
+
+TPtrC8 CAgentShellNotifier::UpdateL(const TDesC8& /*aBuffer*/)
+ /**
+ * Update a currently active notifier with data aBuffer.
+ */
+ {
+ // Keep this short! Must schedule an update and return immediately
+ TPtrC8 ret(KNullDesC8);
+ return (ret);
+ }
+
+
+