wlanutilities/wlansniffer/wlansnifferapplication/src/wlansnifferengine.cpp
branchRCL_3
changeset 25 f28ada11abbf
parent 24 63be7eb3fc78
equal deleted inserted replaced
24:63be7eb3fc78 25:f28ada11abbf
     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     mScanEnabled(false),
       
    87     mEmbedded(false),
       
    88     mWlanQtUtils(new WlanQtUtils())
       
    89 {
       
    90     OstTraceFunctionEntry0(WLANSNIFFERENGINE_WLANSNIFFERENGINE_ENTRY);
       
    91 
       
    92     // Subscribe for WLAN status change indications
       
    93     bool connectStatus = connect(
       
    94         mSettingsManager, 
       
    95         SIGNAL(valueChanged(XQSettingsKey, QVariant)),
       
    96         this, 
       
    97         SLOT(updateSetting(XQSettingsKey, QVariant)));
       
    98     Q_ASSERT(connectStatus);
       
    99     mSettingsManager->startMonitoring(masterWlanKey);
       
   100     mSettingsManager->startMonitoring(wlanForceKey);
       
   101 
       
   102     // Connect WLAN Sniffer service signals
       
   103     connectStatus = connect(
       
   104         mService,
       
   105         SIGNAL(toListView(QString)),
       
   106         this,
       
   107         SIGNAL(toListView(QString)));
       
   108     Q_ASSERT(connectStatus == true);
       
   109     connectStatus = connect(
       
   110         mService,
       
   111         SIGNAL(returnValueDelivered()),
       
   112         this,
       
   113         SIGNAL(exitTriggered()));    
       
   114     Q_ASSERT(connectStatus == true);
       
   115     
       
   116     // Store WLAN Sniffer service embedded status
       
   117     mEmbedded = XQServiceUtil::isEmbedded();
       
   118     
       
   119     OstTraceFunctionExit0(WLANSNIFFERENGINE_WLANSNIFFERENGINE_EXIT);
       
   120 }
       
   121 
       
   122 /*!
       
   123     Destructor.
       
   124  */
       
   125 
       
   126 WlanSnifferEngine::~WlanSnifferEngine()
       
   127 {
       
   128     OstTraceFunctionEntry0(DUP1_WLANSNIFFERENGINE_WLANSNIFFERENGINE_ENTRY);
       
   129     OstTraceFunctionExit0(DUP1_WLANSNIFFERENGINE_WLANSNIFFERENGINE_EXIT);
       
   130 }
       
   131 
       
   132 /*!
       
   133     Getter function for WLAN Qt Utilities instance owned by
       
   134     this class. The whole WLAN Sniffer application uses the same
       
   135     instance, and thus the reference is needed also in other classes.
       
   136     
       
   137     @return WLAN Qt Utilities object.
       
   138  */
       
   139 
       
   140 WlanQtUtils *WlanSnifferEngine::wlanQtUtils() const
       
   141 {
       
   142     OstTraceFunctionEntry0(WLANSNIFFERENGINE_WLANQTUTILS_ENTRY);
       
   143     
       
   144     // The reference must never be null.
       
   145     Q_ASSERT(mWlanQtUtils.data());
       
   146     
       
   147     OstTraceFunctionExit0(WLANSNIFFERENGINE_WLANQTUTILS_EXIT);
       
   148     return mWlanQtUtils.data();
       
   149 }
       
   150 
       
   151 /*!
       
   152     Getter for WLAN Sniffer service embedded property.
       
   153     
       
   154     @return TRUE if WLAN Sniffer is used as an embedded service.
       
   155  */
       
   156 
       
   157 bool WlanSnifferEngine::isEmbedded() const
       
   158 {
       
   159     OstTraceFunctionEntry0(WLANSNIFFERENGINE_ISEMBEDDED_ENTRY);
       
   160     OstTraceFunctionExit0(WLANSNIFFERENGINE_ISEMBEDDED_EXIT);
       
   161     return mEmbedded;
       
   162 }
       
   163 
       
   164 /*!
       
   165     Starts periodic WLAN Scanning.
       
   166     It is allowed to call this function also when the scanning is already ON.
       
   167     If so, the timer is not restarted but the scan period stays untouched. 
       
   168  */
       
   169 
       
   170 void WlanSnifferEngine::startWlanScanning()
       
   171 {
       
   172     OstTraceFunctionEntry0(WLANSNIFFERENGINE_STARTWLANSCANNING_ENTRY);
       
   173 
       
   174     if (!mScanEnabled) {
       
   175         OstTrace0(
       
   176             TRACE_NORMAL,
       
   177             WLANSNIFFERENGINE_STARTWLANSCANNING,
       
   178             "WlanSnifferEngine::startWlanScanning Periodic WLAN scanning starting");
       
   179 
       
   180         mScanEnabled = true;
       
   181         // Connect response signal
       
   182         bool connectStatus = connect(
       
   183             mWlanQtUtils.data(),
       
   184             SIGNAL(wlanScanReady(int)),
       
   185             this,
       
   186             SLOT(handleWlanScanReady(int)));
       
   187         Q_ASSERT(connectStatus);
       
   188 
       
   189         // Start the first scan. Scan timer is started when scan result
       
   190         // signal is received.
       
   191         mWlanQtUtils->scanWlans();
       
   192     }
       
   193     
       
   194     OstTraceFunctionExit0(WLANSNIFFERENGINE_STARTWLANSCANNING_EXIT);
       
   195 }
       
   196 
       
   197 /*!
       
   198     Stops periodic WLAN Scanning.
       
   199     It is allowed to call this function also when periodic scanning is OFF.
       
   200  */
       
   201 
       
   202 void WlanSnifferEngine::stopWlanScanning()
       
   203 {
       
   204     OstTraceFunctionEntry0(WLANSNIFFERENGINE_STOPWLANSCANNING_ENTRY);
       
   205     
       
   206     if (mScanEnabled) {
       
   207         OstTrace0(
       
   208             TRACE_NORMAL,
       
   209             WLANSNIFFERENGINE_STOPWLANSCANNING,
       
   210             "WlanSnifferEngine::stopWlanScanning Periodic WLAN scanning stopped");
       
   211 
       
   212         mScanEnabled = false;
       
   213         // Disconnect response signal
       
   214         disconnect(
       
   215             mWlanQtUtils.data(),
       
   216             SIGNAL(wlanScanReady(int)),
       
   217             this,
       
   218             SLOT(handleWlanScanReady(int)));
       
   219 
       
   220         // Stop the scan
       
   221         mWlanQtUtils->stopWlanScan();
       
   222 
       
   223         // Stop periodic scan timer
       
   224         if (mScanTimerId != 0) {
       
   225             killTimer(mScanTimerId);
       
   226             mScanTimerId = 0;
       
   227         }
       
   228     }
       
   229     
       
   230     OstTraceFunctionExit0(WLANSNIFFERENGINE_STOPWLANSCANNING_EXIT);
       
   231 }
       
   232 
       
   233 /*!
       
   234     Function for getting the master WLAN status.
       
   235 
       
   236     @return Master WLAN status: true if enabled, otherwise false.
       
   237 */
       
   238 
       
   239 bool WlanSnifferEngine::masterWlan() const
       
   240 {
       
   241     OstTraceFunctionEntry1(WLANSNIFFERENGINE_MASTERWLAN_ENTRY, this);
       
   242 
       
   243     // Read WLAN ON/OFF setting from Cenrep
       
   244     int wlanEnabled = mSettingsManager->readItemValue(masterWlanKey).toInt();
       
   245 
       
   246     OstTrace1(
       
   247         TRACE_NORMAL,
       
   248         WLANSNIFFERENGINE_MASTERWLAN,
       
   249         "WlanSnifferEngine::masterWlan;enabled=%d",
       
   250         wlanEnabled);
       
   251 
       
   252     OstTraceFunctionExit1(WLANSNIFFERENGINE_MASTERWLAN_EXIT, this);
       
   253     return wlanEnabled ? true : false;
       
   254 }
       
   255 
       
   256 /*!
       
   257     Function for switching the master WLAN status ON or OFF.
       
   258 
       
   259     @param [in] enabled If set to true, WLAN is switched ON, and vice versa.
       
   260 */
       
   261 
       
   262 void WlanSnifferEngine::setMasterWlan(bool enabled)
       
   263 {
       
   264     OstTraceFunctionEntry1(WLANSNIFFERENGINE_SETMASTERWLAN_ENTRY, this);
       
   265 
       
   266     OstTraceExt1(
       
   267         TRACE_NORMAL,
       
   268         WLANSNIFFERENGINE_SETMASTERWLAN,
       
   269         "WlanSnifferEngine::setMasterWlan;enabled=%hhu",
       
   270         enabled);
       
   271     
       
   272     // Store WLAN ON/OFF setting to Cenrep
       
   273     int wlanEnabled = enabled ? 1 : 0;
       
   274     bool writeStatus = mSettingsManager->writeItemValue(masterWlanKey, wlanEnabled);
       
   275     Q_ASSERT(writeStatus);
       
   276 
       
   277     OstTraceFunctionExit1(WLANSNIFFERENGINE_SETMASTERWLAN_EXIT, this);
       
   278 }
       
   279 
       
   280 /*!
       
   281     Function for getting the force disable WLAN status.
       
   282      
       
   283     @return forced WLAN status: true if disabled, otherwise false.
       
   284 */
       
   285 
       
   286 bool WlanSnifferEngine::forceDisableWlan() const
       
   287 {
       
   288     OstTraceFunctionEntry1(WLANSNIFFERENGINE_FORCEDISABLEWLAN_ENTRY, this);
       
   289     
       
   290     // Read force disable WLAN ON/OFF setting from Cenrep
       
   291     int wlanDisabled = mSettingsManager->readItemValue(wlanForceKey).toInt();
       
   292 
       
   293     OstTrace1(
       
   294         TRACE_NORMAL,
       
   295         WLANSNIFFERENGINE_FORCEDISABLEWLAN,
       
   296         "WlanSnifferEngine::forceDisableWlan;wlanDisabled=%d",
       
   297         wlanDisabled);
       
   298 
       
   299     OstTraceFunctionEntry1(WLANSNIFFERENGINE_FORCEDISABLEWLAN_EXIT, this);
       
   300     return wlanDisabled ? true : false;
       
   301 }
       
   302 
       
   303 /*!
       
   304     Function for getting the offline mode status.
       
   305 
       
   306     @return Offline mode status: true if offline, otherwise false.
       
   307 */
       
   308 
       
   309 bool WlanSnifferEngine::offlineMode() const
       
   310 {
       
   311     OstTraceFunctionEntry1(WLANSNIFFERENGINE_OFFLINEMODE_ENTRY, this);
       
   312     
       
   313     // Read offline mode setting from Cenrep
       
   314     int systemState = mSettingsManager->readItemValue(offlineKey).toInt();
       
   315 
       
   316     bool offline = false;
       
   317     if (ESwStateNormalRfOff == systemState) {
       
   318         offline = true;
       
   319     }
       
   320     
       
   321     OstTraceExt1(
       
   322         TRACE_NORMAL,
       
   323         WLANSNIFFERENGINE_OFFLINEMODE,
       
   324         "WlanSnifferEngine::offlineMode;offline=%hhu",
       
   325         offline);
       
   326 
       
   327     OstTraceFunctionExit1(WLANSNIFFERENGINE_OFFLINEMODE_EXIT, this);
       
   328     return offline; 
       
   329 }
       
   330 
       
   331 /*!
       
   332     Function for completing the running WLAN Sniffer service.
       
   333     This function must only be ran if a WLAN Sniffer service is running. 
       
   334  */
       
   335 
       
   336 void WlanSnifferEngine::completeService()
       
   337 {
       
   338     OstTraceFunctionEntry0(WLANSNIFFERENGINE_COMPLETESERVICE_ENTRY);
       
   339     
       
   340     mService->complete();
       
   341 
       
   342     OstTraceFunctionExit0(WLANSNIFFERENGINE_COMPLETESERVICE_EXIT);
       
   343 }
       
   344 
       
   345 /*!
       
   346     This function (from QObject) handles timers. Initiates a new WLAN scan.
       
   347 
       
   348     @param [in] event Timer event.
       
   349  */
       
   350 
       
   351 void WlanSnifferEngine::timerEvent(QTimerEvent *event)
       
   352 {
       
   353     OstTraceFunctionEntry0(WLANSNIFFERENGINE_TIMEREVENT_ENTRY);
       
   354     
       
   355     int timerId = event->timerId();
       
   356         
       
   357     OstTrace1(
       
   358         TRACE_NORMAL,
       
   359         WLANSNIFFERENGINE_TIMEREVENT,
       
   360         "WlanSnifferEngine::timerEvent;timerId=%d",
       
   361         timerId);
       
   362     
       
   363     // WLAN scan timer is the only used timer
       
   364     Q_ASSERT(timerId == mScanTimerId);
       
   365     
       
   366     // Request a new scan. Timer events come periodically.
       
   367     mWlanQtUtils->scanWlans();
       
   368     
       
   369     OstTraceFunctionExit0(WLANSNIFFERENGINE_TIMEREVENT_EXIT);
       
   370 }
       
   371 
       
   372 /*!
       
   373     Slot for updating settings.
       
   374 
       
   375     @param [in] key The changed key setting.
       
   376     @param [in] value The new value of the setting.
       
   377 */
       
   378 
       
   379 void WlanSnifferEngine::updateSetting(
       
   380     const XQSettingsKey &key,
       
   381     const QVariant &value)
       
   382 {   
       
   383     OstTraceFunctionEntry1(WLANSNIFFERENGINE_UPDATESETTING_ENTRY, this);
       
   384     
       
   385     // Check that the key is WLAN ON/OFF, or wlanForceDisable since 
       
   386     // they are the only supported keys
       
   387     Q_ASSERT(
       
   388         key.target() == masterWlanKey.target() ||
       
   389         key.target() == wlanForceKey.target());
       
   390     Q_ASSERT(
       
   391         key.uid() == masterWlanKey.uid() ||
       
   392         key.uid() == wlanForceKey.uid());
       
   393     Q_ASSERT(
       
   394         key.key() == masterWlanKey.key() ||
       
   395         key.key() == wlanForceKey.key());
       
   396 
       
   397     bool ok;
       
   398     bool boolean = value.toInt(&ok) ? true : false;
       
   399     Q_ASSERT(ok);
       
   400     
       
   401     // The updated key can be either the KWlanOnOff or the KWlanForceDisable
       
   402     if (key.key() == wlanForceKey.key()) {
       
   403         // Inform about WlanForceDisable status change
       
   404         OstTraceExt1(
       
   405             TRACE_NORMAL,
       
   406             WLANSNIFFERENGINE_UPDATESETTING_WLANFORCEDISABLE,
       
   407             "WlanSnifferEngine::emit forceWlanStatus;forcedWlanDisabled=%hhu",
       
   408             boolean);
       
   409         emit forceDisableWlanStatus(boolean);
       
   410     } else {
       
   411         // Inform about WLAN ON/OFF status change
       
   412         OstTraceExt1(
       
   413             TRACE_NORMAL,
       
   414             WLANSNIFFERENGINE_UPDATESETTING_WLANONOFF,
       
   415             "WlanSnifferEngine::emit masterWlanStatus;wlanEnabled=%hhu",
       
   416             boolean);
       
   417         emit masterWlanStatus(boolean);
       
   418     }
       
   419     
       
   420     OstTraceFunctionExit1(WLANSNIFFERENGINE_UPDATESETTING_EXIT, this);
       
   421 }
       
   422 
       
   423 /*!
       
   424     Slot for handling Wlan scan result.
       
   425 
       
   426     @param [in] status Scan status code.
       
   427 */
       
   428 
       
   429 void WlanSnifferEngine::handleWlanScanReady(int status)
       
   430 {   
       
   431     OstTraceFunctionEntry1(WLANSNIFFERENGINE_HANDLEWLANSCANREADY_ENTRY, this);
       
   432 
       
   433     OstTrace1(
       
   434         TRACE_NORMAL,
       
   435         WLANSNIFFERENGINE_HANDLEWLANSCANREADY,
       
   436         "WlanSnifferEngine::handleWlanScanReady;status=%d",
       
   437         status);
       
   438     
       
   439     // Forward result signal only, if there was no error
       
   440     if (status == WlanQtUtils::ScanStatusOk) {
       
   441         emit wlanScanReady();
       
   442     }
       
   443     
       
   444     // Start timer for the next scan, if not running already
       
   445     if (mScanTimerId == 0) {
       
   446         mScanTimerId = startTimer(scanTimerInterval);
       
   447         // The timer start must succeed
       
   448         Q_ASSERT(mScanTimerId != 0);
       
   449     }
       
   450     
       
   451     OstTraceFunctionExit1(WLANSNIFFERENGINE_HANDLEWLANSCANREADY_EXIT, this);
       
   452 }