diff -r ff3b37722600 -r 10810c91db26 wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsconmonwrapper_s60.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlanqtutilities/wrapper/src/wlanqtutilsconmonwrapper_s60.cpp Fri Apr 16 16:07:56 2010 +0300 @@ -0,0 +1,633 @@ +/* + * Copyright (c) 2009 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 is a source file for following classes: + * ConnMonScanWlanAps, + * ConnMonConnInfo, + * ConnMonConnDisconnect + */ + +// INCLUDE FILES +#include +#include +#include + +#include "wlanqtutilscommon.h" +#include "wlanqtutilswlanap.h" +#include "wlanqtutilsactiveconn.h" +#include "wlanqtutilsconmonwrapper.h" +#include "wlanqtutilsconmonwrapper_s60_p.h" + +#ifdef WLANQTUTILS_NO_OST_TRACES_FLAG +#include +#else +#include "OstTraceDefinitions.h" +#endif +#ifdef OST_TRACE_COMPILER_IN_USE +#include "wlanqtutilsconmonwrapper_s60Traces.h" +#endif + + +// =========== PRIVATE CLASS MEMBER FUNCTIONS =============== +// +// --------------------------------------------------------- +// ConnMonScanWlanAps::ConnMonScanWlanAps() +// Constructor +// --------------------------------------------------------- +// +ConnMonScanWlanAps::ConnMonScanWlanAps(ConMonWrapper *wrapper) : + CActive(EPriorityStandard), q_ptr(wrapper), wlanPtr(0, 0) + { + OstTraceFunctionEntry1( CONNMONSCANWLANAPS_CONNMONSCANWLANAPS_ENTRY, this ); + + CActiveScheduler::Add(this); + // TBD: What if this leaves? + // Beware! iConnMon.ConnectL() can + // both leave AND return an error code.. + // User::LeaveIfError( iMonitor.ConnectL() ); + iMonitor.ConnectL(); + + OstTraceFunctionExit1( CONNMONSCANWLANAPS_CONNMONSCANWLANAPS_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonScanWlanAps::ConnMonScanWlanAps() +// Destructor +// --------------------------------------------------------- +// +ConnMonScanWlanAps::~ConnMonScanWlanAps() + { + OstTraceFunctionEntry1( CONNMONSCANWLANAPS_CONNMONSCANWLANAPSDESTR_ENTRY, this ); + + Cancel(); + // Cancel notifications and close connection monitor session + iMonitor.Close(); + if (wlanBuf) + { + delete wlanBuf; + } + + OstTraceFunctionExit1( CONNMONSCANWLANAPS_CONNMONSCANWLANAPSDESTR_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonScanWlanAps::DoCancel() +// +// --------------------------------------------------------- +// +void ConnMonScanWlanAps::DoCancel() + { + OstTraceFunctionEntry1( CONNMONSCANWLANAPS_DOCANCEL_ENTRY, this ); + // TODO: error handling + OstTraceFunctionExit1( CONNMONSCANWLANAPS_DOCANCEL_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonScanWlanAps::RunL() +// Called when scan is ready. Emits scan results in a signal. +// --------------------------------------------------------- +// +void ConnMonScanWlanAps::RunL() + { + OstTraceFunctionEntry1( CONNMONSCANWLANAPS_RUNL_ENTRY, this ); + + if (iStatus == KErrNone) + { + RConnMonWlanNetworksPtrArray wlanPtrArray; + wlanBuf->UnpackToL(wlanPtrArray); + QList wlanScanResult; + + for (TInt i = 0; i < wlanPtrArray.Count(); i++) + { + WlanQtUtilsWlanAp *ap = new WlanQtUtilsWlanAp(); + + // Security mode values defined in enum TConnMonSecurityMode, rconnmon.h. + TUint connMonWlanSecMode; + WlanQtUtilsWlanSecMode wlanQtUtilsWlanSecMode; + + TBuf wlanName = + wlanPtrArray[i]->Name(); + + QString wlanNameInQt = QString::fromUtf16(wlanName.Ptr(), + wlanName.Length()); + + if (wlanNameInQt.length() == 1 && wlanNameInQt.at(0).unicode() + == 0) + { + // QString handles empty strings (single \0 char) strangely, + // so let's initialize them in a different way: + wlanNameInQt = ""; + } + + ap->setSsid(wlanNameInQt); + + // TODO: Won't compile to ARMV5 for some reason. Commented for awhile. + //TBuf8 wlanBssid = wlanPtrArray[i]->WlanBssid(); + //ap->setBssid(QString::fromUtf8(wlanBssid.Ptr(), wlanBssid.Length())); + ap->setBssid("addMAC"); + + TUint wlanConnectionMode = wlanPtrArray[i]->ConnectionMode(); + ap->setConnectionMode(wlanConnectionMode); + + TUint wlanSignalStrength = wlanPtrArray[i]->SignalStrength(); + ap->setSignalStrength(wlanSignalStrength); + + connMonWlanSecMode = wlanPtrArray[i]->SecurityMode(); + wlanQtUtilsWlanSecMode = conMon2WlanQtUtilsSecModeMap(connMonWlanSecMode); + ap->setSecurityMode(wlanQtUtilsWlanSecMode); + + wlanScanResult.append(ap); + delete wlanPtrArray[i]; + } + q_ptr->emitAvailableWlans(wlanScanResult); + wlanPtrArray.Close(); + delete wlanBuf; + wlanBuf = NULL; + // TODO: Is this enough for clearing QList containing ConnUtilsWlanAps? + wlanScanResult.clear(); + } + else + { + // TODO: add error handling + } + + OstTraceFunctionExit1( CONNMONSCANWLANAPS_RUNL_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonScanWlanAps::scanAvailableWlanAPs() +// Gets APs from Connection Monitor +// --------------------------------------------------------- +// +int ConnMonScanWlanAps::scanAvailableWlanAPs() + { + OstTraceFunctionEntry1( CONNMONSCANWLANAPS_SCANAVAILABLEWLANAPS_ENTRY, this ); + + if (!IsActive()) + { + // TODO: What size for wlanBuf? How to know exact size? + // 2560 ~ 35 wlan APs + wlanBuf = new (ELeave) CConnMonWlanNetworksPtrArrayPckg(2560); + wlanPtr.Set(wlanBuf->Buf()->Des()); + + iMonitor.GetPckgAttribute(EBearerIdWLAN, 0, KWlanNetworks, wlanPtr, + iStatus); + SetActive(); + } + + OstTraceFunctionExit1( CONNMONSCANWLANAPS_SCANAVAILABLEWLANAPS_EXIT, this ); + return KErrNone; + } + +// --------------------------------------------------------- +// ConMonScanWlanAps::connMon2WlanQtUtilsSecModeMap() +// Map security mode from Connection Monitor into WlanQtUtilsWlanSecMode. +// --------------------------------------------------------- +// +WlanQtUtilsWlanSecMode ConnMonScanWlanAps::conMon2WlanQtUtilsSecModeMap(TUint connMonSecMode) + { + WlanQtUtilsWlanSecMode ret = WlanQtUtilsWlanSecModeNone; + switch (connMonSecMode) + { + case EConnMonSecurityWep: + ret = WlanQtUtilsWlanSecModeWep; + break; + case EConnMonSecurity802d1x: + ret = WlanQtUtilsWlanSecMode802_1x; + break; + case EConnMonSecurityWpa: + ret = WlanQtUtilsWlanSecModeWpa; + break; + case EConnMonSecurityWpaPsk: + ret = WlanQtUtilsWlanSecModeWpa2; + break; + default: + // TODO: should default be None/unknown or should there be assert against EConnMonSecurityOpen. + ret = WlanQtUtilsWlanSecModeOpen; + break; + } + + return ret; + } + + +// --------------------------------------------------------- +// ConnMonConnInfo::ConnMonConnInfo() +// Constructor +// --------------------------------------------------------- +// +ConnMonConnInfo::ConnMonConnInfo(ConMonWrapper *wrapper) : + q_ptr(wrapper) + { + OstTraceFunctionEntry1( CONNMONCONNINFO_CONNMONCONNINFO_ENTRY, this ); + + iMonitor.ConnectL(); + StartMonitoringL(); + + OstTraceFunctionExit1( CONNMONCONNINFO_CONNMONCONNINFO_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnInfo::~ConnMonConnInfo() +// Destructor +// --------------------------------------------------------- +// +ConnMonConnInfo::~ConnMonConnInfo() + { + OstTraceFunctionEntry1( CONNMONCONNINFO_CONNMONCONNINFODESTR_ENTRY, this ); + + StopMonitoring(); + iMonitor.Close(); + + OstTraceFunctionExit1( CONNMONCONNINFO_CONNMONCONNINFODESTR_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnInfo::StartMonitoringL() +// Starts monitoring of Connection Monitor Server events +// --------------------------------------------------------- +// +void ConnMonConnInfo::StartMonitoringL() + { + OstTraceFunctionEntry1( CONNMONCONNINFO_STARTMONITORINGL_ENTRY, this ); + + iMonitoring = ETrue; + iMonitor.NotifyEventL(*this); + + OstTraceFunctionExit1( CONNMONCONNINFO_STARTMONITORINGL_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnInfo::StopMonitoring() +// Stops monitoring of Connection Monitor Server events +// --------------------------------------------------------- +// +void ConnMonConnInfo::StopMonitoring() + { + OstTraceFunctionEntry1( CONNMONCONNINFO_STOPMONITORING_ENTRY, this ); + + iMonitoring = EFalse; + iMonitor.CancelNotifications(); + + OstTraceFunctionExit1( CONNMONCONNINFO_STOPMONITORING_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnInfo::EventL() +// Handler of Connection Monitor Server events +// --------------------------------------------------------- +// +void ConnMonConnInfo::EventL(const CConnMonEventBase& aConnMonEvent) + { + OstTraceFunctionEntry1( CONNMONCONNINFO_EVENTL_ENTRY, this ); + + TUint connectionId = aConnMonEvent.ConnectionId(); + OstTraceExt2( + TRACE_NORMAL, + CONNMONCONNINFO_EVENTL_EVENTTYPE, + "ConnMonConnInfo::EventL;connectionId=%u;aConnMonEvent.EventType()=%d", connectionId, aConnMonEvent.EventType() ); + + // Note: Conversions from CConnMonEventBase to sub classes cannot be made to use dynamic_cast + // because constructors of CConnMonEventBase and its sub classes are not public in + // connmon library's interface. + + switch (aConnMonEvent.EventType()) + { + case EConnMonCreateConnection: + q_ptr->emitConnCreatedEvent( connectionId ); + break; + case EConnMonDeleteConnection: + + // TODO: take the following into use. + // const CConnMonDeleteConnection* eventDelete; + // eventDelete = static_cast< const CConnMonDeleteConnection*>( &aConnMonEvent ); + //TUint totalDlVolume = eventDelete->DownlinkData(); + //TUint totalUlVolume = eventDelete->UplinkData(); + //TBool authDelete = eventDelete->AuthoritativeDelete(); + + q_ptr->emitConnDeletedEvent( connectionId ); + break; + case EConnMonConnectionStatusChange: + const CConnMonConnectionStatusChange* eventConnectionStatusChange; + eventConnectionStatusChange = + static_cast< const CConnMonConnectionStatusChange* >( &aConnMonEvent ); + WlanQtUtilsConnectionStatus connectionStatus; + connectionStatus = connMon2WlanQtUtilsConnectionStatusMap( + eventConnectionStatusChange->ConnectionStatus() ); + + OstTraceExt2( + TRACE_NORMAL, + CONNMONCONNINFO_EVENTL_CONNSTATUS, + "ConnMonConnInfo::EventL;connectionId=%u;eventConnectionStatusChange->ConnectionStatus()=%d", + connectionId, + eventConnectionStatusChange->ConnectionStatus() ); + + if (connectionStatus != WlanQtUtilsConnectionStatusNone) { + q_ptr->emitConnStatusEvent( connectionId, connectionStatus ); + } + break; + default: + break; + } + + OstTraceFunctionExit1( CONNMONCONNINFO_EVENTL_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnInfo::activeConnection() +// --------------------------------------------------------- +// +WlanQtUtilsActiveConn *ConnMonConnInfo::activeConnection() + { + OstTraceFunctionEntry1( CONNMONCONNINFO_ACTIVECONNECTION_ENTRY, this ); + + // Get number of active connections + TRequestStatus status; + + 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 ); + Q_ASSERT( ret == KErrNone ); // TODO: error handling + + WlanQtUtilsActiveConn* 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 + OstTraceFunctionExit1( CONNMONCONNINFO_ACTIVECONNECTION_EXIT, this ); + return activeConn; + } + } + } + + OstTraceFunctionExit1( DUP1_CONNMONCONNINFO_ACTIVECONNECTION_EXIT, this ); + return NULL; + } + +// --------------------------------------------------------- +// ConnMonConnInfo::connectionInfo() +// --------------------------------------------------------- +// +WlanQtUtilsActiveConn *ConnMonConnInfo::connectionInfo( uint connectionId ) + { + OstTraceFunctionEntry1( CONNMONCONNINFO_CONNECTIONINFO_ENTRY, this ); + + TRequestStatus status; + WlanQtUtilsActiveConn *activeConn = NULL; + + // Get the connection bearer. + TInt bearer = 0; + iMonitor.GetIntAttribute( + connectionId, + 0, + KBearer, + bearer, + status ); + User::WaitForRequest( status ); + if ( status.Int() == KErrNone ) + { + // We are only interested in WLAN connections. + WlanQtUtilsBearerType bearerType = connMon2WlanQtUtilsBearerTypeMap( bearer ); + if ( bearerType == WlanQtUtilsBearerTypeWlan ) + { + activeConn = new WlanQtUtilsActiveConn(); + activeConn->setConnectionId( connectionId ); + activeConn->setBearerType( bearerType ); + activeConnInfoUpdate( activeConn ); + } + } + + OstTraceFunctionExit1( CONNMONCONNINFO_CONNECTIONINFO_EXIT, this ); + return activeConn; + } + +// --------------------------------------------------------- +// ConnMonConnInfo::activeConnInfoUpdate() +// Requests active connection info from Connection Monitor Server +// --------------------------------------------------------- +// +// TODO: divide this function into smaller pieces depending on the need. +// TODO: optimize so that all the information is not always requested from connmon. +// Only information that is missing is requested. +void ConnMonConnInfo::activeConnInfoUpdate( WlanQtUtilsActiveConn *activeConn ) + { + OstTraceFunctionEntry1( CONNMONCONNINFO_ACTIVECONNINFOUPDATE_ENTRY, this ); + + Q_ASSERT( activeConn != NULL ); + Q_ASSERT( activeConn->bearerType() != WlanQtUtilsBearerTypeNone ); + + TUint connectionId = activeConn->connectionId(); + TRequestStatus status; + + // Get connection IAP ID. + TUint iapId = 0; + iMonitor.GetUintAttribute( + connectionId, + 0, + KIAPId, + iapId, + status ); + User::WaitForRequest( status ); + if ( status.Int() == KErrNone ) + { + activeConn->setIapId( iapId ); + } + + // Get connection status. + TInt connectionStatus = 0; + iMonitor.GetIntAttribute( + connectionId, + 0, + KConnectionStatus, + connectionStatus, + status ); + User::WaitForRequest( status ); + if ( status.Int() == KErrNone ) { + activeConn->setConnectionStatus( connMon2WlanQtUtilsConnectionStatusMap( connectionStatus ) ); + } + + OstTraceFunctionExit1( CONNMONCONNINFO_ACTIVECONNINFOUPDATE_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnInfo::connMon2WlanQtUtilsConnectionStatusMap() +// Maps connection status of Connection Monitor Server to connection +// status of Wlan Qt Utilities. +// --------------------------------------------------------- +// +WlanQtUtilsConnectionStatus ConnMonConnInfo::connMon2WlanQtUtilsConnectionStatusMap( TInt aConnectionStatus ) + { + // TODO: This mapping is not specific to current status which is unknown to wrapper. + // TODO: This is only current implementation and will need serious modifications and + // verification from connmon guys. + WlanQtUtilsConnectionStatus connUtilsConnectionStatus = WlanQtUtilsConnectionStatusNone; + switch (aConnectionStatus) + { + // KConnectionOpen is not final status for WLAN, because DHCP is run after that + case KConnectionOpen: + case KStartingConnection: + connUtilsConnectionStatus = WlanQtUtilsConnectionStatusConnecting; + break; + case KLinkLayerOpen: + connUtilsConnectionStatus = WlanQtUtilsConnectionStatusConnected; + break; + case KConnectionClosed: + case KLinkLayerClosed: + connUtilsConnectionStatus = WlanQtUtilsConnectionStatusDisconnected; + break; + default: + // Ignore all other values + connUtilsConnectionStatus = WlanQtUtilsConnectionStatusNone; + break; + } + + return connUtilsConnectionStatus; + } + +// --------------------------------------------------------- +// ConnMonConnInfo::connMon2WlanQtUtilsBearerTypeMap() +// Maps bearer type of Connection Monitor Server to bearer +// type of Wlan Qt Utilities. +// --------------------------------------------------------- +// +WlanQtUtilsBearerType ConnMonConnInfo::connMon2WlanQtUtilsBearerTypeMap( TInt aBearerType ) + { + WlanQtUtilsBearerType connUtilsBearerType = WlanQtUtilsBearerTypeNone; + switch ( aBearerType ) { + case EBearerWCDMA: + case EBearerGPRS: + case EBearerEdgeGPRS: + connUtilsBearerType = WlanQtUtilsBearerTypeCellular; + break; + case EBearerWLAN: + connUtilsBearerType = WlanQtUtilsBearerTypeWlan; + break; + default: + break; + } + + return connUtilsBearerType; + } + +// --------------------------------------------------------- +// ConnMonConnDisconnect::ConnMonConnDisconnect() +// Constructor +// --------------------------------------------------------- +// +ConnMonConnDisconnect::ConnMonConnDisconnect(ConMonWrapper *wrapper) : + CActive(EPriorityStandard), q_ptr(wrapper) + { + OstTraceFunctionEntry1( CONNMONCONNDISCONNECT_CONNMONCONNDISCONNECT_ENTRY, this ); + + CActiveScheduler::Add(this); + iMonitor.ConnectL(); + + OstTraceFunctionExit1( CONNMONCONNDISCONNECT_CONNMONCONNDISCONNECT_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnDisconnect::ConnMonConnDisconnect() +// Destructor +// --------------------------------------------------------- +// +ConnMonConnDisconnect::~ConnMonConnDisconnect() + { + OstTraceFunctionEntry1( CONNMONCONNDISCONNECT_CONNMONCONNDISCONNECTDESTR_ENTRY, this ); + + // Cancel notifications and close connection monitor session + //iMonitor.CancelNotifications(); + iMonitor.Close(); + + OstTraceFunctionExit1( CONNMONCONNDISCONNECT_CONNMONCONNDISCONNECTDESTR_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnDisconnect::DoCancel() +// +// --------------------------------------------------------- +// +void ConnMonConnDisconnect::DoCancel() + { + OstTraceFunctionEntry1( CONNMONCONNDISCONNECT_DOCANCEL_ENTRY, this ); + // TODO: error handling + OstTraceFunctionExit1( CONNMONCONNDISCONNECT_DOCANCEL_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnDisconnect::RunL() +// +// --------------------------------------------------------- +// +void ConnMonConnDisconnect::RunL() + { + OstTraceFunctionEntry1( CONNMONCONNDISCONNECT_RUNL_ENTRY, this ); + // TODO: Is anything needed? + OstTraceFunctionExit1( CONNMONCONNDISCONNECT_RUNL_EXIT, this ); + } + +// --------------------------------------------------------- +// ConnMonConnDisconnect::disconnectConnection(int iapId) +// Stop active connection. +// --------------------------------------------------------- +// +void ConnMonConnDisconnect::disconnectConnection(int iapId) + { + OstTraceFunctionEntry1( CONNMONCONNDISCONNECT_DISCONNECTCONNECTION_ENTRY, this ); + OstTrace1( + TRACE_NORMAL, + CONNMONCONNDISCONNECT_DISCONNECTCONNECTION, + "ConnMonConnDisconnect::disconnectConnection;iapId=%d", iapId ); + + // TODO: Error handling + TUint count; + TRequestStatus status; + iMonitor.GetConnectionCount(count, status); + User::WaitForRequest(status); + + for (TInt i = 1; i <= count; i++) + { + TUint numSubConnections; + TUint iap = 0; + TUint connectionId = 0; + TInt ret = iMonitor.GetConnectionInfo(i, connectionId, + numSubConnections); + if (ret != KErrNone) + { + // error + } + iMonitor.GetUintAttribute(connectionId, 0, KIAPId, iap, status); + User::WaitForRequest(status); + if (status.Int() != KErrNone) + { + // error + } + if (iap == iapId) + { + TInt KErr = iMonitor.SetBoolAttribute(connectionId, 0, + KConnectionStop, ETrue); + } + } + + OstTraceFunctionExit1( CONNMONCONNDISCONNECT_DISCONNECTCONNECTION_EXIT, this ); + } + +//end of file