Bug 479898 - Support for wifi scanning. r=dolske/stuart, sr=jst
authorDoug Turner <dougt@meer.net>
Mon, 16 Mar 2009 17:30:58 -0700
changeset 26270 f29948232171f4dc19d122f70c944b4b4bf02c3b
parent 26269 6f21cfb3a12ddb8265c1f7233f539751f3410d0a
child 26271 a47a52a6865f1f790bfa8f30e9179e4f7000b884
push id1
push usersledru@mozilla.com
push dateThu, 04 Dec 2014 17:57:20 +0000
reviewersdolske, stuart, jst
bugs479898
milestone1.9.2a1pre
Bug 479898 - Support for wifi scanning. r=dolske/stuart, sr=jst
browser/installer/unix/packages-static
browser/installer/windows/packages-static
config/autoconf.mk.in
configure.in
netwerk/Makefile.in
netwerk/build/Makefile.in
netwerk/build/nsNetCID.h
netwerk/build/nsNetModule.cpp
netwerk/necko-config.h.in
netwerk/wifi/Makefile.in
netwerk/wifi/public/Makefile.in
netwerk/wifi/public/nsIWifiAccessPoint.idl
netwerk/wifi/public/nsIWifiListener.idl
netwerk/wifi/public/nsIWifiMonitor.idl
netwerk/wifi/src/Makefile.in
netwerk/wifi/src/nsWifiAccessPoint.cpp
netwerk/wifi/src/nsWifiAccessPoint.h
netwerk/wifi/src/nsWifiMonitor.cpp
netwerk/wifi/src/nsWifiMonitor.h
netwerk/wifi/src/nsWifiScannerMac.cpp
netwerk/wifi/src/nsWifiScannerUnix.cpp
netwerk/wifi/src/nsWifiScannerWin.cpp
netwerk/wifi/src/osx_wifi.h
netwerk/wifi/src/wlanapi.h
netwerk/wifi/tests/wifi_access_point_test.html
toolkit/content/license.html
toolkit/toolkit-makefiles.sh
--- a/browser/installer/unix/packages-static
+++ b/browser/installer/unix/packages-static
@@ -142,16 +142,17 @@ bin/components/necko_cookie.xpt
 bin/components/necko_dns.xpt
 bin/components/necko_file.xpt
 bin/components/necko_ftp.xpt
 bin/components/necko_http.xpt
 bin/components/necko_res.xpt
 bin/components/necko_socket.xpt
 bin/components/necko_strconv.xpt
 bin/components/necko_viewsource.xpt
+bin/components/necko_wifi.xpt
 bin/components/necko.xpt
 #ifdef OJI
 bin/components/oji.xpt
 #endif
 bin/components/loginmgr.xpt
 bin/components/places.xpt
 bin/components/plugin.xpt
 bin/components/prefetch.xpt
--- a/browser/installer/windows/packages-static
+++ b/browser/installer/windows/packages-static
@@ -150,16 +150,17 @@ bin\components\necko_strconv.xpt
 bin\components\necko_about.xpt
 bin\components\necko_dns.xpt
 bin\components\necko_file.xpt
 bin\components\necko_ftp.xpt
 bin\components\necko_http.xpt
 bin\components\necko_res.xpt
 bin\components\necko_socket.xpt
 bin\components\necko_viewsource.xpt
+bin\components\necko_wifi.xpt
 #ifdef OJI
 bin\components\oji.xpt
 #endif
 bin\components\loginmgr.xpt
 bin\components\places.xpt
 bin\components\plugin.xpt
 bin\components\pref.xpt
 bin\components\prefetch.xpt
--- a/config/autoconf.mk.in
+++ b/config/autoconf.mk.in
@@ -208,16 +208,17 @@ MOZ_BUILD_ROOT             = @MOZ_BUILD_
 
 MOZ_XUL                    = @MOZ_XUL@
 MOZ_RDF                    = @MOZ_RDF@
 
 NECKO_PROTOCOLS = @NECKO_PROTOCOLS@
 NECKO_DISK_CACHE = @NECKO_DISK_CACHE@
 NECKO_SMALL_BUFFERS = @NECKO_SMALL_BUFFERS@
 NECKO_COOKIES = @NECKO_COOKIES@
+NECKO_WIFI = @NECKO_WIFI@
 MOZ_AUTH_EXTENSION = @MOZ_AUTH_EXTENSION@
 
 MOZ_NATIVE_HUNSPELL = @SYSTEM_HUNSPELL@
 MOZ_HUNSPELL_LIBS = @MOZ_HUNSPELL_LIBS@
 MOZ_HUNSPELL_CFLAGS = @MOZ_HUNSPELL_CFLAGS@
 
 MOZ_NATIVE_ZLIB	= @SYSTEM_ZLIB@
 MOZ_NATIVE_BZ2	= @SYSTEM_BZ2@
--- a/configure.in
+++ b/configure.in
@@ -4486,16 +4486,17 @@ MOZ_USE_NATIVE_UCONV=
 MOZ_VIEW_SOURCE=1
 MOZ_XPFE_COMPONENTS=1
 MOZ_XPINSTALL=1
 MOZ_XSLT_STANDALONE=
 MOZ_XTF=1
 MOZ_XUL=1
 MOZ_ZIPWRITER=1
 NS_PRINTING=1
+NECKO_WIFI=1
 NECKO_COOKIES=1
 NECKO_DISK_CACHE=1
 NECKO_PROTOCOLS_DEFAULT="about data file ftp gopher http res viewsource"
 NECKO_SMALL_BUFFERS=
 XPC_IDISPATCH_SUPPORT=
 
 
 case "$target_os" in
@@ -7833,16 +7834,48 @@ MOZ_ARG_DISABLE_BOOL(necko-disk-cache,
     NECKO_DISK_CACHE=,
     NECKO_DISK_CACHE=1)
 AC_SUBST(NECKO_DISK_CACHE)
 if test "$NECKO_DISK_CACHE"; then
     AC_DEFINE(NECKO_DISK_CACHE)
 fi
 
 dnl
+dnl option to disable necko's wifi scanner
+dnl
+MOZ_ARG_DISABLE_BOOL(necko-wifi,
+[  --disable-necko-wifi   Disable necko wifi scanner],
+    NECKO_WIFI=,
+    NECKO_WIFI=1
+)
+if test "$NECKO_WIFI"; then
+  NECKO_WIFI=
+  if test "$OS_ARCH" = "Linux"; then
+    AC_CHECK_HEADER([iwlib.h])
+    if test "$ac_cv_header_iwlib_h" = "yes"; then
+      NECKO_WIFI=1
+    fi
+  elif test "$OS_ARCH" = "Darwin"; then
+    NECKO_WIFI=1
+  elif test "$OS_ARCH" = "WINNT"; then
+    NECKO_WIFI=1
+  else
+    AC_MSG_ERROR([Necko WiFi scanning not supported on your platform.])
+  fi
+  AC_SUBST(NECKO_WIFI)
+  
+  if test "$NECKO_WIFI"; then
+    AC_DEFINE(NECKO_WIFI)
+  fi
+
+fi
+AC_SUBST(NECKO_WIFI)
+
+
+dnl
 dnl option to minimize size of necko's i/o buffers
 dnl
 MOZ_ARG_ENABLE_BOOL(necko-small-buffers,
 [  --enable-necko-small-buffers
                           Minimize size of necko's i/o buffers],
     NECKO_SMALL_BUFFERS=1,
     NECKO_SMALL_BUFFERS=)
 AC_SUBST(NECKO_SMALL_BUFFERS)
--- a/netwerk/Makefile.in
+++ b/netwerk/Makefile.in
@@ -49,16 +49,23 @@ DIRS		= \
 		cookie \
 		dns \
 		socket \
 		mime \
 		streamconv \
 		cache \
 		protocol \
 		system \
+        $(NULL)
+
+ifdef NECKO_WIFI
+DIRS 		+= wifi
+endif
+
+DIRS		+= \
 		build \
 		locales \
 		$(NULL)
 
 ifdef ENABLE_TESTS
 TOOL_DIRS  += test
 endif
 
--- a/netwerk/build/Makefile.in
+++ b/netwerk/build/Makefile.in
@@ -111,16 +111,24 @@ endif
 
 ifdef NECKO_COOKIES
 SHARED_LIBRARY_LIBS += \
 		../cookie/src/$(LIB_PREFIX)neckocookie_s.$(LIB_SUFFIX) \
                 $(NULL)
 LOCAL_INCLUDES	+= -I$(srcdir)/../cookie/src
 endif
 
+ifdef NECKO_WIFI
+SHARED_LIBRARY_LIBS += \
+		../wifi/src/$(LIB_PREFIX)neckowifi_s.$(LIB_SUFFIX) \
+                $(NULL)
+LOCAL_INCLUDES	+= -I$(srcdir)/../wifi/src
+endif
+
+
 ifdef MOZ_STORAGE
 REQUIRES += storage
 DEFINES += -DNECKO_OFFLINE_CACHE
 endif
 
 EXTRA_DSO_LDOPTS = \
 		$(LIBS_DIR) \
 		$(EXTRA_DSO_LIBS) \
--- a/netwerk/build/nsNetCID.h
+++ b/netwerk/build/nsNetCID.h
@@ -806,16 +806,31 @@
 { /* c375fa80-150f-11d6-a618-0010a401eb10 */           \
     0xc375fa80,                                        \
     0x150f,                                            \
     0x11d6,                                            \
     { 0xa6, 0x18, 0x00, 0x10, 0xa4, 0x01, 0xeb, 0x10 } \
 }
 
 /******************************************************************************
+ * netwerk/wifi classes
+ */
+#ifdef NECKO_WIFI
+#define NS_WIFI_MONITOR_CLASSNAME  "WIFI_MONITOR"
+#define NS_WIFI_MONITOR_CONTRACTID "@mozilla.org/wifi/monitor;1"
+
+#define NS_WIFI_MONITOR_COMPONENT_CID                  \
+{  0x3FF8FB9F,                                         \
+   0xEE63,                                             \
+   0x48DF,                                             \
+   { 0x89, 0xF0, 0xDA, 0xCE, 0x02, 0x42, 0xFD, 0x82 }  \
+}
+#endif
+
+/******************************************************************************
  * netwerk/streamconv classes
  */
 
 // service implementing nsIStreamConverterService
 #define NS_STREAMCONVERTERSERVICE_CONTRACTID \
     "@mozilla.org/streamConverters;1"
 #define NS_STREAMCONVERTERSERVICE_CID                \
 { /* 892FFEB0-3F80-11d3-A16C-0050041CAF44 */         \
--- a/netwerk/build/nsNetModule.cpp
+++ b/netwerk/build/nsNetModule.cpp
@@ -166,16 +166,25 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsStreamL
 
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifdef NECKO_COOKIES
 #include "nsCookieService.h"
 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsCookieService, nsCookieService::GetSingleton)
 #endif
 
+
+///////////////////////////////////////////////////////////////////////////////
+#ifdef NECKO_WIFI
+
+#include "nsWifiMonitor.h"
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsWifiMonitor)
+
+#endif
+
 ///////////////////////////////////////////////////////////////////////////////
 // protocols
 ///////////////////////////////////////////////////////////////////////////////
 
 // about:blank is mandatory
 #include "nsAboutProtocolHandler.h"
 #include "nsAboutBlank.h"
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsAboutProtocolHandler)
@@ -1086,16 +1095,25 @@ static const nsModuleComponentInfo gNetM
 
     { NS_COOKIESERVICE_CLASSNAME,
       NS_COOKIESERVICE_CID,
       NS_COOKIESERVICE_CONTRACTID,
       nsCookieServiceConstructor
     },
 #endif
 
