|         |      1 /* | 
|         |      2 * Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). | 
|         |      3 * All rights reserved. | 
|         |      4 * This component and the accompanying materials are made available | 
|         |      5 * under the terms of the License "Eclipse Public License v1.0" | 
|         |      6 * which accompanies this distribution, and is available | 
|         |      7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". | 
|         |      8 * | 
|         |      9 * Initial Contributors: | 
|         |     10 * Nokia Corporation - initial contribution. | 
|         |     11 * | 
|         |     12 * Contributors: | 
|         |     13 * | 
|         |     14 * Description:  | 
|         |     15 *      Implementation of CBrowserCommsModel. | 
|         |     16 * | 
|         |     17 * | 
|         |     18 */ | 
|         |     19  | 
|         |     20  | 
|         |     21 // INCLUDE FILES | 
|         |     22  | 
|         |     23 #include <ActiveApDb.h> | 
|         |     24 #include <ApUtils.h> | 
|         |     25 #include <ApSelect.h> | 
|         |     26 #include <ApListItemList.h> | 
|         |     27 #include <ApListItem.h> | 
|         |     28 #include <BrowserNG.rsg> | 
|         |     29 #include "BrowserCommsModel.h" | 
|         |     30 #include "BrowserDialogs.h" | 
|         |     31 #include "Browser.hrh" | 
|         |     32  | 
|         |     33 // CONSTANTS | 
|         |     34  | 
|         |     35 /// Granularity of observer list. | 
|         |     36 LOCAL_D const TInt KObserverListGranularity = 4; | 
|         |     37  | 
|         |     38 // ================= MEMBER FUNCTIONS ======================= | 
|         |     39  | 
|         |     40 // --------------------------------------------------------- | 
|         |     41 // CBrowserCommsModel::NewL | 
|         |     42 // --------------------------------------------------------- | 
|         |     43 // | 
|         |     44 CBrowserCommsModel* CBrowserCommsModel::NewL() | 
|         |     45     { | 
|         |     46     CBrowserCommsModel* model = new (ELeave) CBrowserCommsModel(); | 
|         |     47     CleanupStack::PushL( model ); | 
|         |     48     model->ConstructL(); | 
|         |     49     CleanupStack::Pop();    // model | 
|         |     50     return model; | 
|         |     51     } | 
|         |     52  | 
|         |     53 // --------------------------------------------------------- | 
|         |     54 // CBrowserCommsModel::~CBrowserCommsModel | 
|         |     55 // --------------------------------------------------------- | 
|         |     56 // | 
|         |     57 CBrowserCommsModel::~CBrowserCommsModel() | 
|         |     58     { | 
|         |     59     delete iObservers; | 
|         |     60     if ( iDb ) | 
|         |     61         { | 
|         |     62         iDb->RemoveObserver( this ); | 
|         |     63         } | 
|         |     64     delete iCachedApList; | 
|         |     65     delete iDb; | 
|         |     66     } | 
|         |     67  | 
|         |     68 // --------------------------------------------------------- | 
|         |     69 // CBrowserCommsModel::CBrowserCommsModel | 
|         |     70 // --------------------------------------------------------- | 
|         |     71 // | 
|         |     72 CBrowserCommsModel::CBrowserCommsModel(): iUpdatePending( EFalse ) | 
|         |     73     { | 
|         |     74     } | 
|         |     75  | 
|         |     76 // --------------------------------------------------------- | 
|         |     77 // CBrowserCommsModel::ConstructL | 
|         |     78 // --------------------------------------------------------- | 
|         |     79 // | 
|         |     80 void CBrowserCommsModel::ConstructL() | 
|         |     81     { | 
|         |     82     iDb = CActiveApDb::NewL( EDatabaseTypeIAP ); | 
|         |     83     iDb->AddObserverL( this ); | 
|         |     84     iCachedApList = new (ELeave) CApListItemList(); | 
|         |     85     iObservers = new (ELeave) CArrayPtrFlat<MCommsModelObserver> | 
|         |     86                                                 ( KObserverListGranularity ); | 
|         |     87     iDelayedRefresh = ETrue; | 
|         |     88     //GetAccessPointsL(); | 
|         |     89     } | 
|         |     90  | 
|         |     91 // --------------------------------------------------------- | 
|         |     92 // CBrowserCommsModel::HandleApDbEventL | 
|         |     93 // --------------------------------------------------------- | 
|         |     94 // | 
|         |     95 void CBrowserCommsModel::HandleApDbEventL | 
|         |     96 ( MActiveApDbObserver::TEvent aEvent ) | 
|         |     97     { | 
|         |     98     // We try to refresh AP list in two cases: | 
|         |     99     // 1. Database changed; | 
|         |    100     // 2. Database unlocked and we have a pending update (previous update was | 
|         |    101     //    unsuccessful). | 
|         |    102     if ( aEvent == MActiveApDbObserver::EDbChanged || | 
|         |    103          ( aEvent == MActiveApDbObserver::EDbAvailable && iUpdatePending ) ) | 
|         |    104             { | 
|         |    105             // Try to refresh cached AP list. | 
|         |    106             iDelayedRefresh = ETrue; | 
|         |    107             //GetAccessPointsL(); | 
|         |    108             NotifyObserversL(); | 
|         |    109             } | 
|         |    110     // MActiveApDbObserver::EDbClosing: | 
|         |    111     // MActiveApDbObserver::EDbAvailable: | 
|         |    112        // These events will never come. Commdb cannot be closed | 
|         |    113         // with a notifier still on it. (It must be deleted to close.) | 
|         |    114     } | 
|         |    115  | 
|         |    116 // --------------------------------------------------------- | 
|         |    117 // CBrowserCommsModel::ApDb | 
|         |    118 // --------------------------------------------------------- | 
|         |    119 // | 
|         |    120 CActiveApDb& CBrowserCommsModel::ApDb() const | 
|         |    121     { | 
|         |    122     return *iDb; | 
|         |    123     } | 
|         |    124  | 
|         |    125 // --------------------------------------------------------- | 
|         |    126 // CBrowserCommsModel::CommsDb | 
|         |    127 // --------------------------------------------------------- | 
|         |    128 // | 
|         |    129 CCommsDatabase& CBrowserCommsModel::CommsDb() const | 
|         |    130     { | 
|         |    131     return *(iDb->Database()); | 
|         |    132     } | 
|         |    133  | 
|         |    134 // --------------------------------------------------------- | 
|         |    135 // CBrowserCommsModel::CopyAccessPointsL | 
|         |    136 // --------------------------------------------------------- | 
|         |    137 // | 
|         |    138 CApListItemList* CBrowserCommsModel::CopyAccessPointsL() | 
|         |    139     { | 
|         |    140     if ( iDelayedRefresh ) | 
|         |    141     	{ | 
|         |    142     	GetAccessPointsL(); | 
|         |    143     	iDelayedRefresh = EFalse; | 
|         |    144     	} | 
|         |    145     CApListItemList* accessPoints = new (ELeave) CApListItemList(); | 
|         |    146     CleanupStack::PushL( accessPoints ); | 
|         |    147     CApListItem* ap; | 
|         |    148     TInt i; | 
|         |    149     TInt count = iCachedApList->Count(); | 
|         |    150     for ( i = 0; i < count; i++ ) | 
|         |    151         { | 
|         |    152         ap = CApListItem::NewLC( iCachedApList->At( i ) ); | 
|         |    153         accessPoints->AppendL( ap ); | 
|         |    154         CleanupStack::Pop();    // ap; owner is now the list. | 
|         |    155         } | 
|         |    156     CleanupStack::Pop();    // accessPoints | 
|         |    157     return accessPoints; | 
|         |    158     } | 
|         |    159  | 
|         |    160 // --------------------------------------------------------- | 
|         |    161 // CBrowserCommsModel::AccessPoints | 
|         |    162 // --------------------------------------------------------- | 
|         |    163 // | 
|         |    164 const CApListItemList* CBrowserCommsModel::AccessPointsL() | 
|         |    165     { | 
|         |    166     if ( iDelayedRefresh ) | 
|         |    167     	{ | 
|         |    168     	GetAccessPointsL(); | 
|         |    169     	iDelayedRefresh = EFalse; | 
|         |    170     	} | 
|         |    171     return iCachedApList; | 
|         |    172     } | 
|         |    173  | 
|         |    174 // --------------------------------------------------------- | 
|         |    175 // CBrowserCommsModel::RefreshAccessPointsL | 
|         |    176 // --------------------------------------------------------- | 
|         |    177 // | 
|         |    178 void CBrowserCommsModel::RefreshAccessPointsL() | 
|         |    179     { | 
|         |    180     iDelayedRefresh = ETrue; | 
|         |    181     //GetAccessPointsL(); | 
|         |    182     } | 
|         |    183  | 
|         |    184 // --------------------------------------------------------- | 
|         |    185 // CBrowserCommsModel::AddObserverL | 
|         |    186 // --------------------------------------------------------- | 
|         |    187 // | 
|         |    188 void CBrowserCommsModel::AddObserverL( MCommsModelObserver& aObserver ) | 
|         |    189     { | 
|         |    190     iObservers->AppendL( &aObserver ); | 
|         |    191     } | 
|         |    192  | 
|         |    193 // --------------------------------------------------------- | 
|         |    194 // CBrowserCommsModel::RemoveObserver | 
|         |    195 // --------------------------------------------------------- | 
|         |    196 // | 
|         |    197 void CBrowserCommsModel::RemoveObserver( MCommsModelObserver& aObserver ) | 
|         |    198     { | 
|         |    199     TInt i; | 
|         |    200     TInt count = iObservers->Count(); | 
|         |    201     for ( i = 0; i < count; i++ ) | 
|         |    202         { | 
|         |    203         if ( iObservers->At( i ) == &aObserver ) | 
|         |    204             { | 
|         |    205             iObservers->Delete( i ); | 
|         |    206             break; | 
|         |    207             } | 
|         |    208         } | 
|         |    209     } | 
|         |    210  | 
|         |    211  | 
|         |    212 // --------------------------------------------------------- | 
|         |    213 // CBrowserCommsModel::GetAccessPointsL | 
|         |    214 // --------------------------------------------------------- | 
|         |    215 // | 
|         |    216 void CBrowserCommsModel::GetAccessPointsL() | 
|         |    217     { | 
|         |    218     CApListItemList* apList = new (ELeave) CApListItemList(); | 
|         |    219     CleanupStack::PushL( apList ); | 
|         |    220     TRAPD( err, DoGetAccessPointsL( *apList ) ); | 
|         |    221     switch ( err ) | 
|         |    222         { | 
|         |    223         case KErrNone: | 
|         |    224             { | 
|         |    225             // Got new data. | 
|         |    226             delete iCachedApList; | 
|         |    227             CleanupStack::Pop();    // apList: now member. | 
|         |    228             iCachedApList = apList; | 
|         |    229             iUpdatePending = EFalse; | 
|         |    230             //NotifyObserversL(); | 
|         |    231             break; | 
|         |    232             } | 
|         |    233  | 
|         |    234         case KErrLocked: | 
|         |    235         case KErrAccessDenied: | 
|         |    236         case KErrPermissionDenied: | 
|         |    237             { | 
|         |    238             // Could not access database. Update now pending, old data remains. | 
|         |    239             CleanupStack::PopAndDestroy();  // apList | 
|         |    240             iUpdatePending = ETrue; | 
|         |    241             break; | 
|         |    242             } | 
|         |    243  | 
|         |    244         default: | 
|         |    245             { | 
|         |    246             // Other error. Propagate. | 
|         |    247             User::Leave( err ); | 
|         |    248             break; | 
|         |    249             } | 
|         |    250         } | 
|         |    251     } | 
|         |    252  | 
|         |    253 // --------------------------------------------------------- | 
|         |    254 // CBrowserCommsModel::DoGetAccessPointsL | 
|         |    255 // --------------------------------------------------------- | 
|         |    256 // | 
|         |    257 void CBrowserCommsModel::DoGetAccessPointsL( CApListItemList& aList ) const | 
|         |    258     { | 
|         |    259     CApSelect* apSelect = CApSelect::NewLC | 
|         |    260         ( | 
|         |    261         *(iDb->Database()), | 
|         |    262         KEApIspTypeAll, | 
|         |    263 //        KEApIspTypeAll | KEApIspTypeWAPMandatory, | 
|         |    264         EApBearerTypeAll, | 
|         |    265         KEApSortNameAscending, | 
|         |    266 		EIPv4 | EIPv6 | 
|         |    267         ); | 
|         |    268     (void)apSelect->AllListItemDataL( aList ); | 
|         |    269     CleanupStack::PopAndDestroy();  // apSelect | 
|         |    270     } | 
|         |    271  | 
|         |    272 // --------------------------------------------------------- | 
|         |    273 // CBrowserCommsModel::NotifyObserversL | 
|         |    274 // --------------------------------------------------------- | 
|         |    275 // | 
|         |    276 void CBrowserCommsModel::NotifyObserversL() | 
|         |    277     { | 
|         |    278     if ( iObservers ) | 
|         |    279         { | 
|         |    280         TInt i; | 
|         |    281         TInt count = iObservers->Count(); | 
|         |    282         for ( i = 0; i < count; i++ ) | 
|         |    283             { | 
|         |    284             iObservers->At( i )->HandleCommsModelChangeL(); | 
|         |    285             } | 
|         |    286         } | 
|         |    287     } | 
|         |    288 // End of File |