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/. */
6 #include "nsComponentManagerUtils.h"
7 #include "nsServiceManagerUtils.h"
8 #include "nsThreadUtils.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
;
29 NS_IMPL_ISUPPORTS3(nsWifiMonitor
,
32 nsIWifiScanResultsReady
)
34 nsWifiMonitor::nsWifiMonitor()
36 #if defined(PR_LOGGING)
37 gWifiMonitorLog
= PR_NewLogModule("WifiMonitor");
40 nsCOMPtr
<nsIObserverService
> obsSvc
= mozilla::services::GetObserverService();
42 obsSvc
->AddObserver(this, "xpcom-shutdown", false);
44 LOG(("@@@@@ wifimonitor created\n"));
47 nsWifiMonitor::~nsWifiMonitor()
52 nsWifiMonitor::StartWatching(nsIWifiListener
*aListener
)
54 LOG(("@@@@@ nsWifiMonitor::StartWatching\n"));
55 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
57 return NS_ERROR_NULL_POINTER
;
60 mListeners
.AppendElement(nsWifiListener(new nsMainThreadPtrHolder
<nsIWifiListener
>(aListener
)));
63 mTimer
= do_CreateInstance("@mozilla.org/timer;1");
64 mTimer
->Init(this, 5000, nsITimer::TYPE_REPEATING_SLACK
);
70 nsWifiMonitor::StopWatching(nsIWifiListener
*aListener
)
72 LOG(("@@@@@ nsWifiMonitor::StopWatching\n"));
73 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
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
);
85 if (mListeners
.Length() == 0) {
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
);
101 return NS_ERROR_UNEXPECTED
;
104 wifi
->GetWifiScanResults(this);
108 if (!strcmp(topic
, "xpcom-shutdown")) {
109 LOG(("Shutting down\n"));
114 return NS_ERROR_UNEXPECTED
;
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();
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()?
136 mac
.AssignWithConversion(temp
);
138 results
[i
]->GetSsid(temp
);
141 ssid
.AssignWithConversion(temp
);
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());
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
);