+#ifdef NECKO_WIFI
+    {
+      NS_WIFI_MONITOR_CLASSNAME,
+      NS_WIFI_MONITOR_COMPONENT_CID,
+      NS_WIFI_MONITOR_CONTRACTID,
+      nsWifiMonitorConstructor
+    },
+#endif
+
 #ifdef NECKO_PROTOCOL_gopher
     //gopher:
     { "The Gopher Protocol Handler", 
       NS_GOPHERHANDLER_CID,
       NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "gopher",
       nsGopherHandlerConstructor
     },
 #endif
--- a/netwerk/necko-config.h.in
+++ b/netwerk/necko-config.h.in
@@ -38,16 +38,18 @@
 #define _NECKO_CONFIG_H_
 
 #undef NECKO_DISK_CACHE
 
 #undef NECKO_SMALL_BUFFERS
 
 #undef NECKO_COOKIES
 
+#undef NECKO_WIFI
+
 #undef NECKO_PROTOCOL_about
 #undef NECKO_PROTOCOL_data
 #undef NECKO_PROTOCOL_file
 #undef NECKO_PROTOCOL_ftp
 #undef NECKO_PROTOCOL_gopher
 #undef NECKO_PROTOCOL_http
 #undef NECKO_PROTOCOL_res
 #undef NECKO_PROTOCOL_viewsource
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/Makefile.in
@@ -0,0 +1,48 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org build system.
+#
+# The Initial Developer of the Original Code is Mozilla Corporation
+# Portions created by the Initial Developer are Copyright (C) 2008
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Doug Turner <dougt@meer.net>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH		= ../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+DIRS		= public src
+
+include $(topsrcdir)/config/rules.mk
+
+DEFINES += -DIMPL_NS_NET
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/public/Makefile.in
@@ -0,0 +1,56 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org build system.
+#
+# The Initial Developer of the Original Code is Mozilla Corporation
+# Portions created by the Initial Developer are Copyright (C) 2009
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Doug Turner <dougt@meer.net>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH		= ../../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE		= necko
+XPIDL_MODULE	= necko_wifi
+GRE_MODULE	= 1
+
+XPIDLSRCS	= \
+		nsIWifiMonitor.idl \
+		nsIWifiListener.idl \
+		nsIWifiAccessPoint.idl \
+		$(NULL)
+
+include $(topsrcdir)/config/rules.mk
+
+DEFINES += -DIMPL_NS_NET
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/public/nsIWifiAccessPoint.idl
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsISupports.idl"
+
+[scriptable, uuid(E28E614F-8F86-44FF-BCF5-5F18225834A0)]
+interface nsIWifiAccessPoint : nsISupports
+{
+  
+  /*
+   * The mac address of the WiFi node.  The format of this string is:
+   * XX-XX-XX-XX-XX-XX
+   */
+
+  readonly attribute ACString mac;
+
+  /*
+   * Public name of a wireless network.  The charset of this string is ASCII.
+   * This string will be null if not available.
+   *
+   * Note that this is a conversion of the SSID which makes it "displayable".
+   * for any comparisons, you want to use the Raw SSID.
+   */
+
+  readonly attribute AString ssid;
+
+  /*
+   * Public name of a wireless network.  These are the bytes that are read off
+   * of the network, may contain nulls, and generally shouldn't be displayed to
+   * the user.
+   *
+   */
+
+  readonly attribute ACString rawSSID;
+
+  /*
+   * Current signal strength measured in dBm.
+   */
+  readonly attribute long signal;
+};
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/public/nsIWifiListener.idl
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsISupports.idl"
+#include "nsIArray.idl"
+
+#include "nsIWifiAccessPoint.idl"
+
+[scriptable, uuid(BCD4BEDE-F4A5-4A62-9071-D7A60174E376)]
+interface nsIWifiListener : nsISupports
+{
+  /*
+   * Called when the list of access points changes.
+   *
+   * @param accessPoints An array of nsIWifiAccessPoint representing all
+   *                     access points in view.
+   */
+
+  void onChange([array, size_is(aLen)] in nsIWifiAccessPoint accessPoints, in unsigned long aLen);
+
+  /*
+   * Called when there is a problem with listening to wifi
+   *
+   * @param error the error which caused this event.  The
+   *              error values will be nsresult codes.
+   */
+  
+  void onError(in long error);
+};
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/public/nsIWifiMonitor.idl
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsISupports.idl"
+#include "nsIWifiListener.idl"
+
+[scriptable, uuid(F289701E-D9AF-4685-BC2F-E4226FF7C018)]
+interface nsIWifiMonitor : nsISupports
+{
+
+  /*
+   * startWatching
+   * aListener will be called once, then each time the list of wifi access points change.
+   */
+  void startWatching(in nsIWifiListener aListener);
+
+  /*
+   * stopWatching
+   * cancels all notifications to the |aListener|.
+   */
+  void stopWatching(in nsIWifiListener aListener);
+};
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/Makefile.in
@@ -0,0 +1,74 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org build system.
+#
+# The Initial Developer of the Original Code is Mozilla Corporation
+# Portions created by the Initial Developer are Copyright (C) 2009
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Doug Turner <dougt@meer.net>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH		= ../../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE		= necko
+LIBRARY_NAME	= neckowifi_s
+FORCE_STATIC_LIB	= 1
+LIBXUL_LIBRARY  = 1
+
+REQUIRES	= \
+		xpcom \
+		string \
+		pref \
+		storage \
+		$(NULL)
+
+CPPSRCS	=	nsWifiMonitor.cpp \
+		nsWifiAccessPoint.cpp \
+		$(NULL)
+
+ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
+CPPSRCS	+= nsWifiScannerMac.cpp
+else
+ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
+CPPSRCS	+= nsWifiScannerWin.cpp
+else
+ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
+CPPSRCS	+= nsWifiScannerUnix.cpp
+endif # gtk
+endif # windows
+endif # mac
+
+include $(topsrcdir)/config/rules.mk
+
+DEFINES += -DIMPL_NS_NET
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/nsWifiAccessPoint.cpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * This is a derivative of work done by Google under a BSD style License.
+ * See: http://gears.googlecode.com/svn/trunk/gears/geolocation/
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsWifiAccessPoint.h"
+#include "nsMemory.h"
+#include "prlog.h"
+
+#if defined(PR_LOGGING)
+extern PRLogModuleInfo *gWifiMonitorLog;
+#endif
+#define LOG(args)     PR_LOG(gWifiMonitorLog, PR_LOG_DEBUG, args)
+
+
+NS_IMPL_THREADSAFE_ISUPPORTS1(nsWifiAccessPoint, nsIWifiAccessPoint)
+
+nsWifiAccessPoint::nsWifiAccessPoint()
+{
+  // make sure these are null terminated (because we are paranoid)
+  mMac[0] = nsnull;
+  mSsid[0] = nsnull;
+  mSsidLen = 0;
+}
+
+nsWifiAccessPoint::~nsWifiAccessPoint()
+{
+}
+
+NS_IMETHODIMP nsWifiAccessPoint::GetMac(nsACString& aMac)
+{
+  aMac.Assign(mMac);
+  return NS_OK;
+}
+
+NS_IMETHODIMP nsWifiAccessPoint::GetSsid(nsAString& aSsid)
+{
+  // just assign and embedded nulls will truncate resulting
+  // in a displayable string.
+
+  nsString tempStr;
+  tempStr.AssignWithConversion(mSsid, mSsidLen);
+  aSsid = tempStr;
+
+  return NS_OK;
+}
+
+
+NS_IMETHODIMP nsWifiAccessPoint::GetRawSSID(nsACString& aRawSsid)
+{
+  aRawSsid.Assign(mSsid, mSsidLen); // SSIDs are 32 chars long
+  return NS_OK;
+}
+
+NS_IMETHODIMP nsWifiAccessPoint::GetSignal(PRInt32 *aSignal)
+{
+  NS_ENSURE_ARG(aSignal);
+  *aSignal = mSignal;
+  return NS_OK;
+}
+
+// Helper functions:
+
+PRBool AccessPointsEqual(nsCOMArray<nsWifiAccessPoint>& a, nsCOMArray<nsWifiAccessPoint>& b)
+{
+  if (a.Count() != b.Count()) {
+    LOG(("AccessPoint lists have different lengths\n"));
+    return PR_FALSE;
+  }
+
+  for (PRInt32 i = 0; i < a.Count(); i++) {
+    LOG(("++ Looking for %s\n", a[i]->mSsid));
+    PRBool found = PR_FALSE;
+    for (PRInt32 j = 0; j < b.Count(); j++) {
+      LOG(("   %s->%s | %s->%s\n", a[i]->mSsid, b[j]->mSsid, a[i]->mMac, b[j]->mMac));
+      if (!strcmp(a[i]->mSsid, b[j]->mSsid) &&
+          !strcmp(a[i]->mMac, b[j]->mMac)) {
+        found = PR_TRUE;
+      }
+    }
+    if (!found)
+      return PR_FALSE;
+  }
+  LOG(("   match!\n"));
+  return PR_TRUE;
+}
+
+void ReplaceArray(nsCOMArray<nsWifiAccessPoint>& a, nsCOMArray<nsWifiAccessPoint>& b)
+{
+  a.Clear();
+
+  // better way to copy?
+  for (PRInt32 i = 0; i < b.Count(); i++) {
+    a.AppendObject(b[i]);
+  }
+
+  b.Clear();
+}
+
+
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/nsWifiAccessPoint.h
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * This is a derivative of work done by Google under a BSD style License.
+ * See: http://gears.googlecode.com/svn/trunk/gears/geolocation/
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsWifiMonitor.h"
+#include "nsIWifiAccessPoint.h"
+
+#include "nsString.h"
+#include "nsCOMArray.h"
+
+#ifndef __nsWifiAccessPoint__
+#define __nsWifiAccessPoint__
+
+class nsWifiAccessPoint : public nsIWifiAccessPoint
+{
+public:
+  NS_DECL_ISUPPORTS
+  NS_DECL_NSIWIFIACCESSPOINT
+
+  nsWifiAccessPoint();
+  ~nsWifiAccessPoint();
+
+  char mMac[18];
+  int  mSignal;
+  char mSsid[33];
+  int  mSsidLen;
+
+  void setSignal(int signal)
+  {
+    mSignal = signal;
+  };
+
+  void setMac(const uint8 mac_as_int[6])
+  {
+    // mac_as_int is big-endian. Write in byte chunks.
+    // Format is XX-XX-XX-XX-XX-XX.
+
+    static const char *kMacFormatString = ("%02x-%02x-%02x-%02x-%02x-%02x");
+    
+    sprintf(mMac, kMacFormatString,
+            mac_as_int[0], mac_as_int[1], mac_as_int[2],
+            mac_as_int[3], mac_as_int[4], mac_as_int[5]);
+    mMac[17] = 0;
+  };
+
+  void setSSID(const char* aSSID, unsigned long len) {
+    if (len < sizeof(mSsid)) {
+        strncpy(mSsid, aSSID, len);
+        mSsid[len] = 0;
+        mSsidLen = len;
+    }
+    else
+    {
+      mSsid[0] = 0;
+      mSsidLen = 0;
+    }
+  };
+};
+
+
+
+// Helper functions
+
+PRBool AccessPointsEqual(nsCOMArray<nsWifiAccessPoint>& a, nsCOMArray<nsWifiAccessPoint>& b);
+void ReplaceArray(nsCOMArray<nsWifiAccessPoint>& a, nsCOMArray<nsWifiAccessPoint>& b);
+
+
+#endif
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/nsWifiMonitor.cpp
@@ -0,0 +1,181 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * This is a derivative of work done by Google under a BSD style License.
+ * See: http://gears.googlecode.com/svn/trunk/gears/geolocation/
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsCOMPtr.h"
+#include "nsComponentManagerUtils.h"
+#include "nsIGenericFactory.h"
+#include "nsServiceManagerUtils.h"
+#include "nsThreadUtils.h"
+#include "nsXPCOM.h"
+#include "nsXPCOMCID.h"
+#include "nsAutoLock.h"
+#include "nsIObserver.h"
+#include "nsIObserverService.h"
+#include "nsWifiMonitor.h"
+
+#include "nsIProxyObjectManager.h"
+#include "nsServiceManagerUtils.h"
+#include "nsComponentManagerUtils.h"
+
+#if defined(PR_LOGGING)
+PRLogModuleInfo *gWifiMonitorLog;
+#endif
+
+NS_IMPL_THREADSAFE_ISUPPORTS3(nsWifiMonitor,
+                              nsIRunnable,
+                              nsIObserver,
+                              nsIWifiMonitor)
+
+nsWifiMonitor::nsWifiMonitor()
+: mKeepGoing(PR_TRUE)
+{
+#if defined(PR_LOGGING)
+  gWifiMonitorLog = PR_NewLogModule("WifiMonitor");
+#endif
+
+  mMonitor = nsAutoMonitor::NewMonitor("nsWifiMonitor");
+
+  nsCOMPtr<nsIObserverService> obsSvc = do_GetService("@mozilla.org/observer-service;1");
+  if (obsSvc)
+    obsSvc->AddObserver(this, "xpcom-shutdown", PR_FALSE);
+
+  LOG(("@@@@@ wifimonitor created\n"));
+}
+
+nsWifiMonitor::~nsWifiMonitor()
+{
+  if (mMonitor)
+    nsAutoMonitor::DestroyMonitor(mMonitor);
+}
+
+NS_IMETHODIMP
+nsWifiMonitor::Observe(nsISupports *subject, const char *topic,
+                     const PRUnichar *data)
+{
+  if (!strcmp(topic, "xpcom-shutdown")) {
+    LOG(("Shutting down\n"));
+    mKeepGoing = PR_FALSE;
+
+    nsAutoMonitor mon(mMonitor);
+    mon.Notify();
+  }
+  return NS_OK;
+}
+
+
+NS_IMETHODIMP nsWifiMonitor::StartWatching(nsIWifiListener *aListener)
+{
+  if (!aListener)
+    return NS_ERROR_NULL_POINTER;
+
+  nsresult rv = NS_OK;
+  if (!mThread) {
+    rv = NS_NewThread(getter_AddRefs(mThread), this);
+    if (NS_FAILED(rv))
+      return rv;
+  }
+
+  nsAutoMonitor mon(mMonitor);
+  
+  mKeepGoing = PR_TRUE;
+
+  mListeners.AppendElement(nsWifiListener(aListener));
+
+  // tell ourselves that we have a new watcher.
+  mon.Notify();
+  return NS_OK;
+}
+
+NS_IMETHODIMP nsWifiMonitor::StopWatching(nsIWifiListener *aListener)
+{
+  if (!aListener)
+    return NS_ERROR_NULL_POINTER;
+
+  LOG(("removing listener\n"));
+
+  nsAutoMonitor mon(mMonitor);
+  
+  for (PRUint32 i = 0; i < mListeners.Length(); i++) {
+
+    if (mListeners[i].mListener == aListener) {
+      mListeners.RemoveElementAt(i);
+      break;
+    }
+  }
+
+  if (mListeners.Length() == 0) {
+    mKeepGoing = PR_FALSE;
+    mon.Notify();
+    mThread = nsnull;
+  }
+
+  return NS_OK;
+}
+
+
+NS_IMETHODIMP nsWifiMonitor::Run()
+{
+  LOG(("@@@@@ wifi monitor run called\n"));
+
+  nsresult rv = DoScan();
+
+  if (mKeepGoing && NS_FAILED(rv)) {
+
+    // send error
+    for (PRUint32 i = 0; i < mListeners.Length(); i++) {
+      
+      LOG(("About to send error to a listener\n"));
+      
+      nsCOMPtr<nsIWifiListener> proxy;
+      nsCOMPtr<nsIProxyObjectManager> proxyObjMgr = do_GetService("@mozilla.org/xpcomproxy;1");
+      proxyObjMgr->GetProxyForObject(NS_PROXY_TO_MAIN_THREAD,
+                                     NS_GET_IID(nsIWifiListener),
+                                     mListeners[i].mListener,
+                                     NS_PROXY_SYNC | NS_PROXY_ALWAYS,
+                                     getter_AddRefs(proxy));
+      
+      if (proxy) {
+        nsresult rv = proxy->OnError(rv);
+        LOG( ("... sent %d\n", rv));
+      }
+    }
+  }
+
+  return NS_OK;
+}
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/nsWifiMonitor.h
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * This is a derivative of work done by Google under a BSD style License.
+ * See: http://gears.googlecode.com/svn/trunk/gears/geolocation/
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsIWifiMonitor.h"
+#include "nsCOMPtr.h"
+#include "nsAutoPtr.h"
+#include "nsAutoLock.h"
+#include "nsIThread.h"
+#include "nsIRunnable.h"
+#include "nsCOMArray.h"
+#include "nsIWifiMonitor.h"
+#include "prmon.h"
+#include "prlog.h"
+#include "nsIObserver.h"
+#include "nsTArray.h"
+
+#ifndef __nsWifiMonitor__
+#define __nsWifiMonitor__
+
+#if defined(PR_LOGGING)
+extern PRLogModuleInfo *gWifiMonitorLog;
+#endif
+#define LOG(args)     PR_LOG(gWifiMonitorLog, PR_LOG_DEBUG, args)
+
+class nsWifiListener
+{
+ public:
+
+  nsWifiListener(nsIWifiListener* aListener)
+  {
+    mListener = aListener;
+    mHasSentData = PR_FALSE;
+  }
+  ~nsWifiListener() {}
+  
+  nsCOMPtr<nsIWifiListener> mListener;
+  PRBool mHasSentData;
+};
+
+class nsWifiMonitor : nsIRunnable, nsIWifiMonitor, nsIObserver
+{
+ public:
+  NS_DECL_ISUPPORTS
+  NS_DECL_NSIWIFIMONITOR
+  NS_DECL_NSIRUNNABLE
+  NS_DECL_NSIOBSERVER
+
+  nsWifiMonitor();
+
+ private:
+  ~nsWifiMonitor();
+
+  nsresult DoScan();
+
+  PRBool mKeepGoing;
+  nsCOMPtr<nsIThread> mThread;
+
+  nsTArray<nsWifiListener> mListeners;
+
+  PRMonitor* mMonitor;
+
+};
+
+#endif
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/nsWifiScannerMac.cpp
@@ -0,0 +1,182 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * This is a derivative of work done by Google under a BSD style License.
+ * See: http://gears.googlecode.com/svn/trunk/gears/geolocation/
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include <mach-o/dyld.h>
+#include <dlfcn.h>
+#include <unistd.h>
+
+#include "osx_wifi.h"
+
+#include "nsAutoPtr.h"
+#include "nsCOMArray.h"
+#include "nsWifiMonitor.h"
+#include "nsWifiAccessPoint.h"
+
+#include "nsIProxyObjectManager.h"
+#include "nsServiceManagerUtils.h"
+#include "nsComponentManagerUtils.h"
+#include "nsIMutableArray.h"
+
+nsresult
+nsWifiMonitor::DoScan()
+{
+  void *apple_80211_library = dlopen(
+      "/System/Library/PrivateFrameworks/Apple80211.framework/Apple80211",
+      RTLD_LAZY);
+
+  WirelessContextPtr wifi_context_;
+
+  WirelessAttachFunction WirelessAttach_function_ = reinterpret_cast<WirelessAttachFunction>(dlsym(apple_80211_library, "WirelessAttach"));
+  WirelessScanSplitFunction WirelessScanSplit_function_ = reinterpret_cast<WirelessScanSplitFunction>(dlsym(apple_80211_library, "WirelessScanSplit"));
+  WirelessDetachFunction WirelessDetach_function_ = reinterpret_cast<WirelessDetachFunction>(dlsym(apple_80211_library, "WirelessDetach"));
+  
+  if (!WirelessAttach_function_ || !WirelessScanSplit_function_ || !WirelessDetach_function_)
+    return NS_ERROR_NOT_AVAILABLE;
+
+  if ((*WirelessAttach_function_)(&wifi_context_, 0) != noErr)
+    return NS_ERROR_FAILURE;
+
+  // Regularly get the access point data.
+    
+  nsCOMArray<nsWifiAccessPoint> lastAccessPoints;
+  nsCOMArray<nsWifiAccessPoint> accessPoints;
+
+  do {
+    accessPoints.Clear();
+
+    CFArrayRef managed_access_points = NULL;
+    CFArrayRef adhoc_access_points = NULL;
+    
+    if ((*WirelessScanSplit_function_)(wifi_context_,
+                                      &managed_access_points,
+                                      &adhoc_access_points,
+                                      0) != noErr) {
+      continue;
+    }
+    
+    if (managed_access_points == NULL) {
+      continue;
+    }
+
+    int accessPointsCount = CFArrayGetCount(managed_access_points);
+
+    for (int i = 0; i < accessPointsCount; ++i) {
+
+      nsWifiAccessPoint* ap = new nsWifiAccessPoint();
+      if (!ap)
+        continue;
+
+      const WirelessNetworkInfo *access_point_info =
+        reinterpret_cast<const WirelessNetworkInfo*>(CFDataGetBytePtr(reinterpret_cast<const CFDataRef>(CFArrayGetValueAtIndex(managed_access_points, i))));
+
+      ap->setMac(access_point_info->macAddress);
+
+      // WirelessNetworkInfo::signal appears to be signal strength in dBm.
+      ap->setSignal(access_point_info->signal);
+
+      ap->setSSID(reinterpret_cast<const char*>(access_point_info->name),
+                  access_point_info->nameLen);
+
+      accessPoints.AppendObject(ap);
+    }
+
+    PRBool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints);
+    nsCOMArray<nsIWifiListener> currentListeners;
+
+    {
+      nsAutoMonitor mon(mMonitor);
+      
+      for (PRUint32 i = 0; i < mListeners.Length(); i++) {
+        if (!mListeners[i].mHasSentData || accessPointsChanged) {
+          mListeners[i].mHasSentData = PR_TRUE;
+          currentListeners.AppendObject(mListeners[i].mListener);
+        }
+      }
+    }
+    
+    ReplaceArray(lastAccessPoints, accessPoints);
+
+    if (currentListeners.Count() > 0)
+    {
+      PRUint32 resultCount = lastAccessPoints.Count();
+      nsIWifiAccessPoint** result = static_cast<nsIWifiAccessPoint**> (nsMemory::Alloc(sizeof(nsIWifiAccessPoint*) * resultCount));
+      if (!result)
+        return NS_ERROR_OUT_OF_MEMORY;
+      
+      for (PRUint32 i = 0; i < resultCount; i++)
+        result[i] = lastAccessPoints[i];
+
+      for (PRInt32 i = 0; i < currentListeners.Count(); i++) {
+        
+        LOG(("About to send data to the wifi listeners\n"));
+        
+        nsCOMPtr<nsIWifiListener> proxy;
+        nsCOMPtr<nsIProxyObjectManager> proxyObjMgr = do_GetService("@mozilla.org/xpcomproxy;1");
+        proxyObjMgr->GetProxyForObject(NS_PROXY_TO_MAIN_THREAD,
+                                       NS_GET_IID(nsIWifiListener),
+                                       currentListeners[i],
+                                       NS_PROXY_SYNC | NS_PROXY_ALWAYS,
+                                       getter_AddRefs(proxy));
+        if (!proxy) {
+          LOG(("There is no proxy available.  this should never happen\n"));
+        }
+        else
+        {
+          nsresult rv = proxy->OnChange(result, resultCount);
+          LOG( ("... sent %d\n", rv));
+        }
+      }
+
+      nsMemory::Free(result);
+    }
+
+    // wait for some reasonable amount of time.  pref?
+    LOG(("waiting on monitor\n"));
+    
+    nsAutoMonitor mon(mMonitor);
+    mon.Wait(PR_SecondsToInterval(60));
+  }
+  while (mKeepGoing == PR_TRUE);
+  
+  (*WirelessDetach_function_)(wifi_context_);
+  
+  dlclose(apple_80211_library);
+  
+  return NS_OK;
+}
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/nsWifiScannerUnix.cpp
@@ -0,0 +1,232 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * This is a derivative of work done by Google under a BSD style License.
+ * See: http://gears.googlecode.com/svn/trunk/gears/geolocation/
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "iwlib.h"
+
+#include "dlfcn.h"
+
+#include "nsAutoPtr.h"
+#include "nsWifiMonitor.h"
+#include "nsWifiAccessPoint.h"
+
+#include "nsIProxyObjectManager.h"
+#include "nsServiceManagerUtils.h"
+#include "nsComponentManagerUtils.h"
+#include "nsIMutableArray.h"
+
+
+
+
+typedef int (*iw_open_t)(void);
+  
+typedef void (*iw_enum_t)(int	skfd,
+			  iw_enum_handler fn,
+			  char *args[],
+			  int count);
+  
+typedef  int (*iw_stats_t)(int skfd,
+			   const char *ifname,
+			   iwstats *stats,
+			   const iwrange *range,
+			   int has_range);
+
+
+static iw_open_t iw_open = nsnull;
+static iw_enum_t iw_enum = nsnull;
+static iw_stats_t iw_stats = nsnull;
+
+static int scan_wifi(int skfd, char* ifname, char* args[], int count)
+{
+  nsCOMArray<nsWifiAccessPoint>* accessPoints = (nsCOMArray<nsWifiAccessPoint>*) args[0];
+
+  struct iwreq wrq;
+
+  int result = iw_get_ext(skfd, ifname, SIOCGIWMODE, &wrq);
+  if (result < 0)
+    return 0;
+
+  // We only cared about "Managed" mode.  2 is the magic number.  There isn't a #define for this.
+  if (wrq.u.mode != 2)
+    return 0;
+
+  nsWifiAccessPoint* ap = new nsWifiAccessPoint();
+  if (!ap)
+    return 0;
+
+  char buffer[128];
+  wrq.u.essid.pointer = buffer;
+  wrq.u.essid.length  = 128;
+  wrq.u.essid.flags   = 0;
+  result = iw_get_ext(skfd, ifname, SIOCGIWESSID, &wrq);
+  if (result < 0) {
+    delete ap;
+    return 0;
+  }
+  
+  buffer[wrq.u.essid.length] = 0;
+  strncpy(ap->mSsid, buffer, 32);
+
+  result = iw_get_ext(skfd, ifname, SIOCGIWAP, &wrq);
+  if (result < 0) {
+    delete ap;
+    return 0;
+  }
+  ap->setMac( (const uint8*) wrq.u.ap_addr.sa_data );
+
+  iwrange range;
+  iwstats stats;
+  result = (*iw_stats)(skfd, ifname, &stats, &range, 1);
+  if (result < 0) {
+    delete ap;
+    return 0;
+  }
+
+  if(stats.qual.level > range.max_qual.level)
+    ap->mSignal = stats.qual.level - 0x100;
+  else
+    ap->mSignal = 0;
+
+  accessPoints->AppendObject(ap);
+  return 0;
+}
+
+nsresult
+nsWifiMonitor::DoScan()
+{
+  void* iwlib_handle = dlopen("libiw.so", RTLD_NOW);
+  if (!iwlib_handle) {
+    iwlib_handle = dlopen("libiw.so.29", RTLD_NOW);
+    if (!iwlib_handle) {
+      LOG(("Could not load libiw\n"));
+      return NS_ERROR_NOT_AVAILABLE;
+    }
+  }
+  else {
+    LOG(("Loaded libiw\n"));
+  }
+
+  iw_open = (iw_open_t) dlsym(iwlib_handle, "iw_sockets_open");
+  iw_enum = (iw_enum_t) dlsym(iwlib_handle, "iw_enum_devices");
+  iw_stats = (iw_stats_t)dlsym(iwlib_handle, "iw_get_stats");
+
+  if (!iw_open || !iw_enum || !iw_stats) {
+    dlclose(iwlib_handle);
+    LOG(("Could not load a symbol from iwlib.so\n"));
+    return NS_ERROR_FAILURE;
+  }
+
+  int skfd = (*iw_open)();
+
+  if (skfd < 0) {
+    dlclose(iwlib_handle);
+    return NS_ERROR_FAILURE;
+  }
+
+  nsCOMArray<nsWifiAccessPoint> lastAccessPoints;
+  nsCOMArray<nsWifiAccessPoint> accessPoints;
+
+  char* args[] = {(char*) &accessPoints, nsnull };
+ 
+  while (mKeepGoing == PR_TRUE) {
+
+    accessPoints.Clear();
+
+    (*iw_enum)(skfd, &scan_wifi, args, 1);
+    
+    PRBool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints);
+    nsCOMArray<nsIWifiListener> currentListeners;
+
+    {
+      nsAutoMonitor mon(mMonitor);
+    
+      for (PRUint32 i = 0; i < mListeners.Length(); i++) {
+        if (!mListeners[i].mHasSentData || accessPointsChanged) {
+          mListeners[i].mHasSentData = PR_TRUE;
+          currentListeners.AppendObject(mListeners[i].mListener);
+        }
+      }
+    }
+
+    ReplaceArray(lastAccessPoints, accessPoints);
+
+    if (currentListeners.Count() > 0)
+    {
+      PRUint32 resultCount = lastAccessPoints.Count();
+      nsIWifiAccessPoint** result = static_cast<nsIWifiAccessPoint**> (nsMemory::Alloc(sizeof(nsIWifiAccessPoint*) * resultCount));
+      if (!result)
+        return NS_ERROR_OUT_OF_MEMORY;
+      
+      for (PRUint32 i = 0; i < resultCount; i++)
+        result[i] = lastAccessPoints[i];
+
+      for (PRInt32 i = 0; i < currentListeners.Count(); i++) {
+        
+        LOG(("About to send data to the wifi listeners\n"));
+        
+        nsCOMPtr<nsIWifiListener> proxy;
+        nsCOMPtr<nsIProxyObjectManager> proxyObjMgr = do_GetService("@mozilla.org/xpcomproxy;1");
+        proxyObjMgr->GetProxyForObject(NS_PROXY_TO_MAIN_THREAD,
+                                       NS_GET_IID(nsIWifiListener),
+                                       currentListeners[i],
+                                       NS_PROXY_SYNC | NS_PROXY_ALWAYS,
+                                       getter_AddRefs(proxy));
+        if (!proxy) {
+          LOG(("There is no proxy available.  this should never happen\n"));
+        }
+        else
+        {
+          nsresult rv = proxy->OnChange(result, resultCount);
+          LOG( ("... sent %d\n", rv));
+        }
+      }
+
+      nsMemory::Free(result);
+    }
+
+    LOG(("waiting on monitor\n"));
+    
+    
+    nsAutoMonitor mon(mMonitor);
+    mon.Wait(PR_SecondsToInterval(60));
+  }
+
+  iw_sockets_close(skfd);
+
+  return NS_OK;
+}
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/nsWifiScannerWin.cpp
@@ -0,0 +1,562 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Geolocation.
+ *
+ * The Initial Developer of the Original Code is Mozilla Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * This is a derivative of work done by Google under a BSD style License.
+ * See: http://gears.googlecode.com/svn/trunk/gears/geolocation/
+ *
+ * Contributor(s):
+ *  Doug Turner <dougt@meer.net>  (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+
+#include "windows.h"
+#include "wlanapi.h"
+
+#include <ntddndis.h>
+#include "winioctl.h"
+
+
+#include "nsAutoPtr.h"
+#include "nsWifiMonitor.h"
+#include "nsWifiAccessPoint.h"
+
+#include "nsIProxyObjectManager.h"
+#include "nsServiceManagerUtils.h"
+#include "nsComponentManagerUtils.h"
+#include "nsIMutableArray.h"
+
+
+// Taken from ndis.h
+#define NDIS_STATUS_INVALID_LENGTH   ((NDIS_STATUS)0xC0010014L)
+#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L)
+
+static const int kStringLength = 512;
+
+// The limits on the size of the buffer used for the OID query.
+static const int kInitialBufferSize = 2 << 12;  // Good for about 50 APs.
+static const int kMaximumBufferSize = 2 << 20;  // 2MB
+
+static int oid_buffer_size_ = kStringLength;
+
+PRBool ResizeBuffer(int requested_size, BYTE **buffer)
+{
+  if (requested_size > kMaximumBufferSize) {
+    free(*buffer);
+    *buffer = NULL;
+    return false;
+  }
+
+  BYTE *new_buffer = reinterpret_cast<BYTE*>(realloc(*buffer, requested_size));
+  if (new_buffer == NULL) {
+    free(*buffer);
+    *buffer = NULL;
+    return false;
+  }
+
+  *buffer = new_buffer;
+  return true;
+}
+
+
+
+int PerformQuery(HANDLE adapter_handle,
+                 BYTE *buffer,
+                 DWORD buffer_size,
+                 DWORD *bytes_out) {
+
+  DWORD oid = OID_802_11_BSSID_LIST;
+  
+  if (!DeviceIoControl(adapter_handle,
+                       IOCTL_NDIS_QUERY_GLOBAL_STATS,
+                       &oid,
+                       sizeof(oid),
+                       buffer,
+                       buffer_size,
+                       bytes_out,
+                       NULL)) {
+    return GetLastError();
+  }
+  return ERROR_SUCCESS;
+}
+
+HANDLE GetFileHandle(const unsigned short* device_name) {
+  // We access a device with DOS path \Device\<device_name> at
+  // \\.\<device_name>. 
+
+  nsString formatted_device_name;
+  formatted_device_name.Assign(L"\\\\.\\");
+  formatted_device_name.Append(device_name);
+
+  return CreateFileW(formatted_device_name.get(),
+                     GENERIC_READ,
+                     FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
+                     0,  // security attributes
+                     OPEN_EXISTING,
+                     0,  // flags and attributes
+                     INVALID_HANDLE_VALUE);
+}
+
+
+bool UndefineDosDevice(const unsigned short* device_name) {
+  // We remove only the mapping we use, that is \Device\<device_name>.
+  nsString target_path;
+  target_path.Assign(L"\\Device\\");
+  target_path.Append(device_name);
+
+  return DefineDosDeviceW(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
+                          device_name,
+                          target_path.get()) == TRUE;
+}
+
+bool DefineDosDeviceIfNotExists(unsigned short* device_name) {
+
+  // We create a DOS device name for the device at \Device\<device_name>.
+  nsString target_path;
+  target_path.Assign(L"\\Device\\");
+  target_path.Append(device_name);
+
+  unsigned short target[kStringLength];
+
+  if (QueryDosDeviceW(device_name, target, kStringLength) > 0 && target_path.Equals(target)) {     
+    // Device already exists.
+    return true;
+  } 
+
+  DWORD error = GetLastError();
+  if (error != ERROR_FILE_NOT_FOUND) {
+    return false;
+  }
+
+  if (!DefineDosDeviceW(DDD_RAW_TARGET_PATH,
+                        device_name,
+                        target_path.get())) {
+    return false;
+  }
+  // Check that the device is really there. 
+  return QueryDosDeviceW(device_name, target, kStringLength) > 0 &&
+    target_path.Equals(target);
+} 
+
+void GetNetworkInterfacesFromRegistry(nsStringArray& interfaces)
+{
+  HKEY network_cards_key = NULL;
+  if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                    L"Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards",
+                    0,
+                    KEY_READ,
+                    &network_cards_key) != ERROR_SUCCESS)
+    {
+      return;
+    }   
+  
+  for (int i = 0; ; ++i) {
+    unsigned short name[kStringLength];
+    DWORD name_size = kStringLength;
+    FILETIME time;
+    
+    if (RegEnumKeyExW(network_cards_key,
+                      i,
+                      name,
+                      &name_size,
+                      NULL,
+                      NULL,
+                      NULL,
+                      &time) != ERROR_SUCCESS) 
+      {
+        break;
+      }     
+    
+    HKEY hardware_key = NULL;
+    if (RegOpenKeyExW(network_cards_key,
+                      name,
+                      0,
+                      KEY_READ,
+                      &hardware_key) != ERROR_SUCCESS)
+      {
+        break;
+      }
+    
+    unsigned short service_name[kStringLength];
+    DWORD service_name_size = kStringLength;
+    DWORD type = 0;
+    
+    if (RegQueryValueExW(hardware_key,
+                         L"ServiceName",
+                         NULL,
+                         &type,
+                         reinterpret_cast<LPBYTE>(service_name),
+                         &service_name_size) == ERROR_SUCCESS) {
+ 
+      interfaces.AppendString(nsString(service_name));  // is this allowed?
+    } 
+    RegCloseKey(hardware_key);
+  }
+  RegCloseKey(network_cards_key);
+}
+
+
+PRBool IsRunningOnVista() {
+  static DWORD os_major_version = 0;
+  static DWORD platform_id = 0;
+
+  if (0 == os_major_version) {
+    OSVERSIONINFO os_version = {0};
+    os_version.dwOSVersionInfoSize = sizeof(os_version);
+    GetVersionEx(&os_version);
+    os_major_version = os_version.dwMajorVersion;
+    platform_id = os_version.dwPlatformId;
+  }
+
+  return (6 == os_major_version) && (VER_PLATFORM_WIN32_NT == platform_id);
+}
+
+nsresult
+nsWifiMonitor::DoScan()
+{
+  if (!IsRunningOnVista()) {
+
+    nsCOMArray<nsWifiAccessPoint> lastAccessPoints;
+    nsCOMArray<nsWifiAccessPoint> accessPoints;
+    
+    do {
+      accessPoints.Clear();
+
+      nsStringArray interfaces;
+      GetNetworkInterfacesFromRegistry(interfaces);
+      
+      for (int i = 0; i < interfaces.Count(); i++) {
+        nsString *s = interfaces.StringAt(i);
+        unsigned short *service_name = (PRUnichar*) s->get();
+        
+        if (!DefineDosDeviceIfNotExists(service_name))
+          continue;
+
+        // Get the handle to the device. This will fail if the named device is not
+        // valid.
+        
+        HANDLE adapter_handle = GetFileHandle(service_name);
+        if (adapter_handle == INVALID_HANDLE_VALUE)
+          continue;
+
+        // Get the data.
+        
+        BYTE *buffer = reinterpret_cast<BYTE*>(malloc(oid_buffer_size_));
+        if (buffer == NULL)
+          return NS_ERROR_OUT_OF_MEMORY;
+          
+        DWORD bytes_out;
+        int result;
+        
+        while (true) {     
+          bytes_out = 0; 
+          result = PerformQuery(adapter_handle, buffer, oid_buffer_size_, &bytes_out);
+          
+          if (result == ERROR_GEN_FAILURE ||  // Returned by some Intel cards.
+              result == ERROR_INSUFFICIENT_BUFFER ||
+              result == ERROR_MORE_DATA ||
+              result == NDIS_STATUS_INVALID_LENGTH ||
+              result == NDIS_STATUS_BUFFER_TOO_SHORT) {
+            
+            // The buffer we supplied is too small, so increase it. bytes_out should 
+            // provide the required buffer size, but this is not always the case. 
+            
+            if (bytes_out > static_cast<DWORD>(oid_buffer_size_)) { 
+              oid_buffer_size_ = bytes_out;
+            } else {
+              oid_buffer_size_ *= 2;
+            } 
+            
+            if (!ResizeBuffer(oid_buffer_size_, &buffer)) {
+              oid_buffer_size_ = kInitialBufferSize;  // Reset for next time. 
+              continue;
+            }
+          } else {
+            // The buffer is not too small.
+            break;
+          }
+        }
+          
+        if (result == ERROR_SUCCESS) {
+          NDIS_802_11_BSSID_LIST* bssid_list = reinterpret_cast<NDIS_802_11_BSSID_LIST*>(buffer);
+          
+          // Walk through the BSS IDs.
+          int found = 0;
+          const uint8 *iterator = reinterpret_cast<const uint8*>(&bssid_list->Bssid[0]);
+          const uint8 *end_of_buffer = reinterpret_cast<const uint8*>(&bssid_list) + oid_buffer_size_;
+          for (int i = 0; i < static_cast<int>(bssid_list->NumberOfItems); ++i) {
+            
+            const NDIS_WLAN_BSSID *bss_id = reinterpret_cast<const NDIS_WLAN_BSSID*>(iterator);
+            
+            // Check that the length of this BSS ID is reasonable.
+            if (bss_id->Length < sizeof(NDIS_WLAN_BSSID) ||
+                iterator + bss_id->Length > end_of_buffer) {
+              break;
+            }
+            
+            nsWifiAccessPoint* ap = new nsWifiAccessPoint();
+            if (!ap)
+              continue;
+            
+            ap->setMac(bss_id->MacAddress);
+            ap->setSignal(bss_id->Rssi);
+            ap->setSSID((char*) bss_id->Ssid.Ssid, bss_id->Ssid.SsidLength);
+            
+            accessPoints.AppendObject(ap);
+            
+            // Move to the next BSS ID.
+            iterator += bss_id->Length;
+          }
+
+          free(buffer); 
+
+          // Clean up.
+          CloseHandle(adapter_handle);
+        }
+        
+        UndefineDosDevice(service_name);
+      }
+     
+ 
+    
+    PRBool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints);
+    nsCOMArray<nsIWifiListener> currentListeners;
+    
+    {
+      nsAutoMonitor mon(mMonitor);
+      
+      for (PRUint32 i = 0; i < mListeners.Length(); i++) {
+        if (!mListeners[i].mHasSentData || accessPointsChanged) {
+          mListeners[i].mHasSentData = PR_TRUE;
+          currentListeners.AppendObject(mListeners[i].mListener);
+        }
+      }
+    }
+    
+    ReplaceArray(lastAccessPoints, accessPoints);
+    
+    if (currentListeners.Count() > 0) {
+
+      PRUint32 resultCount = lastAccessPoints.Count();
+      nsIWifiAccessPoint** result = static_cast<nsIWifiAccessPoint**> (nsMemory::Alloc(sizeof(nsIWifiAccessPoint*) * resultCount));
+      if (!result)
+        return NS_ERROR_OUT_OF_MEMORY;
+      
+      for (PRUint32 i = 0; i < resultCount; i++)
+        result[i] = lastAccessPoints[i];
+      
+      for (PRInt32 i = 0; i < currentListeners.Count(); i++) {
+          
+        LOG(("About to send data to the wifi listeners\n"));
+        
+        nsCOMPtr<nsIWifiListener> proxy;
+        nsCOMPtr<nsIProxyObjectManager> proxyObjMgr = do_GetService("@mozilla.org/xpcomproxy;1");
+        proxyObjMgr->GetProxyForObject(NS_PROXY_TO_MAIN_THREAD,
+                                       NS_GET_IID(nsIWifiListener),
+                                       currentListeners[i],
+                                       NS_PROXY_SYNC | NS_PROXY_ALWAYS,
+                                       getter_AddRefs(proxy));
+        if (!proxy) {
+          LOG(("There is no proxy available.  this should never happen\n"));
+        }
+        else
+        {
+          nsresult rv = proxy->OnChange(result, resultCount);
+          LOG( ("... sent %d\n", rv));
+        }
+      }
+
+      nsMemory::Free(result);
+    }
+    
+    // wait for some reasonable amount of time.  pref?
+    LOG(("waiting on monitor\n"));
+    
+    nsAutoMonitor mon(mMonitor);
+    mon.Wait(PR_SecondsToInterval(60));
+  }
+  while (mKeepGoing == PR_TRUE);
+
+
+
+  }
+  else {
+
+    HINSTANCE wlan_library = LoadLibrary("Wlanapi.dll");
+    if (!wlan_library)
+      return NS_ERROR_NOT_AVAILABLE;
+    
+    WlanOpenHandleFunction WlanOpenHandle = (WlanOpenHandleFunction) GetProcAddress(wlan_library, "WlanOpenHandle");
+    WlanEnumInterfacesFunction WlanEnumInterfaces = (WlanEnumInterfacesFunction) GetProcAddress(wlan_library, "WlanEnumInterfaces");
+    WlanGetNetworkBssListFunction WlanGetNetworkBssList = (WlanGetNetworkBssListFunction) GetProcAddress(wlan_library, "WlanGetNetworkBssList");
+    WlanFreeMemoryFunction WlanFreeMemory = (WlanFreeMemoryFunction) GetProcAddress(wlan_library, "WlanFreeMemory");
+    WlanCloseHandleFunction WlanCloseHandle = (WlanCloseHandleFunction) GetProcAddress(wlan_library, "WlanCloseHandle");
+    
+    if (!WlanOpenHandle ||
+        !WlanEnumInterfaces ||
+        !WlanGetNetworkBssList ||
+        !WlanFreeMemory ||
+        !WlanCloseHandle)
+      return NS_ERROR_FAILURE;
+    
+    // Regularly get the access point data.
+    
+    nsCOMArray<nsWifiAccessPoint> lastAccessPoints;
+    nsCOMArray<nsWifiAccessPoint> accessPoints;
+    
+    do {
+      accessPoints.Clear();
+      
+      // Get the handle to the WLAN API.
+      DWORD negotiated_version;
+      HANDLE wlan_handle = NULL;
+      // We could be executing on either Windows XP or Windows Vista, so use the
+      // lower version of the client WLAN API. It seems that the negotiated version
+      // is the Vista version irrespective of what we pass!
+      static const int kXpWlanClientVersion = 1;
+      if ((*WlanOpenHandle)(kXpWlanClientVersion,
+                            NULL,
+                            &negotiated_version,
+                            &wlan_handle) != ERROR_SUCCESS) {
+        return NS_ERROR_NOT_AVAILABLE;
+      }
+      
+      // try again later.
+      if (!wlan_handle)
+        return NS_ERROR_FAILURE;
+      
+      // Get the list of interfaces. WlanEnumInterfaces allocates interface_list.
+      WLAN_INTERFACE_INFO_LIST *interface_list = NULL;
+      if ((*WlanEnumInterfaces)(wlan_handle, NULL, &interface_list) != ERROR_SUCCESS) {
+        // try again later
+        (*WlanCloseHandle)(wlan_handle, NULL);
+        return NS_ERROR_FAILURE;
+      }
+      
+      // Go through the list of interfaces and get the data for each.
+      for (int i = 0; i < static_cast<int>(interface_list->dwNumberOfItems); ++i) {
+        
+        WLAN_BSS_LIST *bss_list;
+        HRESULT rv = (*WlanGetNetworkBssList)(wlan_handle,
+                                              &interface_list->InterfaceInfo[i].InterfaceGuid,
+                                              NULL,   // Use all SSIDs.
+                                              DOT11_BSS_TYPE_UNUSED,
+                                              false,  // bSecurityEnabled - unused
+                                              NULL,   // reserved
+                                              &bss_list);
+        if (rv != ERROR_SUCCESS) {
+          continue;
+        }
+        
+        for (int j = 0; j < static_cast<int>(bss_list->dwNumberOfItems); ++j) {
+          
+          nsWifiAccessPoint* ap = new nsWifiAccessPoint();
+          if (!ap)
+            continue;
+          
+          const WLAN_BSS_ENTRY bss_entry = bss_list->wlanBssEntries[j];
+          
+          ap->setMac(bss_entry.dot11Bssid);
+          ap->setSignal(bss_entry.lRssi);
+          ap->setSSID((char*) bss_entry.dot11Ssid.ucSSID,
+                      bss_entry.dot11Ssid.uSSIDLength);
+          
+          accessPoints.AppendObject(ap);
+        }
+        (*WlanFreeMemory)(bss_list);
+      }
+      
+      // Free interface_list.
+      (*WlanFreeMemory)(interface_list);
+      
+      // Close the handle.
+      (*WlanCloseHandle)(wlan_handle, NULL);
+      
+      
+      PRBool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints);
+      nsCOMArray<nsIWifiListener> currentListeners;
+      
+      {
+        nsAutoMonitor mon(mMonitor);
+      
+        for (PRUint32 i = 0; i < mListeners.Length(); i++) {
+          if (!mListeners[i].mHasSentData || accessPointsChanged) {
+            mListeners[i].mHasSentData = PR_TRUE;
+            currentListeners.AppendObject(mListeners[i].mListener);
+          }
+        }
+      }
+      
+      ReplaceArray(lastAccessPoints, accessPoints);
+      
+      if (currentListeners.Count() > 0) {
+        PRUint32 resultCount = lastAccessPoints.Count();
+        nsIWifiAccessPoint** result = static_cast<nsIWifiAccessPoint**> (nsMemory::Alloc(sizeof(nsIWifiAccessPoint*) * resultCount));
+        if (!result)
+          return NS_ERROR_OUT_OF_MEMORY;
+      
+        for (PRUint32 i = 0; i < resultCount; i++)
+          result[i] = lastAccessPoints[i];
+        
+        for (PRInt32 i = 0; i < currentListeners.Count(); i++) {
+          
+          LOG(("About to send data to the wifi listeners\n"));
+          
+          nsCOMPtr<nsIWifiListener> proxy;
+          nsCOMPtr<nsIProxyObjectManager> proxyObjMgr = do_GetService("@mozilla.org/xpcomproxy;1");
+          proxyObjMgr->GetProxyForObject(NS_PROXY_TO_MAIN_THREAD,
+                                         NS_GET_IID(nsIWifiListener),
+                                         currentListeners[i],
+                                         NS_PROXY_SYNC | NS_PROXY_ALWAYS,
+                                         getter_AddRefs(proxy));
+          if (!proxy) {
+            LOG(("There is no proxy available.  this should never happen\n"));
+          }
+          else
+          {
+            nsresult rv = proxy->OnChange(result, resultCount);
+            LOG( ("... sent %d\n", rv));
+          }
+        }
+        
+        nsMemory::Free(result);
+      }
+      
+      // wait for some reasonable amount of time.  pref?
+      LOG(("waiting on monitor\n"));
+      
+      nsAutoMonitor mon(mMonitor);
+      mon.Wait(PR_SecondsToInterval(60));
+    }
+    while (mKeepGoing == PR_TRUE);
+  }
+  return NS_OK;
+}
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/osx_wifi.h
@@ -0,0 +1,120 @@
+// Copyright 2008, Google Inc.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//  1. Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//  2. Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//  3. Neither the name of Google Inc. nor the names of its contributors may be
+//     used to endorse or promote products derived from this software without
+//     specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The contents of this file are taken from Apple80211.h from the iStumbler
+// project (http://www.istumbler.net). This project is released under the BSD
+// license with the following restrictions.
+//
+// Copyright (c) 02006, Alf Watt (alf@istumbler.net). All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without 
+// modification, are permitted provided that the following conditions 
+// are met:
+//
+// * Redistributions of source code must retain the above copyright
+//   notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above copyright
+//   notice, this list of conditions and the following disclaimer in the
+//   documentation and/or other materials provided with the distribution.
+//
+// * Neither the name of iStumbler nor the names of its contributors may be
+//   used to endorse or promote products derived from this software without
+//   specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// This is the reverse engineered header for the Apple80211 private framework.
+// The framework can be found at
+// /System/Library/PrivateFrameworks/Apple80211.framework.
+
+#ifndef GEARS_GEOLOCATION_OSX_WIFI_H__
+#define GEARS_GEOLOCATION_OSX_WIFI_H__
+
+#include <CoreFoundation/CoreFoundation.h>
+
+extern "C" {
+
+typedef SInt32 WIErr;
+
+// A WirelessContext should be created using WirelessAttach
+// before any other Wireless functions are called. WirelessDetach
+// is used to dispose of a WirelessContext.
+typedef struct __WirelessContext *WirelessContextPtr;
+
+// WirelessAttach
+//
+// This should be called before all other wireless functions.
+typedef WIErr (*WirelessAttachFunction)(WirelessContextPtr *outContext,
+                                        const UInt32);
+
+// WirelessDetach
+//
+// This should be called after all other wireless functions.
+typedef WIErr (*WirelessDetachFunction)(WirelessContextPtr inContext);
+
+typedef UInt16 WINetworkInfoFlags;
+
+struct WirelessNetworkInfo
+{
+  UInt16 channel;            // Channel for the network.
+  SInt16 noise;              // Noise for the network. 0 for Adhoc.
+  SInt16 signal;             // Signal strength of the network. 0 for Adhoc.
+  UInt8 macAddress[6];       // MAC address of the wireless access point.
+  UInt16 beaconInterval;     // Beacon interval in milliseconds
+  WINetworkInfoFlags flags;  // Flags for the network
+  UInt16 nameLen;
+  SInt8 name[32];
+};
+
+// WirelessScanSplit
+//
+// WirelessScanSplit scans for available wireless networks. It will allocate 2
+// CFArrays to store a list of managed and adhoc networks. The arrays hold
+// CFData objects which contain WirelessNetworkInfo structures.
+//
+// Note: An adhoc network created on the computer the scan is running on will
+// not be found. WirelessGetInfo can be used to find info about a local adhoc
+// network.
+// 
+// If stripDups != 0 only one bases tation for each SSID will be returned.
+typedef WIErr (*WirelessScanSplitFunction)(WirelessContextPtr inContext,
+                                           CFArrayRef *apList,
+                                           CFArrayRef *adhocList,
+                                           const UInt32 stripDups);
+
+}  // extern "C"
+
+#endif  // GEARS_GEOLOCATION_OSX_WIFI_H__
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/src/wlanapi.h
@@ -0,0 +1,134 @@
+// Copyright 2008, Google Inc.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//  1. Redistributions of source code must retain the above copyright notice,
+//     this list of conditions and the following disclaimer.
+//  2. Redistributions in binary form must reproduce the above copyright notice,
+//     this list of conditions and the following disclaimer in the documentation
+//     and/or other materials provided with the distribution.
+//  3. Neither the name of Google Inc. nor the names of its contributors may be
+//     used to endorse or promote products derived from this software without
+//     specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Replicates missing wlanapi.h. Taken from
+// http://msdn.microsoft.com/en-us/library/bb204766.aspx.
+
+// TODO(steveblock): Change naming convention to follow correct style.
+
+
+// WlanOpenHandle
+
+typedef DWORD (WINAPI *WlanOpenHandleFunction)(DWORD dwClientVersion,
+                                               PVOID pReserved,
+                                               PDWORD pdwNegotiatedVersion,
+                                               PHANDLE phClientHandle);
+
+// WlanEnumInterfaces
+
+typedef enum _WLAN_INTERFACE_STATE {
+  WLAN_INTERFACE_STATE_UNUSED,
+} WLAN_INTERFACE_STATE;
+
+typedef struct _WLAN_INTERFACE_INFO {
+  GUID InterfaceGuid;
+  WCHAR strInterfaceDescription[256];
+  WLAN_INTERFACE_STATE isState;
+} WLAN_INTERFACE_INFO, *PWLAN_INTERFACE_INFO;
+
+typedef struct _WLAN_INTERFACE_INFO_LIST {
+  DWORD dwNumberOfItems;
+  DWORD dwIndex;
+  WLAN_INTERFACE_INFO InterfaceInfo[1];
+} WLAN_INTERFACE_INFO_LIST, *PWLAN_INTERFACE_INFO_LIST;
+
+typedef DWORD (WINAPI *WlanEnumInterfacesFunction)(
+    HANDLE hClientHandle,
+    PVOID pReserved,
+    PWLAN_INTERFACE_INFO_LIST *ppInterfaceList);
+
+// WlanGetNetworkBssList
+
+#define DOT11_SSID_MAX_LENGTH 32
+
+typedef struct _DOT11_SSID {
+  ULONG uSSIDLength;
+  UCHAR ucSSID[DOT11_SSID_MAX_LENGTH];
+} DOT11_SSID, *PDOT11_SSID;
+
+typedef UCHAR DOT11_MAC_ADDRESS[6];
+
+typedef enum _DOT11_BSS_TYPE {
+  DOT11_BSS_TYPE_UNUSED,
+} DOT11_BSS_TYPE;
+
+typedef enum _DOT11_PHY_TYPE {
+  DOT11_PHY_TYPE_UNUSED,
+} DOT11_PHY_TYPE;
+
+#define DOT11_RATE_SET_MAX_LENGTH (126)
+
+typedef struct _WLAN_RATE_SET {
+  ULONG uRateSetLength;
+  USHORT usRateSet[DOT11_RATE_SET_MAX_LENGTH];
+} WLAN_RATE_SET, *PWLAN_RATE_SET;
+
+typedef struct _WLAN_BSS_ENTRY {
+  DOT11_SSID dot11Ssid;
+  ULONG uPhyId;
+  DOT11_MAC_ADDRESS dot11Bssid;
+  DOT11_BSS_TYPE dot11BssType;
+  DOT11_PHY_TYPE dot11BssPhyType;
+  LONG lRssi;
+  ULONG uLinkQuality;
+  BOOLEAN bInRegDomain;
+  USHORT usBeaconPeriod;
+  ULONGLONG ullTimestamp;
+  ULONGLONG ullHostTimestamp;
+  USHORT usCapabilityInformation;
+  ULONG ulChCenterFrequency;
+  WLAN_RATE_SET wlanRateSet;
+  ULONG ulIeOffset;
+  ULONG ulIeSize;
+} WLAN_BSS_ENTRY, *PWLAN_BSS_ENTRY;
+
+typedef struct _WLAN_BSS_LIST {
+  DWORD dwTotalSize;
+  DWORD dwNumberOfItems;
+  // Following data is an array of WLAN_BSS_ENTRY objects of length
+  // dwNumberOfItems.
+  WLAN_BSS_ENTRY wlanBssEntries[1];
+} WLAN_BSS_LIST, *PWLAN_BSS_LIST;
+
+typedef DWORD (WINAPI *WlanGetNetworkBssListFunction)(
+    HANDLE hClientHandle,
+    const GUID *pInterfaceGuid,
+    const  PDOT11_SSID pDot11Ssid,
+    DOT11_BSS_TYPE dot11BssType,
+    BOOL bSecurityEnabled,
+    PVOID pReserved,
+    PWLAN_BSS_LIST *ppWlanBssList
+);
+
+// WlanFreeMemory
+
+typedef VOID (WINAPI *WlanFreeMemoryFunction)(PVOID pMemory);
+
+// WlanCloseHandle
+
+typedef DWORD (WINAPI *WlanCloseHandleFunction)(HANDLE hClientHandle,
+                                                PVOID pReserved);
+
+
new file mode 100644
--- /dev/null
+++ b/netwerk/wifi/tests/wifi_access_point_test.html
@@ -0,0 +1,61 @@
+<html>
+<head>
+<title>hi</title>
+<script>
+
+var count = 0;
+
+
+function test() {
+}
+
+test.prototype =
+{
+  onChange: function (accessPoints)
+  {
+    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
+    var d = document.getElementById("d");
+    d.innerHTML = "";
+
+    for (var i=0; i<accessPoints.length; i++) {
+      var a = accessPoints[i];
+      d.innerHTML = d.innerHTML + "<p>" + a.mac + " " + a.ssid + " " + a.signal + "</p>";
+    }
+                                         
+                                         
+    var c = document.getElementById("c");
+    c.innerHTML = "<p>" + count++ + "</p>";
+
+  },
+
+  onError: function (value) {
+     alert("error: " +value);
+  },
+
+  QueryInterface: function(iid) {
+        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
+        if (iid.equals(Components.interfaces.nsIWifiListener) ||
+            iid.equals(Components.interfaces.nsISupports))
+            return this;
+        throw Components.results.NS_ERROR_NO_INTERFACE;
+   },
+}
+
+
+  netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
+
+  var listener = new test();
+  var wifi_service = Components.classes["@mozilla.org/wifi/monitor;1"].getService(Components.interfaces.nsIWifiMonitor);
+              
+  wifi_service.startWatching(listener);
+
+
+
+</script>
+</head>
+
+<body>
+<div id="d"><p></p></div>
+<div id="c"><p></p></div>
+</body>
+</html>
--- a/toolkit/content/license.html
+++ b/toolkit/content/license.html
@@ -2764,16 +2764,107 @@ LIMITED TO, PROCUREMENT OF SUBSTITUTE GO
 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 </pre>
 
 
 
