diff -r 05bc53fe583b -r 83ca720e2b9a bearermanagement/mpm/src/mpmdialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bearermanagement/mpm/src/mpmdialog.cpp Wed Sep 01 12:23:51 2010 +0100 @@ -0,0 +1,374 @@ +/* +* Copyright (c) 2004-2007 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: MPM user dialog handling +* +*/ + +/** +@file mpmdialog.cpp +Mobility Policy Manager user dialog initiation. +*/ + +// INCLUDE FILES +#include // for TConnPref +#include +#include +#include +#include +#include // For feature flags +#include //publish and subscribe + +#include "mpmdialog.h" +#include "mpmlogger.h" +#include "mpmdefaultconnection.h" +#include "rmpm.h" +#include "mpmcommsdataccess.h" + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMPMDialog::NewL +// ----------------------------------------------------------------------------- +// +CMPMDialog* CMPMDialog::NewL( CMPMIapSelection& aIapSelection, + const RAvailableIAPList& aIAPList, + TUint32 aBearerSet, + CArrayPtrFlat& aQueue, + CMPMServer& aServer ) + { + CMPMDialog* self = new ( ELeave ) CMPMDialog( aIapSelection, + aBearerSet, + aQueue, + aServer ); + CleanupStack::PushL( self ); + self->ConstructL( aIAPList ); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CMPMDialog::CMPMDialog +// ----------------------------------------------------------------------------- +// +CMPMDialog::CMPMDialog( CMPMIapSelection& aIapSelection, + TUint32 aBearerSet, + CArrayPtrFlat& aQueue, + CMPMServer& aServer ) + : CMPMDialogBase( *(CArrayPtrFlat*)&aQueue ), + iIapSelection( aIapSelection ), + iSnapOrIAPId( 0 ), + iBearerSet( aBearerSet ), + iServer ( aServer ) + { + } + + +// ----------------------------------------------------------------------------- +// CMPMDialog::~CMPMDialog +// ----------------------------------------------------------------------------- +// +CMPMDialog::~CMPMDialog() + { + Cancel(); + MPMLOGSTRING2( "CMPMDialog::~CMPMDialog: deleted, Completing with code = %i", + iStatus.Int() ) + iDlgServ.Close(); + // Clean up all other stuff + iIAPList.Close(); + } + + +// ----------------------------------------------------------------------------- +// CMPMDialog::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPMDialog::ConstructL( const RAvailableIAPList& aIAPList ) + { + User::LeaveIfError( CopyArray( aIAPList, iIAPList ) ); + CMPMDialogBase::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// CMPMDialog::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPMDialog::Start( CMPMDialogBase* /*aDlg*/ ) + { + InitSelectConnection(); + } + +// ----------------------------------------------------------------------------- +// CMPMDialog::IntSelectConnection +// ----------------------------------------------------------------------------- +// +void CMPMDialog::InitSelectConnection() + { + TInt err = iDlgServ.Connect(); + // Try to publish sort snap data + // + if ( err == KErrNone ) + { + TRAP( err, PublishSortSnapInfoL() ) + } + if ( err != KErrNone ) + { + // Jump to RunL() + TRequestStatus* status = &iStatus; + User::RequestComplete( status, err ); + SetActive(); + return; + } + + // Map bearer set. bearerSet variable is a combination of values + // mapped to TCommDbBearer while iBearerSet is a combination of + // TExtendedConnPref::TExtendedConnBearer values. + + TUint32 bearerSet( ECommDbBearerVirtual ); + if ( iBearerSet == TExtendedConnPref::EExtendedConnBearerUnknown ) + { + bearerSet |= ECommDbBearerCSD | ECommDbBearerWcdma | + ECommDbBearerWLAN; + } + else + { + if ( iBearerSet & TExtendedConnPref::EExtendedConnBearerWLAN ) + { + bearerSet |= ECommDbBearerWLAN; + } + if ( iBearerSet & TExtendedConnPref::EExtendedConnBearerCellular ) + { + bearerSet |= ECommDbBearerWcdma; + } + } + + // API definition was provided by Symbian, but we don't really need + // these parameters with AccessPointConnection. + // + TUint32 unusedVariable( 0 ); + + /* AccessPointConnection API implements also the ChangeConnection in + * the ALR "world", you should also be careful of the input value of + * iSnapOrIAPId, because the Destination with the input ElementID is + * considered the "current Destination in use", so it will not be + * listed by the notifier. So if you really want to see the ALR + * version of AccessPointConnection, in input iSnapOrIAPId MUST be + * an invalid ElementID (e.g. 0), to be sure that no Destinations + * will be removed from the list. + */ + iDlgServ.AccessPointConnection( unusedVariable, + unusedVariable, + iSnapOrIAPId, + bearerSet, + iStatus ); + + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CMPMDialog::PublishSortSnapInfoL +// ----------------------------------------------------------------------------- +// +void CMPMDialog::PublishSortSnapInfoL() + { + // allow PublishSortSnapInfoL to run only + // if the dialog is the first one in the queue. + // => First one is active one. + if ( !IsFirst() ) + { + return; + } + + MPMLOGSTRING( "CMPMDialog::PublishSortSnapInfoL" ) + RArray snaps; + CleanupClosePushL( snaps ); + + // set first snap to 0 as ungathegorised + // + snaps.AppendL( KSortUncategorisedIaps ); + + // Find Snap ids + // + iServer.CommsDatAccess()->FindAllSnapsL( snaps ); + + // Write iaps for each snap, also 0 is + // included for uncategorised + // + TMpmSnapPubSubFormat snapData; + TInt i( 0 ), err( KErrNone ); + for(; ( i < snaps.Count() ) && + ( i < KMPMSortSnapMaxKey ); i++ ) + { + snapData.iSnap = snaps[ i ]; + snapData.iSortedIaps.Reset(); + // Get sorted iaps + // + iIapSelection.Session()->SortSnapL( snaps[ i ], snapData.iSortedIaps ); + + // Define pub&sub key if not already defined + // + err = RProperty::Define( KMPMSortSnapCategory, + i, + KMPMSortSnapType, + KMPMSortSnapReadPolicy, + KMPMSortSnapWritePolicy ); + + if ( err != KErrAlreadyExists && + err != KErrNone ) + { + MPMLOGSTRING2( "CMPMDialog::PublishSortSnapInfoL: error in define: %d ", err ) + } + + TPtrC8 dataPtr( reinterpret_cast< TUint8* >( &snapData ), sizeof( snapData ) ); + + err = RProperty::Set( KMPMSortSnapCategory, + i, + dataPtr ); + if ( err != KErrNone ) + { + MPMLOGSTRING2( "CMPMDialog::PublishSortSnapInfoL: error in set: %d ", err ) + } + MPMLOGSTRING3( "CMPMDialog::PublishSortSnapInfoL: snap %d iap count %d", + snapData.iSnap, snapData.iSortedIaps.Count() ) + } + + // set rest of the keys to undefined + // + while( i < KMPMSortSnapMaxKey ) + { + err = RProperty::Delete( KMPMSortSnapCategory, i ); + if ( err != KErrNotFound && + err != KErrNone ) + { + MPMLOGSTRING2( "CMPMDialog::PublishSortSnapInfoL: error in delete: %d ", err ) + } + i++; + } + CleanupStack::PopAndDestroy( &snaps ); + } + +// ----------------------------------------------------------------------------- +// CMPMDialog::RunL +// ----------------------------------------------------------------------------- +// +void CMPMDialog::RunL() + { + MPMLOGSTRING2( "CMPMDialog::RunL: status = %i", + iStatus.Int() ) + + TMDBElementId tableId = iSnapOrIAPId & KCDMaskShowRecordType; + TBool isIap( EFalse ); + if ( tableId == KCDTIdIAPRecord ) + { + isIap = ETrue; + } + + // Clean data from publish & subscribe + // + CleanSortSnapInfo(); + + TUint32 id = ( iSnapOrIAPId & KCDMaskShowRecordId ) >> KShift8; + iIapSelection.HandleUserSelectionL( isIap, id, iStatus.Int() ); + } + + +// ----------------------------------------------------------------------------- +// CMPMDialog::RunError +// ----------------------------------------------------------------------------- +// +TInt CMPMDialog::RunError(TInt aError) + { + // Handles a leave occurring in the request completion event handler + // RunL(). The active scheduler calls this function if this active + // object's RunL() function leaves. This gives this active object + // the opportunity to perform any necessary cleanup. + // + MPMLOGSTRING2( "CMPMDialog::RunError: RunL left with error = %i", aError ) + iIapSelection.HandleUserSelectionError( aError ); + + // Clean data from publish & subscribe + // + CleanSortSnapInfo(); + + // Return KErrNone to prevent panic + // + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CMPMDialog::DoCancel +// ----------------------------------------------------------------------------- +// +void CMPMDialog::DoCancel() + { + iDlgServ.CancelAccessPointConnection(); + // Clean data from publish & subscribe + // + CleanSortSnapInfo(); + } + + +// ----------------------------------------------------------------------------- +// CMPMDialog::CopyArray +// ----------------------------------------------------------------------------- +// +TInt CMPMDialog::CopyArray( const RAvailableIAPList& aOrigin, + RAvailableIAPList& aCopy ) + { + TInt err( KErrNone ); + + // Clean array first + // + aCopy.Reset(); + + for( TInt i( 0 ); ( i < aOrigin.Count() ) && ( err == KErrNone ); ++i ) + { + err = aCopy.Append( aOrigin[i] ); + if ( err != KErrNone ) + { + // Cleanup and return + // + MPMLOGSTRING2( "CMPMDialog::CopyArray: Append error = %i", err ) + aCopy.Reset(); + } + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CMPMDialog::CleanSortSnapInfoL +// ----------------------------------------------------------------------------- +// +void CMPMDialog::CleanSortSnapInfo() + { + MPMLOGSTRING( "CMPMDialog::CleanSortSnapInfoL" ) + + // Clean info from all keys + // + for( TInt i(0); i < KMPMSortSnapMaxKey; i++ ) + { + TInt err = RProperty::Delete( KMPMSortSnapCategory, i ); + if ( err != KErrNotFound && + err != KErrNone ) + { + MPMLOGSTRING2( "CMPMDialog::CleanSortSnapInfoL: error in delete: %d ", err ) + } + } + } + +// End of File