javauis/eswt_akn/eswtapifacade/src/swtbrowseractiveapdb.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_akn/eswtapifacade/src/swtbrowseractiveapdb.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,206 @@
+/*
+* Copyright (c) 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:  THIS FILE IS NOT INCLUDED INTO ECLIPSE CVS DELIVERY
+*
+*/
+
+
+#include <ApSelect.h>
+#include <ApListItemList.h>
+#include <ActiveApDb.h>
+#include <ApListItem.h>
+
+
+#include "swtbrowseractiveapdb.h"
+
+
+
+class CSwtBrowserApDbObserver
+        : public CBase
+        , public MActiveApDbObserver
+{
+public:
+
+    CSwtBrowserApDbObserver(CSwtBrowserActiveApDb* aApDb);
+
+    ~CSwtBrowserApDbObserver();
+    // From MActiveApDbObserver
+
+    /**
+     * From MActiveApDbObserver
+     * Handle database event (refresh cached AP list on change).
+     *
+     * @param aEvent Database-related event.
+     * @return void.
+     */
+    void HandleApDbEventL(MActiveApDbObserver::TEvent aEvent);
+
+
+private:
+    /*
+     * Pointer to avtive ap database
+     * Not own
+     */
+    CSwtBrowserActiveApDb* iApDb;
+};
+
+
+CSwtBrowserApDbObserver::CSwtBrowserApDbObserver(CSwtBrowserActiveApDb* aApDb)
+        : iApDb(aApDb)
+{
+
+}
+
+CSwtBrowserApDbObserver::~CSwtBrowserApDbObserver()
+{
+
+}
+
+
+void CSwtBrowserApDbObserver::HandleApDbEventL(
+    MActiveApDbObserver::TEvent aEvent)
+{
+    iApDb->HandleApDbEventL(aEvent);
+}
+
+
+
+EXPORT_C CSwtBrowserActiveApDb* CSwtBrowserActiveApDb::NewL()
+{
+    CSwtBrowserActiveApDb* activeAp = new(ELeave) CSwtBrowserActiveApDb();
+    CleanupStack::PushL(activeAp);
+    activeAp->ConstructL();
+    CleanupStack::Pop(activeAp);
+    return activeAp;
+}
+
+CSwtBrowserActiveApDb::~CSwtBrowserActiveApDb()
+{
+    if (iDb)
+    {
+        iDb->RemoveObserver(iObserver);
+    }
+    delete iObserver;
+    delete iCachedApList;
+    delete iDb;
+}
+
+
+CSwtBrowserActiveApDb::CSwtBrowserActiveApDb(): iUpdatePending(EFalse)
+{
+}
+
+
+void CSwtBrowserActiveApDb::ConstructL()
+{
+    iDb = CActiveApDb::NewL(EDatabaseTypeIAP);
+    iObserver = new(ELeave) CSwtBrowserApDbObserver(this);
+    iDb->AddObserverL(iObserver);
+    iCachedApList = new(ELeave) CApListItemList();
+    iDelayedRefresh = ETrue;
+}
+
+void CSwtBrowserActiveApDb::HandleApDbEventL(const TInt aEvent)
+{
+    // Refreshing AP list when:
+    // 1. Database changed;
+    // 2. Database unlocked and there is a pending update
+    if (aEvent == MActiveApDbObserver::EDbChanged ||
+            (aEvent == MActiveApDbObserver::EDbAvailable && iUpdatePending))
+    {
+        // Reefresh cached AP list.
+        iDelayedRefresh = ETrue;
+    }
+}
+
+EXPORT_C CActiveApDb& CSwtBrowserActiveApDb::ApDb() const
+{
+    return *iDb;
+}
+
+
+EXPORT_C CCommsDatabase& CSwtBrowserActiveApDb::CommsDb() const
+{
+    return *(iDb->Database());
+}
+
+EXPORT_C TUint32 CSwtBrowserActiveApDb::FirstAccessPointUidL()
+{
+    if (iDelayedRefresh)
+    {
+        GetAccessPointsL();
+        iDelayedRefresh = EFalse;
+    }
+
+    if (iCachedApList->Count() > 0)
+    {
+        return (*iCachedApList)[0]->Uid();
+    }
+    else
+    {
+        return  0;
+    }
+}
+
+
+void CSwtBrowserActiveApDb::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);
+        iCachedApList = apList;
+        iUpdatePending = EFalse;
+        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;
+    }
+    }
+}
+
+
+void CSwtBrowserActiveApDb::DoGetAccessPointsL(CApListItemList& aList) const
+{
+    CApSelect* apSelect = CApSelect::NewLC
+                          (
+                              *(iDb->Database()),
+                              KEApIspTypeAll,
+                              EApBearerTypeAll,
+                              KEApSortNameAscending,
+                              EIPv4 | EIPv6
+                          );
+    apSelect->AllListItemDataL(aList);
+    CleanupStack::PopAndDestroy(apSelect);
+}