wlanutilities/wlansniffer/wlansnifferapplication/src/wlansnifferengine.cpp
changeset 31 e8f4211554fb
child 39 7b3e49e4608a
equal deleted inserted replaced
30:ab513c8439db 31:e8f4211554fb
       
     1 /*
       
     2 * Copyright (c) 2009-2010 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 "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 * WLAN Sniffer application engine. 
       
    16 */
       
    17 
       
    18 // System includes
       
    19 
       
    20 #include <QTimerEvent>
       
    21 
       
    22 #include <xqserviceutil.h>
       
    23 #include <xqsettingsmanager.h>
       
    24 #include <wlandevicesettingsinternalcrkeys.h>
       
    25 #include <startupdomainpskeys.h>
       
    26 
       
    27 // User includes
       
    28 
       
    29 #include "wlanqtutils.h"
       
    30 #include "wlansnifferservice.h"
       
    31 #include "wlansnifferengine.h"
       
    32 
       
    33 #include "OstTraceDefinitions.h"
       
    34 #ifdef OST_TRACE_COMPILER_IN_USE
       
    35 #include "wlansnifferengineTraces.h"
       
    36 #endif
       
    37 
       
    38 /*!
       
    39     \class WlanSnifferEngine
       
    40     \brief WLAN Sniffer application engine.
       
    41 
       
    42     This class implements the WLAN Sniffer application engine.
       
    43     The purpose of the engine implementation is to gather all non-UI
       
    44     implementation base functionality into one place that can be utilized
       
    45     from multiple places (i.e. multiple views and windows).  
       
    46 */
       
    47 
       
    48 
       
    49 // External function prototypes
       
    50 
       
    51 // Local constants
       
    52 
       
    53 //! Master WLAN ON/OFF setting key
       
    54 static const XQSettingsKey masterWlanKey(
       
    55     XQSettingsKey::TargetCentralRepository,
       
    56     KCRUidWlanDeviceSettingsRegistryId.iUid, 
       
    57     KWlanOnOff);
       
    58     
       
    59 //! WLAN  forced OFF setting key
       
    60 static const XQSettingsKey wlanForceKey(
       
    61     XQSettingsKey::TargetCentralRepository,
       
    62     KCRUidWlanDeviceSettingsRegistryId.iUid, 
       
    63     KWlanForceDisable);
       
    64 
       
    65 //! Offline mode setting key
       
    66 static const XQSettingsKey offlineKey(
       
    67     XQSettingsKey::TargetPublishAndSubscribe,
       
    68     KPSUidStartup.iUid, 
       
    69     KPSGlobalSystemState);
       
    70 
       
    71 // ======== LOCAL FUNCTIONS ========
       
    72 
       
    73 // ======== MEMBER FUNCTIONS ========
       
    74 
       
    75 /*!
       
    76     Constructor.
       
    77     
       
    78     @param [in] parent Parent object.
       
    79  */
       
    80 
       
    81 WlanSnifferEngine::WlanSnifferEngine(QObject *parent) :
       
    82     QObject(parent),
       
    83     mService(new WlanSnifferService(this)),
       
    84     mSettingsManager(new XQSettingsManager(this)),
       
    85     mScanTimerId(0),
       
    86     mEmbedded(false),
       
    87     mWlanQtUtils(new WlanQtUtils())
       
    88 {
       
    89     OstTraceFunctionEntry0(WLANSNIFFERENGINE_WLANSNIFFERENGINE_ENTRY);
       
    90 
       
    91     // Subscribe for WLAN status change indications
       
    92     bool connectStatus = connect(
       
    93         mSettingsManager, 
       
    94         SIGNAL(valueChanged(XQSettingsKey, QVariant)),
       
    95         this, 
       
    96         SLOT(updateSetting(XQSettingsKey, QVariant)));
       
    97     Q_ASSERT(connectStatus);
       
    98     mSettingsManager->startMonitoring(masterWlanKey);
       
    99     mSettingsManager->startMonitoring(wlanForceKey);
       
   100 
       
   101     // Connect WLAN Sniffer service signals
       
   102     connectStatus = connect(
       
   103         mService,
       
   104         SIGNAL(toListView(QString)),
       
   105         this,
       
   106         SIGNAL(toListView(QString)));
       
   107     Q_ASSERT(connectStatus == true);
       
   108     connectStatus = connect(
       
   109         mService,
       
   110         SIGNAL(returnValueDelivered()),
       
   111         this,
       
   112         SIGNAL(exitTriggered()));    
       
   113     Q_ASSERT(connectStatus == true);
       
   114     
       
   115     // Store WLAN Sniffer service embedded status
       
   116     mEmbedded = XQServiceUtil::isEmbedded();
       
   117     
       
   118     OstTraceFunctionExit0(WLANSNIFFERENGINE_WLANSNIFFERENGINE_EXIT);
       
   119 }
       
   120 
       
   121 /*!
       
   122     Destructor.
       
   123  */
       
   124 
       
   125 WlanSnifferEngine::~WlanSnifferEngine()
       
   126 {
       
   127     OstTraceFunctionEntry0(DUP1_WLANSNIFFERENGINE_WLANSNIFFERENGINE_ENTRY);
       
   128     OstTraceFunctionExit0(DUP1_WLANSNIFFERENGINE_WLANSNIFFERENGINE_EXIT);
       
   129 }
       
   130 
       
   131 /*!
       
   132     Getter function for WLAN Qt Utilities instance owned by
       
   133     this class. The whole WLAN Sniffer application uses the same
       
   134     instance, and thus the reference is needed also in other classes.
       
   135     
       
   136     @return WLAN Qt Utilities object.
       
   137  */
       
   138 
       
   139 WlanQtUtils *WlanSnifferEngine::wlanQtUtils() const
       
   140 {
       
   141     OstTraceFunctionEntry0(WLANSNIFFERENGINE_WLANQTUTILS_ENTRY);
       
   142     
       
   143     // The reference must never be null.
       
   144     Q_ASSERT(mWlanQtUtils.data());
       
   145     
       
   146     OstTraceFunctionExit0(WLANSNIFFERENGINE_WLANQTUTILS_EXIT);
       
   147     return mWlanQtUtils.data();
       
   148 }
       
   149 
       
   150 /*!
       
   151     Getter for WLAN Sniffer service embedded property.
       
   152     
       
   153     @return TRUE if WLAN Sniffer is used as an embedded service.
       
   154  */
       
   155 
       
   156 bool WlanSnifferEngine::isEmbedded() const
       
   157 {
       
   158     OstTraceFunctionEntry0(WLANSNIFFERENGINE_ISEMBEDDED_ENTRY);
       
   159     OstTraceFunctionExit0(WLANSNIFFERENGINE_ISEMBEDDED_EXIT);
       
   160     return mEmbedded;
       
   161 }
       
   162 
       
   163 /*!
       
   164     Starts periodic WLAN Scanning.
       
   165     It is allowed to call this function also when the scanning is already ON.
       
   166     If so, the timer is not restarted but the scan period stays untouched. 
       
   167  */
       
   168 
       
   169 void WlanSnifferEngine::startWlanScanning()
       
   170 {
       
   171     OstTraceFunctionEntry0(WLANSNIFFERENGINE_STARTWLANSCANNING_ENTRY);
       
   172 
       
   173     // A valid timer ID means scan is ON 
       
   174     if (mScanTimerId == 0) {
       
   175         OstTrace0(
       
   176             TRACE_NORMAL,
       
   177             WLANSNIFFERENGINE_STARTWLANSCANNING,
       
   178             "WlanSnifferEngine::startWlanScanning Periodic WLAN scanning starting");
       
   179 
       
   180         // Connect signal forwarding
       
   181         bool connectStatus = connect(
       
   182             mWlanQtUtils.data(),
       
   183             SIGNAL(wlanScanReady()),
       
   184             this,
       
   185             SIGNAL(wlanScanReady()));
       
   186         Q_ASSERT(connectStatus);
       
   187 
       
   188         // Start the first scan
       
   189         mWlanQtUtils->scanWlans();
       
   190         
       
   191         // Start timer for the next scan
       
   192         mScanTimerId = startTimer(scanTimerInterval);
       
   193         
       
   194         // The timer start must succeed
       
   195         Q_ASSERT(mScanTimerId != 0);
       
   196     }
       
   197     
       
   198     OstTraceFunctionExit0(WLANSNIFFERENGINE_STARTWLANSCANNING_EXIT);
       
   199 }
       
   200 
       
   201 /*!
       
   202     Stops periodic WLAN Scanning.
       
   203     It is allowed to call this function also when periodic scanning is OFF.
       
   204  */
       
   205 
       
   206 void WlanSnifferEngine::stopWlanScanning()
       
   207 {
       
   208     OstTraceFunctionEntry0(WLANSNIFFERENGINE_STOPWLANSCANNING_ENTRY);
       
   209     
       
   210     // A valid timer ID means scan is ON 
       
   211     if (mScanTimerId != 0) {
       
   212         OstTrace0(
       
   213             TRACE_NORMAL,
       
   214             WLANSNIFFERENGINE_STOPWLANSCANNING,
       
   215             "WlanSnifferEngine::stopWlanScanning Periodic WLAN scanning stopped");
       
   216         
       
   217         // Disconnect signal forwarding
       
   218         disconnect(
       
   219             mWlanQtUtils.data(),
       
   220             SIGNAL(wlanScanReady()),
       
   221             this,
       
   222             SIGNAL(wlanScanReady()));
       
   223         
       
   224         killTimer(mScanTimerId);
       
   225         mScanTimerId = 0;
       
   226     }
       
   227     
       
   228     OstTraceFunctionExit0(WLANSNIFFERENGINE_STOPWLANSCANNING_EXIT);
       
   229 }
       
   230 
       
   231 /*!
       
   232     Function for getting the master WLAN status.
       
   233 
       
   234     @return Master WLAN status: true if enabled, otherwise false.
       
   235 */
       
   236 
       
   237 bool WlanSnifferEngine::masterWlan() const
       
   238 {
       
   239     OstTraceFunctionEntry1(WLANSNIFFERENGINE_MASTERWLAN_ENTRY, this);
       
   240 
       
   241     // Read WLAN ON/OFF setting from Cenrep
       
   242     int wlanEnabled = mSettingsManager->readItemValue(masterWlanKey).toInt();
       
   243 
       
   244     OstTrace1(
       
   245         TRACE_NORMAL,
       
   246         WLANSNIFFERENGINE_MASTERWLAN,
       
   247         "WlanSnifferEngine::masterWlan;enabled=%d",
       
   248         wlanEnabled);
       
   249 
       
   250     OstTraceFunctionExit1(WLANSNIFFERENGINE_MASTERWLAN_EXIT, this);
       
   251     return wlanEnabled ? true : false;
       
   252 }
       
   253 
       
   254 /*!
       
   255     Function for switching the master WLAN status ON or OFF.
       
   256 
       
   257     @param [in] enabled If set to true, WLAN is switched ON, and vice versa.
       
   258 */
       
   259 
       
   260 void WlanSnifferEngine::setMasterWlan(bool enabled)
       
   261 {
       
   262     OstTraceFunctionEntry1(WLANSNIFFERENGINE_SETMASTERWLAN_ENTRY, this);
       
   263 
       
   264     OstTraceExt1(
       
   265         TRACE_NORMAL,
       
   266         WLANSNIFFERENGINE_SETMASTERWLAN,
       
   267         "WlanSnifferEngine::setMasterWlan;enabled=%hhu",
       
   268         enabled);
       
   269     
       
   270     // Store WLAN ON/OFF setting to Cenrep
       
   271     int wlanEnabled = enabled ? 1 : 0;
       
   272     bool writeStatus = mSettingsManager->writeItemValue(masterWlanKey, wlanEnabled);
       
   273     Q_ASSERT(writeStatus);
       
   274 
       
   275     OstTraceFunctionExit1(WLANSNIFFERENGINE_SETMASTERWLAN_EXIT, this);
       
   276 }
       
   277 
       
   278 /*!
       
   279     Function for getting the force disable WLAN status.
       
   280      
       
   281     @return forced WLAN status: true if disabled, otherwise false.
       
   282 */
       
   283 
       
   284 bool WlanSnifferEngine::forceDisableWlan() const
       
   285 {
       
   286     OstTraceFunctionEntry1(WLANSNIFFERENGINE_FORCEDISABLEWLAN_ENTRY, this);
       
   287     
       
   288     // Read force disable WLAN ON/OFF setting from Cenrep
       
   289     int wlanDisabled = mSettingsManager->readItemValue(wlanForceKey).toInt();
       
   290 
       
   291     OstTrace1(
       
   292         TRACE_NORMAL,
       
   293         WLANSNIFFERENGINE_FORCEDISABLEWLAN,
       
   294         "WlanSnifferEngine::forceDisableWlan;wlanDisabled=%d",
       
   295         wlanDisabled);
       
   296 
       
   297     OstTraceFunctionEntry1(WLANSNIFFERENGINE_FORCEDISABLEWLAN_EXIT, this);
       
   298     return wlanDisabled ? true : false;
       
   299 }
       
   300 
       
   301 /*!
       
   302     Function for getting the offline mode status.
       
   303 
       
   304     @return Offline mode status: true if offline, otherwise false.
       
   305 */
       
   306 
       
   307 bool WlanSnifferEngine::offlineMode() const
       
   308 {
       
   309     OstTraceFunctionEntry1(WLANSNIFFERENGINE_OFFLINEMODE_ENTRY, this);
       
   310     
       
   311     // Read offline mode setting from Cenrep
       
   312     int systemState = mSettingsManager->readItemValue(offlineKey).toInt();
       
   313 
       
   314     bool offline = false;
       
   315     if (ESwStateNormalRfOff == systemState) {
       
   316         offline = true;
       
   317     }
       
   318     
       
   319     OstTraceExt1(
       
   320         TRACE_NORMAL,
       
   321         WLANSNIFFERENGINE_OFFLINEMODE,
       
   322         "WlanSnifferEngine::offlineMode;offline=%hhu",
       
   323         offline);
       
   324 
       
   325     OstTraceFunctionExit1(WLANSNIFFERENGINE_OFFLINEMODE_EXIT, this);
       
   326     return offline; 
       
   327 }
       
   328 
       
   329 /*!
       
   330     Function for completing the running WLAN Sniffer service.
       
   331     This function must only be ran if a WLAN Sniffer service is running. 
       
   332  */
       
   333 
       
   334 void WlanSnifferEngine::completeService()
       
   335 {
       
   336     OstTraceFunctionEntry0(WLANSNIFFERENGINE_COMPLETESERVICE_ENTRY);
       
   337     
       
   338     mService->complete();
       
   339 
       
   340     OstTraceFunctionExit0(WLANSNIFFERENGINE_COMPLETESERVICE_EXIT);
       
   341 }
       
   342 
       
   343 /*!
       
   344     This function (from QObject) handles timers. Initiates a new WLAN scan.
       
   345 
       
   346     @param [in] event Timer event.
       
   347  */
       
   348 
       
   349 void WlanSnifferEngine::timerEvent(QTimerEvent *event)
       
   350 {
       
   351     OstTraceFunctionEntry0(WLANSNIFFERENGINE_TIMEREVENT_ENTRY);
       
   352     
       
   353     int timerId = event->timerId();
       
   354         
       
   355     OstTrace1(
       
   356         TRACE_NORMAL,
       
   357         WLANSNIFFERENGINE_TIMEREVENT,
       
   358         "WlanSnifferEngine::timerEvent;timerId=%d",
       
   359         timerId);
       
   360     
       
   361     // WLAN scan timer is the only used timer
       
   362     Q_ASSERT(timerId == mScanTimerId);
       
   363     
       
   364     // Request a new scan. Timer events come periodically.
       
   365     mWlanQtUtils->scanWlans();
       
   366     
       
   367     OstTraceFunctionExit0(WLANSNIFFERENGINE_TIMEREVENT_EXIT);
       
   368 }
       
   369 
       
   370 /*!
       
   371     Slot for updating settings.
       
   372 
       
   373     @param [in] key The changed key setting.
       
   374     @param [in] value The new value of the setting.
       
   375 */
       
   376 
       
   377 void WlanSnifferEngine::updateSetting(
       
   378     const XQSettingsKey &key,
       
   379     const QVariant &value)
       
   380 {   
       
   381     OstTraceFunctionEntry1(WLANSNIFFERENGINE_UPDATESETTING_ENTRY, this);
       
   382     
       
   383     // Check that the key is WLAN ON/OFF, or wlanForceDisable since 
       
   384     // they are the only supported keys
       
   385     Q_ASSERT(
       
   386         key.target() == masterWlanKey.target() ||
       
   387         key.target() == wlanForceKey.target());
       
   388     Q_ASSERT(
       
   389         key.uid() == masterWlanKey.uid() ||
       
   390         key.uid() == wlanForceKey.uid());
       
   391     Q_ASSERT(
       
   392         key.key() == masterWlanKey.key() ||
       
   393         key.key() == wlanForceKey.key());
       
   394 
       
   395     bool ok;
       
   396     bool boolean = value.toInt(&ok) ? true : false;
       
   397     Q_ASSERT(ok);
       
   398     
       
   399     // The updated key can be either the KWlanOnOff or the KWlanForceDisable
       
   400     if (key.key() == wlanForceKey.key()) {
       
   401         // Inform about WlanForceDisable status change
       
   402         OstTraceExt1(
       
   403             TRACE_NORMAL,
       
   404             WLANSNIFFERENGINE_UPDATESETTING_WLANFORCEDISABLE,
       
   405             "WlanSnifferEngine::emit forceWlanStatus;forcedWlanDisabled=%hhu",
       
   406             boolean);
       
   407         emit forceDisableWlanStatus(boolean);
       
   408     } else {
       
   409         // Inform about WLAN ON/OFF status change
       
   410         OstTraceExt1(
       
   411             TRACE_NORMAL,
       
   412             WLANSNIFFERENGINE_UPDATESETTING_WLANONOFF,
       
   413             "WlanSnifferEngine::emit masterWlanStatus;wlanEnabled=%hhu",
       
   414             boolean);
       
   415         emit masterWlanStatus(boolean);
       
   416     }
       
   417     
       
   418     OstTraceFunctionExit1(WLANSNIFFERENGINE_UPDATESETTING_EXIT, this);
       
   419 }