+
+    <hr>
+
+    <h1><a name="google-gears"></a>Google Gears</h1>
+
+    <p class="correctme">This license applies to files in the following directories 
+      with the specified copyright year ranges:</p>
+    <ul>
+      <li><span class="path">netwerk/wifi/</span>, 2009</li>
+    </ul>
+
+<pre>
+Copyright 2008, Google Inc.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the following
+ disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ 3. Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+The contents of this file are taken from Apple80211.h from
+the iStumbler project (http://www.istumbler.net). This
+project is released under the BSD license with the following
+restrictions.
+
+Copyright (c) 02006, Alf Watt (alf@istumbler.net). All
+rights reserved.
+
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the following
+disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following
+disclaimer in the documentation and/or other materials
+provided with the distribution.
+
+* Neither the name of iStumbler nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+This is the reverse engineered header for the Apple80211
+private framework.  The framework can be found at
+/System/Library/PrivateFrameworks/Apple80211.framework.
+
+</pre>
+
     <hr>
 
     <h1><a name="other-notices"></a>Other Required Notices</h1>
 
     <ul>
       <li>This software is based in part on the work of the Independent 
           JPEG Group.</li>
       <li>Portions of the OS/2 version of this software are copyright
--- a/toolkit/toolkit-makefiles.sh
+++ b/toolkit/toolkit-makefiles.sh
@@ -360,16 +360,19 @@ MAKEFILES_netwerk="
   netwerk/base/src/Makefile
   netwerk/build/Makefile
   netwerk/cache/Makefile
   netwerk/cache/public/Makefile
   netwerk/cache/src/Makefile
   netwerk/cookie/Makefile
   netwerk/cookie/public/Makefile
   netwerk/cookie/src/Makefile
+  netwerk/wifi/Makefile
+  netwerk/wifi/public/Makefile
+  netwerk/wifi/src/Makefile
   netwerk/dns/Makefile
   netwerk/dns/public/Makefile
   netwerk/dns/src/Makefile
   netwerk/protocol/Makefile
   netwerk/protocol/about/Makefile
   netwerk/protocol/about/public/Makefile
   netwerk/protocol/about/src/Makefile
   netwerk/protocol/data/Makefile