]> git.sesse.net Git - vlc/blobdiff - modules/control/dbus/dbus_root.c
Reorganize the dbus control module code
[vlc] / modules / control / dbus / dbus_root.c
diff --git a/modules/control/dbus/dbus_root.c b/modules/control/dbus/dbus_root.c
new file mode 100644 (file)
index 0000000..aa43caa
--- /dev/null
@@ -0,0 +1,141 @@
+/*****************************************************************************
+ * dbus-root.c : dbus control module (mpris v1.0) - root object
+ *****************************************************************************
+ * Copyright © 2006-2008 Rafaël Carré
+ * Copyright © 2007-2010 Mirsal Ennaime
+ * Copyright © 2009-2010 The VideoLAN team
+ * $Id$
+ *
+ * Authors:    Mirsal ENNAIME <mirsal dot ennaime at gmail dot com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_interface.h>
+
+#include "dbus_root.h"
+#include "dbus_common.h"
+
+/* XML data to answer org.freedesktop.DBus.Introspectable.Introspect requests */
+static const char* psz_root_introspection_xml =
+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
+"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
+"<node>\n"
+"  <node name=\"Player\"/>\n"
+"  <node name=\"TrackList\"/>\n"
+"  <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
+"    <method name=\"Introspect\">\n"
+"      <arg name=\"data\" direction=\"out\" type=\"s\"/>\n"
+"    </method>\n"
+"  </interface>\n"
+"  <interface name=\"org.freedesktop.MediaPlayer\">\n"
+"    <method name=\"Identity\">\n"
+"      <arg type=\"s\" direction=\"out\" />\n"
+"    </method>\n"
+"    <method name=\"MprisVersion\">\n"
+"      <arg type=\"(qq)\" direction=\"out\" />\n"
+"    </method>\n"
+"    <method name=\"Quit\">\n"
+"    </method>\n"
+"  </interface>\n"
+"</node>\n"
+;
+
+DBUS_METHOD( Identity )
+{
+    VLC_UNUSED(p_this);
+    REPLY_INIT;
+    OUT_ARGUMENTS;
+    char *psz_identity;
+
+    if( asprintf( &psz_identity, "%s %s", PACKAGE, VERSION ) != -1 )
+    {
+        ADD_STRING( &psz_identity );
+        free( psz_identity );
+    }
+    else
+        return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+    REPLY_SEND;
+}
+
+DBUS_METHOD( MprisVersion )
+{ /*implemented version of the mpris spec */
+    REPLY_INIT;
+    OUT_ARGUMENTS;
+    VLC_UNUSED( p_this );
+    dbus_uint16_t i_major = DBUS_MPRIS_VERSION_MAJOR;
+    dbus_uint16_t i_minor = DBUS_MPRIS_VERSION_MINOR;
+    DBusMessageIter version;
+
+    if( !dbus_message_iter_open_container( &args, DBUS_TYPE_STRUCT, NULL,
+            &version ) )
+        return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+    if( !dbus_message_iter_append_basic( &version, DBUS_TYPE_UINT16,
+            &i_major ) )
+        return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+    if( !dbus_message_iter_append_basic( &version, DBUS_TYPE_UINT16,
+            &i_minor ) )
+        return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+    if( !dbus_message_iter_close_container( &args, &version ) )
+        return DBUS_HANDLER_RESULT_NEED_MEMORY;
+    REPLY_SEND;
+}
+
+DBUS_METHOD( Quit )
+{ /* exits vlc */
+    REPLY_INIT;
+    libvlc_Quit(INTF->p_libvlc);
+    REPLY_SEND;
+}
+
+DBUS_METHOD( handle_introspect_root )
+{ /* handles introspection of root object */
+    VLC_UNUSED(p_this);
+    REPLY_INIT;
+    OUT_ARGUMENTS;
+    ADD_STRING( &psz_root_introspection_xml );
+    REPLY_SEND;
+}
+
+#define METHOD_FUNC( interface, method, function ) \
+    else if( dbus_message_is_method_call( p_from, interface, method ) )\
+        return function( p_conn, p_from, p_this )
+
+DBusHandlerResult
+handle_root ( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
+{
+    if( dbus_message_is_method_call( p_from,
+                DBUS_INTERFACE_INTROSPECTABLE, "Introspect" ) )
+        return handle_introspect_root( p_conn, p_from, p_this );
+
+    /* here D-Bus method names are associated to an handler */
+
+    METHOD_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "Identity",      Identity );
+    METHOD_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "MprisVersion",  MprisVersion );
+    METHOD_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "Quit",          Quit );
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+#undef METHOD_FUNC