summaryrefslogtreecommitdiff
path: root/common/gvfsdaemonprotocol.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/gvfsdaemonprotocol.c')
-rw-r--r--common/gvfsdaemonprotocol.c614
1 files changed, 0 insertions, 614 deletions
diff --git a/common/gvfsdaemonprotocol.c b/common/gvfsdaemonprotocol.c
deleted file mode 100644
index 36331ed8..00000000
--- a/common/gvfsdaemonprotocol.c
+++ /dev/null
@@ -1,614 +0,0 @@
-/* GIO - GLib Input, Output and Streaming Library
- *
- * Copyright (C) 2006-2007 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Alexander Larsson <alexl@redhat.com>
- */
-
-#include <config.h>
-
-#include <glib-object.h>
-#include <dbus/dbus.h>
-#include <glib/gi18n-lib.h>
-#include <gvfsdaemonprotocol.h>
-#include <gdbusutils.h>
-#include <gio/gio.h>
-
-static const char *
-get_object_signature (GObject *obj)
-{
- if (G_IS_THEMED_ICON (obj))
- {
- return
- DBUS_STRUCT_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_UINT32_AS_STRING
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING
- DBUS_STRUCT_END_CHAR_AS_STRING;
- }
- else if (G_IS_FILE_ICON (obj))
- {
- GFile *file;
- char *path;
-
- file = g_file_icon_get_file (G_FILE_ICON (obj));
-
- path = g_file_get_path (file);
- if (path)
- {
- g_free (path);
- return
- DBUS_STRUCT_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_UINT32_AS_STRING
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING
- DBUS_STRUCT_END_CHAR_AS_STRING;
- }
- }
- return
- DBUS_STRUCT_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_UINT32_AS_STRING
- DBUS_STRUCT_END_CHAR_AS_STRING;
-}
-
-static void
-append_string_array (DBusMessageIter *iter, char **strs)
-{
- DBusMessageIter array;
- int i;
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_ARRAY,
- DBUS_TYPE_STRING_AS_STRING,
- &array))
- _g_dbus_oom ();
-
-
- for (i = 0; strs[i] != NULL; i++)
- {
- if (!dbus_message_iter_append_basic (&array, DBUS_TYPE_STRING, &strs[i]))
- _g_dbus_oom ();
- }
-
- if (!dbus_message_iter_close_container (iter, &array))
- _g_dbus_oom ();
-}
-
-static void
-append_object (DBusMessageIter *iter, GObject *obj)
-{
- DBusMessageIter obj_struct_iter;
- guint32 v_uint32;
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_STRUCT,
- NULL,
- &obj_struct_iter))
- _g_dbus_oom ();
-
- if (G_IS_THEMED_ICON (obj))
- {
- const char * const *icons;
-
- icons = g_themed_icon_get_names (G_THEMED_ICON (obj));
-
- v_uint32 = 1;
- if (!dbus_message_iter_append_basic (&obj_struct_iter,
- DBUS_TYPE_UINT32, &v_uint32))
- _g_dbus_oom ();
-
- append_string_array (&obj_struct_iter, (char **)icons);
- }
- else if (G_IS_FILE_ICON (obj))
- {
- GFile *file;
- char *path;
-
- file = g_file_icon_get_file (G_FILE_ICON (obj));
-
- path = g_file_get_path (file);
- if (path)
- {
- v_uint32 = 2;
- if (!dbus_message_iter_append_basic (&obj_struct_iter,
- DBUS_TYPE_UINT32, &v_uint32))
- _g_dbus_oom ();
-
- path = g_file_get_path (file);
- _g_dbus_message_iter_append_cstring (&obj_struct_iter, path);
- g_free (path);
- }
- else
- {
- /* Seems unlikely that daemon backend will generate GFileIcons with
- files on the vfs, so its probably not a problem not to support this.
- (Its tricky to support, since we don't link the daemon to the client/
- library directly.) */
- g_warning ("Unknown file type for icon in attribute, ignoring");
-
- v_uint32 = 0;
- if (!dbus_message_iter_append_basic (&obj_struct_iter,
- DBUS_TYPE_UINT32, &v_uint32))
- _g_dbus_oom ();
- }
- }
- else
- {
- /* NULL or unknown type: */
- if (obj != NULL)
- g_warning ("Unknown attribute object type, ignoring");
-
- v_uint32 = 0;
- if (!dbus_message_iter_append_basic (&obj_struct_iter,
- DBUS_TYPE_UINT32, &v_uint32))
- _g_dbus_oom ();
- }
-
- if (!dbus_message_iter_close_container (iter, &obj_struct_iter))
- _g_dbus_oom ();
-}
-
-void
-_g_dbus_attribute_value_destroy (GFileAttributeType type,
- GDbusAttributeValue *value)
-{
- switch (type) {
- case G_FILE_ATTRIBUTE_TYPE_STRING:
- case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING:
- g_free (value->ptr);
- break;
- case G_FILE_ATTRIBUTE_TYPE_OBJECT:
- if (value->ptr)
- g_object_unref (value->ptr);
- break;
- default:
- break;
- }
-}
-
-gpointer
-_g_dbus_attribute_as_pointer (GFileAttributeType type,
- GDbusAttributeValue *value)
-{
- switch (type) {
- case G_FILE_ATTRIBUTE_TYPE_STRING:
- case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING:
- case G_FILE_ATTRIBUTE_TYPE_OBJECT:
- return value->ptr;
- default:
- return (gpointer) value;
- }
-}
-
-const char *
-_g_dbus_type_from_file_attribute_type (GFileAttributeType type)
-{
- char *dbus_type;
-
- switch (type)
- {
- case G_FILE_ATTRIBUTE_TYPE_STRING:
- dbus_type = DBUS_TYPE_STRING_AS_STRING;
- break;
- case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING:
- dbus_type = DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING;
- break;
- case G_FILE_ATTRIBUTE_TYPE_BOOLEAN:
- dbus_type = DBUS_TYPE_BOOLEAN_AS_STRING;
- break;
- case G_FILE_ATTRIBUTE_TYPE_UINT32:
- dbus_type = DBUS_TYPE_UINT32_AS_STRING;
- break;
- case G_FILE_ATTRIBUTE_TYPE_INT32:
- dbus_type = DBUS_TYPE_INT32_AS_STRING;
- break;
- case G_FILE_ATTRIBUTE_TYPE_UINT64:
- dbus_type = DBUS_TYPE_UINT64_AS_STRING;
- break;
- case G_FILE_ATTRIBUTE_TYPE_INT64:
- dbus_type = DBUS_TYPE_INT64_AS_STRING;
- break;
- case G_FILE_ATTRIBUTE_TYPE_OBJECT:
- dbus_type = DBUS_TYPE_STRUCT_AS_STRING;
- break;
- default:
- dbus_type = NULL;
- g_warning ("Invalid attribute type %u, ignoring\n", type);
- break;
- }
-
- return dbus_type;
-}
-
-void
-_g_dbus_append_file_attribute (DBusMessageIter *iter,
- const char *attribute,
- GFileAttributeType type,
- gpointer value_p)
-{
- DBusMessageIter variant_iter, inner_struct_iter;
- const char *dbus_type;
- GObject *obj = NULL;
-
- dbus_type = _g_dbus_type_from_file_attribute_type (type);
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_STRUCT,
- NULL,
- &inner_struct_iter))
- _g_dbus_oom ();
-
- if (!dbus_message_iter_append_basic (&inner_struct_iter,
- DBUS_TYPE_STRING,
- &attribute))
- _g_dbus_oom ();
-
- if (dbus_type[0] == DBUS_TYPE_STRUCT)
- dbus_type = get_object_signature ((GObject *)value_p);
-
- if (!dbus_message_iter_open_container (&inner_struct_iter,
- DBUS_TYPE_VARIANT,
- dbus_type,
- &variant_iter))
- _g_dbus_oom ();
-
- if (dbus_type[0] == DBUS_TYPE_STRING)
- {
- if (!dbus_message_iter_append_basic (&variant_iter,
- DBUS_TYPE_STRING, &value_p))
- _g_dbus_oom ();
- }
- else if (dbus_type[0] == DBUS_TYPE_ARRAY)
- _g_dbus_message_iter_append_cstring (&variant_iter, (char *)value_p);
- else if (dbus_type[0] == DBUS_STRUCT_BEGIN_CHAR)
- append_object (&variant_iter, (GObject *)value_p);
- else if (dbus_type[0] == DBUS_TYPE_BOOLEAN)
- {
- /* dbus bool is uint32, gboolean is just "int", convert */
- dbus_bool_t bool = *(gboolean *)value_p;
- if (!dbus_message_iter_append_basic (&variant_iter,
- dbus_type[0], &bool))
- _g_dbus_oom ();
- }
- else
- {
- /* All other types have the same size as dbus types */
- if (!dbus_message_iter_append_basic (&variant_iter,
- dbus_type[0], value_p))
- _g_dbus_oom ();
- }
-
- if (obj)
- g_object_unref (obj);
-
- if (!dbus_message_iter_close_container (&inner_struct_iter, &variant_iter))
- _g_dbus_oom ();
-
- if (!dbus_message_iter_close_container (iter, &inner_struct_iter))
- _g_dbus_oom ();
-}
-
-void
-_g_dbus_append_file_info (DBusMessageIter *iter,
- GFileInfo *info)
-{
- DBusMessageIter struct_iter, array_iter;
- char **attributes;
- int i;
-
- attributes = g_file_info_list_attributes (info, NULL);
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_STRUCT,
- NULL,
- &struct_iter))
- _g_dbus_oom ();
-
-
- if (!dbus_message_iter_open_container (&struct_iter,
- DBUS_TYPE_ARRAY,
- DBUS_STRUCT_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_TYPE_VARIANT_AS_STRING
- DBUS_STRUCT_END_CHAR_AS_STRING,
- &array_iter))
- _g_dbus_oom ();
-
- for (i = 0; attributes[i] != NULL; i++)
- {
- GFileAttributeType type;
- gpointer value_p;
-
- if (g_file_info_get_attribute_data (info, attributes[i], &type, &value_p, NULL))
- _g_dbus_append_file_attribute (&array_iter, attributes [i], type, value_p);
- }
-
- g_strfreev (attributes);
-
- if (!dbus_message_iter_close_container (&struct_iter, &array_iter))
- _g_dbus_oom ();
-
- if (!dbus_message_iter_close_container (iter, &struct_iter))
- _g_dbus_oom ();
-}
-
-gboolean
-_g_dbus_get_file_attribute (DBusMessageIter *iter,
- gchar **attribute,
- GFileAttributeType *type,
- GDbusAttributeValue *value)
-{
- char *str;
- char **strs;
- int n_elements;
- DBusMessageIter inner_struct_iter, variant_iter, cstring_iter, obj_iter;
- const gchar *attribute_temp;
- dbus_uint32_t obj_type;
- dbus_bool_t dbus_bool;
- GObject *obj;
-
- dbus_message_iter_recurse (iter, &inner_struct_iter);
-
- if (dbus_message_iter_get_arg_type (&inner_struct_iter) != DBUS_TYPE_STRING)
- goto error;
-
- dbus_message_iter_get_basic (&inner_struct_iter, &attribute_temp);
- *attribute = g_strdup (attribute_temp);
-
- dbus_message_iter_next (&inner_struct_iter);
-
- if (dbus_message_iter_get_arg_type (&inner_struct_iter) != DBUS_TYPE_VARIANT)
- goto error;
-
- dbus_message_iter_recurse (&inner_struct_iter, &variant_iter);
-
- switch (dbus_message_iter_get_arg_type (&variant_iter))
- {
- case DBUS_TYPE_STRING:
- *type = G_FILE_ATTRIBUTE_TYPE_STRING;
- dbus_message_iter_get_basic (&variant_iter, &str);
- value->ptr = g_strdup (str);
- break;
- case DBUS_TYPE_ARRAY:
- if (dbus_message_iter_get_element_type (&variant_iter) != DBUS_TYPE_BYTE)
- goto error;
-
- *type = G_FILE_ATTRIBUTE_TYPE_BYTE_STRING;
-
- dbus_message_iter_recurse (&variant_iter, &cstring_iter);
- dbus_message_iter_get_fixed_array (&cstring_iter,
- &str, &n_elements);
- value->ptr = g_strndup (str, n_elements);
- break;
- case DBUS_TYPE_BOOLEAN:
- dbus_message_iter_get_basic (&variant_iter, &dbus_bool);
- value->boolean = dbus_bool;
- *type = G_FILE_ATTRIBUTE_TYPE_BOOLEAN;
- break;
- case DBUS_TYPE_UINT32:
- dbus_message_iter_get_basic (&variant_iter, value);
- *type = G_FILE_ATTRIBUTE_TYPE_UINT32;
- break;
- case DBUS_TYPE_INT32:
- dbus_message_iter_get_basic (&variant_iter, value);
- *type = G_FILE_ATTRIBUTE_TYPE_INT32;
- break;
- case DBUS_TYPE_UINT64:
- dbus_message_iter_get_basic (&variant_iter, value);
- *type = G_FILE_ATTRIBUTE_TYPE_UINT64;
- break;
- case DBUS_TYPE_INT64:
- dbus_message_iter_get_basic (&variant_iter, value);
- *type = G_FILE_ATTRIBUTE_TYPE_INT64;
- break;
- case DBUS_TYPE_STRUCT:
- dbus_message_iter_recurse (&variant_iter, &obj_iter);
- if (dbus_message_iter_get_arg_type (&obj_iter) != DBUS_TYPE_UINT32)
- goto error;
-
- *type = G_FILE_ATTRIBUTE_TYPE_OBJECT;
-
- dbus_message_iter_get_basic (&obj_iter, &obj_type);
- obj = NULL;
-
- dbus_message_iter_next (&obj_iter);
- /* 0 == NULL */
-
- if (obj_type == 1)
- {
- /* G_THEMED_ICON */
- if (_g_dbus_message_iter_get_args (&obj_iter,
- NULL,
- DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
- &strs, &n_elements, 0))
- {
- obj = G_OBJECT (g_themed_icon_new_from_names (strs, n_elements));
- dbus_free_string_array (strs);
- }
- }
- else if (obj_type == 2)
- {
- /* G_FILE_ICON, w/ local file */
- if (_g_dbus_message_iter_get_args (&obj_iter,
- NULL,
- G_DBUS_TYPE_CSTRING, &str,
- 0))
- {
- GFile *file = g_file_new_for_path (str);
- obj = G_OBJECT (g_file_icon_new (file));
- g_free (str);
- }
- }
- else
- {
- /* NULL (or unsupported) */
- if (obj_type != 0)
- g_warning ("Unsupported object type in file attribute");
- }
-
- value->ptr = obj;
- break;
- default:
- goto error;
- }
-
- return TRUE;
-
- error:
- return FALSE;
-}
-
-GFileInfo *
-_g_dbus_get_file_info (DBusMessageIter *iter,
- GError **error)
-{
- GFileInfo *info;
- DBusMessageIter struct_iter, array_iter;
- gchar *attribute;
- GFileAttributeType type;
- GDbusAttributeValue value;
-
- info = g_file_info_new ();
-
- if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_STRUCT)
- goto error;
-
- dbus_message_iter_recurse (iter, &struct_iter);
-
- if (dbus_message_iter_get_arg_type (&struct_iter) != DBUS_TYPE_ARRAY)
- goto error;
-
- dbus_message_iter_recurse (&struct_iter, &array_iter);
-
- while (dbus_message_iter_get_arg_type (&array_iter) == DBUS_TYPE_STRUCT)
- {
- if (!_g_dbus_get_file_attribute (&array_iter, &attribute, &type, &value))
- goto error;
-
- g_file_info_set_attribute (info, attribute, type, _g_dbus_attribute_as_pointer (type, &value));
-
- g_free (attribute);
- _g_dbus_attribute_value_destroy (type, &value);
-
- dbus_message_iter_next (&array_iter);
- }
-
- dbus_message_iter_next (iter);
- return info;
-
- error:
- g_object_unref (info);
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid file info format"));
- return NULL;
-}
-
-GFileAttributeInfoList *
-_g_dbus_get_attribute_info_list (DBusMessageIter *iter,
- GError **error)
-{
- GFileAttributeInfoList *list;
- DBusMessageIter array_iter, struct_iter;
- const char *name;
- dbus_uint32_t type, flags;
-
- if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_ARRAY ||
- dbus_message_iter_get_element_type (iter) != DBUS_TYPE_STRUCT)
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid attribute info list content"));
- return NULL;
- }
-
- list = g_file_attribute_info_list_new ();
-
- dbus_message_iter_recurse (iter, &array_iter);
- while (dbus_message_iter_get_arg_type (&array_iter) == DBUS_TYPE_STRUCT)
- {
- dbus_message_iter_recurse (&array_iter, &struct_iter);
-
- if (dbus_message_iter_get_arg_type (&struct_iter) == DBUS_TYPE_STRING)
- {
- dbus_message_iter_get_basic (&struct_iter, &name);
- dbus_message_iter_next (&struct_iter);
-
- if (dbus_message_iter_get_arg_type (&struct_iter) == DBUS_TYPE_UINT32)
- {
- dbus_message_iter_get_basic (&struct_iter, &type);
- dbus_message_iter_next (&struct_iter);
-
- if (dbus_message_iter_get_arg_type (&struct_iter) == DBUS_TYPE_UINT32)
- {
- dbus_message_iter_get_basic (&struct_iter, &flags);
-
- g_file_attribute_info_list_add (list, name, type, flags);
- }
- }
- }
-
- dbus_message_iter_next (&array_iter);
- }
-
- return list;
-}
-
-void
-_g_dbus_append_attribute_info_list (DBusMessageIter *iter,
- GFileAttributeInfoList *list)
-{
- DBusMessageIter array_iter, struct_iter;
- int i;
- dbus_uint32_t dbus_type, dbus_flags;
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_ARRAY,
- DBUS_STRUCT_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_TYPE_UINT32_AS_STRING
- DBUS_TYPE_UINT32_AS_STRING
- DBUS_STRUCT_END_CHAR_AS_STRING,
- &array_iter))
- _g_dbus_oom ();
-
- for (i = 0; i < list->n_infos; i++)
- {
- if (!dbus_message_iter_open_container (&array_iter,
- DBUS_TYPE_STRUCT,
- NULL,
- &struct_iter))
- _g_dbus_oom ();
-
- if (!dbus_message_iter_append_basic (&struct_iter,
- DBUS_TYPE_STRING, &list->infos[i].name))
- _g_dbus_oom ();
-
- dbus_type = list->infos[i].type;
- if (!dbus_message_iter_append_basic (&struct_iter,
- DBUS_TYPE_UINT32, &dbus_type))
- _g_dbus_oom ();
-
- dbus_flags = list->infos[i].flags;
- if (!dbus_message_iter_append_basic (&struct_iter,
- DBUS_TYPE_UINT32, &dbus_flags))
- _g_dbus_oom ();
-
- if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
- _g_dbus_oom ();
- }
-
- if (!dbus_message_iter_close_container (iter, &array_iter))
- _g_dbus_oom ();
-}