diff -r 000000000000 -r dfb7c4ff071f datacommsserver/networkingdialogapi/src/ND_DLGSL.CPP --- /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 +#include +#include +using namespace CommsDat; +#include +#include +#include "ND_DLGSL.H" +#include +#include + +/** 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(KCDTIdConnectionPrefsRecord); + //CCDConnectionPrefsRecord* ptrTemplate = new (ELeave) CCDConnectionPrefsRecord(); + CCDConnectionPrefsRecord* ptrTemplate = static_cast(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(iTable->iRecords[iRecordIndex])->iBearerSet = aPrefs.iBearerSet; + static_cast(iTable->iRecords[iRecordIndex])->iDirection = aPrefs.iDirection; + + if(iTable->FindL(*iDb)) + { + CCDIAPRecord* ptrIapRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); + CleanupStack::PushL(ptrIapRecord); + + CCDConnectionPrefsRecord* connpref = static_cast(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(static_cast(iTable->iRecords[iRecordIndex])->iDefaultIAP.iLinkedRecord); + + if(!ptrIapRecord) + { + CCDIAPRecord* ptrIapRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); + CleanupStack::PushL(ptrIapRecord); + + CCDConnectionPrefsRecord* connpref = static_cast(iTable->iRecords[iRecordIndex]); + ptrIapRecord->SetRecordId(connpref->iDefaultIAP); + ptrIapRecord->LoadL(*iDb); + connpref->iDefaultIAP.iLinkedRecord = ptrIapRecord; + + CleanupStack::Pop(ptrIapRecord); + } + + TBuf 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(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(static_cast(iTable->iRecords[iRecordIndex])->iDefaultIAP.iLinkedRecord); + + if(!ptrIapRecord) + { + CCDIAPRecord* ptrIapRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); + + CCDConnectionPrefsRecord* connpref = static_cast(iTable->iRecords[iRecordIndex]); + ptrIapRecord->SetRecordId(connpref->iDefaultIAP); + connpref->iDefaultIAP.iLinkedRecord = ptrIapRecord; + } + + static_cast(static_cast(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(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(iTable->iRecords[i])->iRecordTag == aDefaultAP) + CCDAccessPointRecord* aprec = static_cast(iTable->iRecords[i]); + TInt id = aprec->ElementId() & bitMask; + if ( (static_cast(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* tierTagId = new(ELeave) CMDBField(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(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::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 tmpBuffer; + CCDAccessPointRecord* snapRecord = static_cast(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(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(KCDTIdModemBearerRecord); + ptrTemplate = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord)); + } + else + { + iTable = new (ELeave)CMDBRecordSet(KCDTIdLocationRecord); + ptrTemplate = static_cast(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 tmpBuffer; + tmpBuffer = static_cast(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;iLength();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;iLength();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;iLength();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;iLength();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;iCancel(); + } + + 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;iLength();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; + }