wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsconmonwrapperinfo_symbian.cpp
changeset 39 7b3e49e4608a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsconmonwrapperinfo_symbian.cpp	Thu Jun 24 10:49:51 2010 +0300
@@ -0,0 +1,354 @@
+/*
+* Copyright (c) 2009-2010 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:
+* Private implementation of wrapper for Symbian Connection Monitor
+* library's scan interface.
+*/
+
+// System includes
+
+#include <rconnmon.h>
+#include <nifvar.h>
+
+// User includes
+
+#include "wlanqtutils.h"
+#include "wlanqtutilsconnection.h"
+#include "wlanqtutilsconmonwrapper.h"
+#include "wlanqtutilsconmonwrapperinfo_symbian.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "wlanqtutilsconmonwrapperinfo_symbianTraces.h"
+#endif
+
+/*!
+    \class WlanQtUtilsConMonWrapperInfo
+    \brief Private wrapper for Symbian Connection Monitor library.
+
+    Provides functionality to request information about connections.
+*/
+
+// External function prototypes
+
+// Local constants
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+    Constructor.
+    
+    @param [in] wrapper Wrapper to report progress to.
+*/
+
+WlanQtUtilsConMonWrapperInfo::WlanQtUtilsConMonWrapperInfo(
+    WlanQtUtilsConMonWrapper *wrapper) :
+    iMonitoringConnection(0),
+    q_ptr(wrapper)
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERINFO_WLANQTUTILSCONMONWRAPPERINFO_ENTRY, this);
+
+    // Errors in Connection Monitor Server connection are fatal so just
+    // throw them as exceptions
+    QT_TRAP_THROWING(
+        iMonitor.ConnectL();
+        iMonitor.NotifyEventL(*this);
+        );
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERINFO_WLANQTUTILSCONMONWRAPPERINFO_EXIT, this);
+}
+
+/*!
+    Destructor.
+*/
+
+WlanQtUtilsConMonWrapperInfo::~WlanQtUtilsConMonWrapperInfo()
+{
+    OstTraceFunctionEntry1(DUP1_WLANQTUTILSCONMONWRAPPERINFO_WLANQTUTILSCONMONWRAPPERINFO_ENTRY, this);
+
+    iMonitor.CancelNotifications();
+    iMonitor.Close();
+
+    OstTraceFunctionExit1(DUP1_WLANQTUTILSCONMONWRAPPERINFO_WLANQTUTILSCONMONWRAPPERINFO_EXIT, this);
+}
+
+/*!
+   Getter for active connection information.
+
+   @return Information of active connection, if one exists.
+*/ 
+
+WlanQtUtilsConnection *WlanQtUtilsConMonWrapperInfo::ActiveConnection()
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERINFO_ACTIVECONNECTION_ENTRY, this);
+
+    // Get number of active connections
+    TRequestStatus status;
+
+    WlanQtUtilsConnection *activeConn = NULL;
+    TUint numConnections = 0;
+    iMonitor.GetConnectionCount(numConnections, status);
+    User::WaitForRequest(status);
+    if (status.Int() == KErrNone) {
+        // Get connection info of this connection
+        for (TUint i = 1; i <= numConnections; i++) {
+            TUint numSubConnections = 0;
+            TUint connectionId = 0;
+            TInt ret = iMonitor.GetConnectionInfo(
+                i,
+                connectionId,
+                numSubConnections);
+            if (ret == KErrNone) {
+                activeConn = ConnectionInfo(connectionId);
+                if (activeConn != NULL) {
+                    // ConnectionInfo() only returns WLAN connections,
+                    // and there may be only one active WLAN connection,
+                    // so this is the one we want to return and also
+                    // remember later.
+                    Q_ASSERT(iMonitoringConnection == 0 
+                        || iMonitoringConnection == connectionId);
+                    iMonitoringConnection = connectionId;
+                    break;
+                }
+            }
+        }
+    }
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERINFO_ACTIVECONNECTION_EXIT, this);
+    return activeConn;
+}
+
+/*!
+   Returns information of a connection with the given connection ID.
+
+   @param[in] connectionId Connection ID.
+   @return Information of the given connection, if one exists.
+*/
+
+WlanQtUtilsConnection *WlanQtUtilsConMonWrapperInfo::ConnectionInfo(
+    uint connectionId)
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERINFO_CONNECTIONINFO_ENTRY, this);
+    
+    WlanQtUtilsConnection *activeConn = NULL;
+
+    if (IsWlanConnection(connectionId)) {
+        activeConn = new WlanQtUtilsConnection();
+        activeConn->setConnectionId(connectionId);
+        if (!ConnectionInfoDetails(activeConn)) {
+            delete activeConn;
+            activeConn = NULL;
+        }
+    }
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERINFO_CONNECTIONINFO_EXIT, this);
+    return activeConn;
+}
+
+/*!
+   Gets detailed information of a given connection.
+
+   @param[out] connection Where to store info. Connection ID must already
+                          be valid.
+                          
+   @return Returns ETrue if detail fetching succeeded.
+*/
+
+TBool WlanQtUtilsConMonWrapperInfo::ConnectionInfoDetails(
+    WlanQtUtilsConnection *connection)
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERINFO_CONNECTIONINFODETAILS_ENTRY, this);
+    Q_ASSERT(connection != NULL);
+
+    TBool success = EFalse;
+    TUint connectionId = connection->connectionId();
+    TRequestStatus status;
+
+    // Get connection IAP ID.
+    TUint iapId = 0;
+    iMonitor.GetUintAttribute(
+        connectionId,
+        0,
+        KIAPId,
+        iapId,
+        status);
+    User::WaitForRequest(status);
+    if (status.Int() == KErrNone) {
+        connection->setIapId(iapId);
+
+        // Get connection status.
+        TInt connectionStatus = 0;
+        iMonitor.GetIntAttribute(
+            connectionId,
+            0,
+            KConnectionStatus,
+            connectionStatus,
+            status);
+        User::WaitForRequest(status);
+        if (status.Int() == KErrNone) {
+            connection->setConnectionStatus(
+                ConnMonConnStatusMap(connectionStatus));
+            success = ETrue;
+        }
+    }
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERINFO_CONNECTIONINFODETAILS_EXIT, this);
+    return success;
+}
+
+/*!
+   Handler of Connection Monitor Server events.
+   
+   @param [in] connMonEvent Connection monitor event.
+*/
+
+void WlanQtUtilsConMonWrapperInfo::EventL(const CConnMonEventBase& connMonEvent)
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERINFO_EVENTL_ENTRY, this);
+
+    TUint connectionId = connMonEvent.ConnectionId();
+    
+    OstTraceExt2(
+        TRACE_NORMAL,
+        WLANQTUTILSCONMONWRAPPERINFO_EVENTL_EVENTTYPE,
+        "WlanQtUtilsConMonWrapperInfo::EventL;connectionId=%u;aConnMonEvent.EventType()=%{ConnMonEvent}",
+        connectionId,
+        connMonEvent.EventType());
+
+    switch (connMonEvent.EventType()) {
+    case EConnMonCreateConnection:
+        // Filter out other than WLAN connections
+        if (IsWlanConnection(connectionId)) {
+            iMonitoringConnection = connectionId;
+            emit q_ptr->connCreatedEventFromWrapper(connectionId);
+        }
+        break;
+        
+    case EConnMonDeleteConnection:
+        if (iMonitoringConnection == connectionId) {
+            iMonitoringConnection = 0;
+            emit q_ptr->connDeletedEventFromWrapper(connectionId);
+        }
+        break;
+        
+    case EConnMonConnectionStatusChange:
+        if (iMonitoringConnection == connectionId) {
+            // Find out the new status for the connection
+            const CConnMonConnectionStatusChange *connMonStatusEvent;
+            connMonStatusEvent =
+                static_cast< const CConnMonConnectionStatusChange* >(&connMonEvent);
+            WlanQtUtils::ConnStatus connectionStatus;
+            connectionStatus =
+                ConnMonConnStatusMap(connMonStatusEvent->ConnectionStatus());
+            
+            OstTraceExt2(
+                TRACE_NORMAL,
+                WLANQTUTILSCONMONWRAPPERINFO_EVENTL_CONNSTATUS,
+                "WlanQtUtilsConMonWrapperInfo::EventL;connectionId=%u;eventConnectionStatusChange->ConnectionStatus()=%{ConnMonConnStatus}",
+                connectionId,
+                connMonStatusEvent->ConnectionStatus());
+    
+            if (connectionStatus != WlanQtUtils::ConnStatusNone) {
+                emit q_ptr->connStatusEventFromWrapper(
+                    connectionId,
+                    connectionStatus);
+            }
+        }
+        break;
+        
+    default:
+        // Not interesting
+        break;
+    }
+
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERINFO_EVENTL_EXIT, this);
+}
+
+/*!
+   Maps Connection Monitor's connection status value into
+   WlanQtUtilsConnectionStatus.
+   
+   Note: Mapping is only valid for WLAN connections.
+
+   @param connStatus Connection status as used by Connection
+                     Monitor server. Defined in nifvar.h.
+   @return Connection status in Wlan Qt Utilities style.
+*/
+
+WlanQtUtils::ConnStatus WlanQtUtilsConMonWrapperInfo::ConnMonConnStatusMap(
+    TInt connStatus)
+    {    
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERINFO_CONNMONCONNSTATUSMAP_ENTRY, this);
+
+    WlanQtUtils::ConnStatus utilsConnStatus;
+    switch (connStatus) {
+    // KConnectionOpen is not final status for WLAN, because DHCP is
+    // run after that
+    case KConnectionOpen:
+    case KStartingConnection:
+        utilsConnStatus = WlanQtUtils::ConnStatusConnecting;
+        break;
+        
+    case KLinkLayerOpen:
+        utilsConnStatus = WlanQtUtils::ConnStatusConnected;
+        break;
+        
+    case KLinkLayerClosed:
+        utilsConnStatus = WlanQtUtils::ConnStatusDisconnected;
+        break;
+        
+    default:
+        // Ignore all other values
+        utilsConnStatus = WlanQtUtils::ConnStatusNone;
+        break;
+    }
+    
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERINFO_CONNMONCONNSTATUSMAP_EXIT, this);
+    return utilsConnStatus;
+}
+
+/*!
+    Checks the bearer of given connection.
+    Meant for filtering handling only for WLAN IAP's.
+    
+    @param [in] connectionId Connection ID.
+    
+    @return Returns ETrue if connection a WLAN connection, otherwise false. 
+*/
+
+TBool WlanQtUtilsConMonWrapperInfo::IsWlanConnection(TUint connectionId)
+{
+    OstTraceFunctionEntry1(WLANQTUTILSCONMONWRAPPERINFO_ISWLANCONNECTION_ENTRY, this);
+    
+    TBool result = EFalse;
+    TRequestStatus status;
+
+    TInt bearer = 0;
+    iMonitor.GetIntAttribute(
+        connectionId,
+        0,
+        KBearer,
+        bearer,
+        status);
+    User::WaitForRequest(status);
+
+    if (status.Int() == KErrNone && bearer == EBearerWLAN) {
+        result = ETrue;
+    }
+    
+    OstTraceFunctionExit1(WLANQTUTILSCONMONWRAPPERINFO_ISWLANCONNECTION_EXIT, this);
+    return result;
+}