Bug 1266054: GTK+: Hold references to |DBusMessage| in |RefPtr|, r=karlt
MozReview-Commit-ID: CuweWk1ZMT1
--- 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) {