--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserui/browser/BrowserAppSrc/BrowserCommsModel.cpp Mon Mar 30 12:49:49 2009 +0300
@@ -0,0 +1,288 @@
+/*
+* 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 <ActiveApDb.h>
+#include <ApUtils.h>
+#include <ApSelect.h>
+#include <ApListItemList.h>
+#include <ApListItem.h>
+#include <BrowserNG.rsg>
+#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<MCommsModelObserver>
+ ( 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
+ );
+ (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