diff -r 6385c4c93049 -r 8e6fa1719340 browserui/browser/BrowserAppSrc/BrowserCommsModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserui/browser/BrowserAppSrc/BrowserCommsModel.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,290 @@ +/* +* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Implementation of CBrowserCommsModel. +* +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include "BrowserCommsModel.h" +#include "BrowserDialogs.h" +#include "Browser.hrh" + +// CONSTANTS + +/// Granularity of observer list. +LOCAL_D const TInt KObserverListGranularity = 4; + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CBrowserCommsModel::NewL +// --------------------------------------------------------- +// +CBrowserCommsModel* CBrowserCommsModel::NewL() + { + CBrowserCommsModel* model = new (ELeave) CBrowserCommsModel(); + CleanupStack::PushL( model ); + model->ConstructL(); + CleanupStack::Pop(); // model + return model; + } + +// --------------------------------------------------------- +// CBrowserCommsModel::~CBrowserCommsModel +// --------------------------------------------------------- +// +CBrowserCommsModel::~CBrowserCommsModel() + { + delete iObservers; + if ( iDb ) + { + iDb->RemoveObserver( this ); + } + delete iCachedApList; + delete iDb; + } + +// --------------------------------------------------------- +// CBrowserCommsModel::CBrowserCommsModel +// --------------------------------------------------------- +// +CBrowserCommsModel::CBrowserCommsModel(): iUpdatePending( EFalse ) + { + } + +// --------------------------------------------------------- +// CBrowserCommsModel::ConstructL +// --------------------------------------------------------- +// +void CBrowserCommsModel::ConstructL() + { + iDb = CActiveApDb::NewL( EDatabaseTypeIAP ); + iDb->AddObserverL( this ); + iCachedApList = new (ELeave) CApListItemList(); + iObservers = new (ELeave) CArrayPtrFlat + ( KObserverListGranularity ); + iDelayedRefresh = ETrue; + //GetAccessPointsL(); + } + +// --------------------------------------------------------- +// CBrowserCommsModel::HandleApDbEventL +// --------------------------------------------------------- +// +void CBrowserCommsModel::HandleApDbEventL +( MActiveApDbObserver::TEvent aEvent ) + { + // We try to refresh AP list in two cases: + // 1. Database changed; + // 2. Database unlocked and we have a pending update (previous update was + // unsuccessful). + if ( aEvent == MActiveApDbObserver::EDbChanged || + ( aEvent == MActiveApDbObserver::EDbAvailable && iUpdatePending ) ) + { + // Try to refresh cached AP list. + iDelayedRefresh = ETrue; + //GetAccessPointsL(); + NotifyObserversL(); + } + // MActiveApDbObserver::EDbClosing: + // MActiveApDbObserver::EDbAvailable: + // These events will never come. Commdb cannot be closed + // with a notifier still on it. (It must be deleted to close.) + } + +// --------------------------------------------------------- +// CBrowserCommsModel::ApDb +// --------------------------------------------------------- +// +CActiveApDb& CBrowserCommsModel::ApDb() const + { + return *iDb; + } + +// --------------------------------------------------------- +// CBrowserCommsModel::CommsDb +// --------------------------------------------------------- +// +CCommsDatabase& CBrowserCommsModel::CommsDb() const + { + return *(iDb->Database()); + } + +// --------------------------------------------------------- +// CBrowserCommsModel::CopyAccessPointsL +// --------------------------------------------------------- +// +CApListItemList* CBrowserCommsModel::CopyAccessPointsL() + { + if ( iDelayedRefresh ) + { + GetAccessPointsL(); + iDelayedRefresh = EFalse; + } + CApListItemList* accessPoints = new (ELeave) CApListItemList(); + CleanupStack::PushL( accessPoints ); + CApListItem* ap; + TInt i; + TInt count = iCachedApList->Count(); + for ( i = 0; i < count; i++ ) + { + ap = CApListItem::NewLC( iCachedApList->At( i ) ); + accessPoints->AppendL( ap ); + CleanupStack::Pop(); // ap; owner is now the list. + } + CleanupStack::Pop(); // accessPoints + return accessPoints; + } + +// --------------------------------------------------------- +// CBrowserCommsModel::AccessPoints +// --------------------------------------------------------- +// +const CApListItemList* CBrowserCommsModel::AccessPointsL() + { + if ( iDelayedRefresh ) + { + GetAccessPointsL(); + iDelayedRefresh = EFalse; + } + return iCachedApList; + } + +// --------------------------------------------------------- +// CBrowserCommsModel::RefreshAccessPointsL +// --------------------------------------------------------- +// +void CBrowserCommsModel::RefreshAccessPointsL() + { + iDelayedRefresh = ETrue; + //GetAccessPointsL(); + } + +// --------------------------------------------------------- +// CBrowserCommsModel::AddObserverL +// --------------------------------------------------------- +// +void CBrowserCommsModel::AddObserverL( MCommsModelObserver& aObserver ) + { + iObservers->AppendL( &aObserver ); + } + +// --------------------------------------------------------- +// CBrowserCommsModel::RemoveObserver +// --------------------------------------------------------- +// +void CBrowserCommsModel::RemoveObserver( MCommsModelObserver& aObserver ) + { + TInt i; + TInt count = iObservers->Count(); + for ( i = 0; i < count; i++ ) + { + if ( iObservers->At( i ) == &aObserver ) + { + iObservers->Delete( i ); + break; + } + } + } + + +// --------------------------------------------------------- +// CBrowserCommsModel::GetAccessPointsL +// --------------------------------------------------------- +// +void CBrowserCommsModel::GetAccessPointsL() + { + CApListItemList* apList = new (ELeave) CApListItemList(); + CleanupStack::PushL( apList ); + TRAPD( err, DoGetAccessPointsL( *apList ) ); + switch ( err ) + { + case KErrNone: + { + // Got new data. + delete iCachedApList; + CleanupStack::Pop(); // apList: now member. + iCachedApList = apList; + iUpdatePending = EFalse; + //NotifyObserversL(); + break; + } + + case KErrLocked: + case KErrAccessDenied: + case KErrPermissionDenied: + { + // Could not access database. Update now pending, old data remains. + CleanupStack::PopAndDestroy(); // apList + iUpdatePending = ETrue; + break; + } + + default: + { + // Other error. Propagate. + User::Leave( err ); + break; + } + } + } + +// --------------------------------------------------------- +// CBrowserCommsModel::DoGetAccessPointsL +// --------------------------------------------------------- +// +void CBrowserCommsModel::DoGetAccessPointsL( CApListItemList& aList ) const + { + CApSelect* apSelect = CApSelect::NewLC + ( + *(iDb->Database()), + KEApIspTypeAll, +// KEApIspTypeAll | KEApIspTypeWAPMandatory, + EApBearerTypeAll, + KEApSortNameAscending, + EIPv4 | EIPv6, + EVpnFilterBoth, //For VPNs + ETrue //Easy Wlan ap + ); + (void)apSelect->AllListItemDataL( aList ); + CleanupStack::PopAndDestroy(); // apSelect + } + +// --------------------------------------------------------- +// CBrowserCommsModel::NotifyObserversL +// --------------------------------------------------------- +// +void CBrowserCommsModel::NotifyObserversL() + { + if ( iObservers ) + { + TInt i; + TInt count = iObservers->Count(); + for ( i = 0; i < count; i++ ) + { + iObservers->At( i )->HandleCommsModelChangeL(); + } + } + } +// End of File