--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayercontrol/networkinterfacemgr/src/dialogprocessor.cpp Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,398 @@
+// 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:
+//
+
+/**
+ @file
+*/
+
+#include "CAgentSMBase.h"
+#include "dialogprocessor.h"
+#include "AgentPanic.h"
+#include "Ni_Log.h"
+
+
+NONSHARABLE_CLASS(CDialogDestroyPCTNotification) : public CActive
+/**
+Declaration of this private class - forward reference in dialogprocessor.h
+*/
+ {
+public:
+ CDialogDestroyPCTNotification(RGenConAgentDialogServer* aDialogSvr,
+ CDialogProcessor* aDlgPrc,
+ TInt aPriority = CActive::EPriorityStandard);
+ virtual ~CDialogDestroyPCTNotification();
+ void RequestNotification();
+private:
+
+ /** From CActive */
+ virtual void DoCancel();
+ virtual void RunL();
+private:
+ RGenConAgentDialogServer* iDialogSvr;
+ CDialogProcessor* iDlgPrc;
+ };
+
+//
+// MDialogProcessorObserver
+//
+
+EXPORT_C void MDialogProcessorObserver::MDPOSelectComplete(TInt /*aError*/, const TConnectionSettings& /*aSettings*/)
+ { AgentPanic(Agent::EDialogProcessorSelectObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPOSelectModemAndLocationComplete(TInt /*aError*/, const TConnectionSettings& /*aSettings*/)
+ { AgentPanic(Agent::EDialogProcessorSelectModemAndLocationObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPOWarnComplete(TInt /*aError*/, TBool /*aResponse*/)
+ { AgentPanic(Agent::EDialogProcessorWarnObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPOLoginComplete(TInt /*aError*/)
+ { AgentPanic(Agent::EDialogProcessorLoginObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPOAuthenticateComplete(TInt /*aError*/)
+ { AgentPanic(Agent::EDialogProcessorAuthObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPOReconnectComplete(TInt /*aError*/)
+ { AgentPanic(Agent::EDialogProcessorReconnectObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPOReadPctComplete(TInt /*aError*/)
+ { AgentPanic(Agent::EDialogProcessorReadPctObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPODestroyPctComplete(TInt /*aError*/)
+ { AgentPanic(Agent::EDialogProcessorDestroyPctObserverNotImplemented); }
+
+EXPORT_C void MDialogProcessorObserver::MDPOQoSWarningComplete(TInt /*aError*/, TBool /*aResponse*/)
+ { AgentPanic(Agent::EDialogProcessorWarnQoSObserverNotImplemented); }
+
+//
+// CDialogProcessor definitions
+//
+
+EXPORT_C CDialogProcessor* CDialogProcessor::NewL(TInt aPriority)
+ {
+ CDialogProcessor* self = new(ELeave) CDialogProcessor(aPriority);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CDialogProcessor::CDialogProcessor(TInt aPriority)
+ : CActive(aPriority)
+ {}
+
+void CDialogProcessor::ConstructL()
+ {
+ CActiveScheduler::Add(this);
+ TInt ret = iDlgServ.Connect();
+ LOG(NifmanLog::Printf(_L("CDialogProcessor::ConstructL - Connect returned %d"),ret); )
+ User::LeaveIfError(ret);
+ iDestroyPctNotification = new(ELeave) CDialogDestroyPCTNotification(&iDlgServ,this);
+ iState = ENoState;
+ }
+
+EXPORT_C CDialogProcessor::~CDialogProcessor()
+ {
+ CancelEverything();
+ delete iDestroyPctNotification;
+ iDlgServ.Close();
+ }
+
+EXPORT_C void CDialogProcessor::SelectConnection(MDialogProcessorObserver& aObserver, const TConnectionPrefs& aPrefs)
+/**
+Request connection dialog
+*/
+ {
+ iDlgServ.IapConnection(iSettings.iIAPId, aPrefs, iStatus);
+
+ SetActive(aObserver,ESelectConnection);
+ }
+
+EXPORT_C void CDialogProcessor::SelectConnection(MDialogProcessorObserver& aObserver, const TConnectionPrefs& aPrefs, TInt aLastError)
+
+/**
+Request connection dialog
+*/
+ {
+ iDlgServ.IapConnection(iSettings.iIAPId, aPrefs, aLastError, iStatus);
+
+ SetActive(aObserver,ESelectConnection);
+ }
+
+EXPORT_C void CDialogProcessor::SelectModemAndLocation(MDialogProcessorObserver& aObserver)
+/**
+Request Modem Dialog
+*/
+ {
+ iDlgServ.ModemAndLocationSelection(iSettings.iBearerId,iSettings.iLocationId,iStatus);
+ SetActive(aObserver,ESelectModemAndLocation);
+ }
+
+EXPORT_C void CDialogProcessor::Authenticate(MDialogProcessorObserver& aObserver, TDes& aUsername,TDes& aPassword,TBool aIsReconnect)
+/**
+Request authentication dialog
+*/
+ {
+ iDlgServ.Authenticate(aUsername,aPassword,aIsReconnect,iStatus);
+ SetActive(aObserver,EAuthentication);
+ }
+
+EXPORT_C void CDialogProcessor::Reconnect(MDialogProcessorObserver& aObserver)
+/**
+Request reconnect dialog
+*/
+ {
+ iDlgServ.Reconnect(iReconResponse,iStatus);
+ SetActive(aObserver,EReconnect);
+ }
+
+EXPORT_C void CDialogProcessor::WarnNewConnection(MDialogProcessorObserver& aObserver, const TConnectionPrefs& aPrefs, const TDesC* aNewIapName, const TIspConnectionNames*, TInt aLastError)
+/**
+Warn of new connection dialog
+*/
+ {
+ __ASSERT_DEBUG(aNewIapName, AgentPanic(Agent::ENullWarnParameter));
+ iDlgServ.WarnNewIapConnection(aPrefs, aLastError, *aNewIapName, iWarnNewConnectResponse, iStatus);
+
+ SetActive(aObserver,EWarnNewConnection);
+ }
+
+EXPORT_C void CDialogProcessor::Login(MDialogProcessorObserver& aObserver, TDes& aUsername, TDes& aPassword,TBool aIsReconnect)
+/**
+Request login dialog
+*/
+ {
+ iDlgServ.Login(aUsername,aPassword,aIsReconnect,iStatus);
+ SetActive(aObserver,ELogin);
+ }
+
+EXPORT_C void CDialogProcessor::DestroyPctNotification(MDialogProcessorObserver& aObserver)
+/**
+Request notification on destruction of PCT.
+*/
+ {
+ iDestroyPctNotification->RequestNotification();
+ iPctDestructionObserver = &aObserver;
+ }
+
+EXPORT_C void CDialogProcessor::ReadPct(MDialogProcessorObserver& aObserver, TDes& aData)
+/**
+Request read from PCT and return read string in aData
+*/
+ {
+ iDlgServ.ReadPct(aData,iStatus);
+ SetActive(aObserver,EReadPct);
+ }
+
+EXPORT_C void CDialogProcessor::QoSWarning(MDialogProcessorObserver& aObserver)
+/**
+Warn QoS has fallen below minimum values
+*/
+ {
+ iDlgServ.QoSWarning(iQoSWarningResponse, iStatus);
+ SetActive(aObserver,EQoSWarning);
+ }
+
+EXPORT_C TInt CDialogProcessor::OpenPct()
+/**
+Request open of PCT
+*/
+ {
+ return iDlgServ.OpenPct();
+ }
+
+EXPORT_C TInt CDialogProcessor::WritePct(const TDesC& aData)
+/**
+Request write aData to PCT
+*/
+ {
+ return iDlgServ.WritePct(aData);
+ }
+
+EXPORT_C void CDialogProcessor::ClosePct()
+/**
+Request close of PCT
+*/
+ {
+ iDlgServ.ClosePct();
+ }
+
+EXPORT_C void CDialogProcessor::CancelEverything()
+/**
+Cancel the active object waiting on the destroy pct notification
+and then everything else outstanding
+*/
+ {
+ if (iDestroyPctNotification)
+ {
+ iDestroyPctNotification->Cancel();
+ // Null the observer pointer, the observer is owned by other objects!
+ iPctDestructionObserver = NULL;
+ }
+
+ Cancel();
+ }
+
+void CDialogProcessor::CompleteDestroyPctNotification(TInt aStatus)
+/**
+Complete notification on destruction of PCT
+*/
+ {
+ if (iPctDestructionObserver)
+ {
+ iPctDestructionObserver->MDPODestroyPctComplete(aStatus);
+ // Null the observer pointer, the observer is owned by other objects!
+ iPctDestructionObserver = NULL;
+ }
+ }
+
+void CDialogProcessor::SetActive(MDialogProcessorObserver& aObserver, TDPState aState)
+ {
+ __ASSERT_DEBUG(!iCurrentObserver, AgentPanic(Agent::EObserverNotNull));
+
+ iCurrentObserver = &aObserver;
+ iState = aState;
+ CActive::SetActive();
+ }
+
+void CDialogProcessor::RunL()
+ {
+ __ASSERT_DEBUG(iCurrentObserver, AgentPanic(Agent::EObserverNull));
+
+ const TDPState state = iState;
+ iState = ENoState;
+ MDialogProcessorObserver* currentObserver = iCurrentObserver;
+ iCurrentObserver = NULL;
+
+ switch (state)
+ {
+ case ESelectConnection:
+ currentObserver->MDPOSelectComplete(iStatus.Int(),iSettings);
+ break;
+ case EWarnNewConnection:
+ currentObserver->MDPOWarnComplete(iStatus.Int(),iWarnNewConnectResponse);
+ break;
+ case ESelectModemAndLocation:
+ currentObserver->MDPOSelectModemAndLocationComplete(iStatus.Int(),iSettings);
+ break;
+ case ELogin:
+ currentObserver->MDPOLoginComplete(iStatus.Int());
+ break;
+ case EAuthentication:
+ currentObserver->MDPOAuthenticateComplete(iStatus.Int());
+ break;
+ case EReconnect:
+ if(iReconResponse)
+ currentObserver->MDPOReconnectComplete(KErrNone);
+ else
+ currentObserver->MDPOReconnectComplete(KErrCancel);
+ break;
+ case EReadPct:
+ currentObserver->MDPOReadPctComplete(iStatus.Int());
+ break;
+ case EQoSWarning:
+ currentObserver->MDPOQoSWarningComplete(iStatus.Int(),iQoSWarningResponse);
+ break;
+ default:
+ User::Leave(KErrGeneral);
+ break;
+ }
+ }
+
+void CDialogProcessor::DoCancel()
+/**
+Only called if CDialogProcessor is active (Could be inactive while iDestroyPctNotification
+is still active so should call CancelEverything() instead if pct around)
+*/
+ {
+ __ASSERT_DEBUG(!iPctDestructionObserver, AgentPanic(Agent::EDestroyNotificationNotCancelled));
+
+ switch (iState)
+ {
+ case ESelectConnection:
+ iDlgServ.CancelIapConnection();
+ break;
+ case ESelectModemAndLocation:
+ iDlgServ.CancelModemAndLocationSelection();
+ break;
+ case EWarnNewConnection:
+ iDlgServ.CancelWarnNewIapConnection();
+ break;
+ case ELogin:
+ iDlgServ.CancelLogin();
+ break;
+ case EAuthentication:
+ iDlgServ.CancelAuthenticate();
+ break;
+ case EReconnect:
+ iDlgServ.CancelReconnect();
+ break;
+ case EReadPct:
+ iDlgServ.CancelReadPct();
+ break;
+ case EQoSWarning:
+ iDlgServ.CancelQoSWarning();
+ break;
+ default:
+ AgentPanic(Agent::EIllegalActionType);
+ break;
+ }
+
+ iState = ENoState;
+ iCurrentObserver = NULL;
+ }
+
+//
+// CDialogDestroyPCTNotification
+//
+
+CDialogDestroyPCTNotification::CDialogDestroyPCTNotification(RGenConAgentDialogServer* aDialogSvr,
+ CDialogProcessor* aDlgPrc,
+ TInt aPriority)
+ : CActive(aPriority), iDialogSvr(aDialogSvr), iDlgPrc(aDlgPrc)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CDialogDestroyPCTNotification::~CDialogDestroyPCTNotification()
+ {
+ Cancel();
+ }
+
+void CDialogDestroyPCTNotification::RequestNotification()
+/**
+Request notification when the PCT is destroyed
+*/
+ {
+ iDialogSvr->DestroyPctNotification(iStatus);
+ SetActive();
+ }
+
+void CDialogDestroyPCTNotification::DoCancel()
+/**
+This will cancel any oustanding requests and cause the destroy notification to complete - which will
+get caught by the CActive::Cancel()
+*/
+ {
+ iDialogSvr->CancelDestroyPctNotification();
+ }
+
+void CDialogDestroyPCTNotification::RunL()
+/**
+Received notification
+*/
+ {
+ iDlgPrc->CompleteDestroyPctNotification(iStatus.Int());
+ }
+