aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Terry <michael.terry@canonical.com>2013-08-28 17:36:42 +0000
committerTarmac <Unknown>2013-08-28 17:36:42 +0000
commit57a4a0edb15b2933ad4dd0fea59074219f5d8c5b (patch)
tree7fa2345f400443009fa462551887aa3f666745a1
parent770bf58782b33d03b6c32342158710103ca85db7 (diff)
parent6d444beb4392c2116533749fa869b6a1c4c6454a (diff)
downloadayatana-greeter-session-broadcast-57a4a0edb15b2933ad4dd0fea59074219f5d8c5b.tar.gz
ayatana-greeter-session-broadcast-57a4a0edb15b2933ad4dd0fea59074219f5d8c5b.tar.bz2
ayatana-greeter-session-broadcast-57a4a0edb15b2933ad4dd0fea59074219f5d8c5b.zip
Implement the basic service. Adds RequestApplicationStart method which sends out a StartApplication signal.
Approved by Ted Gould, PS Jenkins bot.
-rw-r--r--CMakeLists.txt7
-rw-r--r--data/CMakeLists.txt10
-rw-r--r--data/com.canonical.Unity.Greeter.Broadcast.conf21
-rw-r--r--debian/unity-greeter-session-broadcast.install1
-rw-r--r--service/CMakeLists.txt10
-rw-r--r--service/service.c70
6 files changed, 116 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 86192f6..97d6cad 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -47,6 +47,13 @@ endif()
message("Installing DBus services to ${DBUSSERVICEDIR}")
if(${LOCAL_INSTALL})
+ set(DBUSSYSCONFDIR "${CMAKE_INSTALL_SYSCONFDIR}")
+else()
+ EXEC_PROGRAM(${PKG_CONFIG_EXECUTABLE} ARGS dbus-1 --variable sysconfdir OUTPUT_VARIABLE DBUSSYSCONFDIR)
+endif()
+message("Installing DBus policy files to ${DBUSSYSCONFDIR}")
+
+if(${LOCAL_INSTALL})
set(DBUSIFACEDIR "${CMAKE_INSTALL_DATADIR}/dbus-1/interfaces/")
else()
EXEC_PROGRAM(${PKG_CONFIG_EXECUTABLE} ARGS dbus-1 --variable interfaces_dir OUTPUT_VARIABLE DBUSIFACEDIR )
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
index b784adb..d00c9ef 100644
--- a/data/CMakeLists.txt
+++ b/data/CMakeLists.txt
@@ -10,6 +10,16 @@ DESTINATION ${DBUSIFACEDIR}
)
###########################
+# DBus Policy Files
+###########################
+
+install(
+FILES
+com.canonical.Unity.Greeter.Broadcast.conf
+DESTINATION ${DBUSSYSCONFDIR}/dbus-1/system.d
+)
+
+###########################
# Dbus Services
###########################
diff --git a/data/com.canonical.Unity.Greeter.Broadcast.conf b/data/com.canonical.Unity.Greeter.Broadcast.conf
new file mode 100644
index 0000000..8a8cfe6
--- /dev/null
+++ b/data/com.canonical.Unity.Greeter.Broadcast.conf
@@ -0,0 +1,21 @@
+<!-- ../system.conf have denied everything, so we just punch some holes -->
+
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+ <policy user="root">
+ <allow own="com.canonical.Unity.Greeter.Broadcast"/>
+ <allow send_destination="com.canonical.Unity.Greeter.Broadcast"/>
+ </policy>
+
+ <policy user="lightdm">
+ <allow send_destination="com.canonical.Unity.Greeter.Broadcast"/>
+ </policy>
+
+ <policy context="default">
+ <allow send_destination="com.canonical.Unity.Greeter.Broadcast"
+ send_interface="org.freedesktop.DBus.Introspectable"/>
+ </policy>
+
+</busconfig>
diff --git a/debian/unity-greeter-session-broadcast.install b/debian/unity-greeter-session-broadcast.install
index 46805f9..4a7f626 100644
--- a/debian/unity-greeter-session-broadcast.install
+++ b/debian/unity-greeter-session-broadcast.install
@@ -1,3 +1,4 @@
+etc/dbus-1
usr/lib/*/unity-greeter-session-broadcast
usr/share/dbus-1
usr/share/glib-2.0
diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt
index ac70f23..7e336d5 100644
--- a/service/CMakeLists.txt
+++ b/service/CMakeLists.txt
@@ -30,11 +30,19 @@ ${GOBJECT2_LIBRARIES}
# Service Executable
###########################
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}
+)
+
add_executable(service-exec service.c)
set_target_properties(service-exec PROPERTIES OUTPUT_NAME "unity-greeter-session-broadcast-service")
-target_link_libraries(service-exec service-generated)
+target_link_libraries(service-exec
+service-generated
+${GIO2_LIBRARIES}
+)
###########################
# Installation
diff --git a/service/service.c b/service/service.c
index 3c2f9e2..adf45b3 100644
--- a/service/service.c
+++ b/service/service.c
@@ -15,15 +15,81 @@
*
*/
+#include <gio/gio.h>
+#include <unistd.h>
+#include "service-iface.h"
+
+static gboolean
+on_handle_request_application_start (ServiceIfaceComCanonicalUnityGreeterBroadcast *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_username,
+ const gchar *arg_appId)
+{
+ /* Simply pass the request on */
+ service_iface_com_canonical_unity_greeter_broadcast_emit_start_application (object,
+ arg_username,
+ arg_appId);
+ service_iface_com_canonical_unity_greeter_broadcast_complete_request_application_start (object,
+ invocation);
+ return TRUE;
+}
+
+static void
+on_bus_acquired (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ GError *error = NULL;
+ ServiceIfaceComCanonicalUnityGreeterBroadcast *interface;
+
+ interface = (ServiceIfaceComCanonicalUnityGreeterBroadcast *)user_data;
+
+ if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (interface),
+ connection,
+ "/com/canonical/Unity/Greeter/Broadcast",
+ &error))
+ {
+ g_error ("Unable to export interface: %s, exiting", error->message);
+ }
+}
+
+static void
+on_name_lost (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ g_error ("Lost bus name, exiting");
+}
+
int
main (int argc, char * argv[])
{
+ guint owner_id;
+ GMainLoop *loop;
+ ServiceIfaceComCanonicalUnityGreeterBroadcast *interface;
+ interface = service_iface_com_canonical_unity_greeter_broadcast_skeleton_new ();
+ g_signal_connect (interface,
+ "handle-request-application-start",
+ G_CALLBACK (on_handle_request_application_start),
+ NULL);
+ owner_id = g_bus_own_name (G_BUS_TYPE_SYSTEM,
+ "com.canonical.Unity.Greeter.Broadcast",
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ on_bus_acquired,
+ NULL,
+ on_name_lost,
+ g_object_ref (interface),
+ g_object_unref);
+ loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (loop);
+ g_bus_unown_name (owner_id);
+ g_object_unref (interface);
+ g_object_unref (loop);
-
- return 0;
+ return 0;
}