Bug 1266054: GTK+: Hold references to |DBusMessage| in |RefPtr|, r=karlt draft
authorThomas Zimmermann <tdz@users.sourceforge.net>
Mon, 09 May 2016 11:37:52 +0200
changeset 364790 a37acd8d13717bb0c418069173cb6ed169fe2b67
parent 364789 e6fe1e3d39bccc97745cb09f2497402bee1f5dab
child 364791 d8ad48d8c9343f366f50f9057a5767a47671c020
push id17564
push usertdz@users.sourceforge.net
push dateMon, 09 May 2016 10:27:13 +0000
reviewerskarlt
bugs1266054
milestone49.0a1
Bug 1266054: GTK+: Hold references to |DBusMessage| in |RefPtr|, r=karlt MozReview-Commit-ID: CuweWk1ZMT1
widget/gtk/WakeLockListener.cpp
--- a/widget/gtk/WakeLockListener.cpp
+++ b/widget/gtk/WakeLockListener.cpp
@@ -2,20 +2,22 @@
 /* vim:expandtab:shiftwidth=2:tabstop=2:
  */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifdef MOZ_ENABLE_DBUS
 
+#include "WakeLockListener.h"
+
 #include <dbus/dbus.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
-#include "WakeLockListener.h"
+#include "mozilla/ipc/DBusMessageRefPtr.h"
 
 #define FREEDESKTOP_SCREENSAVER_TARGET    "org.freedesktop.ScreenSaver"
 #define FREEDESKTOP_SCREENSAVER_OBJECT    "/ScreenSaver"
 #define FREEDESKTOP_SCREENSAVER_INTERFACE "org.freedesktop.ScreenSaver"
 
 #define SESSION_MANAGER_TARGET            "org.gnome.SessionManager"
 #define SESSION_MANAGER_OBJECT            "/org/gnome/SessionManager"
 #define SESSION_MANAGER_INTERFACE         "org.gnome.SessionManager"
@@ -77,36 +79,34 @@ private:
 
 bool
 WakeLockTopic::SendMessage(DBusMessage* aMessage)
 {
   // send message and get a handle for a reply
   DBusPendingCall* reply;
   dbus_connection_send_with_reply(mConnection, aMessage, &reply,
                                   DBUS_TIMEOUT);
-  dbus_message_unref(aMessage);
-
   if (!reply) {
     return false;
   }
 
   dbus_pending_call_set_notify(reply, &ReceiveInhibitReply, this, NULL);
   dbus_pending_call_unref(reply);
 
   return true;
 }
 
 bool
 WakeLockTopic::SendFreeDesktopInhibitMessage()
 {
-  DBusMessage* message =
+  RefPtr<DBusMessage> message = already_AddRefed<DBusMessage>(
     dbus_message_new_method_call(FREEDESKTOP_SCREENSAVER_TARGET,
                                  FREEDESKTOP_SCREENSAVER_OBJECT,
                                  FREEDESKTOP_SCREENSAVER_INTERFACE,
-                                 "Inhibit");
+                                 "Inhibit"));
 
   if (!message) {
     return false;
   }
 
   const char* app = g_get_prgname();
   const char* topic = mTopic.get();
   dbus_message_append_args(message,
@@ -115,21 +115,21 @@ WakeLockTopic::SendFreeDesktopInhibitMes
                            DBUS_TYPE_INVALID);
 
   return SendMessage(message);
 }
 
 bool
 WakeLockTopic::SendGNOMEInhibitMessage()
 {
-  DBusMessage* message =
+  RefPtr<DBusMessage> message = already_AddRefed<DBusMessage>(
     dbus_message_new_method_call(SESSION_MANAGER_TARGET,
                                  SESSION_MANAGER_OBJECT,
                                  SESSION_MANAGER_INTERFACE,
-                                 "Inhibit");
+                                 "Inhibit"));
 
   if (!message) {
     return false;
   }
 
   static const uint32_t xid = 0;
   static const uint32_t flags = (1 << 3); // Inhibit idle
   const char* app = g_get_prgname();
@@ -167,43 +167,42 @@ WakeLockTopic::SendInhibit()
   }
 
   return sendOk;
 }
 
 bool
 WakeLockTopic::SendUninhibit()
 {
-  DBusMessage* message = nullptr;
+  RefPtr<DBusMessage> message;
 
   if (mDesktopEnvironment == FreeDesktop) {
-    message =
+    message = already_AddRefed<DBusMessage>(
       dbus_message_new_method_call(FREEDESKTOP_SCREENSAVER_TARGET,
                                    FREEDESKTOP_SCREENSAVER_OBJECT,
                                    FREEDESKTOP_SCREENSAVER_INTERFACE,
-                                   "UnInhibit");
+                                   "UnInhibit"));
   } else if (mDesktopEnvironment == GNOME) {
-    message =
+    message = already_AddRefed<DBusMessage>(
       dbus_message_new_method_call(SESSION_MANAGER_TARGET,
                                    SESSION_MANAGER_OBJECT,
                                    SESSION_MANAGER_INTERFACE,
-                                   "Uninhibit");
+                                   "Uninhibit"));
   }
 
   if (!message) {
     return false;
   }
 
   dbus_message_append_args(message,
                            DBUS_TYPE_UINT32, &mInhibitRequest,
                            DBUS_TYPE_INVALID);
 
   dbus_connection_send(mConnection, message, nullptr);
   dbus_connection_flush(mConnection);
-  dbus_message_unref(message);
 
   mInhibitRequest = 0;
 
   return true;
 }
 
 nsresult
 WakeLockTopic::InhibitScreensaver()
@@ -286,33 +285,32 @@ WakeLockTopic::ReceiveInhibitReply(DBusP
   if (!WakeLockListener::GetSingleton(false)) {
     // The WakeLockListener (and therefore our topic) was deleted while we were
     // waiting for a reply.
     return;
   }
 
   WakeLockTopic* self = static_cast<WakeLockTopic*>(user_data);
 
-  DBusMessage* msg = dbus_pending_call_steal_reply(pending);
+  RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
+    dbus_pending_call_steal_reply(pending));
   if (!msg) {
     return;
   }
 
   if (dbus_message_get_type(msg) == DBUS_MESSAGE_TYPE_METHOD_RETURN) {
     uint32_t inhibitRequest;
 
     if (dbus_message_get_args(msg, nullptr, DBUS_TYPE_UINT32,
                               &inhibitRequest, DBUS_TYPE_INVALID)) {
       self->InhibitSucceeded(inhibitRequest);
     }
   } else {
     self->InhibitFailed();
   }
-
-  dbus_message_unref(msg);
 }
 
 
 WakeLockListener::WakeLockListener()
   : mConnection(already_AddRefed<DBusConnection>(
     dbus_bus_get(DBUS_BUS_SESSION, nullptr)))
 {
   if (mConnection) {