Bug 1314968 - Disentangle nsWifiScannerDBus::SendMessage. r?kanru draft
authorJan Steffens <jan.steffens@gmail.com>
Sat, 16 Sep 2017 18:35:18 +0200
changeset 666044 42f28116e2fe74f92150a9941b088aaf52a6ca9a
parent 666009 2edd69b245fbc493c3a1cf17c40c63b0280ead12
child 666045 eca698772efc4ad4d6016cf5c2d22650f39d05d8
push id80256
push userbmo:jan.steffens@gmail.com
push dateSun, 17 Sep 2017 08:48:31 +0000
reviewerskanru
bugs1314968
milestone57.0a1
Bug 1314968 - Disentangle nsWifiScannerDBus::SendMessage. r?kanru Make a copy of the function and specialize it for each message sent. Avoids the mess of comparing the method name to figure out what to do. MozReview-Commit-ID: 1KlZyc8Pc9I
netwerk/wifi/nsWifiScannerDBus.cpp
netwerk/wifi/nsWifiScannerDBus.h
--- a/netwerk/wifi/nsWifiScannerDBus.cpp
+++ b/netwerk/wifi/nsWifiScannerDBus.cpp
@@ -29,88 +29,150 @@ nsWifiScannerDBus::~nsWifiScannerDBus()
 }
 
 nsresult
 nsWifiScannerDBus::Scan()
 {
   if (!mConnection) {
     return NS_ERROR_NOT_AVAILABLE;
   }
-  return SendMessage("org.freedesktop.NetworkManager",
-                     "/org/freedesktop/NetworkManager",
-                     "GetDevices");
+  return SendGetDevices();
+}
+
+// http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html
+// Refer to function dbus_connection_send_with_reply_and_block.
+static const uint32_t DBUS_DEFAULT_TIMEOUT = -1;
+
+nsresult
+nsWifiScannerDBus::SendGetDevices()
+{
+  RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
+    dbus_message_new_method_call("org.freedesktop.NetworkManager",
+                                 "/org/freedesktop/NetworkManager",
+                                 "org.freedesktop.NetworkManager",
+                                 "GetDevices"));
+  if (!msg) {
+    return NS_ERROR_FAILURE;
+  }
+
+  DBusError err;
+  dbus_error_init(&err);
+
+  RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
+    dbus_connection_send_with_reply_and_block(mConnection, msg,
+                                              DBUS_DEFAULT_TIMEOUT, &err));
+  if (dbus_error_is_set(&err)) {
+    dbus_error_free(&err);
+    return NS_ERROR_FAILURE;
+  }
+
+  return IdentifyDevices(reply);
 }
 
 nsresult
-nsWifiScannerDBus::SendMessage(const char* aInterface,
-                               const char* aPath,
-                               const char* aFuncCall)
+nsWifiScannerDBus::SendGetDeviceType(const char* aPath)
 {
   RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
     dbus_message_new_method_call("org.freedesktop.NetworkManager",
-                                 aPath, aInterface, aFuncCall));
+                                 aPath,
+                                 "org.freedesktop.DBus.Properties",
+                                 "Get"));
   if (!msg) {
     return NS_ERROR_FAILURE;
   }
 
   DBusMessageIter argsIter;
   dbus_message_iter_init_append(msg, &argsIter);
 
-  if (!strcmp(aFuncCall, "Get")) {
-    const char* paramInterface = "org.freedesktop.NetworkManager.Device";
-    if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
-                                        &paramInterface)) {
-      return NS_ERROR_FAILURE;
-    }
+  const char* paramInterface = "org.freedesktop.NetworkManager.Device";
+  if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
+                                      &paramInterface)) {
+    return NS_ERROR_FAILURE;
+  }
+
+  const char* paramDeviceType = "DeviceType";
+  if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
+                                      &paramDeviceType)) {
+    return NS_ERROR_FAILURE;
+  }
+
+  DBusError err;
+  dbus_error_init(&err);
 
-    const char* paramDeviceType = "DeviceType";
-    if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
-                                        &paramDeviceType)) {
-      return NS_ERROR_FAILURE;
-    }
-  } else if (!strcmp(aFuncCall, "GetAll")) {
-    const char* param = "";
-    if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING, &param)) {
-      return NS_ERROR_FAILURE;
-    }
+  RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
+    dbus_connection_send_with_reply_and_block(mConnection, msg,
+                                              DBUS_DEFAULT_TIMEOUT, &err));
+  if (dbus_error_is_set(&err)) {
+    dbus_error_free(&err);
+    return NS_ERROR_FAILURE;
+  }
+
+  return IdentifyDeviceType(reply, aPath);
+}
+
+nsresult
+nsWifiScannerDBus::SendGetAccessPoints(const char* aPath)
+{
+  RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
+    dbus_message_new_method_call("org.freedesktop.NetworkManager",
+                                 aPath,
+                                 "org.freedesktop.NetworkManager.Device.Wireless",
+                                 "GetAccessPoints"));
+  if (!msg) {
+    return NS_ERROR_FAILURE;
   }
 
   DBusError err;
   dbus_error_init(&err);
 
-  // http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html
-  // Refer to function dbus_connection_send_with_reply_and_block.
-  const uint32_t DBUS_DEFAULT_TIMEOUT = -1;
   RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
     dbus_connection_send_with_reply_and_block(mConnection, msg,
                                               DBUS_DEFAULT_TIMEOUT, &err));
   if (dbus_error_is_set(&err)) {
     dbus_error_free(&err);
-
     // In the GetAccessPoints case, if there are no access points, error is set.
     // We don't want to error out here.
-    if (!strcmp(aFuncCall, "GetAccessPoints")) {
-      return NS_OK;
-    }
+    return NS_OK;
+  }
+
+  return IdentifyAccessPoints(reply);
+}
+
+nsresult
+nsWifiScannerDBus::SendGetAPProperties(const char* aPath)
+{
+  RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
+    dbus_message_new_method_call("org.freedesktop.NetworkManager",
+                                 aPath,
+                                 "org.freedesktop.DBus.Properties",
+                                 "GetAll"));
+  if (!msg) {
     return NS_ERROR_FAILURE;
   }
 
