browserui/browser/BrowserAppSrc/BrowserCommsModel.cpp
branchRCL_3
changeset 65 8e6fa1719340
equal deleted inserted replaced
64:6385c4c93049 65:8e6fa1719340
       
     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 		EVpnFilterBoth, //For VPNs
       
   268         ETrue    //Easy Wlan ap
       
   269         );
       
   270     (void)apSelect->AllListItemDataL( aList );
       
   271     CleanupStack::PopAndDestroy();  // apSelect
       
   272     }
       
   273 
       
   274 // ---------------------------------------------------------
       
   275 // CBrowserCommsModel::NotifyObserversL
       
   276 // ---------------------------------------------------------
       
   277 //
       
   278 void CBrowserCommsModel::NotifyObserversL()
       
   279     {
       
   280     if ( iObservers )
       
   281         {
       
   282         TInt i;
       
   283         TInt count = iObservers->Count();
       
   284         for ( i = 0; i < count; i++ )
       
   285             {
       
   286             iObservers->At( i )->HandleCommsModelChangeL();
       
   287             }
       
   288         }
       
   289     }
       
   290 // End of File