Rollup of bug 786631: Get processes with non-default permissions on the prelaunch...
[gecko.git] / netwerk / wifi / nsWifiMonitorGonk.cpp
blob81dae85413c8e541092af97cef30f1180ff32e98
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_ISUPPORTS3(nsWifiMonitor,
30 nsIWifiMonitor,
31 nsIObserver,
32 nsIWifiScanResultsReady)
34 nsWifiMonitor::nsWifiMonitor()
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);
44 LOG(("@@@@@ wifimonitor created\n"));
47 nsWifiMonitor::~nsWifiMonitor()
51 NS_IMETHODIMP
52 nsWifiMonitor::StartWatching(nsIWifiListener *aListener)
54 LOG(("@@@@@ nsWifiMonitor::StartWatching\n"));
55 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
56 if (!aListener) {
57 return NS_ERROR_NULL_POINTER;
60 mListeners.AppendElement(nsWifiListener(aListener));
62 if (!mTimer) {
63 mTimer = do_CreateInstance("@mozilla.org/timer;1");
64 mTimer->Init(this, 5000, nsITimer::TYPE_REPEATING_SLACK);
66 return NS_OK;
69 NS_IMETHODIMP
70 nsWifiMonitor::StopWatching(nsIWifiListener *aListener)
72 LOG(("@@@@@ nsWifiMonitor::StopWatching\n"));
73 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
74 if (!aListener) {
75 return NS_ERROR_NULL_POINTER;
78 for (uint32_t i = 0; i < mListeners.Length(); i++) {
79 if (mListeners[i].mListener == aListener) {
80 mListeners.RemoveElementAt(i);
81 break;
85 if (mListeners.Length() == 0) {
86 ClearTimer();
88 return NS_OK;
91 NS_IMETHODIMP
92 nsWifiMonitor::Observe(nsISupports *subject, const char *topic,
93 const PRUnichar *data)
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;
104 wifi->GetWifiScanResults(this);
105 return NS_OK;
108 if (!strcmp(topic, "xpcom-shutdown")) {
109 LOG(("Shutting down\n"));
110 ClearTimer();
111 return NS_OK;
114 return NS_ERROR_UNEXPECTED;
117 NS_IMETHODIMP
118 nsWifiMonitor::Onready(uint32_t count, nsIWifiScanResult **results)
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()?
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);
153 bool accessPointsChanged = !AccessPointsEqual(accessPoints, mLastAccessPoints);
154 ReplaceArray(mLastAccessPoints, accessPoints);
156 nsTArray<nsIWifiAccessPoint*> ac;
157 uint32_t resultCount = accessPoints.Count();
158 for (uint32_t i = 0; i < resultCount; i++) {
159 ac.AppendElement(accessPoints[i]);
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());
168 return NS_OK;
171 NS_IMETHODIMP
172 nsWifiMonitor::Onfailure()
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);
180 ClearTimer();
181 return NS_OK;