netwerk/wifi/nsWifiMonitorGonk.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include "nsCOMPtr.h"
     6 #include "nsComponentManagerUtils.h"
     7 #include "nsServiceManagerUtils.h"
     8 #include "nsThreadUtils.h"
     9 #include "nsXPCOM.h"
    10 #include "nsXPCOMCID.h"
    11 #include "nsIObserver.h"
    12 #include "nsIObserverService.h"
    13 #include "nsWifiMonitor.h"
    14 #include "nsWifiAccessPoint.h"
    16 #include "nsServiceManagerUtils.h"
    17 #include "nsComponentManagerUtils.h"
    18 #include "mozilla/Services.h"
    20 #include "nsIInterfaceRequestor.h"
    21 #include "nsIInterfaceRequestorUtils.h"
    23 using namespace mozilla;
    25 #if defined(PR_LOGGING)
    26 PRLogModuleInfo *gWifiMonitorLog;
    27 #endif
    29 NS_IMPL_ISUPPORTS(nsWifiMonitor,
    30                   nsIWifiMonitor,
    31                   nsIObserver,
    32                   nsIWifiScanResultsReady)
    34 nsWifiMonitor::nsWifiMonitor()
    35 {
    36 #if defined(PR_LOGGING)
    37   gWifiMonitorLog = PR_NewLogModule("WifiMonitor");
    38 #endif
    40   nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService();
    41   if (obsSvc) {
    42     obsSvc->AddObserver(this, "xpcom-shutdown", false);
    43   }
    44   LOG(("@@@@@ wifimonitor created\n"));
    45 }
    47 nsWifiMonitor::~nsWifiMonitor()
    48 {
    49 }
    51 NS_IMETHODIMP
    52 nsWifiMonitor::StartWatching(nsIWifiListener *aListener)
    53 {
    54   LOG(("@@@@@ nsWifiMonitor::StartWatching\n"));
    55   NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
    56   if (!aListener) {
    57     return NS_ERROR_NULL_POINTER;
    58   }
    60   mListeners.AppendElement(nsWifiListener(new nsMainThreadPtrHolder<nsIWifiListener>(aListener)));
    62   if (!mTimer) {
    63     mTimer = do_CreateInstance("@mozilla.org/timer;1");
    64     mTimer->Init(this, 5000, nsITimer::TYPE_REPEATING_SLACK);
    65   }
    66   return NS_OK;
    67 }
    69 NS_IMETHODIMP
    70 nsWifiMonitor::StopWatching(nsIWifiListener *aListener)
    71 {
    72   LOG(("@@@@@ nsWifiMonitor::StopWatching\n"));
    73   NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
    74   if (!aListener) {
    75     return NS_ERROR_NULL_POINTER;
    76   }
    78   for (uint32_t i = 0; i < mListeners.Length(); i++) {
    79     if (mListeners[i].mListener == aListener) {
    80       mListeners.RemoveElementAt(i);
    81       break;
    82     }
    83   }
    85   if (mListeners.Length() == 0) {
    86     ClearTimer();
    87   }
    88   return NS_OK;
    89 }
    91 NS_IMETHODIMP
    92 nsWifiMonitor::Observe(nsISupports *subject, const char *topic,
    93                        const char16_t *data)
    94 {
    95   if (!strcmp(topic, "timer-callback")) {
    96     LOG(("timer callback\n"));
    98     nsCOMPtr<nsIInterfaceRequestor> ir = do_GetService("@mozilla.org/telephony/system-worker-manager;1");
    99     nsCOMPtr<nsIWifi> wifi = do_GetInterface(ir);
   100     if (!wifi) {
   101       return NS_ERROR_UNEXPECTED;
   102     }
   104     wifi->GetWifiScanResults(this);
   105     return NS_OK;
   106   }
   108   if (!strcmp(topic, "xpcom-shutdown")) {
   109     LOG(("Shutting down\n"));
   110     ClearTimer();
   111     return NS_OK;
   112   }
   114   return NS_ERROR_UNEXPECTED;
   115 }
   117 NS_IMETHODIMP
   118 nsWifiMonitor::Onready(uint32_t count, nsIWifiScanResult **results)
   119 {
   120   NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   121   LOG(("@@@@@ About to send data to the wifi listeners\n"));
   123   nsCOMArray<nsWifiAccessPoint> accessPoints;
   125   for (uint32_t i = 0; i < count; i++) {
   126     nsRefPtr<nsWifiAccessPoint> ap = new nsWifiAccessPoint();
   128     nsString temp;
   129     results[i]->GetBssid(temp);
   130     //   00:00:00:00:00:00 --> 00-00-00-00-00-00
   131     for (int32_t x=0; x<6; x++) {
   132       temp.ReplaceSubstring(NS_LITERAL_STRING(":"), NS_LITERAL_STRING("-")); // would it be too much to ask for a ReplaceAll()?
   133     }
   135     nsCString mac;
   136     mac.AssignWithConversion(temp);
   138     results[i]->GetSsid(temp);
   140     nsCString ssid;
   141     ssid.AssignWithConversion(temp);
   143     uint32_t signal;
   144     results[i]->GetSignalStrength(&signal);
   146     ap->setSignal(signal);
   147     ap->setMacRaw(mac.get());
   148     ap->setSSIDRaw(ssid.get(), ssid.Length());
   150     accessPoints.AppendObject(ap);
   151   }
   153   bool accessPointsChanged = !AccessPointsEqual(accessPoints, mLastAccessPoints);
   154   ReplaceArray(mLastAccessPoints, accessPoints);
   156   nsTArray<nsIWifiAccessPoint*> ac;
   157   uint32_t resultCount = mLastAccessPoints.Count();
   158   for (uint32_t i = 0; i < resultCount; i++) {
   159     ac.AppendElement(mLastAccessPoints[i]);
   160   }
   162   for (uint32_t i = 0; i < mListeners.Length(); i++) {
   163     if (!mListeners[i].mHasSentData || accessPointsChanged) {
   164       mListeners[i].mHasSentData = true;
   165       mListeners[i].mListener->OnChange(ac.Elements(), ac.Length());
   166     }
   167   }
   168   return NS_OK;
   169 }
   171 NS_IMETHODIMP
   172 nsWifiMonitor::Onfailure()
   173 {
   174   NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   175   LOG(("@@@@@ About to send error to the wifi listeners\n"));
   176   for (uint32_t i = 0; i < mListeners.Length(); i++) {
   177     mListeners[i].mListener->OnError(NS_ERROR_UNEXPECTED);
   178   }
   180   ClearTimer();
   181   return NS_OK;
   182 }

mercurial