Bug 1360560 - Implement XRemote client by D-Bus service, r=jhorak

MozReview-Commit-ID: JDNEC8Jar5w

--HG--
extra : rebase_source : 8c1d1e128101dfb2e4e467fda74d82febdcd323a
This commit is contained in:
Martin Stransky 2017-11-02 16:21:28 +01:00
Родитель f92190a78d
Коммит 79f785f637
3 изменённых файлов: 163 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,123 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:expandtab:shiftwidth=2:tabstop=8:
*/
/* vim:set ts=8 sw=2 et cindent: */
/* 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/. */
#include "DBusRemoteClient.h"
#include "RemoteUtils.h"
#include "mozilla/Logging.h"
#include "nsPrintfCString.h"
using mozilla::LogLevel;
static mozilla::LazyLogModule sRemoteLm("DBusRemoteClient");
DBusRemoteClient::DBusRemoteClient()
{
mConnection = nullptr;
MOZ_LOG(sRemoteLm, LogLevel::Debug, ("DBusRemoteClient::DBusRemoteClient"));
}
DBusRemoteClient::~DBusRemoteClient()
{
MOZ_LOG(sRemoteLm, LogLevel::Debug, ("DBusRemoteClient::~DBusRemoteClient"));
Shutdown();
}
nsresult
DBusRemoteClient::Init()
{
MOZ_LOG(sRemoteLm, LogLevel::Debug, ("DBusRemoteClient::Init"));
if (mConnection)
return NS_OK;
mConnection = already_AddRefed<DBusConnection>(
dbus_bus_get(DBUS_BUS_SESSION, nullptr));
if (!mConnection)
return NS_ERROR_FAILURE;
dbus_connection_set_exit_on_disconnect(mConnection, false);
return NS_OK;
}
void
DBusRemoteClient::Shutdown (void)
{
MOZ_LOG(sRemoteLm, LogLevel::Debug, ("DBusRemoteClient::Shutdown"));
// This connection is owned by libdbus and we don't need to close it
mConnection = nullptr;
}
nsresult
DBusRemoteClient::SendCommandLine (const char *aProgram, const char *aUsername,
const char *aProfile,
int32_t argc, char **argv,
const char* aDesktopStartupID,
char **aResponse, bool *aWindowFound)
{
MOZ_LOG(sRemoteLm, LogLevel::Debug, ("DBusRemoteClient::SendCommandLine"));
int commandLineLength;
char *commandLine = ConstructCommandLine(argc, argv, aDesktopStartupID,
&commandLineLength);
if (!commandLine)
return NS_ERROR_FAILURE;
nsresult rv = DoSendDBusCommandLine(aProgram, aProfile,
commandLine, commandLineLength);
free(commandLine);
*aWindowFound = NS_SUCCEEDED(rv);
MOZ_LOG(sRemoteLm, LogLevel::Debug, ("DoSendDBusCommandLine returning 0x%" PRIx32 "\n",
static_cast<uint32_t>(rv)));
return rv;
}
nsresult
DBusRemoteClient::DoSendDBusCommandLine(const char *aProgram, const char *aProfile,
const char* aBuffer, int aLength)
{
NS_ASSERTION(aProfile && aProfile[0] != '\0', "Missing user profile!");
nsAutoCString destinationName;
destinationName = nsPrintfCString("org.mozilla.%s.%s", aProgram, aProfile);
nsAutoCString objectName;
objectName = nsPrintfCString("/org/mozilla/%s/Remote", aProgram);
nsAutoCString remoteInterfaceName;
remoteInterfaceName = nsPrintfCString("org.mozilla.%s", aProgram);
RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
dbus_message_new_method_call(destinationName.get(),
objectName.get(), // object to call on
remoteInterfaceName.get(), // interface to call on
"OpenURL")); // method name
if (!msg) {
return NS_ERROR_FAILURE;
}
// append arguments
if (!dbus_message_append_args(msg, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
&aBuffer, aLength, DBUS_TYPE_INVALID)) {
return NS_ERROR_FAILURE;
}
// send message and get a handle for a reply
DBusError err;
dbus_error_init(&err);
RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
dbus_connection_send_with_reply_and_block(mConnection, msg, -1, &err));
if (dbus_error_is_set(&err)) {
dbus_error_free(&err);
return NS_ERROR_FAILURE;
}
return NS_OK;
}

Просмотреть файл

@ -0,0 +1,33 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 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/. */
#ifndef DBusRemoteClient_h__
#define DBusRemoteClient_h__
#include "nsRemoteClient.h"
#include "mozilla/StaticPtr.h"
#include "mozilla/DBusHelpers.h"
class DBusRemoteClient : public nsRemoteClient
{
public:
DBusRemoteClient();
~DBusRemoteClient();
virtual nsresult Init();
virtual nsresult SendCommandLine(const char *aProgram, const char *aUsername,
const char *aProfile,
int32_t argc, char **argv,
const char* aDesktopStartupID,
char **aResponse, bool *aSucceeded);
void Shutdown();
private:
nsresult DoSendDBusCommandLine(const char *aProgram, const char *aProfile,
const char* aBuffer, int aLength);
RefPtr<DBusConnection> mConnection;
};
#endif // DBusRemoteClient_h__

Просмотреть файл

@ -13,3 +13,10 @@ SOURCES += [
'RemoteUtils.cpp',
'XRemoteClient.cpp',
]
if CONFIG['MOZ_ENABLE_DBUS'] and CONFIG['MOZ_WAYLAND']:
SOURCES += [
'DBusRemoteClient.cpp',
]
CXXFLAGS += CONFIG['TK_CFLAGS']
CXXFLAGS += CONFIG['MOZ_DBUS_GLIB_CFLAGS']