-  nsresult rv;
-  if (!strcmp(aFuncCall, "GetDevices")) {
-    rv = IdentifyDevices(reply);
-  } else if (!strcmp(aFuncCall, "Get")) {
-    rv = IdentifyDeviceType(reply, aPath);
-  } else if (!strcmp(aFuncCall, "GetAccessPoints")) {
-    rv = IdentifyAccessPoints(reply);
-  } else if (!strcmp(aFuncCall, "GetAll")) {
-    rv = IdentifyAPProperties(reply);
-  } else {
-    rv = NS_ERROR_FAILURE;
+  DBusMessageIter argsIter;
+  dbus_message_iter_init_append(msg, &argsIter);
+
+  const char* param = "";
+  if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING, &param)) {
+    return NS_ERROR_FAILURE;
   }
-  return rv;
+
+  DBusError err;
+  dbus_error_init(&err);
+
+  RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
+    dbus_connection_send_with_reply_and_block(mConnection, msg,
+                                              DBUS_DEFAULT_TIMEOUT, &err));
+  if (dbus_error_is_set(&err)) {
+    dbus_error_free(&err);
+    return NS_ERROR_FAILURE;
+  }
+
+  return IdentifyAPProperties(reply);
 }
 
 nsresult
 nsWifiScannerDBus::IdentifyDevices(DBusMessage* aMsg)
 {
   DBusMessageIter iter;
   nsresult rv = GetDBusIterator(aMsg, &iter);
   NS_ENSURE_SUCCESS(rv, rv);
@@ -121,17 +183,17 @@ nsWifiScannerDBus::IdentifyDevices(DBusM
       return NS_ERROR_FAILURE;
     }
 
     dbus_message_iter_get_basic(&iter, &devicePath);
     if (!devicePath) {
       return NS_ERROR_FAILURE;
     }
 
-    rv = SendMessage("org.freedesktop.DBus.Properties", devicePath, "Get");
+    rv = SendGetDeviceType(devicePath);
     NS_ENSURE_SUCCESS(rv, rv);
   } while (dbus_message_iter_next(&iter));
 
   return NS_OK;
 }
 
 nsresult
 nsWifiScannerDBus::IdentifyDeviceType(DBusMessage* aMsg, const char* aDevicePath)
@@ -154,18 +216,17 @@ nsWifiScannerDBus::IdentifyDeviceType(DB
   uint32_t deviceType;
   dbus_message_iter_get_basic(&variantIter, &deviceType);
 
   // http://projects.gnome.org/NetworkManager/developers/api/07/spec-07.html
   // Refer to NM_DEVICE_TYPE_WIFI under NM_DEVICE_TYPE.
   const uint32_t NM_DEVICE_TYPE_WIFI = 2;
   nsresult rv = NS_OK;
   if (deviceType == NM_DEVICE_TYPE_WIFI) {
-    rv = SendMessage("org.freedesktop.NetworkManager.Device.Wireless",
-                     aDevicePath, "GetAccessPoints");
+    rv = SendGetAccessPoints(aDevicePath);
   }
 
   return rv;
 }
 
 nsresult
 nsWifiScannerDBus::IdentifyAccessPoints(DBusMessage* aMsg)
 {
@@ -178,17 +239,17 @@ nsWifiScannerDBus::IdentifyAccessPoints(
     if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH) {
       return NS_ERROR_FAILURE;
     }
     dbus_message_iter_get_basic(&iter, &path);
     if (!path) {
       return NS_ERROR_FAILURE;
     }
 
-    rv = SendMessage("org.freedesktop.DBus.Properties", path, "GetAll");
+    rv = SendGetAPProperties(path);
     NS_ENSURE_SUCCESS(rv, rv);
   } while (dbus_message_iter_next(&iter));
 
   return NS_OK;
 }
 
 nsresult
 nsWifiScannerDBus::IdentifyAPProperties(DBusMessage* aMsg)
--- a/netwerk/wifi/nsWifiScannerDBus.h
+++ b/netwerk/wifi/nsWifiScannerDBus.h
@@ -20,19 +20,20 @@ class nsWifiScannerDBus final
 {
 public:
   explicit nsWifiScannerDBus(nsCOMArray<nsWifiAccessPoint>* aAccessPoints);
   ~nsWifiScannerDBus();
 
   nsresult Scan();
 
 private:
-  nsresult SendMessage(const char* aInterface,
-                       const char* aPath,
-                       const char* aFuncCall);
+  nsresult SendGetDevices();
+  nsresult SendGetDeviceType(const char* aPath);
+  nsresult SendGetAccessPoints(const char* aPath);
+  nsresult SendGetAPProperties(const char* aPath);
   nsresult IdentifyDevices(DBusMessage* aMsg);
   nsresult IdentifyDeviceType(DBusMessage* aMsg, const char* aDevicePath);
   nsresult IdentifyAccessPoints(DBusMessage* aMsg);
   nsresult IdentifyAPProperties(DBusMessage* aMsg);
   nsresult StoreSsid(DBusMessageIter* aVariant, nsWifiAccessPoint* aAp);
   nsresult SetMac(DBusMessageIter* aVariant, nsWifiAccessPoint* aAp);
   nsresult GetDBusIterator(DBusMessage* aMsg, DBusMessageIter* aIterArray);