[maemo-commits] [maemo-commits] r11599 - projects/haf/trunk/hildon-fm/hildon-fm
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Fri May 11 17:13:36 EEST 2007
- Previous message: [maemo-commits] r11597 - in projects/haf/trunk/fontconfig: . debian
- Next message: [maemo-commits] r11600 - in projects/haf/trunk/hildon-fm: . debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: marivoll
Date: 2007-05-11 17:13:33 +0300 (Fri, 11 May 2007)
New Revision: 11599
Added:
projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.c
projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.h
Modified:
projects/haf/trunk/hildon-fm/hildon-fm/Makefile.am
projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-model.c
projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-private.c
projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.c
projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.h
Log:
Support for smb:// locations. Aka, the "Weirdos from another
planet" release.
* hildon-fm/hildon-file-system-special-location.h
(hildon_file_system_special_location_get_folder,
hildon-fm/hildon-file-system-special-location.c): New, to let the
smb:// special location provide their own weird way of listing the
top-level.
* hildon-fm/hildon-file-system-model.c (link_file_folder): Use it
for special locations.
* hildon-fm/hildon-file-system-smb.c,
hildon-fm/hildon-file-system-smb.h: New, for the weird smb://
namespace.
* hildon-fm/Makefile.am (libhildonfm_la_SOURCES): Added them.
* hildon-fm/hildon-file-system-private.c
(_hildon_file_system_get_locations): Setup SMB.
Modified: projects/haf/trunk/hildon-fm/hildon-fm/Makefile.am
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/Makefile.am 2007-05-11 14:10:57 UTC (rev 11598)
+++ projects/haf/trunk/hildon-fm/hildon-fm/Makefile.am 2007-05-11 14:13:33 UTC (rev 11599)
@@ -1,3 +1,7 @@
+bin_PROGRAMS = t
+t_SOURCES = t.c
+t_CFLAGS= $(GTK_CFLAGS)
+t_LDFLAGS = $(GTK_LIBS)
INCLUDES = $(GTK_CFLAGS) $(GCONF_CFLAGS) $(HILDON_THUMBNAIL_CFLAGS) \
$(GWCONNECT_CFLAGS) $(DBUSGLIB_CFLAGS) \
@@ -51,6 +55,8 @@
hildon-file-system-upnp.c \
hildon-file-system-obex.h \
hildon-file-system-obex.c \
+ hildon-file-system-smb.h \
+ hildon-file-system-smb.c \
hildon-fm1-compat.h \
hildon-fm1-compat.c \
$(hildonfm_built_headers) \
Modified: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-model.c
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-model.c 2007-05-11 14:10:57 UTC (rev 11598)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-model.c 2007-05-11 14:13:33 UTC (rev 11599)
@@ -1432,9 +1432,10 @@
/* Not allocated dynamically */
folder_string = gtk_file_path_get_string(path);
+ model_node = parent_node->data;
+
/* First consider the parent itself.
*/
- model_node = parent_node->data;
if (model_node)
{
test_string = gtk_file_path_get_string (model_node->path);
@@ -1449,8 +1450,8 @@
test_string = gtk_file_path_get_string(model_node->path);
- /* Let's make sure that we survise with folder names both ending and not ending to slash */
- if (_hildon_file_system_compare_ignore_last_separator(folder_string, test_string))
+ if (_hildon_file_system_compare_ignore_last_separator (folder_string,
+ test_string))
return node;
if (recursively) {
@@ -1464,8 +1465,8 @@
{
GNode *result =
hildon_file_system_model_search_path_internal(node,
- path,
- TRUE);
+ path,
+ TRUE);
if (result) return result;
}
}
@@ -1658,10 +1659,22 @@
parent_folder = (node->parent && node->parent->data) ?
((HildonFileSystemModelNode *) node->parent->data)->folder : NULL;
- model_node->get_folder_handle =
- gtk_file_system_get_folder (model->priv->filesystem,
- path, GTK_FILE_INFO_ALL,
- get_folder_callback, node);
+ if (model_node->location)
+ {
+ model_node->get_folder_handle =
+ hildon_file_system_special_location_get_folder
+ (model_node->location,
+ model->priv->filesystem,
+ path, GTK_FILE_INFO_ALL,
+ get_folder_callback, node);
+ }
+ else
+ {
+ model_node->get_folder_handle =
+ gtk_file_system_get_folder (model->priv->filesystem,
+ path, GTK_FILE_INFO_ALL,
+ get_folder_callback, node);
+ }
if (model_node->get_folder_handle == NULL)
{
@@ -1795,8 +1808,9 @@
/* First check if this item is already part of the model */
{
- node = hildon_file_system_model_search_path_internal(
- parent_node, path, FALSE);
+ node =
+ hildon_file_system_model_search_path_internal (parent_node,
+ path, FALSE);
if (node) {
HildonFileSystemModelNode *model_node = node->data;
@@ -2681,22 +2695,19 @@
GtkTreeIter * start_iter,
gboolean recursive)
{
- HildonFileSystemModelPrivate *priv = CAST_GET_PRIVATE(model);
+ HildonFileSystemModelPrivate *priv = CAST_GET_PRIVATE(model);
+ GNode *start_node;
- g_return_val_if_fail(iter != NULL, FALSE);
+ g_return_val_if_fail(iter != NULL, FALSE);
- iter->stamp = priv->stamp;
+ start_node = get_node (priv, start_iter);
+ g_return_val_if_fail (start_node != NULL, FALSE);
-
-
-
-
- iter->user_data =
- hildon_file_system_model_search_path_internal(
- get_node(priv,
- start_iter),
- path, recursive);
- return iter->user_data != NULL;
+ iter->stamp = priv->stamp;
+ iter->user_data =
+ hildon_file_system_model_search_path_internal (start_node,
+ path, recursive);
+ return iter->user_data != NULL;
}
/**
Modified: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-private.c
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-private.c 2007-05-11 14:10:57 UTC (rev 11598)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-private.c 2007-05-11 14:13:33 UTC (rev 11599)
@@ -44,6 +44,7 @@
#include "hildon-file-system-local-device.h"
#include "hildon-file-system-mmc.h"
#include "hildon-file-system-upnp.h"
+#include "hildon-file-system-smb.h"
#include "hildon-file-system-obex.h"
#include "hildon-file-system-old-gateway.h"
@@ -217,6 +218,14 @@
g_node_append_data(locations, location);
}
}
+
+ /* Setup SMB
+ */
+ {
+ location = g_object_new (HILDON_TYPE_FILE_SYSTEM_SMB, NULL);
+ location->basepath = g_strdup ("smb://");
+ g_node_append_data (locations, location);
+ }
}
return locations;
@@ -257,7 +266,7 @@
candidate->basepath, searched->uri, (gpointer) searched->result);
}
- return searched->result != NULL;
+ return searched->result != NULL;
}
}
Added: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.c
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.c 2007-05-11 14:10:57 UTC (rev 11598)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.c 2007-05-11 14:13:33 UTC (rev 11599)
@@ -0,0 +1,517 @@
+/*
+ * This file is part of hildon-fm package
+ *
+ * Copyright (C) 2007 Nokia Corporation. All rights reserved.
+ *
+ * Contact: Marius Vollmer <marius.vollmer at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include <glib.h>
+#include <string.h>
+
+#include "hildon-file-system-smb.h"
+#include "hildon-file-system-settings.h"
+#include "hildon-file-system-dynamic-device.h"
+#include "hildon-file-common-private.h"
+#include "hildon-file-system-private.h"
+
+static void
+hildon_file_system_smb_class_init (HildonFileSystemSmbClass *klass);
+static void
+hildon_file_system_smb_finalize (GObject *obj);
+static void
+hildon_file_system_smb_init (HildonFileSystemSmb *device);
+static HildonFileSystemSpecialLocation*
+hildon_file_system_smb_create_child_location (HildonFileSystemSpecialLocation
+ *location, gchar *uri);
+
+static gboolean
+hildon_file_system_smb_is_visible (HildonFileSystemSpecialLocation *location);
+
+static gboolean
+hildon_file_system_smb_is_available (HildonFileSystemSpecialLocation *location);
+static GtkFileSystemHandle *
+hildon_file_system_smb_get_folder (HildonFileSystemSpecialLocation *location,
+ GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GtkFileSystemGetFolderCallback callback,
+ gpointer data);
+
+static GtkFileSystemHandle *
+hildon_file_system_smb_get_workgroups_folder (GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GtkFileSystemGetFolderCallback callback,
+ gpointer data);
+
+G_DEFINE_TYPE (HildonFileSystemSmb,
+ hildon_file_system_smb,
+ HILDON_TYPE_FILE_SYSTEM_REMOTE_DEVICE);
+
+static void
+hildon_file_system_smb_class_init (HildonFileSystemSmbClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ HildonFileSystemSpecialLocationClass *location =
+ HILDON_FILE_SYSTEM_SPECIAL_LOCATION_CLASS (klass);
+
+ gobject_class->finalize = hildon_file_system_smb_finalize;
+ location->create_child_location =
+ hildon_file_system_smb_create_child_location;
+ location->get_folder = hildon_file_system_smb_get_folder;
+
+ location->requires_access = FALSE;
+ location->is_visible = hildon_file_system_smb_is_visible;
+ location->is_available = hildon_file_system_smb_is_available;
+}
+
+static void
+iap_connected_changed (GObject *settings, GParamSpec *param, gpointer data)
+{
+ HildonFileSystemSmb *smb = HILDON_FILE_SYSTEM_SMB (data);
+
+ smb->has_children = FALSE;
+ g_signal_emit_by_name (data, "connection-state");
+ g_signal_emit_by_name (data, "rescan");
+}
+
+static void
+hildon_file_system_smb_init (HildonFileSystemSmb *device)
+{
+ HildonFileSystemSettings *fs_settings;
+ HildonFileSystemSpecialLocation *location;
+
+ fs_settings = _hildon_file_system_settings_get_instance ();
+
+ location = HILDON_FILE_SYSTEM_SPECIAL_LOCATION (device);
+ location->compatibility_type = HILDON_FILE_SYSTEM_MODEL_GATEWAY;
+ location->fixed_icon = g_strdup ("qgn_list_filesys_samba");
+ location->fixed_title = g_strdup (_("sfil_li_samba"));
+ location->failed_access_message = NULL;
+
+ device->has_children = FALSE;
+
+ device->connected_handler_id =
+ g_signal_connect (fs_settings,
+ "notify::iap-connected",
+ G_CALLBACK (iap_connected_changed),
+ device);
+}
+
+static void
+hildon_file_system_smb_finalize (GObject *obj)
+{
+ HildonFileSystemSmb *smb;
+ HildonFileSystemSettings *fs_settings;
+
+ smb = HILDON_FILE_SYSTEM_SMB (obj);
+
+ fs_settings = _hildon_file_system_settings_get_instance ();
+ if (g_signal_handler_is_connected (fs_settings,
+ smb->connected_handler_id))
+ {
+ g_signal_handler_disconnect (fs_settings,
+ smb->connected_handler_id);
+ }
+
+ G_OBJECT_CLASS (hildon_file_system_smb_parent_class)->finalize (obj);
+}
+
+HildonFileSystemSpecialLocation*
+hildon_file_system_smb_create_child_location (HildonFileSystemSpecialLocation
+ *location, gchar *uri)
+{
+ HildonFileSystemSpecialLocation *child = NULL;
+ gchar *skipped, *found;
+
+ skipped = uri + strlen (location->basepath) + 1;
+ found = strchr (skipped, G_DIR_SEPARATOR);
+
+ if (found == NULL || found[1] == 0)
+ {
+ child = g_object_new(HILDON_TYPE_FILE_SYSTEM_DYNAMIC_DEVICE, NULL);
+ HILDON_FILE_SYSTEM_REMOTE_DEVICE (child)->accessible =
+ HILDON_FILE_SYSTEM_REMOTE_DEVICE (location)->accessible;
+ hildon_file_system_special_location_set_icon (child,
+ "qgn_list_filesys_samba");
+ child->failed_access_message = _("sfil_ib_cannot_connect_device");
+ child->basepath = g_strdup (uri);
+ HILDON_FILE_SYSTEM_SMB (location)->has_children = TRUE;
+ }
+
+ return child;
+}
+
+static gboolean
+hildon_file_system_smb_is_visible (HildonFileSystemSpecialLocation *location)
+{
+ if (!HILDON_FILE_SYSTEM_SMB (location)->has_children)
+ return FALSE;
+ else
+ return hildon_file_system_smb_is_available (location);
+}
+
+static gboolean
+hildon_file_system_smb_is_available (HildonFileSystemSpecialLocation *location)
+{
+ HildonFileSystemSettings *fs_settings;
+ gboolean connected;
+
+ fs_settings = _hildon_file_system_settings_get_instance ();
+ g_object_get (fs_settings, "iap-connected", &connected, NULL);
+ return connected;
+}
+
+static GtkFileSystemHandle *
+hildon_file_system_smb_get_folder (HildonFileSystemSpecialLocation *location,
+ GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GtkFileSystemGetFolderCallback callback,
+ gpointer data)
+{
+ return hildon_file_system_smb_get_workgroups_folder (file_system,
+ path,
+ types,
+ callback,
+ data);
+}
+
+
+/* Collapsing GtkFileFolders
+
+ XXX - This just implements enough to make the weird smb://
+ namespace work.
+ */
+
+#define MY_TYPE_FILE_FOLDER (my_file_folder_get_type ())
+#define MY_FILE_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_FILE_FOLDER, MyFileFolder))
+#define MY_IS_FILE_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_FILE_FOLDER))
+#define MY_FILE_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MY_TYPE_FILE_FOLDER, MyFileFolderClass))
+#define MY_IS_FILE_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MY_TYPE_FILE_FOLDER))
+#define MY_FILE_FOLDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MY_TYPE_FILE_FOLDER, MyFileFolderClass))
+
+typedef struct _MyFileFolder MyFileFolder;
+typedef struct _MyFileFolderClass MyFileFolderClass;
+
+struct _MyFileFolderClass
+{
+ GObjectClass parent_class;
+};
+
+struct _MyFileFolder
+{
+ GObject parent_instance;
+
+ GtkFileSystem *filesystem;
+ GtkFileInfoType types;
+ GtkFileFolder *root;
+ GList *children;
+};
+
+static GType my_file_folder_get_type (void);
+static void my_file_folder_iface_init (GtkFileFolderIface *iface);
+static void my_file_folder_init (MyFileFolder *impl);
+static void my_file_folder_finalize (GObject *object);
+
+static GtkFileInfo *my_file_folder_get_info (GtkFileFolder *folder,
+ const GtkFilePath *path,
+ GError **error);
+static gboolean my_file_folder_list_children (GtkFileFolder *folder,
+ GSList **children,
+ GError **error);
+static gboolean my_file_folder_is_finished_loading (GtkFileFolder *folder);
+
+G_DEFINE_TYPE_WITH_CODE (MyFileFolder, my_file_folder, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_FILE_FOLDER,
+ my_file_folder_iface_init))
+
+static void
+my_file_folder_class_init (MyFileFolderClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+ gobject_class->finalize = my_file_folder_finalize;
+}
+
+static void
+my_file_folder_iface_init (GtkFileFolderIface *iface)
+{
+ iface->get_info = my_file_folder_get_info;
+ iface->list_children = my_file_folder_list_children;
+ iface->is_finished_loading = my_file_folder_is_finished_loading;
+}
+
+static void
+my_file_folder_init (MyFileFolder *impl)
+{
+ impl->filesystem = NULL;
+ impl->root = NULL;
+ impl->children = NULL;
+}
+
+static void
+my_file_folder_finalize (GObject *object)
+{
+ MyFileFolder *folder = MY_FILE_FOLDER (object);
+ GList *c;
+
+ if (folder->root)
+ g_object_unref (folder->root);
+
+ for (c = folder->children; c; c = c->next)
+ g_object_unref (c->data);
+ g_list_free (folder->children);
+
+ g_object_unref (folder->filesystem);
+
+ G_OBJECT_CLASS (my_file_folder_parent_class)->finalize (object);
+}
+
+static GtkFileInfo *
+my_file_folder_get_info (GtkFileFolder *folder,
+ const GtkFilePath *path,
+ GError **error)
+{
+ GtkFileInfo *info;
+
+ /* XXX - maybe provide more detail...
+ */
+
+ info = gtk_file_info_new ();
+ gtk_file_info_set_display_name (info,
+ g_basename
+ (gtk_file_path_get_string (path)));
+ gtk_file_info_set_is_folder (info, TRUE);
+ return info;
+}
+
+static gboolean
+my_file_folder_list_children (GtkFileFolder *folder,
+ GSList **children,
+ GError **error)
+{
+ MyFileFolder *my_folder = MY_FILE_FOLDER (folder);
+ GList *c;
+
+ *children = NULL;
+ for (c = my_folder->children; c; c = c->next)
+ {
+ GSList *childrens_children;
+ if (!gtk_file_folder_list_children (GTK_FILE_FOLDER (c->data),
+ &childrens_children, error))
+ {
+ g_slist_free (*children);
+ return FALSE;
+ }
+ *children = g_slist_append (*children, childrens_children);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+my_file_folder_is_finished_loading (GtkFileFolder *folder)
+{
+ MyFileFolder *my_folder = MY_FILE_FOLDER (folder);
+ GList *c;
+
+ if (!gtk_file_folder_is_finished_loading (GTK_FILE_FOLDER (my_folder->root)))
+ return FALSE;
+
+ for (c = my_folder->children; c; c = c->next)
+ {
+ if (!gtk_file_folder_is_finished_loading (GTK_FILE_FOLDER (c->data)))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static char *
+strchr_reverse (char *front, char *start, char ch)
+{
+ if (front == NULL)
+ return NULL;
+
+ if (start == NULL)
+ start = front + strlen (front);
+
+ while (start > front)
+ {
+ start--;
+ if (*start == ch)
+ return start;
+ }
+
+ return NULL;
+}
+
+static GtkFilePath *
+my_file_folder_collaps_path (GtkFilePath *from)
+{
+ /* We collapse the second to last component.
+ */
+
+ const char *str = gtk_file_path_get_string (from);
+ char *new_str = g_strdup (str);
+ char *last_slash = strchr_reverse (new_str, NULL, '/');
+ char *second_last_slash = strchr_reverse (new_str, last_slash, '/');
+
+ fprintf (stderr, "/ %s\n", last_slash);
+ fprintf (stderr, "// %s\n", second_last_slash);
+
+ if (second_last_slash)
+ strcpy (second_last_slash + 1, last_slash + 1);
+
+ return gtk_file_path_new_steal (new_str);
+}
+
+static void
+my_file_folder_child_files_added (GtkFileFolder *folder,
+ GSList *paths,
+ gpointer data)
+{
+ MyFileFolder *my_folder = MY_FILE_FOLDER (data);
+
+ fprintf (stderr, "CHILD_FILES_ADDED\n");
+
+ GSList *my_paths;
+ my_paths = NULL;
+ while (paths)
+ {
+ GtkFilePath *p = paths->data;
+ GtkFilePath *my_p = my_file_folder_collaps_path (p);
+
+ my_paths = g_slist_append (my_paths, my_p);
+ paths = paths->next;
+ }
+
+ g_signal_emit_by_name (my_folder, "files-added", my_paths);
+
+ {
+ GSList *p;
+ for (p = my_paths; p; p = p->next)
+ gtk_file_path_free (p->data);
+ g_slist_free (my_paths);
+ }
+}
+
+static void
+my_file_folder_child_folder_added (GtkFileSystemHandle *handle,
+ GtkFileFolder *folder,
+ const GError *error,
+ gpointer data)
+{
+ MyFileFolder *my_folder = MY_FILE_FOLDER (data);
+
+ g_object_unref (handle);
+
+ if (folder)
+ {
+ my_folder->children = g_list_append (my_folder->children,
+ folder);
+ g_signal_connect (folder, "files-added",
+ G_CALLBACK (my_file_folder_child_files_added),
+ my_folder);
+ }
+}
+
+
+static void
+my_file_folder_root_files_added (GtkFileFolder *folder,
+ GSList *paths,
+ gpointer data)
+{
+ MyFileFolder *my_folder = MY_FILE_FOLDER (data);
+
+ fprintf (stderr, "ROOT_FILES_ADDED\n");
+
+ while (paths)
+ {
+ GtkFilePath *p = paths->data;
+ gtk_file_system_get_folder (my_folder->filesystem,
+ p,
+ my_folder->types,
+ my_file_folder_child_folder_added,
+ my_folder);
+ paths = paths->next;
+ }
+}
+
+static void
+my_file_folder_setup_root (MyFileFolder *my_folder, GtkFileFolder *root)
+{
+ my_folder->root = root;
+ g_signal_connect (root, "files-added",
+ G_CALLBACK (my_file_folder_root_files_added), my_folder);
+}
+
+struct get_root_folder_clos {
+ GtkFileSystem *filesystem;
+ GtkFileInfoType types;
+ GtkFileSystemGetFolderCallback callback;
+ gpointer data;
+};
+
+static void
+get_root_folder_callback (GtkFileSystemHandle *handle,
+ GtkFileFolder *folder,
+ const GError *error,
+ gpointer data)
+{
+ struct get_root_folder_clos *clos = data;
+ MyFileFolder *my_folder = NULL;
+
+ if (!handle->cancelled && folder && error == NULL)
+ {
+ my_folder = g_object_new (MY_TYPE_FILE_FOLDER, NULL);
+ my_folder->filesystem = clos->filesystem;
+ my_folder->types = clos->types;
+ my_file_folder_setup_root (my_folder, folder);
+ }
+ else
+ {
+ if (folder)
+ g_object_unref (folder);
+ }
+
+ clos->callback (handle, GTK_FILE_FOLDER (my_folder), error, clos->data);
+ g_free (clos);
+}
+
+static GtkFileSystemHandle *
+hildon_file_system_smb_get_workgroups_folder (GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GtkFileSystemGetFolderCallback callback,
+ gpointer data)
+{
+ struct get_root_folder_clos *clos = g_new (struct get_root_folder_clos, 1);
+
+ clos->filesystem = g_object_ref (file_system);
+ clos->types = types;
+ clos->callback = callback;
+ clos->data = data;
+ return gtk_file_system_get_folder (file_system,
+ path,
+ types,
+ get_root_folder_callback,
+ clos);
+}
+
Added: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.h
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.h 2007-05-11 14:10:57 UTC (rev 11598)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-smb.h 2007-05-11 14:13:33 UTC (rev 11599)
@@ -0,0 +1,59 @@
+/*
+ * This file is part of hildon-fm package
+ *
+ * Copyright (C) 2007 Nokia Corporation. All rights reserved.
+ *
+ * Contact: Marius Vollmer <marius.vollmer at nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifndef HILDON_FILE_SYSTEM_SMB_H_
+#define HILDON_FILE_SYSTEM_SMB_H_
+
+#include "hildon-file-system-remote-device.h"
+
+G_BEGIN_DECLS
+
+#define HILDON_TYPE_FILE_SYSTEM_SMB (hildon_file_system_smb_get_type ())
+#define HILDON_FILE_SYSTEM_SMB(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), HILDON_TYPE_FILE_SYSTEM_SMB, HildonFileSystemSmb))
+#define HILDON_FILE_SYSTEM_SMB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), HILDON_TYPE_FILE_SYSTEM_SMB, HildonFileSystemSmbClass))
+#define HILDON_IS_FILE_SYSTEM_SMB(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HILDON_TYPE_FILE_SYSTEM_SMB))
+#define HILDON_IS_FILE_SYSTEM_SMB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), HILDON_TYPE_FILE_SYSTEM_SMB))
+#define HILDON_FILE_SYSTEM_SMB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), HILDON_TYPE_FILE_SYSTEM_SMB, HildonFileSystemSmbClass))
+
+
+typedef struct _HildonFileSystemSmb HildonFileSystemSmb;
+typedef struct _HildonFileSystemSmbClass HildonFileSystemSmbClass;
+
+
+struct _HildonFileSystemSmb
+{
+ HildonFileSystemRemoteDevice parent_instance;
+ gboolean has_children;
+ gint connected_handler_id;
+};
+
+struct _HildonFileSystemSmbClass
+{
+ HildonFileSystemRemoteDeviceClass parent_class;
+};
+
+GType hildon_file_system_smb_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif
Modified: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.c
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.c 2007-05-11 14:10:57 UTC (rev 11598)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.c 2007-05-11 14:13:33 UTC (rev 11599)
@@ -279,13 +279,6 @@
return FALSE;
}
-/* If the given path is an immediate child of the location and location thinks
- * that the path is actually a device as well, it creates a new dynamic
- * location.
- * This functionality is used when dynamic device are appended to the tree.
- * If not, NULL is returned. If child_type == 0 or subclass doesn't implement
- * this, NULL is returned always.
- * THIS IS CALLED BY _hildon_file_system_get_special_location ONLY */
HildonFileSystemSpecialLocation*
hildon_file_system_special_location_create_child_location (
HildonFileSystemSpecialLocation *location, gchar *uri)
@@ -316,6 +309,38 @@
if (klass->volumes_changed)
return klass->volumes_changed (location, fs);
}
+
+GtkFileSystemHandle *
+hildon_file_system_special_location_get_folder
+ (HildonFileSystemSpecialLocation *location,
+ GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GtkFileSystemGetFolderCallback callback,
+ gpointer data)
+{
+ HildonFileSystemSpecialLocationClass *klass;
+
+ g_return_val_if_fail (HILDON_IS_FILE_SYSTEM_SPECIAL_LOCATION (location),
+ NULL);
+
+ klass = HILDON_FILE_SYSTEM_SPECIAL_LOCATION_GET_CLASS (location);
+
+ if (klass->get_folder)
+ return klass->get_folder (location,
+ file_system,
+ path,
+ types,
+ callback,
+ data);
+ else
+ return gtk_file_system_get_folder (file_system,
+ path,
+ types,
+ callback,
+ data);
+}
+
/* Convenience function for setting fixed name. If fixed name is enough, name
* related virtual functions are not needed to be overwritten by subclasses.*/
void
Modified: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.h
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.h 2007-05-11 14:10:57 UTC (rev 11598)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-system-special-location.h 2007-05-11 14:13:33 UTC (rev 11599)
@@ -55,7 +55,6 @@
typedef struct _HildonFileSystemSpecialLocationClass
HildonFileSystemSpecialLocationClass;
-
struct _HildonFileSystemSpecialLocation
{
GObject parent_instance;
@@ -69,23 +68,29 @@
struct _HildonFileSystemSpecialLocationClass
{
- GObjectClass parent_class;
+ GObjectClass parent_class;
- /* private */
- gchar* (*get_display_name) (HildonFileSystemSpecialLocation *location, GtkFileSystem *fs);
- gchar* (*get_extra_info) (HildonFileSystemSpecialLocation *location);
- GdkPixbuf* (*get_icon) (HildonFileSystemSpecialLocation *location,
- GtkFileSystem *fs, GtkWidget *ref_widget, int size);
- gboolean (*is_available) (HildonFileSystemSpecialLocation *location);
- gboolean (*is_visible) (HildonFileSystemSpecialLocation *location);
- gchar* (*get_unavailable_reason) (HildonFileSystemSpecialLocation *location);
- gboolean (*requires_access) (HildonFileSystemSpecialLocation *location);
- gboolean (*failed_access) (HildonFileSystemSpecialLocation *location);
- HildonFileSystemSpecialLocation* (*create_child_location)
- (HildonFileSystemSpecialLocation *location, gchar *uri);
- void (*volumes_changed) (HildonFileSystemSpecialLocation *location,
+ /* private */
+ gchar* (*get_display_name) (HildonFileSystemSpecialLocation *location, GtkFileSystem *fs);
+ gchar* (*get_extra_info) (HildonFileSystemSpecialLocation *location);
+ GdkPixbuf* (*get_icon) (HildonFileSystemSpecialLocation *location,
+ GtkFileSystem *fs, GtkWidget *ref_widget, int size);
+ gboolean (*is_available) (HildonFileSystemSpecialLocation *location);
+ gboolean (*is_visible) (HildonFileSystemSpecialLocation *location);
+ gchar* (*get_unavailable_reason) (HildonFileSystemSpecialLocation *location);
+ gboolean (*requires_access) (HildonFileSystemSpecialLocation *location);
+ gboolean (*failed_access) (HildonFileSystemSpecialLocation *location);
+ HildonFileSystemSpecialLocation* (*create_child_location) (HildonFileSystemSpecialLocation *location, gchar *uri);
+ void (*volumes_changed) (HildonFileSystemSpecialLocation *location,
GtkFileSystem *fs);
+ GtkFileSystemHandle * (*get_folder) (HildonFileSystemSpecialLocation *location,
+ GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GtkFileSystemGetFolderCallback callback,
+ gpointer data);
+
/* signals */
void (*changed) (GObject *obj);
void (*connection_state) (GObject *obj);
@@ -134,19 +139,24 @@
* ignore this, but may also want to be removed from the model */
gboolean hildon_file_system_special_location_failed_access (HildonFileSystemSpecialLocation *location);
-/* If the given path is an immediate child of the location and location thinks
- * that the path is actually a device as well, it creates a new dynamic
- * location.
- * This functionality is used when dynamic device are appended to the tree.
- * If not, NULL is returned. If child_type == 0 or subclass doesn't implement
- * this, NULL is returned always.
- * THIS IS CALLED BY _hildon_file_system_get_special_location ONLY */
+/* Determine whether URI should be considered a immediate child of
+ LOCATION and return the special location object for it, if so. The
+ BASEPATH of LOCATION is guaranteed to be a prefix of URI.
+*/
HildonFileSystemSpecialLocation *
hildon_file_system_special_location_create_child_location (HildonFileSystemSpecialLocation *location, gchar *uri);
void
hildon_file_system_special_location_volumes_changed (HildonFileSystemSpecialLocation *location, GtkFileSystem *fs);
+GtkFileSystemHandle *
+hildon_file_system_special_location_get_folder (HildonFileSystemSpecialLocation *location,
+ GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GtkFileSystemGetFolderCallback callback,
+ gpointer data);
+
/* Convenience function for setting fixed name. If fixed name is enough, name
* related virtual functions are not needed to be overwritten by subclasses.*/
void hildon_file_system_special_location_set_display_name (HildonFileSystemSpecialLocation *location, const gchar *name);
- Previous message: [maemo-commits] r11597 - in projects/haf/trunk/fontconfig: . debian
- Next message: [maemo-commits] r11600 - in projects/haf/trunk/hildon-fm: . debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
