diff -r 000000000000 -r dfb7c4ff071f datacommsserver/networkingdialogapi/agentnotifier/src/agentshellnotifier.cpp --- /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 + +#include + +#include "agentnotifierdefs.h" +#include "agentshellnotifier.h" + +EXPORT_C CArrayPtr* NotifierArray() +// +// Lib main entry point +// + { + CArrayPtrFlat* subjects=new (ELeave)CArrayPtrFlat(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 buf1; + TBuf 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); + } + + +