You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

307 lines
8.0 KiB

/*
* Copyright (C) 2008-2009 Nick Schermer <nick@xfce.org>
*
* 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
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include <exo/exo.h>
#include <dbus/dbus-glib.h>
#include <libxfce4util/libxfce4util.h>
#include <common/panel-private.h>
#include <common/panel-dbus.h>
#include <libxfce4panel/libxfce4panel.h>
#include <libxfce4panel/xfce-panel-plugin-provider.h>
#include <panel/panel-dbus-client.h>
#include <panel/panel-dbus-service.h>
#include <panel/panel-dbus-client-infos.h>
enum
{
PLUGIN_NAME,
NAME,
TYPE,
VALUE,
N_TOKENS
};
static DBusGProxy *
panel_dbus_client_get_proxy (GError **error)
{
DBusGConnection *dbus_connection;
/* return null if no connection is found */
dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, error);
panel_return_val_if_fail (dbus_connection != NULL, NULL);
if (G_UNLIKELY (dbus_connection == NULL))
return NULL;
return dbus_g_proxy_new_for_name_owner (dbus_connection,
PANEL_DBUS_NAME,
PANEL_DBUS_PATH,
PANEL_DBUS_INTERFACE,
error);
}
gboolean
panel_dbus_client_check_instance_running (void)
{
DBusGProxy *dbus_proxy;
/* if no proxy is returned, there is no registered PanelDBusService */
dbus_proxy = panel_dbus_client_get_proxy (NULL);
if (dbus_proxy == NULL)
return FALSE;
g_object_unref (G_OBJECT (dbus_proxy));
return TRUE;
}
gboolean
panel_dbus_client_display_preferences_dialog (guint active,
GError **error)
{
gboolean result;
DBusGProxy *dbus_proxy;
panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
dbus_proxy = panel_dbus_client_get_proxy (error);
if (G_LIKELY (dbus_proxy == NULL))
return FALSE;
result = _panel_dbus_client_display_preferences_dialog (dbus_proxy,
active, error);
g_object_unref (G_OBJECT (dbus_proxy));
return result;
}
gboolean
panel_dbus_client_display_items_dialog (guint active,
GError **error)
{
gboolean result;
DBusGProxy *dbus_proxy;
panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
dbus_proxy = panel_dbus_client_get_proxy (error);
if (G_UNLIKELY (dbus_proxy == NULL))
return FALSE;
result = _panel_dbus_client_display_items_dialog (dbus_proxy, active,
error);
g_object_unref (G_OBJECT (dbus_proxy));
return result;
}
gboolean
panel_dbus_client_save (GError **error)
{
DBusGProxy *dbus_proxy;
gboolean result;
panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
dbus_proxy = panel_dbus_client_get_proxy (error);
if (G_UNLIKELY (dbus_proxy == NULL))
return FALSE;
result = _panel_dbus_client_save (dbus_proxy, error);
g_object_unref (G_OBJECT (dbus_proxy));
return result;
}
gboolean
panel_dbus_client_add_new_item (const gchar *plugin_name,
gchar **arguments,
GError **error)
{
DBusGProxy *dbus_proxy;
gboolean result;
panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
dbus_proxy = panel_dbus_client_get_proxy (error);
if (G_UNLIKELY (dbus_proxy == NULL))
return FALSE;
result = _panel_dbus_client_add_new_item (dbus_proxy, plugin_name,
(const gchar **) arguments,
error);
g_object_unref (G_OBJECT (dbus_proxy));
return result;
}
static GType
panel_dbus_client_gtype_from_string (const gchar *str)
{
if (strcmp (str, "bool") == 0)
return G_TYPE_BOOLEAN;
else if (strcmp (str, "double") == 0)
return G_TYPE_DOUBLE;
else if (strcmp (str, "int") == 0)
return G_TYPE_INT;
else if (strcmp (str, "string") == 0)
return G_TYPE_STRING;
else if (strcmp (str, "uint") == 0)
return G_TYPE_UINT;
else
return G_TYPE_NONE;
}
gboolean
panel_dbus_client_plugin_event (const gchar *plugin_event,
GError **error)
{
DBusGProxy *dbus_proxy;
gboolean result = FALSE;
gchar **tokens;
GType type;
GValue value = { 0, };
guint n_tokens;
panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
dbus_proxy = panel_dbus_client_get_proxy (error);
if (G_UNLIKELY (dbus_proxy == NULL))
return FALSE;
tokens = g_strsplit (plugin_event, ":", -1);
n_tokens = g_strv_length (tokens);
if (!(n_tokens == 2 || n_tokens == N_TOKENS)
|| exo_str_is_empty (tokens[PLUGIN_NAME])
|| exo_str_is_empty (tokens[NAME]))
{
g_set_error_literal (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
_("Invalid plugin event syntax specified. "
"Use PLUGIN-NAME:NAME[:TYPE:VALUE]."));
goto out;
}
else if (n_tokens == 2)
{
/* set noop value, recognized by the dbus service as %NULL value */
g_value_init (&value, G_TYPE_UCHAR);
g_value_set_uchar (&value, '\0');
}
else if (n_tokens == N_TOKENS)
{
type = panel_dbus_client_gtype_from_string (tokens[TYPE]);
if (G_LIKELY (type != G_TYPE_NONE))
{
g_value_init (&value, type);
if (type == G_TYPE_BOOLEAN)
g_value_set_boolean (&value, strcmp (tokens[VALUE], "true") == 0);
else if (type == G_TYPE_DOUBLE)
g_value_set_double (&value, g_ascii_strtod (tokens[VALUE], NULL));
else if (type == G_TYPE_INT)
g_value_set_int (&value, strtol (tokens[VALUE], NULL, 0));
else if (type == G_TYPE_STRING)
g_value_set_static_string (&value, tokens[VALUE]);
else if (type == G_TYPE_UINT)
g_value_set_uint (&value, strtol (tokens[VALUE], NULL, 0));
else
panel_assert_not_reached ();
}
else
{
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
_("Invalid hint type \"%s\". Valid types "
"are bool, double, int, string and uint."),
tokens[TYPE]);
goto out;
}
}
else
{
panel_assert_not_reached ();
goto out;
}
/* send value over dbus */
panel_return_val_if_fail (G_IS_VALUE (&value), FALSE);
result = _panel_dbus_client_plugin_event (dbus_proxy,
tokens[PLUGIN_NAME],
tokens[NAME],
&value,
error);
g_value_unset (&value);
out:
g_strfreev (tokens);
g_object_unref (G_OBJECT (dbus_proxy));
return result;
}
gboolean
panel_dbus_client_terminate (gboolean restart,
GError **error)
{
DBusGProxy *dbus_proxy;
gboolean result;
panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
dbus_proxy = panel_dbus_client_get_proxy (error);
if (G_UNLIKELY (dbus_proxy == NULL))
return FALSE;
result = _panel_dbus_client_terminate (dbus_proxy, restart, error);
g_object_unref (G_OBJECT (dbus_proxy));
return result;
}