--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/networkingdialogapi/src/ND_DLGSL.CPP Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,1719 @@
+// 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
+ @internalComponent
+*/
+
+#include <commsdattypesv1_1.h>
+#include <commsdattypesv1_1_partner.h>
+#include <metadatabase.h>
+using namespace CommsDat;
+#include <cdbpreftable.h>
+#include <agentdialog.h>
+#include "ND_DLGSL.H"
+#include <es_ini.h>
+#include <commsdattypeinfov1_1_internal.h>
+
+/** Literal accepts the String */
+_LIT(KSelectTitle,"Select %S");
+
+/** Literal accepts the String */
+_LIT(KSelectPrompt,"%S");
+
+/** Literal accepts the Integer */
+_LIT(KWarnPrompt,"Connection failed with %d");
+
+/** Literal Specifies the New Connection */
+_LIT(KWarnPromptNoError,"New connection");
+
+/** Literal Conain the String trying to connect to server */
+_LIT(KAttemptPrompt,"Attempt to connect to %S?");
+
+/** Literal prompts to Select IAP */
+_LIT(KIAP,"IAP");
+/** Literal prompts to Select IAP */
+_LIT(KAP, "Access Point");
+
+/** Literal Specifies QoSWarning */
+_LIT(KQoSWarnTitle,"The connection quality is lower than required");
+
+/** Literal Specifies Disconnect option */
+_LIT(KQoSWarnPrompt,"Do you wish to disconnect?");
+
+namespace ND_DLDSL
+ {
+const TInt KOneSecond=1000000; //< TimeInterval of OneSecond
+const TInt KTimeInterval=KOneSecond; //< TimeInterval to start the CPctTimer
+const TInt KNotifierLength=16; //< NotifierLength
+const TText KFullStop='.'; //< Constant to hold FullStop
+ }
+
+CDialogBase::CDialogBase(CNetDialDialogSession* aSession, TInt aPriority)
+ : CActive(aPriority),
+ iSession(aSession),
+ iAgentDialogInput(iAgentDialogInputBuf()),
+ iAgentDialogOutput(iAgentDialogOutputBuf())
+/**
+CDialogBase Constructor.
+*/
+ {
+ __FLOG_OPEN(KDlgSvrLogSubsys, KDlgSvrLogComponent);
+ }
+
+void CDialogBase::ConstructL()
+/**
+Completes construction of the CDialogBase object.
+*/
+ {
+ iNotifier = new(ELeave) RNotifier();
+ User::LeaveIfError(iNotifier->Connect());
+
+ _LIT(KAgentDialogIniFileName, "agentdialog.ini");
+ _LIT(KNotifierUidTag, "NotifierUid");
+ CESockIniData* cfgFile = NULL;
+
+ // coverity[SYMBIAN.CLEANUP_STACK] coverity [alloc_fn]
+ // coverity[SYMBIAN.CLEANUP_STACK] coverity [assign]
+ TRAPD(err, cfgFile = CESockIniData::NewL(KAgentDialogIniFileName));
+ // coverity[SYMBIAN.CLEANUP_STACK] coverity [leave_without_push]
+ __FLOG_1(_L("Agent dialog config file for - returned %d"),err);
+
+ if (err == KErrNone)
+ {
+ // the file was opened correctly
+ TInt val = 0;
+ if (cfgFile->FindVar(KNotifierUidTag, val))
+ {
+ // the value was found, build a TUid to assign to the member variable
+ iUidAgentDialogNotifier = TUid::Uid(val);
+ __FLOG(_L("Uid Found in ini file"));
+ }
+ else
+ {
+ // value was not found, use the default UID for agent dialog notifiers
+ iUidAgentDialogNotifier = KUidAgentDialogNotifier;
+ }
+ delete cfgFile;
+ }
+ else
+ {
+ // the ini file was not found so use the default UID for agent dialog notifiers
+ iUidAgentDialogNotifier = KUidAgentDialogNotifier;
+ }
+ __FLOG_1(_L("Uid Loaded ===>%x"),iUidAgentDialogNotifier.iUid);
+ }
+
+CDialogBase::~CDialogBase()
+/**
+Destructor.
+*/
+ {
+ if (iNotifier!=NULL)
+ {
+ iNotifier->Close();
+ delete iNotifier;
+ }
+ delete iCallBack;
+ __FLOG_CLOSE;
+ }
+
+
+void CDialogBase::StartNotifierAndGetResponse()
+/**
+Utility function to start the dialog notifier
+ */
+ {
+ __ASSERT_DEBUG(iNotifier!=NULL, User::Invariant());
+
+ __FLOG_1(_L("CDialogBase::StartNotifierAndGetResponse - Openning Dialog - Uid Loaded ===>%x "),
+ iUidAgentDialogNotifier.iUid);
+ iNotifier->StartNotifierAndGetResponse( iStatus, iUidAgentDialogNotifier, iAgentDialogInputBuf, iAgentDialogOutputBuf );
+ SetActive();
+ }
+
+void CDialogBase::CancelNotifier()
+/**
+ Utility function to cancel the dialog notifier
+*/
+ {
+ __ASSERT_DEBUG(iNotifier!=NULL, User::Invariant());
+ iCancelFlag=ETrue;
+ iNotifier->CancelNotifier(iUidAgentDialogNotifier);
+ }
+
+void CDialogBase::DoCancel()
+/**
+ Cancel the outstanding request - most of the derived classes have a
+ common DoCancel method, so it seems reasonable to factor it here
+*/
+ {
+ CancelNotifier();
+ }
+
+
+
+
+
+CIAPSelection* CIAPSelection::NewL(CMDBSession* aDb,CNetDialDialogSession* aSession, TInt aPriority)
+/**
+IAP Selection
+
+@param aDb pointer to communications database.
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return Pointer to IAPSelection object.
+*/
+ {
+ CIAPSelection* r=new(ELeave) CIAPSelection(aDb,aSession,aPriority);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CIAPSelection::CIAPSelection(CMDBSession* aDb,CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority),
+ iDb(aDb)
+
+
+/**
+CIAPSelection Constructor
+*/
+ {}
+
+void CIAPSelection::ConstructL()
+/**
+Completes construction of the CIAPSelection object.
+
+@see CDialogBase::ConstructL().
+*/
+ {
+ CDialogBase::ConstructL();
+ CActiveScheduler::Add(this);
+ InitRecordSetL();
+ }
+
+CIAPSelection::~CIAPSelection()
+/**
+CIAPSelection Destructor.
+*/
+ {
+ Cancel();
+ delete iTable;
+ }
+
+void CIAPSelection::InitRecordSetL()
+ {
+ delete iTable;
+ iTable = NULL;
+ iTable = new (ELeave)CMDBRecordSet<CCDConnectionPrefsRecord>(KCDTIdConnectionPrefsRecord);
+ //CCDConnectionPrefsRecord* ptrTemplate = new (ELeave) CCDConnectionPrefsRecord();
+ CCDConnectionPrefsRecord* ptrTemplate = static_cast<CCDConnectionPrefsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord));
+ CleanupStack::PushL(ptrTemplate);
+ User::LeaveIfError((iTable->iRecords).Append(ptrTemplate));
+ CleanupStack::Pop(ptrTemplate);
+ iRecordIndex = 0;
+ }
+
+void CIAPSelection::GetIAPL(TUint32& aIAPId, const TConnectionPrefs& aPrefs, TInt aError, TCallBack aCallBack)
+/**
+Gets the IAP.
+
+@param aIAPId The id of the IAP service.
+@param aPrefs Specifies the rank and desired direction of the connection and bearer.
+@param aError Any error code, or KErrNone if no error.
+@param aCallBack Encapsulates a general call-back function.
+*/
+ {
+ iCancelFlag = EFalse;
+ iCallBack = new(ELeave) CAsyncCallBack(aCallBack,CActive::EPriorityStandard);
+ iIAPId = &aIAPId;
+ iRecordsPresent = ETrue;
+
+ if(iRecordIndex != 0)
+ {
+ InitRecordSetL();
+ }
+
+ static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex])->iBearerSet = aPrefs.iBearerSet;
+ static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex])->iDirection = aPrefs.iDirection;
+
+ if(iTable->FindL(*iDb))
+ {
+ CCDIAPRecord* ptrIapRecord = static_cast<CCDIAPRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
+ CleanupStack::PushL(ptrIapRecord);
+
+ CCDConnectionPrefsRecord* connpref = static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex]);
+ ptrIapRecord->SetRecordId(connpref->iDefaultIAP);
+ ptrIapRecord->LoadL(*iDb);
+ connpref->iDefaultIAP.iLinkedRecord = ptrIapRecord;
+ CleanupStack::Pop(ptrIapRecord);
+ SelectL(aError);
+ }
+ else
+ // else case is common part for failure
+ {
+ if (aError!=KErrNone)
+ {
+ iAgentDialogInput.iTitle.Format(KWarnPrompt,aError);
+ }
+ _LIT(noService,"No IAP Records Found");
+ iAgentDialogInput.iTitle.Append(noService);
+ iAgentDialogInput.iDialog = EContinueDialog;
+ StartNotifierAndGetResponse();
+ iRecordsPresent = EFalse;
+ }
+ }
+
+void CIAPSelection::SelectL(TInt aError)
+/**
+@param aError Any error code, or KErrNone if no error.
+*/
+ {
+ if (aError!=KErrNone)
+ {
+ iAgentDialogInput.iTitle.Format(KWarnPrompt,aError);
+// iAgentDialogInput.iTitle.Append(KCarriageReturn);
+ }
+ iAgentDialogInput.iTitle.AppendFormat(KSelectTitle,&KIAP);
+ ReselectL();
+ }
+
+void CIAPSelection::ReselectL()
+ {
+ CCDIAPRecord* ptrIapRecord = static_cast<CCDIAPRecord*>(static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex])->iDefaultIAP.iLinkedRecord);
+
+ if(!ptrIapRecord)
+ {
+ CCDIAPRecord* ptrIapRecord = static_cast<CCDIAPRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
+ CleanupStack::PushL(ptrIapRecord);
+
+ CCDConnectionPrefsRecord* connpref = static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex]);
+ ptrIapRecord->SetRecordId(connpref->iDefaultIAP);
+ ptrIapRecord->LoadL(*iDb);
+ connpref->iDefaultIAP.iLinkedRecord = ptrIapRecord;
+
+ CleanupStack::Pop(ptrIapRecord);
+ }
+
+ TBuf<KCommsDbSvrDefaultTextFieldLength> tmpBuffer;
+ tmpBuffer = ptrIapRecord->iRecordName;
+ iAgentDialogInput.iLabel.Format(KSelectPrompt,&tmpBuffer);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ }
+
+void CIAPSelection::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ if (iStatus < KErrNone)
+ {
+ __FLOG_1(_L("Dialog returned with %d"),iStatus.Int());
+ iResultStatus=iStatus.Int();
+ if((iResultStatus==KErrNone)&&(iCancelFlag))
+ {
+ iResultStatus=KErrCancel;
+ }
+ iCallBack->Call();
+ return;
+ }
+
+ if (iRecordsPresent)
+ {
+ if (iStatus.Int() == EAgentYesPressed) //YES Pressed
+ {
+ __FLOG(_L("Dialog returned after \"Yes\" was pressed"));
+ *iIAPId = static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex])->iDefaultIAP;
+ iResultStatus=KErrNone;
+ iCallBack->Call();
+ }
+ else
+ {
+ __FLOG_1(_L("No pressed selecting next record - returned %d"),iStatus.Int());
+ if(iRecordIndex < (iTable->iRecords.Count() - 1))
+ {
+ iRecordIndex++;
+ }
+ else
+ {
+ iRecordIndex = 0;
+ }
+
+ CCDIAPRecord* ptrIapRecord = static_cast<CCDIAPRecord*>(static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex])->iDefaultIAP.iLinkedRecord);
+
+ if(!ptrIapRecord)
+ {
+ CCDIAPRecord* ptrIapRecord = static_cast<CCDIAPRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
+
+ CCDConnectionPrefsRecord* connpref = static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex]);
+ ptrIapRecord->SetRecordId(connpref->iDefaultIAP);
+ connpref->iDefaultIAP.iLinkedRecord = ptrIapRecord;
+ }
+
+ static_cast<CCDIAPRecord*>(static_cast<CCDConnectionPrefsRecord*>(iTable->iRecords[iRecordIndex])->iDefaultIAP.iLinkedRecord)->LoadL(*iDb);
+
+ ReselectL();
+ }
+ }
+ else
+ {
+ iResultStatus=KErrCancel;
+ iCallBack->Call();
+ }
+ }
+
+TInt CIAPSelection::Status()
+/**
+Gets the Status
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+
+CAccessPointSelection* CAccessPointSelection::NewL(CMDBSession* aDb,CNetDialDialogSession* aSession, TInt aPriority)
+/**
+AccessPoint Selection
+
+@param aDb pointer to communications database.
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return Pointer to AccessPointSelection object.
+*/
+ {
+ CAccessPointSelection* r=new(ELeave) CAccessPointSelection(aDb,aSession,aPriority);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CAccessPointSelection::CAccessPointSelection(CMDBSession* aDb,CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority),
+ iDb(aDb)
+/**
+CIAPSelection Constructor
+*/
+ {
+ }
+
+void CAccessPointSelection::ConstructL()
+/**
+Completes construction of the CAccessPointSelection object.
+
+@see CDialogBase::ConstructL().
+*/
+ {
+ CDialogBase::ConstructL();
+ CActiveScheduler::Add(this);
+ }
+
+CAccessPointSelection::~CAccessPointSelection()
+/**
+CAccessPointSelection Destructor.
+*/
+ {
+ Cancel();
+ delete iTable;
+ }
+
+void CAccessPointSelection::InitRecordSetL(TUint32 aDefaultAP, TInt aTierId)
+ {
+ ASSERT(iTable==0);
+ iTable = new (ELeave) CMDBRecordSet<CCDAccessPointRecord>(KCDTIdAccessPointRecord);
+ iTable->LoadL(*iDb);
+
+ //just to show the TableId and RecordId
+ TInt bitMask = KCDMaskShowRecordType | KCDMaskShowRecordId;
+
+ // sort with default SNAP first
+ for (TInt i = 0; i < iTable->iRecords.Count(); i++)
+ {
+ //if (static_cast<CCDAccessPointRecord*>(iTable->iRecords[i])->iRecordTag == aDefaultAP)
+ CCDAccessPointRecord* aprec = static_cast<CCDAccessPointRecord*>(iTable->iRecords[i]);
+ TInt id = aprec->ElementId() & bitMask;
+ if ( (static_cast<CCDAccessPointRecord*>(iTable->iRecords[i])->ElementId() & bitMask) == aDefaultAP)
+ {
+ CMDBRecordBase* t = iTable->iRecords[i];
+ iTable->iRecords[i] = iTable->iRecords[0];
+ iTable->iRecords[0] = t;
+ break;
+ }
+ }
+
+ // filter out all access points that do not belong to the specified group
+ CMDBField<TInt>* tierTagId = new(ELeave) CMDBField<TInt>(KCDTIdTierRecord | KCDTIdRecordTag);
+ CleanupStack::PushL(tierTagId);
+
+ for (TInt i = iTable->iRecords.Count() - 1; i >= 0; i--)
+ {
+ ASSERT((iTable->iRecords[i]->TypeId() & KCDMaskShowRecordType) == KCDTIdAccessPointRecord);
+ //this is the ElementId of the linked TierRec...
+ TMDBElementId tierElementId = static_cast<CCDAccessPointRecord*>(iTable->iRecords[i])->iTier; // was iAccessPointGID; tiers subsume groups concept
+ TInt tierRecId = (tierElementId & KCDMaskShowRecordId) >> 8;
+
+ tierTagId->SetRecordId(tierRecId);
+
+ tierTagId->LoadL(*iDb);
+
+ TInt tierId = *tierTagId;
+ if (tierId != aTierId)
+ {
+ CMDBRecordBase* ptr = iTable->iRecords[i];
+ iTable->iRecords.Remove(i);
+ delete ptr;
+ }
+ }
+ CleanupStack::PopAndDestroy(tierTagId);
+ }
+
+void CAccessPointSelection::GetAccessPointL(TUint32& aAPId, TInt aTierId, TCallBack aCallBack)
+/**
+Gets the access point.
+
+@param aAPId The id of the access point.
+@param aTierId Specifies the tier id.
+@param aError Any error code, or KErrNone if no error.
+@param aCallBack Encapsulates a general call-back function.
+*/
+ {
+ User::LeaveIfError(aTierId>0? KErrNone : KErrArgument);
+
+ iCallBack = new(ELeave) CAsyncCallBack(aCallBack,CActive::EPriorityStandard);
+ iCancelFlag = EFalse;
+ iAPId = &aAPId;
+ iRecordsPresent = ETrue;
+
+ //Get UID of the tier's manager having the tier's id.
+ CCDTierRecord* tierRec = static_cast<CCDTierRecord*>(CCDTierRecord::RecordFactoryL(KCDTIdTierRecord));
+ CleanupStack::PushL(tierRec);
+ tierRec->iRecordTag = aTierId;
+ TBool found = tierRec->FindL(*iDb);
+ if (!found)
+ {
+ User::Leave(KErrNotFound);
+ }
+ ASSERT(tierRec->iTierManagerName.TypeId() == KCDTIdTierManagerName); // Panics if built against incorrect CommsDat.
+
+ if (tierRec->iDefaultAccessPoint != 0)
+ {
+ TInt defaultAP = tierRec->iDefaultAccessPoint;
+ InitRecordSetL(defaultAP,aTierId);
+ if (iTable->iRecords.Count() > 0)
+ {
+ iAgentDialogInput.iTitle.AppendFormat(KSelectTitle, &KAP);
+ ReselectL();
+ }
+ else
+ {
+ iAgentDialogInput.iTitle.Format(KWarnPrompt,KErrNotFound);
+ _LIT(noService, "No Access Point Records Found");
+ iAgentDialogInput.iTitle.Append(noService);
+ iAgentDialogInput.iDialog = EContinueDialog;
+ StartNotifierAndGetResponse();
+ iRecordsPresent = EFalse;
+ }
+ }
+ CleanupStack::PopAndDestroy(tierRec);
+
+ }
+
+void CAccessPointSelection::ReselectL()
+ {
+ TBuf<KCommsDbSvrDefaultTextFieldLength> tmpBuffer;
+ CCDAccessPointRecord* snapRecord = static_cast<CCDAccessPointRecord*>(iTable->iRecords[iRecordIndex]);
+ tmpBuffer = snapRecord->iRecordName;
+ iAgentDialogInput.iLabel.Format(KSelectPrompt,&tmpBuffer);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ }
+
+void CAccessPointSelection::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ if (iStatus < KErrNone)
+ {
+ __FLOG_1(_L("Dialog returned with %d"),iStatus.Int());
+ iResultStatus=iStatus.Int();
+ if((iResultStatus==KErrNone)&&(iCancelFlag))
+ {
+ iResultStatus=KErrCancel;
+ }
+ iCallBack->Call();
+ return;
+ }
+
+ if (iRecordsPresent)
+ {
+ if (iStatus.Int() == EAgentYesPressed) //YES Pressed
+ {
+ __FLOG(_L("Dialog returned after \"Yes\" was pressed"));
+ CCDAccessPointRecord* snapRecord = static_cast<CCDAccessPointRecord*>(iTable->iRecords[iRecordIndex]);
+ *iAPId = snapRecord->iRecordTag;
+ iResultStatus=KErrNone;
+ iCallBack->Call();
+ }
+ else
+ {
+ __FLOG_1(_L("No pressed selecting next record - returned %d"),iStatus.Int());
+ if(iRecordIndex < (iTable->iRecords.Count() - 1))
+ {
+ iRecordIndex++;
+ }
+ else
+ {
+ iRecordIndex = 0;
+ }
+
+ ReselectL();
+ }
+ }
+ else
+ {
+ iResultStatus=KErrCancel;
+ iCallBack->Call();
+ }
+ }
+
+TInt CAccessPointSelection::Status()
+/**
+Gets the Status
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+
+CModemAndLocationSelection* CModemAndLocationSelection::NewL(CMDBSession* aDb,CNetDialDialogSession* aSession, TInt aPriority)
+/**
+Modem And Location Selection
+@param aDb pointer to communications database/commsdat session.
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return A Pointer to CModemAndLocationSelection object.
+*/
+ {
+ CModemAndLocationSelection* r=new(ELeave) CModemAndLocationSelection(aDb,aSession,aPriority);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CModemAndLocationSelection::CModemAndLocationSelection(CMDBSession* aDb,CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority),
+ iDb(aDb)
+
+/**
+Constructor
+*/
+ {}
+
+void CModemAndLocationSelection::ConstructL()
+/**
+Create a new CModemAndLocationSelection object.
+*/
+ {
+ CDialogBase::ConstructL();
+ CActiveScheduler::Add(this);
+ }
+
+void CModemAndLocationSelection::InitRecordSetL(TMDBElementId aRecordId)
+ {
+ delete iTable;
+ iTable = NULL;
+
+ CCDRecordBase* ptrTemplate;
+ if(aRecordId == KCDTIdModemBearerRecord)
+ {
+ iTable = new (ELeave)CMDBRecordSet<CCDModemBearerRecord>(KCDTIdModemBearerRecord);
+ ptrTemplate = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
+ }
+ else
+ {
+ iTable = new (ELeave)CMDBRecordSet<CCDLocationRecord>(KCDTIdLocationRecord);
+ ptrTemplate = static_cast<CCDLocationRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdLocationRecord));
+ }
+
+ CleanupStack::PushL(ptrTemplate);
+ User::LeaveIfError((iTable->iRecords).Append(ptrTemplate));
+ CleanupStack::Pop(ptrTemplate);
+
+ iRecordIndex = 0;
+ }
+CModemAndLocationSelection::~CModemAndLocationSelection()
+/**
+Destructor
+*/
+ {
+ Cancel();
+ delete iTable;
+ }
+
+void CModemAndLocationSelection::GetModemAndLocationL(TUint32& aModemId, TUint32& aLocationId, TCallBack aCallBack)
+/**
+Shows a dialog to enable the user to choose which modem and location to use for data transactions
+
+@param aModemId The id of of the record in the modem table to be used for data transactions
+@param aLocationId The id of the record in the location table to be used for the modem for data transactions
+@param aStatus Any error code, or KErrNone if no error
+*/
+ {
+ iCancelFlag = EFalse;
+ iCallBack = new(ELeave) CAsyncCallBack(aCallBack,CActive::EPriorityStandard);
+ iModemId = &aModemId;
+ iLocationId = &aLocationId;
+
+ StartModemSelectL();
+ }
+
+void CModemAndLocationSelection::StartModemSelectL()
+/**
+Shows a dialog to enable the user to start the modem.
+*/
+ {
+ iState=EEnterModem;
+ InitRecordSetL(KCDTIdModemBearerRecord);
+ TRAPD(result, iTable->LoadL(*iDb));
+
+ if (result != KErrNone)
+ {
+ DisplayNoRecordsL();
+ }
+ else
+ {
+ SelectL(TPtrC(MODEM),KErrNone);
+ }
+ }
+
+void CModemAndLocationSelection::StartLocationSelectL()
+ {
+ iState=EEnterLocation;
+ delete iTable;
+ iTable = NULL;
+ InitRecordSetL(KCDTIdLocationRecord);
+ TRAPD(result, iTable->LoadL(*iDb));
+
+ if (result != KErrNone)
+ {
+ DisplayNoRecordsL();
+ }
+ else
+ {
+ SelectL(TPtrC(LOCATION),KErrNone);
+ }
+ }
+
+void CModemAndLocationSelection::SelectL(const TDesC& aTable, TInt aError)
+ {
+ if (aError!=KErrNone)
+ {
+ iAgentDialogInput.iTitle.Format(KWarnPrompt,aError);
+ iAgentDialogInput.iTitle.Append(KCarriageReturn);
+ iAgentDialogInput.iTitle.AppendFormat(KSelectTitle,&aTable);
+ }
+ else
+ {
+ iAgentDialogInput.iTitle.Format(KSelectTitle,&aTable);
+ }
+ ReselectL();
+ }
+
+void CModemAndLocationSelection::ReselectL()
+ {
+ TBuf<KCommsDbSvrDefaultTextFieldLength> tmpBuffer;
+ tmpBuffer = static_cast<CCDRecordBase*>(iTable->iRecords[iRecordIndex])->iRecordName;
+ iAgentDialogInput.iLabel.Format(KSelectPrompt,&tmpBuffer);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ }
+
+void CModemAndLocationSelection::DisplayNoRecordsL()
+/**
+@Leave ENoRecordFound If no records found.
+*/
+ {
+ switch(iState)
+ {
+ case EEnterModem:
+ {
+ _LIT(noModem,"No Modem Records Found");
+ iAgentDialogInput.iTitle.Copy(noModem);
+ }
+ break;
+ case EEnterLocation:
+ {
+ _LIT(noLocation,"No Location Records Found");
+ iAgentDialogInput.iTitle.Copy(noLocation);
+ }
+ break;
+ default:
+ {
+ _LIT(noRecords,"No Records Found");
+ iAgentDialogInput.iTitle.Copy(noRecords);
+ }
+ break;
+ }
+
+ iAgentDialogInput.iDialog = EContinueDialog;
+ StartNotifierAndGetResponse();
+
+ iState=ENoRecordFound;
+ }
+
+void CModemAndLocationSelection::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ if (iStatus < KErrNone)
+ {
+ iResultStatus=iStatus.Int();
+ if((iResultStatus==KErrNone)&&(iCancelFlag))
+ {
+ iResultStatus=KErrCancel;
+ }
+ iCallBack->Call();
+ return;
+ }
+
+ switch(iState)
+ {
+ case EEnterModem:
+ if(iStatus.Int() == EAgentYesPressed) //Yes Pressed
+ {
+ *iModemId = (iTable->iRecords[iRecordIndex])->RecordId();
+ //iStatusResult is not yet KErrNone because need to enter the location too
+ StartLocationSelectL();
+ }
+ else
+ {
+ if(iRecordIndex < (iTable->iRecords.Count() - 1))
+ {
+ iRecordIndex++;
+ }
+ else
+ {
+ iRecordIndex = 0;
+ }
+ ReselectL();
+ }
+ break;
+ case EEnterLocation:
+ if(iStatus.Int() == EAgentYesPressed) //Yes Pressed
+ {
+ *iLocationId = (iTable->iRecords[iRecordIndex])->RecordId();
+ iResultStatus=KErrNone;
+ iCallBack->Call();
+ }
+ else
+ {
+ if(iRecordIndex < (iTable->iRecords.Count() - 1))
+ {
+ iRecordIndex++;
+ }
+ else
+ {
+ iRecordIndex = 0;
+ }
+ ReselectL();
+ }
+ break;
+ case ENoRecordFound:
+ iResultStatus=KErrCancel;
+ iCallBack->Call();
+ break;
+
+ default:
+ User::Leave(KErrNotFound);
+ break;
+ }
+ }
+
+TInt CModemAndLocationSelection::Status()
+/**
+Gets the Status.
+
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+CIAPWarning* CIAPWarning::NewL(CNetDialDialogSession* aSession, TInt aPriority)
+/**
+IAP Warning.
+
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return A Pointer to CIAPWarning object.
+*/
+ {
+ CIAPWarning* r=new(ELeave) CIAPWarning(aSession,aPriority);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CIAPWarning::CIAPWarning(CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority)
+/**
+Constructor
+*/
+ {}
+
+void CIAPWarning::ConstructL()
+/**
+Create a new CIAPWarning object.
+*/
+ {
+ CDialogBase::ConstructL();
+ CActiveScheduler::Add(this);
+ }
+
+CIAPWarning::~CIAPWarning()
+/**
+Destructor.
+*/
+ {
+ Cancel();
+ }
+
+void CIAPWarning::WarnIAPL(const TConnectionPrefs& /*aPrefs*/, TInt aLastError, const TDesC& aNewIapName, TBool& aResponse, TCallBack aCallBack)
+/**
+Warn IAP
+
+@param aPrefs Specifies the rank and desired direction of the connection and bearer.
+@param aLastError The error with which previous connection failed.
+@param aNewIapName The name of the IAP to be used for next connection.
+@param aResponse Specifies whether to proceed with the connection or stop the connection attempt.
+@param aCallBack Constructs the callback object with the specified callback function .
+*/
+ {
+ iCancelFlag = EFalse;
+ iCallBack = new(ELeave) CAsyncCallBack(aCallBack,CActive::EPriorityStandard);
+ iResponse = &aResponse;
+
+ if (aLastError < KErrNone)
+ {
+ iAgentDialogInput.iTitle.Format(KWarnPrompt,aLastError);
+ iAgentDialogInput.iLabel.Format(KAttemptPrompt,&aNewIapName);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ }
+ else
+ {
+ iAgentDialogInput.iTitle.Copy(KWarnPromptNoError);
+ iAgentDialogInput.iLabel.Format(KAttemptPrompt,&aNewIapName);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ }
+ StartNotifierAndGetResponse();
+
+ }
+
+void CIAPWarning::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ iResultStatus = iStatus.Int();
+ *iResponse = (iStatus.Int() == EAgentYesPressed);
+
+ if(iResultStatus == KErrNone && iCancelFlag)
+ {
+ iResultStatus = KErrCancel;
+ }
+
+ if (iResultStatus > KErrNone)
+ {
+ iResultStatus = KErrNone;
+ }
+
+ iCallBack->Call();
+ }
+
+TInt CIAPWarning::Status()
+/**
+Gets the Status
+
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+
+CLogin* CLogin::NewL(CNetDialDialogSession* aSession, TInt aPriority)
+/**
+Login Dialog
+
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return Pointer to CLogin object.
+*/
+ {
+ CLogin* login=new(ELeave) CLogin(aSession,aPriority);
+ CleanupStack::PushL(login);
+ login->ConstructL();
+ CleanupStack::Pop();
+ return login;
+ }
+
+CLogin::CLogin(CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority)
+/**
+Constructor.
+*/
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CLogin::~CLogin()
+/**
+Destructor.
+*/
+ {
+ Cancel();
+ }
+
+void CLogin::GetUserPassL(TDes& aUsername, TDes& aPassword, TCallBack aCallBack)
+/**
+Get the User Name and Password.
+
+@param aUsername Username.
+@param aPassword Password.
+@param aCallBack Constructs the callback object with the specified callback function.
+*/
+ {
+ iCancelFlag=EFalse;
+ iCallBack=new(ELeave) CAsyncCallBack(aCallBack,0);
+ iUsername=&aUsername;
+ iPassword=&aPassword;
+ StartGetUsername();
+ }
+
+void CLogin::StartGetUsername()
+ {
+ _LIT(KLoginUsernamePrompt,"Select Login Username");
+ iAgentDialogInput.iTitle.Copy(KLoginUsernamePrompt);
+ iAgentDialogInput.iLabel.Copy(*iUsername);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ iState = EEnterName;
+ }
+
+void CLogin::StartGetPassword()
+ {
+ _LIT(KLoginPasswordPrompt,"Select Login Password");
+ iAgentDialogInput.iTitle.Copy(KLoginPasswordPrompt);
+ iAgentDialogInput.iLabel.Copy(*iPassword);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ iState = EEnterPass;
+ }
+
+void CLogin::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ if (iStatus.Int() < KErrNone)
+ {
+ iResultStatus=iStatus.Int();
+ if((iResultStatus==KErrNone)&&(iCancelFlag))
+ {
+ iResultStatus=KErrCancel;
+ }
+ iCallBack->Call();
+ return;
+ }
+
+ switch(iState)
+ {
+ case EEnterName:
+ if(iStatus.Int() == EAgentYesPressed) //yes Pressed
+ {
+ StartGetPassword();
+ }
+ else
+ {
+ for(TInt i=0;i<iUsername->Length();i++)
+ {
+ TChar aChar=(TChar)(++(*iUsername)[i]);
+ if(!aChar.IsAlphaDigit())
+ {
+ (*iUsername)[i]=ND_DLDSL::KFullStop;
+ }
+ }
+ StartGetUsername();
+ }
+ break;
+
+ case EEnterPass:
+ if(iStatus.Int() == EAgentYesPressed) //Yes PRessed
+ {
+ iResultStatus=KErrNone;
+ iCallBack->Call();
+ }
+ else
+ {
+ for(TInt i=0;i<iPassword->Length();i++)
+ {
+ TChar aChar=(TChar)(++(*iPassword)[i]);
+ if(!aChar.IsAlphaDigit())
+ {
+ (*iPassword)[i]=ND_DLDSL::KFullStop;
+ }
+ }
+ StartGetPassword();
+ }
+ break;
+
+ default:
+ User::Leave(KErrNotFound);
+ break;
+ }
+
+ }
+
+
+TInt CLogin::Status()
+/**
+Gets the Status.
+
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+CAuthenticate* CAuthenticate::NewL(CNetDialDialogSession* aSession, TInt aPriority)
+/**
+Authentication Dialog.
+
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return Pointer to CLogin object.
+*/
+ {
+ CAuthenticate* authenticate=new(ELeave) CAuthenticate(aSession,aPriority);
+ CleanupStack::PushL(authenticate);
+ authenticate->ConstructL();
+ CleanupStack::Pop();
+ return authenticate;
+ }
+
+CAuthenticate::CAuthenticate(CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority)
+/**
+Constructor.
+*/
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CAuthenticate::~CAuthenticate()
+/**
+Destructor.
+*/
+ {
+ Cancel();
+ }
+
+void CAuthenticate::GetUserPassL(TDes& aUsername, TDes& aPassword, TCallBack aCallBack)
+/**
+Get the User Name and Password.
+
+@param aUsername Username.
+@param aPassword Password.
+@param aCallBack Constructs the callback object with the specified callback function.
+*/
+ {
+ iCancelFlag=EFalse;
+ iCallBack=new(ELeave) CAsyncCallBack(aCallBack,0);
+ iUsername=&aUsername;
+ iPassword=&aPassword;
+ StartGetUsername();
+ }
+
+void CAuthenticate::StartGetUsername()
+ {
+ _LIT(KAuthUsernamePrompt,"Select Authentication Username");
+ iAgentDialogInput.iTitle.Copy(KAuthUsernamePrompt);
+ iAgentDialogInput.iLabel.Copy(*iUsername);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ iState = EEnterName;
+ }
+
+void CAuthenticate::StartGetPassword()
+ {
+ _LIT(KAuthPasswordPrompt,"Select Authentication Password");
+ iAgentDialogInput.iTitle.Copy(KAuthPasswordPrompt);
+ iAgentDialogInput.iLabel.Copy(*iPassword);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ iState = EEnterPass;
+ }
+
+void CAuthenticate::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ if (iStatus.Int() < KErrNone)
+ {
+ iResultStatus=iStatus.Int();
+ if((iResultStatus==KErrNone)&&(iCancelFlag))
+ {
+ iResultStatus=KErrCancel;
+ }
+ iCallBack->Call();
+ return;
+ }
+
+ if (iStatus.Int() == EAgentNoPressed)
+ {
+ iResultStatus=EAgentNoPressed;
+ iCallBack->Call();
+ return;
+ }
+
+ switch(iState)
+ {
+ case EEnterName:
+ if(iStatus.Int() == EAgentYesPressed) //Yes PRessed
+ {
+ StartGetPassword();
+ }
+ else
+ {
+ for(TInt i=0;i<iUsername->Length();i++)
+ {
+ TChar aChar=(TChar)(++(*iUsername)[i]);
+ if(!aChar.IsAlphaDigit())
+ {
+ (*iUsername)[i]=ND_DLDSL::KFullStop;
+ }
+ }
+ StartGetUsername();
+ }
+ break;
+
+ case EEnterPass:
+ if(iStatus.Int() == EAgentYesPressed) //Yes PRessed
+ {
+ iResultStatus=KErrNone;
+ iCallBack->Call();
+ }
+ else
+ {
+ for(TInt i=0;i<iPassword->Length();i++)
+ {
+ TChar aChar=(TChar)(++(*iPassword)[i]);
+ if(!aChar.IsAlphaDigit())
+ {
+ (*iPassword)[i]=ND_DLDSL::KFullStop;
+ }
+ }
+ StartGetPassword();
+ }
+ break;
+
+ default:
+ User::Leave(KErrNotFound);
+ break;
+ }
+ }
+
+TInt CAuthenticate::Status()
+/**
+Gets the Status.
+
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+
+CReconnect* CReconnect::NewL(CNetDialDialogSession* aSession, TInt aPriority)
+/**
+Reconnection Dialog
+
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return Pointer to CReconnect object.
+*/
+ {
+ CReconnect* reconnect=new(ELeave) CReconnect(aSession,aPriority);
+ CleanupStack::PushL(reconnect);
+ reconnect->ConstructL();
+ CleanupStack::Pop();
+ return reconnect;
+ }
+
+CReconnect::CReconnect(CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority)
+/**
+Constructor.
+*/
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CReconnect::~CReconnect()
+/**
+Destructor.
+*/
+ {
+ Cancel();
+ }
+
+void CReconnect::ReconnectL(TCallBack aCallBack)
+/**
+Shows a reconnect dialog when connection has been broken during data transfer.
+
+@param aCallBack Encapsulates a general call-back function.
+*/
+ {
+ iCancelFlag=EFalse;
+ iCallBack=new(ELeave) CAsyncCallBack(aCallBack,CActive::EPriorityStandard);
+ _LIT(KReconnectTitle,"Reconnect Dialog");
+ iAgentDialogInput.iTitle.Copy(KReconnectTitle);
+ _LIT(KReconnectPrompt,"Reconnect? ");
+ iAgentDialogInput.iLabel.Copy(KReconnectPrompt);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ }
+
+void CReconnect::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ if (iStatus>=KErrNone)
+ {
+ if(iStatus.Int() == EAgentYesPressed)
+ {
+ iResultStatus=ETrue;
+ }
+ else
+ {
+ iResultStatus=EFalse;
+ }
+ if(iCancelFlag)
+ {
+ iResultStatus=EFalse;
+ }
+ iCallBack->Call();
+ return;
+ }
+ iResultStatus=EFalse;
+ iCallBack->Call();
+ }
+
+TBool CReconnect::Status()
+/**
+Gets the Status
+
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+void CReconnect::DoCancel()
+/**
+Implements cancellation of an outstanding request
+*/
+ {
+ CancelNotifier();
+
+ iResultStatus = EFalse; // choose "no"
+ // need to call this so that the previous reconnect request is completed (otherwise the cancellation can block forever)
+ iCallBack->Call();
+ }
+
+CPct* CPct::NewL(CNetDialDialogSession* aSession, TInt aPriority)
+/**
+CPct definitions
+
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return Pointer to CPct object.
+*/
+ {
+ CPct* r=new(ELeave) CPct(aSession,aPriority);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CPct::CPct(CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority),
+ iState(ENone),
+ iDestroyCallBack(EPriorityStandard)
+/**
+Constructor
+*/
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CPct::ConstructL()
+/**
+Create a new CPct object.
+*/
+ {
+ iTimer=CPctTimer::NewL(this);
+ iStartBuffer=0;
+ CDialogBase::ConstructL();
+ }
+
+CPct::~CPct()
+/**
+Destructor
+*/
+ {
+ Cancel();
+ delete iTimer;
+ }
+
+void CPct::WritePct(TDes& aBuffer)
+ {
+ if (iState==ERead)
+ return;
+
+ iCancelFlag=EFalse;
+ iWriteBuffer.Copy(aBuffer);
+
+ for(TInt i=0;i<iWriteBuffer.Length();i++)
+ {
+ if (iWriteBuffer[i]==KCarriageReturn || iWriteBuffer[i]==KLineFeed)
+ iWriteBuffer[i]=ND_DLDSL::KFullStop;
+ }
+
+ if (iState==EWrite)
+ {
+ __ASSERT_DEBUG(iTimer!=NULL, User::Invariant());
+ iTimer->Cancel();
+ }
+
+ DoWrite();
+ }
+
+void CPct::DoWrite()
+ {
+ __ASSERT_DEBUG(iTimer!=NULL, User::Invariant());
+ __ASSERT_DEBUG(iNotifier!=NULL, User::Invariant());
+
+ if (iStartBuffer<(iWriteBuffer.Length()-ND_DLDSL::KNotifierLength))
+ {
+ iNotifier->InfoPrint(iWriteBuffer.Mid(iStartBuffer,ND_DLDSL::KNotifierLength));
+ iStartBuffer+=4;
+ iTimer->Start();
+ iState=EWrite;
+ }
+ else
+ iState=ENone;
+ }
+
+void CPct::PctTimerComplete(TInt /*aStatus*/)
+ {
+ DoWrite();
+ }
+
+void CPct::ReadPctL(TDes& aBuffer,TCallBack& aCallBack)
+ {
+ if (iTimer!=NULL)
+ iTimer->Cancel();
+
+ iCancelFlag=EFalse;
+ delete iCallBack;
+ iCallBack=new(ELeave) CAsyncCallBack(aCallBack,0);
+ iReadBuffer=&aBuffer;
+ StartRead();
+ }
+
+void CPct::StartRead()
+ {
+ __ASSERT_DEBUG(iNotifier!=NULL, User::Invariant());
+
+ iAgentDialogInput.iTitle.Copy(iWriteBuffer.Right(Min(ND_DLDSL::KNotifierLength,iWriteBuffer.Length())));
+ iAgentDialogInput.iLabel.Copy(*iReadBuffer);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ iState=ERead;
+ }
+
+void CPct::DestroyPctNotificationL(TCallBack& aCallBack)
+ {
+ __ASSERT_DEBUG(!iDestroyCallBackOutstanding, User::Invariant());
+
+ iDestroyCallBackOutstanding = ETrue;
+ iDestroyCallBack.Set(aCallBack);
+ }
+
+void CPct::ClosePct()
+/**
+Close the Pct dialog.
+*/
+ {
+ __ASSERT_DEBUG(!iDestroyCallBackOutstanding, User::Invariant());
+
+ DoTimerCancel();
+ }
+
+TInt CPct::Status()
+/**
+Gets the Status
+
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }
+
+void CPct::DoReadCancel()
+/**
+Cancels read only. Does not cancel destroy notification
+*/
+ {
+ iCancelFlag=ETrue;
+ }
+
+void CPct::DoTimerCancel()
+/**
+Cancels timer only. This is not a real cancel as the timer is just so that you can see the
+writes all the time.
+*/
+ {
+ if (iTimer!=NULL)
+ {
+ iTimer->Cancel();
+ delete iTimer;
+ iTimer=NULL;
+ }
+ }
+
+void CPct::DoNotificationCancel()
+/**
+Cancel Notification only.
+*/
+ {
+ if (iDestroyCallBackOutstanding)
+ {
+ iResultStatus = KErrCancel;
+ iDestroyCallBack.Call();
+ iDestroyCallBackOutstanding = EFalse;
+ }
+ }
+
+void CPct::DoCancel()
+/**
+Implements cancellation of an outstanding request
+*/
+ {
+ DoReadCancel();
+ DoTimerCancel();
+ DoNotificationCancel();
+ }
+
+void CPct::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ if (iState!=ERead)
+ User::Leave(KErrNotFound);
+
+ if (iCancelFlag)
+ {
+ iResultStatus=KErrCancel;
+ iCallBack->Call();
+ iState=ENone;
+ return;
+ }
+
+ if (iStatus.Int() < KErrNone)
+ {
+
+ iResultStatus=iStatus.Int();
+ iCallBack->Call();
+ iState=ENone;
+ return;
+ }
+
+ if(iStatus.Int() == EAgentYesPressed)
+ {
+ iResultStatus=KErrNone;
+ iCallBack->Call();
+ iState=EWrite;
+ WritePct(iWriteBuffer);
+ }
+ else
+ {
+ for(TInt i=0;i<iReadBuffer->Length();i++)
+ {
+ TChar ch=(TChar)(++(*iReadBuffer)[i]);
+ if(!ch.IsAlphaDigit())
+ (*iReadBuffer)[i]=ND_DLDSL::KFullStop;
+ }
+ StartRead();
+ }
+ }
+
+CPctTimer* CPctTimer::NewL(CPct* aNotifier)
+/**
+CPctTimer Definition. Create a new CPctTimer object.
+
+@return A Pointer to CPctTimer object.
+*/
+ {
+ CPctTimer* r=new(ELeave) CPctTimer(aNotifier);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CPctTimer::CPctTimer(CPct* aNotifier)
+ : CTimer(0),
+ iNotifier(aNotifier)
+/**
+Constructor.
+*/
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CPctTimer::~CPctTimer()
+/**
+Destructor.
+*/
+ {
+ Cancel();
+ }
+
+void CPctTimer::Start()
+/**
+Start the Pct Timer.
+*/
+ {
+ After(ND_DLDSL::KTimeInterval);
+ }
+
+void CPctTimer::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ iNotifier->PctTimerComplete(iStatus.Int());
+ }
+
+CQoSWarning* CQoSWarning::NewL(CNetDialDialogSession* aSession, TInt aPriority)
+/**
+QoS Warning.
+
+@param aSession pointer to NetDialDialogSession.
+@param aPriority Priority.
+@return Pointer to CQoSWarning object.
+*/
+ {
+ CQoSWarning* r=new(ELeave) CQoSWarning(aSession,aPriority);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+CQoSWarning::CQoSWarning(CNetDialDialogSession* aSession, TInt aPriority)
+ : CDialogBase(aSession, aPriority)
+/**
+Constructor.
+*/
+ {}
+
+void CQoSWarning::ConstructL()
+/**
+Create a new CPctTimer object.
+*/
+ {
+ CDialogBase::ConstructL();
+ CActiveScheduler::Add(this);
+ }
+
+CQoSWarning::~CQoSWarning()
+/**
+Destructor.
+*/
+ {
+ Cancel();
+ }
+
+void CQoSWarning::WarnQoSL(TBool& aResponse, TCallBack aCallBack)
+/**
+Warn QoS
+
+@param aResponse Specifies whether to proceed with the connection or stop the connection attempt.
+@param aCallBack Encapsulates a general call-back function.
+*/
+ {
+ iCancelFlag = EFalse;
+ iCallBack = new(ELeave) CAsyncCallBack(aCallBack,CActive::EPriorityStandard);
+ iResponse = &aResponse;
+
+ iAgentDialogInput.iTitle.Copy(KQoSWarnTitle);
+ iAgentDialogInput.iLabel.Copy(KQoSWarnPrompt);
+ iAgentDialogInput.iDialog = ENoYesDialog;
+ StartNotifierAndGetResponse();
+ }
+
+void CQoSWarning::RunL()
+/**
+Handles an active object’s request completion event.
+*/
+ {
+ iResultStatus = iStatus.Int();
+ *iResponse = (iStatus.Int() == EAgentYesPressed);
+
+ if(iResultStatus == KErrNone && iCancelFlag)
+ iResultStatus = KErrCancel;
+
+ if (iResultStatus > KErrNone)
+ iResultStatus = KErrNone;
+
+ iCallBack->Call();
+ }
+
+TInt CQoSWarning::Status()
+/**
+Gets the Status.
+
+@return the status.
+*/
+ {
+ return iResultStatus;
+ }