divorce XML literal to hostnamed.h, update types to be glib-appropriate, comments
authorkremlin <ian@kremlin.cc>
Mon, 2 Jun 2014 21:18:33 +0000 (16:18 -0500)
committerkremlin <ian@kremlin.cc>
Mon, 2 Jun 2014 21:18:33 +0000 (16:18 -0500)
src/interfaces/hostnamed/hostnamed.c
src/interfaces/hostnamed/hostnamed.h [new file with mode: 0644]

index d804b89ab7bedeca910c388ba89a7532c473eec4..4d4332bed0dac607680a00448ecbdcce47c0e6d3 100644 (file)
@@ -1,97 +1,8 @@
 #include <gio/gio.h>
+#include "hostnamed.h"
 
-/* testing, for now */
-static GDBusNodeInfo *spect_data = NULL;
-static const gchar spect_xml[] = 
-               "<node>"
-               " <interface name='org.freedesktop.DBus.Peer'>"
-               "  <method name='Ping'/>"
-               "  <method name='GetMachineId'>"
-               "   <arg type='s' name='machine_uuid' direction='out'/>"
-               "  </method>"
-               " </interface>"
-               " <interface name='org.freedesktop.DBus.Introspectable'>"
-               "  <method name='Introspect'>"
-               "   <arg name='data' type='s' direction='out'/>"
-               "  </method>"
-               " </interface>"
-               " <interface name='org.freedesktop.DBus.Properties'>"
-               "  <method name='Get'>"
-               "   <arg name='interface' direction='in' type='s'/>"
-               "   <arg name='property' direction='in' type='s'/>"
-               "   <arg name='value' direction='out' type='v'/>"
-               "  </method>"
-               "  <method name='GetAll'>"
-               "   <arg name='interface' direction='in' type='s'/>"
-               "   <arg name='properties' direction='out' type='a{sv}'/>"
-               "  </method>"
-               "  <method name='Set'>"
-               "   <arg name='interface' direction='in' type='s'/>"
-               "   <arg name='property' direction='in' type='s'/>"
-               "   <arg name='value' direction='in' type='v'/>"
-               "  </method>"
-               "  <signal name='PropertiesChanged'>"
-               "   <arg type='s' name='interface'/>"
-               "   <arg type='a{sv}' name='changed_properties'/>"
-               "   <arg type='as' name='invalidated_properties'/>"
-               "  </signal>"
-               " </interface>"
-               " <interface name='org.freedesktop.hostname1'>"
-               "  <property name='Hostname' type='s' access='read'>"
-               "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='false'/>"
-               "  </property>"
-               "  <property name='StaticHostname' type='s' access='read'>"
-               "  </property>"
-               "  <property name='PrettyHostname' type='s' access='read'>"
-               "  </property>"
-               "  <property name='IconName' type='s' access='read'>"
-               "  </property>"
-               "  <property name='Chassis' type='s' access='read'>"
-               "  </property>"
-               "  <property name='KernelName' type='s' access='read'>"
-               "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>"
-               "  </property>"
-               "  <property name='KernelRelease' type='s' access='read'>"
-               "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>"
-               "  </property>"
-               "  <property name='KernelVersion' type='s' access='read'>"
-               "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>"
-               "  </property>"
-               "  <property name='OperatingSystemPrettyName' type='s' access='read'>"
-               "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>"
-               "  </property>"
-               "  <property name='OperatingSystemCPEName' type='s' access='read'>"
-               "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>"
-               "  </property>"
-               "  <method name='SetHostname'>"
-               "   <arg type='s' direction='in'/>"
-               "   <arg type='b' direction='in'/>"
-               "  </method>"
-               "  <method name='SetStaticHostname'>"
-               "   <arg type='s' direction='in'/>"
-               "   <arg type='b' direction='in'/>"
-               "  </method>"
-               "  <method name='SetPrettyHostname'>"
-               "   <arg type='s' direction='in'/>"
-               "   <arg type='b' direction='in'/>"
-               "  </method>"
-               "  <method name='SetIconName'>"
-               "   <arg type='s' direction='in'/>"
-               "   <arg type='b' direction='in'/>"
-               "  </method>"
-               "  <method name='SetChassis'>"
-               "   <arg type='s' direction='in'/>"
-               "   <arg type='b' direction='in'/>"
-               "  </method>"
-               " </interface>"
-               "</node>";
-
-static const GDBusInterfaceVTable interface_vtable =
-{
-  handle_method_call,
-  handle_get_property,
-  handle_set_property
-};
+GDBusNodeInfo *spect_data;
+GMainLoop *loop;
 
 static void handle_method_call(GDBusConnection *conn,
                                const gchar *sender,
@@ -104,10 +15,14 @@ static void handle_method_call(GDBusConnection *conn,
 
                g_printf("%s wants to call %s, at %s with interface %s\n", sender, method_name, obj_path, interf_name);
 
-               g_dbus_method_invocation_return_value(invc, &spect_xml);
+               GString  *xml_ret;
+               GVariant *xml_ret_gvar;
 
-}
+               g_dbus_interface_info_generate_xml(spect_data->interfaces[0], (guint)0, xml_ret);
+               xml_ret_gvar = g_variant_new_string(xml_ret->str);
+               g_dbus_method_invocation_return_value(invc, xml_ret_gvar);
 
+}
 
 static GVariant * handle_get_property(GDBusConnection *conn,
                                const gchar *sender,
@@ -118,8 +33,6 @@ static GVariant * handle_get_property(GDBusConnection *conn,
                                gpointer usr_data) {
                
                GVariant *ret;
-               ret = g_variant_new_string("");
-               g_snprintf(ret, 100, "%s touched property %s at %s", sender, prop_name, obj_path);
 
                return ret;
 }
@@ -143,25 +56,31 @@ static gboolean handle_set_property(GDBusConnection *conn,
                return TRUE;
 }
 
+/* "hot" functions initially passed to gdbus */
+static const GDBusInterfaceVTable interface_vtable =
+{
+  handle_method_call,
+  handle_get_property,
+  handle_set_property
+};
+
 /* end method/property functions, begin bus name handlers
  * TODO: these should be intertwined as to handle edge cases
  * for when the system cannot immediately grab the name, as
  * well as cases where the system unintendedly loses the name
  */
-
-
 static void on_bus_acquired(GDBusConnection *conn, const gchar *name, gpointer user_data) {
        g_print("got bus, name: %s\n", name);
        
        guint reg_id;
 
-       reg_id = g_dbus_connection_register_object (conn,
-                                                                                               "/org/freedesktop/hostname1",
-                                                                                               spect_data->interfaces[0], 
-                                                                                               &interface_vtable,
-                                                                                               NULL,
-                                                                                               NULL,
-                                                                                               NULL );
+       reg_id = g_dbus_connection_register_object(conn,
+                                                                                          "/org/freedesktop/hostname1",
+                                                                                          spect_data->interfaces[0], 
+                                                                                          &interface_vtable,
+                                                                                          NULL,
+                                                                                          NULL,
+                                                                                          NULL );
        g_assert(reg_id > 0);
 }
 
@@ -171,18 +90,16 @@ static void on_name_acquired(GDBusConnection *conn, const gchar *name, gpointer
 
 static void on_name_lost(GDBusConnection *conn, const gchar *name, gpointer user_data) {
        g_print("lost name %s, exiting...\n", name);
-       exit(1);
+       g_main_loop_quit(loop);
 }
 
 /* safe call to try and start hostnamed */
 GError hostnamed_init() {
 
        guint bus_descriptor;
-       GError *err = NULL;
-       GMainLoop *loop;
+       GError *err = NULL;     
 
-       /* TODO: there is a correct way to generate introspection XML, switch to that */
-       spect_data = g_dbus_node_info_new_for_xml(spect_xml, NULL);
+       spect_data = g_dbus_node_info_new_for_xml(SYSTEMD_HOSTNAMED_XML, &err);
 
        bus_descriptor = g_bus_own_name(G_BUS_TYPE_SESSION,
                                        (gchar *)"org.freedesktop.hostname1",
diff --git a/src/interfaces/hostnamed/hostnamed.h b/src/interfaces/hostnamed/hostnamed.h
new file mode 100644 (file)
index 0000000..6bc1478
--- /dev/null
@@ -0,0 +1,78 @@
+#include <gio/gio.h>
+
+static const gchar SYSTEMD_HOSTNAMED_XML[] = 
+       "<!DOCTYPE node PUBLIC '-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'"
+       "'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>"
+       "<node>"
+       " <interface name='org.freedesktop.DBus.Peer'>"
+       "  <method name='Ping'/>"
+       "  <method name='GetMachineId'>"
+       "   <arg type='s' name='machine_uuid' direction='out'/>"
+       "  </method>"
+       " </interface>"
+       " <interface name='org.freedesktop.DBus.Introspectable'>"
+       "  <method name='Introspect'>"
+       "   <arg name='data' type='s' direction='out'/>"
+       "  </method>"
+       " </interface>"
+       " <interface name='org.freedesktop.DBus.Properties'>"
+       "  <method name='Get'>"
+       "   <arg name='interface' direction='in' type='s'/>"
+       "   <arg name='property' direction='in' type='s'/>"
+       "   <arg name='value' direction='out' type='v'/>"
+       "  </method>"
+       "  <method name='GetAll'>"
+       "   <arg name='interface' direction='in' type='s'/>"
+       "   <arg name='properties' direction='out' type='a{sv}'/>"
+       "  </method>"
+       "  <method name='Set'>"
+       "   <arg name='interface' direction='in' type='s'/>"
+       "   <arg name='property' direction='in' type='s'/>"
+       "   <arg name='value' direction='in' type='v'/>"
+       "  </method>"
+       "  <signal name='PropertiesChanged'>"
+       "   <arg type='s' name='interface'/>"
+       "   <arg type='a{sv}' name='changed_properties'/>"
+       "   <arg type='as' name='invalidated_properties'/>"
+       "  </signal>"
+       " </interface>"
+       " <interface name='org.freedesktop.hostname1'>"
+       "  <property name='Hostname' type='s' access='read'>"
+       "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='false'/>"
+       "  </property>"
+       "  <property name='StaticHostname' type='s' access='read'>"
+       "  </property>"
+       "  <property name='PrettyHostname' type='s' access='read'>"
+       "  </property>"
+       "  <property name='IconName' type='s' access='read'>"
+       "  </property>"
+       "  <property name='Chassis' type='s' access='read'>"
+       "  </property>"
+       "  <property name='OperatingSystemPrettyName' type='s' access='read'>"
+       "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>"
+       "  </property>"
+       "  <property name='OperatingSystemCPEName' type='s' access='read'>"
+       "   <annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='const'/>"
+       "  </property>"
+       "  <method name='SetHostname'>"
+       "   <arg type='s' direction='in'/>"
+       "   <arg type='b' direction='in'/>"
+       "  </method>"
+       "  <method name='SetStaticHostname'>"
+       "   <arg type='s' direction='in'/>"
+       "   <arg type='b' direction='in'/>"
+       "  </method>"
+       "  <method name='SetPrettyHostname'>"
+       "   <arg type='s' direction='in'/>"
+       "   <arg type='b' direction='in'/>"
+       "  </method>"
+       "  <method name='SetIconName'>"
+       "   <arg type='s' direction='in'/>"
+       "   <arg type='b' direction='in'/>"
+       "  </method>"
+       "  <method name='SetChassis'>"
+       "   <arg type='s' direction='in'/>"
+       "   <arg type='b' direction='in'/>"
+       "  </method>"
+       " </interface>"
+       "</node>";