--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/networkingdialogapi/src/ND_DLGSV.CPP Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,1029 @@
+// Copyright (c) 1997-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 ND_DLGSV.CPP
+*/
+
+#include <c32comm.h>
+#include <e32svr.h>
+#include <commsdattypesv1_1.h>
+using namespace CommsDat;
+#include <comms-infras/dbaccess.h>
+#include "ND_DLGSL.H"
+#include "ND_DLGSV.H"
+#include <rsshared.h>
+#include <c32root.h>
+#include <es_sock.h>
+
+/**
+@internalComponent
+*/
+
+
+//
+// CNetDialDialogServerChannelHandler
+//
+
+/*static*/ CNetDialDialogServerChannelHandler* CNetDialDialogServerChannelHandler::NewL(
+ CommsFW::RCFChannel::TMsgQueues aRxQueues, CommsFW::RCFChannel::TMsgQueues aTxQueues,
+ CNetDialDialogServer& aServer)
+ {
+ CNetDialDialogServerChannelHandler* pHandler = new (ELeave) CNetDialDialogServerChannelHandler(aServer);
+ CleanupStack::PushL(pHandler);
+ pHandler->ConstructL(aRxQueues, aTxQueues);
+ CleanupStack::Pop(pHandler);
+ return pHandler;
+ }
+
+CNetDialDialogServerChannelHandler::CNetDialDialogServerChannelHandler(CNetDialDialogServer& aServer):
+ CCFModuleChannelHandler(CActive::EPriorityStandard),iServer(aServer)
+ {
+ }
+
+void CNetDialDialogServerChannelHandler::CFMessageShutdown(const CommsFW::TCFShutdownMsg& /*aMessage*/)
+ {
+ iServer.Shutdown();
+ }
+
+//
+// CNetDialDialogServer
+//
+CNetDialDialogServer::CNetDialDialogServer(TInt aPriority)
+ : CServer2(aPriority)
+ {
+ __FLOG_OPEN(KDlgSvrLogSubsys, KDlgSvrLogComponent);
+ }
+
+CNetDialDialogServer::~CNetDialDialogServer()
+ {
+ delete iChannel;
+ __FLOG_CLOSE;
+ }
+
+CNetDialDialogServer* CNetDialDialogServer::NewL(CommsFW::RCFChannel::TMsgQueues aRxQueues, CommsFW::RCFChannel::TMsgQueues aTxQueues)
+/**
+Create and start a new count server.
+*/
+ {
+ CNetDialDialogServer* pS=new(ELeave) CNetDialDialogServer(EPrioritySupervisor);
+ CleanupStack::PushL(pS);
+ pS->ConstructL(aRxQueues, aTxQueues);
+ CleanupStack::Pop();
+ return pS;
+ }
+
+void CNetDialDialogServer::ConstructL(CommsFW::RCFChannel::TMsgQueues aRxQueues, CommsFW::RCFChannel::TMsgQueues aTxQueues)
+ {
+ __FLOG(_L("CNetDialDialogServer::ConstructL"));
+ iChannel = CNetDialDialogServerChannelHandler::NewL(aRxQueues, aTxQueues, *this);
+ StartL(KCommsDialogServerName);
+ }
+
+void CNetDialDialogServer::Shutdown()
+ {
+ if(!Message().IsNull())
+ {
+ __FLOG(_L("CNetDialDialogServer::Shutdown: Completing message pending in the server."));
+ Message().Complete(KErrServerTerminated);
+ }
+ CNetDialDialogSession* pSession;
+ iSessionIter.SetToFirst();
+ while((pSession=reinterpret_cast<CNetDialDialogSession*>(iSessionIter++))!=NULL)
+ {
+ delete pSession;
+ iSessionIter.SetToFirst();
+ __FLOG(_L("CNetDialDialogServer::Shutdown: Found session. Deleted."));
+ }
+
+ __FLOG(_L("CNetDialDialogServer::Shutdown: Stopping active scheduler."));
+ CActiveScheduler::Stop();
+ }
+
+CSession2* CNetDialDialogServer::NewSessionL(const TVersion &aVersion, const RMessage2& /*aMessage*/) const
+/**
+ Create a new server session
+*/
+ {
+ // check we're the right version
+ TVersion v(KDialogServMajorVersionNumber,KDialogServMinorVersionNumber,KDialogServBuildVersionNumber);
+ if (!User::QueryVersionSupported(v,aVersion))
+ User::Leave(KErrNotSupported);
+ return CNetDialDialogSession::NewL((CNetDialDialogServer*)this);
+ }
+
+//
+// CNetDialDialogSession
+//
+CNetDialDialogSession* CNetDialDialogSession::NewL(CNetDialDialogServer* aServer)
+/**
+CNetDialDialogSession
+*/
+{
+ CNetDialDialogSession* r=new(ELeave) CNetDialDialogSession(aServer);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CNetDialDialogSession::CNetDialDialogSession(CNetDialDialogServer* aServer)
+ : CSession2(),
+ iNetDialDialogSvr(aServer),
+ iBufPtr(NULL,0),
+ iPctWriteBuffer(NULL,0)
+/**
+Constructor.
+*/
+ {
+ __FLOG_OPEN(KDlgSvrLogSubsys, KDlgSvrLogComponent);
+ }
+
+void CNetDialDialogSession::ConstructL()
+/**
+Completes construction of the CNetDialDialogSession object.
+*/
+ {
+ iDb=CMDBSession::NewL(KCDVersion1_2);
+ iBuffer=HBufC::NewL(EMaxWriteBufferSize);
+ TPtr temp=iBuffer->Des();
+ iBufPtr.Set(temp);
+ iPctWriteBuffer.Set(temp);
+ }
+
+CNetDialDialogSession::~CNetDialDialogSession()
+/**
+Destructor.
+*/
+ {
+ delete iBuffer;
+ delete iDb;
+ CancelEverything();
+ // Just in case the cancel fails, delete the objects.
+ // This is safe as the pointers are nulled after successful
+ // completition to client.
+ delete iIAPSelection;
+ delete iAccessPointSelection;
+ delete iModemAndLocationSelection;
+ delete iIAPWarning;
+ delete iLogin;
+ delete iAuthenticate;
+ delete iReconnect;
+ delete iPct;
+ delete iQoSWarning;
+ __FLOG_CLOSE;
+ }
+
+void CNetDialDialogSession::ServiceL(const RMessage2& aMessage)
+/**
+Services the specified transaction.
+
+@param aMessage A Reference to RMessage class.
+*/
+ {
+ TRAPD(err,DispatchMessageL(aMessage));
+ if(err!=KErrNone)
+ aMessage.Complete(err);
+ }
+
+void CNetDialDialogSession::DispatchMessageL(const RMessage2& aMessage)
+/**
+Dispatch the Message.
+
+@param aMessage A Reference to RMessage class.
+*/
+ {
+ switch (aMessage.Function())
+ {
+ case EGetIAP:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EGetIAP;
+ GetIAPL();
+ break;
+ case EGetAccessPoint:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EGetAccessPointState;
+ GetAccessPointL();
+ break;
+ case EGetAccessPointAP:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EGetAccessPointState;
+ GetAccessPointAPL();
+ break;
+ case EGetModemAndLocation:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EGetModemAndLocation;
+ GetModemAndLocationL();
+ break;
+ case EWarnNewIAP:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EWarnIAP;
+ WarnIAPL();
+ break;
+ case EGetLogin:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=ELogin;
+ GetLoginL();
+ break;
+ case EGetAuthentication:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EAuthentication;
+ GetAuthenticationL();
+ break;
+ case EGetReconnectReq:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EReconnectReq;
+ ReconnectReqL();
+ break;
+ case EOpenPct:
+ CheckBusyL();
+ CheckPctL(aMessage);
+ iMessage=aMessage;
+ iState=EPct;
+ OpenPctL();
+ break;
+ case EWritePct:
+ CheckPctL(aMessage);
+ iMessage=aMessage;
+ iState=EPct;
+ WritePct();
+ break;
+ case EReadPct:
+ CheckPctL(aMessage);
+ iReadPctMessage=aMessage;
+ iState=EPct;
+ ReadPctL();
+ break;
+ case EDestroyPctNotification:
+ CheckPctL(aMessage);
+ iDestroyNotificationMessage=aMessage;
+ iState=EPct;
+ DestroyPctNotificationL();
+ break;
+ case EClosePct:
+ CheckPctL(aMessage);
+ iMessage=aMessage;
+ iState=EPct;
+ ClosePct();
+ break;
+ case EWarnQoS:
+ CheckBusyL();
+ iMessage=aMessage;
+ iState=EWarnQoSState;
+ WarnQoSL();
+ break;
+ case ECancelGetIAP:
+ case ECancelGetAccessPoint:
+ case ECancelGetModemAndLocation:
+ case ECancelWarnIAP:
+ case ECancelLogin:
+ case ECancelAuthenticate:
+ case ECancelReconnect:
+ case ECancelReadPct:
+ case ECancelDestroyPctNotification:
+ case ECancelWarnQoS:
+ Cancel((TDialogServRqst)aMessage.Function());
+ aMessage.Complete(KErrNone);
+ if(!iMessage.IsNull())
+ iMessage.Complete(KErrCancel);
+ break;
+ default:
+ PanicClient(EClientBadRequest);
+ break;
+ }
+ }
+
+void CNetDialDialogSession::CheckBusyL()
+/**
+Check whether the request is Busy.
+*/
+ {
+ if(iBusy)
+ {
+ User::Leave(KErrInUse);
+ }
+
+ iBusy=ETrue;
+ }
+
+TInt CNetDialDialogSession::GeneralCallBackL(TAny* aSession)
+ {
+ __ASSERT_ALWAYS(aSession,PanicServer(ESvrGeneralCallBackNoSession));
+
+ CNetDialDialogSession* self = STATIC_CAST(CNetDialDialogSession*,aSession);
+
+ switch (self->iState)
+ {
+ case EGetIAP:
+ self->GetIAPCompleteL(self->iIAPSelection->Status());
+ break;
+ case EGetModemAndLocation:
+ self->GetModemAndLocationCompleteL(self->iModemAndLocationSelection->Status());
+ break;
+ case EWarnIAP:
+ self->WarnIAPCompleteL(self->iIAPWarning->Status());
+ break;
+ case ELogin:
+ self->CompleteLoginL(self->iLogin->Status());
+ break;
+ case EAuthentication:
+ self->CompleteAuthentication(self->iAuthenticate->Status());
+ break;
+ case EReconnectReq:
+ self->CompleteReconnectReq(self->iReconnect->Status());
+ break;
+ case EWarnQoSState:
+ self->WarnQoSCompleteL(self->iQoSWarning->Status());
+ break;
+ case EGetAccessPointState:
+ self->GetAccessPointCompleteL(self->iAccessPointSelection->Status());
+ break;
+ default:
+ PanicServer(ESvrGeneralCallBackError);
+ break;
+ }
+
+ if (self->iDb)
+ {
+ delete self->iDb;
+ self->iDb = NULL;
+ }
+
+ return KErrNone;
+ }
+
+void CNetDialDialogSession::GetModemAndLocationL()
+/**
+Shows a dialog to enable the user to choose which modem and location to use for data transactions
+*/
+ {
+ iModemAndLocationSelection = CModemAndLocationSelection::NewL(iDb,this);
+
+ TCallBack callBack(GeneralCallBackL,this);
+ iModemAndLocationSelection->GetModemAndLocationL(iModemId(),iLocationId(),callBack);
+ }
+
+void CNetDialDialogSession::GetModemAndLocationCompleteL(TInt aStatus)
+/**
+Shows a dialog to indicate whether data transcations is completed.
+@param aStatus whether sucess or failure.
+*/
+ {
+ if (aStatus == KErrNone)
+ {
+ iMessage.WriteL(0,iModemId);
+ iMessage.WriteL(1,iLocationId);
+ }
+
+ delete iModemAndLocationSelection;
+ iModemAndLocationSelection = NULL;
+
+ iBusy=EFalse;
+
+ iMessage.Complete(aStatus);
+ }
+
+void CNetDialDialogSession::GetIAPL()
+/**
+Get IAP
+*/
+ {
+ iMessage.ReadL(1,iPrefs);
+
+ const TInt lastError = iMessage.Int2();
+
+ iIAPSelection=CIAPSelection::NewL(iDb,this);
+
+ TCallBack callBack(GeneralCallBackL,this);
+ iIAPSelection->GetIAPL(iIAP(),iPrefs(),lastError,callBack);
+ }
+
+void CNetDialDialogSession::GetIAPCompleteL(TInt aStatus)
+ {
+ __FLOG_1(_L("CNetDialDialogSession::GetIAPCompleteL - Returned %d"),aStatus);
+ if (aStatus == KErrNone)
+ {
+ iMessage.WriteL(0,iIAP);
+ }
+
+ delete iIAPSelection;
+ iIAPSelection = NULL;
+
+ iBusy=EFalse;
+
+ iMessage.Complete(aStatus);
+ }
+
+void CNetDialDialogSession::WarnIAPL()
+/**
+Warn IAP
+*/
+ {
+ iMessage.ReadL(0,iPrefs);
+ const TInt lastError = iMessage.Int1();
+ iMessage.ReadL(2,iNewIAPName);
+
+ iIAPWarning = CIAPWarning::NewL(this);
+
+ TCallBack callBack(GeneralCallBackL,this);
+ iIAPWarning->WarnIAPL(iPrefs(),lastError,iNewIAPName,iBool(),callBack);
+ }
+
+void CNetDialDialogSession::WarnIAPCompleteL(TInt aStatus)
+ {
+ if (aStatus == KErrNone)
+ {
+ iMessage.WriteL(3,iBool);
+ }
+
+ delete iIAPWarning;
+ iIAPWarning = NULL;
+
+ iBusy = EFalse;
+
+ iMessage.Complete(aStatus);
+ }
+
+void CNetDialDialogSession::GetAccessPointL()
+/**
+Get AccessPoint
+*/
+ {
+ // licensees specific implementation, this is only a reference
+ ASSERT(iAccessPointSelection==NULL);
+ const TInt tierId = iMessage.Int1();
+ iAccessPointSelection=CAccessPointSelection::NewL(iDb,this);
+ TCallBack callBack(GeneralCallBackL,this);
+ iAccessPointSelection->GetAccessPointL(iAccessPoint(),tierId,callBack);
+ }
+
+void CNetDialDialogSession::GetAccessPointAPL()
+/**
+Get AccessPoint filtered on bearer-related info
+*/
+ {
+ // licensees specific implementation, this is only a reference
+ ASSERT(iAccessPointSelection==NULL);
+ const TInt tierId = iMessage.Int1();
+ iAccessPointSelection=CAccessPointSelection::NewL(iDb,this);
+ TCallBack callBack(GeneralCallBackL,this);
+ iAccessPointSelection->GetAccessPointL(iAccessPoint(),tierId,callBack);
+ }
+
+void CNetDialDialogSession::GetAccessPointCompleteL(TInt aStatus)
+ {
+ __FLOG_1(_L("CNetDialDialogSession::GetAccessPointCompleteL - Returned %d"),aStatus);
+ if (aStatus == KErrNone)
+ {
+ iMessage.WriteL(0,iAccessPoint);
+ }
+
+ delete iAccessPointSelection;
+ iAccessPointSelection = NULL;
+ iBusy=EFalse;
+ iMessage.Complete(aStatus);
+ }
+
+void CNetDialDialogSession::GetLoginL()
+/**
+Login Dialog
+*/
+ {
+ iLogin=CLogin::NewL(this);
+
+ iMessage.ReadL(0,iUsername);
+ iMessage.ReadL(1,iPassword);
+
+ TCallBack callBack(GeneralCallBackL,this);
+ iLogin->GetUserPassL(iUsername,iPassword,callBack);
+ }
+
+void CNetDialDialogSession::CompleteLoginL(TInt aStatus)
+/**
+Shows the dialog to indicate the Login Complete.
+*/
+ {
+ if(aStatus==KErrNone)
+ {
+ iMessage.WriteL(0,iUsername);
+ iMessage.WriteL(1,iPassword);
+ }
+
+ delete iLogin;
+ iLogin=NULL;
+ iBusy=EFalse;
+
+ iMessage.Complete(aStatus);
+ }
+
+void CNetDialDialogSession::GetAuthenticationL()
+/**
+Authentication Dialog
+*/
+ {
+ iAuthenticate=CAuthenticate::NewL(this);
+
+ iMessage.ReadL(0,iUsername);
+ iMessage.ReadL(1,iPassword);
+
+ TCallBack callBack(GeneralCallBackL,this);
+ iAuthenticate->GetUserPassL(iUsername,iPassword,callBack);
+ }
+
+void CNetDialDialogSession::CompleteAuthentication(TInt aStatus)
+/**
+Complete the Authentication process.
+*/
+ {
+ if(aStatus==KErrNone)
+ {
+ TInt ret = iMessage.Write(0,iUsername);
+ if (ret!=KErrNone)
+ PanicClient(EClientBadDescriptor);
+ ret = iMessage.Write(1,iPassword);
+ if (ret!=KErrNone)
+ PanicClient(EClientBadDescriptor);
+ }
+
+ delete iAuthenticate;
+ iAuthenticate=NULL;
+ iBusy=EFalse;
+
+ iMessage.Complete(aStatus);
+ }
+
+void CNetDialDialogSession::ReconnectReqL()
+/**
+Reconnection Request
+*/
+ {
+ iReconnect=CReconnect::NewL(this);
+
+ TCallBack callBack(GeneralCallBackL,this);
+ iReconnect->ReconnectL(callBack);
+ }
+
+void CNetDialDialogSession::CompleteReconnectReq(TBool aBool)
+/**
+Shows Complete Reconnect Request
+*/
+ {
+ TPckg<TBool> boolDes(aBool);
+ TInt ret = iMessage.Write(0,boolDes);
+ if (ret!=KErrNone)
+ PanicClient(EClientBadDescriptor);
+
+ delete iReconnect;
+ iReconnect=NULL;
+ iBusy=EFalse;
+
+ iMessage.Complete(KErrNone);
+ }
+
+//
+// Post Connection Terminal
+//
+void CNetDialDialogSession::CheckPctL(const RMessage2& aMessage)
+/**
+Post Connection Terminal
+
+@param aMessage A Reference to RMessage class.
+*/
+ {
+
+ if (aMessage.Function()==EOpenPct)
+ {
+ if (iPctOpen)
+ PanicClient(EClientPctAlreadyOpen);
+ }
+ else
+ {
+ if (!iPctOpen)
+ PanicClient(EClientPctNotOpen);
+ if (!iBusy)
+ User::Leave(KErrGeneral);
+ }
+ }
+
+void CNetDialDialogSession::OpenPctL()
+/**
+Open the Post Connection Terminal.
+*/
+ {
+ iPct=CPct::NewL(this);
+ iPctOpen=ETrue;
+ iMessage.Complete(KErrNone);
+ }
+
+void CNetDialDialogSession::WritePct()
+/**
+Write to Post Connection Terminal.
+*/
+ {
+ __ASSERT_DEBUG(iPct, PanicServer(ESvrPctNotOpen));
+
+ TPtr temp(iBufPtr);
+ temp.Copy(iPctWriteBuffer);
+
+ TBuf<EMaxWriteBufferSize> newBuffer;
+ TInt ret = iMessage.Read(0,newBuffer);
+ if (ret!=KErrNone)
+ PanicClient(EClientBadDescriptor);
+ else
+ {
+ if (newBuffer.Length()<=EMaxWriteBufferSize-3)
+ {
+ _LIT(KEllipsis,"...");
+ newBuffer.Append(KEllipsis);
+ }
+ TInt len=temp.Length()+newBuffer.Length();
+ if (len>EMaxWriteBufferSize)
+ {
+ temp.Copy(temp.Right(temp.Length()-(len-EMaxWriteBufferSize)));
+ len=EMaxWriteBufferSize;
+ }
+ iPctWriteBuffer.Set((TText*)temp.Ptr(),temp.Length(),len);
+ iPctWriteBuffer.Append(newBuffer);
+ }
+
+ iPct->WritePct(iPctWriteBuffer);
+ iMessage.Complete(KErrNone);
+ }
+
+void CNetDialDialogSession::ReadPctL()
+/**
+Read from Post Connection Terminal.
+*/
+ {
+
+ __ASSERT_DEBUG(iPct, PanicServer(ESvrPctNotOpen));
+
+ iPctReadBuffer.Zero();
+ iReadPctMessage.ReadL(0,iPctReadBuffer);
+
+ TCallBack readPctCallBack(ReadPctCallBack,this);
+ iPct->ReadPctL(iPctReadBuffer,readPctCallBack);
+ iReadPctOutstanding=ETrue;
+ }
+
+TInt CNetDialDialogSession::ReadPctCallBack(TAny* aContext)
+ {
+
+ CNetDialDialogSession* This=(CNetDialDialogSession*)aContext;
+ if (This)
+ This->ReadPctComplete(This->iPct->Status());
+ return KErrNone;
+ }
+
+void CNetDialDialogSession::ReadPctComplete(TInt aStatus)
+/**
+Complete the Read form Post Connection Terminal.
+
+@param aStatus if success KErrNone else any other error code.
+@panic ESvrNoReadPctOutstanding if no ReadPct is outstanding.
+*/
+ {
+
+ __ASSERT_DEBUG(iReadPctOutstanding, PanicServer(ESvrNoReadPctOutstanding));
+
+ if(aStatus==KErrNone)
+ {
+ TInt pos=iPctReadBuffer.Locate('.');
+ if (pos>=0)
+ {
+ TPtrC carriageRet(&KCarriageReturn);
+ iPctReadBuffer.Insert(pos,carriageRet);
+ }
+ TInt ret = iReadPctMessage.Write(0,iPctReadBuffer);
+ if (ret!=KErrNone)
+ PanicClient(EClientBadDescriptor);
+ }
+
+ iReadPctMessage.Complete(aStatus);
+ iReadPctOutstanding=EFalse;
+ }
+
+void CNetDialDialogSession::DestroyPctNotificationL()
+/**
+Destroy Pct Notification
+
+@panic ESvrPctNotOpen if Pct is not open.
+*/
+ {
+ __ASSERT_DEBUG(iPct, PanicServer(ESvrPctNotOpen));
+
+ TCallBack destroyPctCallBack(DestroyPctCallBack,this);
+ iPct->DestroyPctNotificationL(destroyPctCallBack);
+ iDestroyPctNotfcnOutstanding = ETrue;
+ }
+
+TInt CNetDialDialogSession::DestroyPctCallBack(TAny* aContext)
+ {
+ CNetDialDialogSession* session=(CNetDialDialogSession*)aContext;
+ if (session)
+ session->DestroyPctComplete(session->iPct->Status());
+ return KErrNone;
+ }
+
+void CNetDialDialogSession::DestroyPctComplete(TInt aStatus)
+/**
+Destroy Pct Complete.
+
+@param aStatus if success KErrNone else any other error code.
+*/
+ {
+ __ASSERT_DEBUG(iDestroyPctNotfcnOutstanding, PanicServer(ESvrNoDestroyPctNotfcnOutstanding));
+
+ iDestroyNotificationMessage.Complete(aStatus);
+ iDestroyPctNotfcnOutstanding = EFalse;
+ }
+
+void CNetDialDialogSession::ClosePct()
+/**
+Close Pct.
+*/
+ {
+ __ASSERT_DEBUG(iPct, PanicServer(ESvrPctNotOpen));
+ __ASSERT_ALWAYS(!iReadPctOutstanding, PanicClient(EClientReadPctOutstandingOnClose));
+ __ASSERT_ALWAYS(!iDestroyPctNotfcnOutstanding, PanicClient(EClientDestroyPctNotfcnOutstandingOnClose));
+
+ iPctReadBuffer.Zero();
+ iPctWriteBuffer.Zero();
+ iPct->ClosePct();
+ iBusy=EFalse;
+ iPctOpen=EFalse;
+ iMessage.Complete(KErrNone);
+ }
+
+void CNetDialDialogSession::WarnQoSL()
+/**
+Warn QoS
+*/
+ {
+ iQoSWarning = CQoSWarning::NewL(this);
+
+ TCallBack callBack(GeneralCallBackL,this);
+ iQoSWarning->WarnQoSL(iBool(),callBack);
+ }
+
+void CNetDialDialogSession::WarnQoSCompleteL(TInt aStatus)
+/**
+Complete Warn QoS.
+
+@param aStatus if success KErrNone else any other error code.
+*/
+ {
+ if (aStatus == KErrNone)
+ {
+ iMessage.WriteL(0,iBool);
+ }
+
+ delete iQoSWarning;
+ iQoSWarning = NULL;
+
+ iBusy = EFalse;
+
+ iMessage.Complete(aStatus);
+ }
+
+void CNetDialDialogSession::Cancel(TDialogServRqst aRequest)
+/**
+Call DoCancel() not Cancel() because there is no cancel for the notifier
+so we must set a flag and and cancel when it next returns to the RunL()
+*/
+ {
+ if(!iBusy)
+ return;
+
+ switch (aRequest)
+ {
+ case ECancelGetIAP:
+ if (iState==EGetIAP)
+ {
+ if (iIAPSelection)
+ iIAPSelection->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ case ECancelGetModemAndLocation:
+ if (iState==EGetModemAndLocation)
+ {
+ if (iModemAndLocationSelection)
+ iModemAndLocationSelection->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ case ECancelWarnIAP:
+ if (iState==EWarnIAP)
+ {
+ if (iIAPWarning)
+ iIAPWarning->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ case ECancelLogin:
+ if (iState==ELogin)
+ {
+ if (iLogin)
+ iLogin->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ case ECancelAuthenticate:
+ if (iState==EAuthentication)
+ {
+ if (iAuthenticate)
+ iAuthenticate->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ case ECancelReconnect:
+ if (iState==EReconnectReq)
+ {
+ if (iReconnect)
+ iReconnect->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ case ECancelReadPct:
+ if (iState==EPct && iPctOpen && iReadPctOutstanding)
+ {
+ if (iPct)
+ iPct->Cancel(); // cancels read only
+ iReadPctOutstanding=EFalse;
+ }
+ break;
+ case ECancelDestroyPctNotification:
+ if (iState==EPct && iDestroyPctNotfcnOutstanding)
+ {
+ if (iPct)
+ iPct->DoNotificationCancel();
+ }
+ break;
+ case ECancelWarnQoS:
+ if(iState == EWarnQoSState)
+ {
+ if (iQoSWarning)
+ iQoSWarning->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ case ECancelGetAccessPoint:
+ if (iState==EGetAccessPoint)
+ {
+ if (iAccessPointSelection)
+ iAccessPointSelection->Cancel();
+ iBusy=EFalse;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+void CNetDialDialogSession::CancelEverything()
+/**
+Cancel Every Request.
+*/
+ {
+ switch (iState)
+ {
+ case EGetIAP:
+ Cancel(ECancelGetIAP);
+ break;
+ case EGetModemAndLocation:
+ Cancel(ECancelGetModemAndLocation);
+ break;
+ case EWarnIAP:
+ Cancel(ECancelWarnIAP);
+ break;
+ case ELogin:
+ Cancel(ECancelLogin);
+ break;
+ case EAuthentication:
+ Cancel(ECancelAuthenticate);
+ break;
+ case EReconnectReq:
+ Cancel(ECancelReconnect);
+ break;
+ case EPct:
+ Cancel(ECancelReadPct);
+ Cancel(ECancelDestroyPctNotification);
+ break;
+ case EWarnQoSState:
+ Cancel(ECancelWarnQoS);
+ break;
+ case EGetAccessPointState:
+ Cancel(ECancelGetAccessPoint);
+ break;
+ default:
+ break;
+ }
+ }
+
+void CNetDialDialogSession::PanicClient(TInt aPanic) const
+/**
+Panic the client
+*/
+ {
+ _LIT(KPanicClientText,"AgentDialog Client");
+ User::Panic(KPanicClientText,aPanic);
+ }
+
+EXPORT_C TInt ThreadFunction(TAny* aArg)
+/**
+Global functions
+*/
+ {
+ /* Now shares heap with ESock, so we can rely on heap checking here,
+ must reply on the heap checking in ESock instead. Which is OK as
+ leaks are still detected and HookLogger can still find them. */
+ //__UHEAP_MARK;
+
+ CTrapCleanup* cleanup=NULL;
+ cleanup = CTrapCleanup::New();
+ CActiveScheduler* pA=NULL;
+ pA = new CActiveScheduler;
+ if ( pA && cleanup )
+ {
+ CActiveScheduler::Install(pA);
+
+ CNetDialDialogServer* dlgServer=NULL;
+ TCFModuleInfo* pParameters = (TCFModuleInfo*) aArg;
+ TRAPD(ret,(dlgServer=CNetDialDialogServer::NewL(pParameters->iRxQueues, pParameters->iTxQueues)));
+
+ RThread::Rendezvous(ret);
+ if (ret==KErrNone)
+ {
+ CActiveScheduler::Start();
+ }
+
+ delete dlgServer;
+ }
+ else
+ {
+ RThread::Rendezvous(KErrNoMemory);
+ }
+
+ delete pA;
+ delete cleanup;
+
+ return KErrNone;
+ }
+
+
+/**
+Panic the server
+*/
+GLDEF_C void PanicServer(TAgentDialogPanic aPanic)
+ {
+ User::Panic(KCommsDialogServerName, aPanic);
+ }
+
+/**
+Attempt to start a thread for the dialog server in the C32 process.
+*/
+EXPORT_C TInt StartDialogThread()
+ {
+ RRootServ rootserver;
+ TInt err=rootserver.Connect();
+
+ if(err==KErrNone)
+ {
+ // Load CNetDialDialogServer
+ TCFModuleName name;
+ name.Copy(KCommsDialogServerName);
+ TRSStartModuleParams params(name, TFileName(_L("agentdialog.dll")), EPriorityNormal,
+ /*StackSize*/ 8192, EShareHeap, /*ThreadFunctionOrdinal*/ 29);
+ params.iParams.iShareHeapWith.Copy(SOCKET_SERVER_MAIN_MODULE_NAME);
+ TRequestStatus status;
+ rootserver.LoadCpm(status, params, KNullDesC8);
+ User::WaitForRequest(status);
+ rootserver.Close();
+ if(status.Int()!=KErrNone && status.Int()!=KErrRSModuleAlreadyExist)
+ {
+ err = status.Int();
+ }
+ }
+ return err;
+ }