no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / uriloader / exthandler / nsDBusHandlerApp.cpp
blob6155a1a95181751409a0294b7eea6f3516eb02f9
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * vim:expandtab:shiftwidth=2:tabstop=2:cin:
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include <dbus/dbus.h>
8 #include "mozilla/Components.h"
9 #include "mozilla/DBusHelpers.h"
10 #include "nsDBusHandlerApp.h"
11 #include "nsIURI.h"
12 #include "nsIClassInfoImpl.h"
13 #include "nsCOMPtr.h"
14 #include "nsCExternalHandlerService.h"
16 using namespace mozilla;
18 // XXX why does nsMIMEInfoImpl have a threadsafe nsISupports? do we need one
19 // here too?
20 NS_IMPL_CLASSINFO(nsDBusHandlerApp, nullptr, 0,
21 components::DBusHandlerApp::CID())
22 NS_IMPL_ISUPPORTS_CI(nsDBusHandlerApp, nsIDBusHandlerApp, nsIHandlerApp)
24 ////////////////////////////////////////////////////////////////////////////////
25 //// nsIHandlerApp
27 NS_IMETHODIMP nsDBusHandlerApp::GetName(nsAString& aName) {
28 aName.Assign(mName);
29 return NS_OK;
32 NS_IMETHODIMP nsDBusHandlerApp::SetName(const nsAString& aName) {
33 mName.Assign(aName);
34 return NS_OK;
37 NS_IMETHODIMP nsDBusHandlerApp::SetDetailedDescription(
38 const nsAString& aDescription) {
39 mDetailedDescription.Assign(aDescription);
41 return NS_OK;
44 NS_IMETHODIMP nsDBusHandlerApp::GetDetailedDescription(
45 nsAString& aDescription) {
46 aDescription.Assign(mDetailedDescription);
48 return NS_OK;
51 NS_IMETHODIMP
52 nsDBusHandlerApp::Equals(nsIHandlerApp* aHandlerApp, bool* _retval) {
53 NS_ENSURE_ARG_POINTER(aHandlerApp);
55 // If the handler app isn't a dbus handler app, then it's not the same app.
56 nsCOMPtr<nsIDBusHandlerApp> dbusHandlerApp = do_QueryInterface(aHandlerApp);
57 if (!dbusHandlerApp) {
58 *_retval = false;
59 return NS_OK;
61 nsAutoCString service;
62 nsAutoCString method;
64 nsresult rv = dbusHandlerApp->GetService(service);
65 if (NS_FAILED(rv)) {
66 *_retval = false;
67 return NS_OK;
69 rv = dbusHandlerApp->GetMethod(method);
70 if (NS_FAILED(rv)) {
71 *_retval = false;
72 return NS_OK;
75 *_retval = service.Equals(mService) && method.Equals(mMethod);
76 return NS_OK;
79 NS_IMETHODIMP
80 nsDBusHandlerApp::LaunchWithURI(
81 nsIURI* aURI, mozilla::dom::BrowsingContext* aBrowsingContext) {
82 nsAutoCString spec;
83 nsresult rv = aURI->GetAsciiSpec(spec);
84 NS_ENSURE_SUCCESS(rv, rv);
85 const char* uri = spec.get();
87 DBusError err;
88 dbus_error_init(&err);
90 mozilla::UniquePtr<DBusConnection, mozilla::DBusConnectionDelete> connection(
91 dbus_bus_get_private(DBUS_BUS_SESSION, &err));
93 if (dbus_error_is_set(&err)) {
94 dbus_error_free(&err);
95 return NS_ERROR_FAILURE;
97 if (nullptr == connection) {
98 return NS_ERROR_FAILURE;
100 dbus_connection_set_exit_on_disconnect(connection.get(), false);
102 RefPtr<DBusMessage> msg =
103 already_AddRefed<DBusMessage>(dbus_message_new_method_call(
104 mService.get(), mObjpath.get(), mInterface.get(), mMethod.get()));
106 if (!msg) {
107 return NS_ERROR_FAILURE;
109 dbus_message_set_no_reply(msg, true);
111 DBusMessageIter iter;
112 dbus_message_iter_init_append(msg, &iter);
113 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &uri);
115 if (dbus_connection_send(connection.get(), msg, nullptr)) {
116 dbus_connection_flush(connection.get());
117 } else {
118 return NS_ERROR_FAILURE;
120 return NS_OK;
123 ////////////////////////////////////////////////////////////////////////////////
124 //// nsIDBusHandlerApp
126 NS_IMETHODIMP nsDBusHandlerApp::GetService(nsACString& aService) {
127 aService.Assign(mService);
128 return NS_OK;
131 NS_IMETHODIMP nsDBusHandlerApp::SetService(const nsACString& aService) {
132 mService.Assign(aService);
133 return NS_OK;
136 NS_IMETHODIMP nsDBusHandlerApp::GetMethod(nsACString& aMethod) {
137 aMethod.Assign(mMethod);
138 return NS_OK;
141 NS_IMETHODIMP nsDBusHandlerApp::SetMethod(const nsACString& aMethod) {
142 mMethod.Assign(aMethod);
143 return NS_OK;
146 NS_IMETHODIMP nsDBusHandlerApp::GetDBusInterface(nsACString& aInterface) {
147 aInterface.Assign(mInterface);
148 return NS_OK;
151 NS_IMETHODIMP nsDBusHandlerApp::SetDBusInterface(const nsACString& aInterface) {
152 mInterface.Assign(aInterface);
153 return NS_OK;
156 NS_IMETHODIMP nsDBusHandlerApp::GetObjectPath(nsACString& aObjpath) {
157 aObjpath.Assign(mObjpath);
158 return NS_OK;
161 NS_IMETHODIMP nsDBusHandlerApp::SetObjectPath(const nsACString& aObjpath) {
162 mObjpath.Assign(aObjpath);
163 return NS_OK;