[nautilus-sendto] Merge some helper libraries into one



commit 91d25632e6e1c1b6c3d340ac0569ae520096c35a
Author: Bastien Nocera <hadess hadess net>
Date:   Fri Aug 20 18:52:05 2010 +0100

    Merge some helper libraries into one
    
    So that the packer can be exported to other plugins.

 src/plugins/Makefile.am                   |   21 +-
 src/plugins/evolution/Makefile.am         |    2 +-
 src/plugins/evolution/evolution.c         |    2 +-
 src/plugins/nautilus-sendto-packer.c      |  434 +++++++++++++++++++++++++++++
 src/plugins/nautilus-sendto-packer.h      |   54 ++++
 src/plugins/nst-common.c                  |  408 ---------------------------
 src/plugins/nst-common.h                  |   34 ---
 src/plugins/removable-devices/Makefile.am |    2 +-
 8 files changed, 498 insertions(+), 459 deletions(-)
---
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index 6d445b5..9f5531b 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -2,26 +2,20 @@ SUBDIRS = . removable-devices evolution
 #SUBDIRS = . $(PLUGINS)
 DIST_SUBDIRS = $(ALL_PLUGINS)
 
-NST_COMMON_SOURCES = nst-common.c nst-common.h
-
-noinst_LTLIBRARIES = libnstcommon.la
-libnstcommon_la_SOURCES = $(NST_COMMON_SOURCES)
-libnstcommon_la_CFLAGS = $(NAUTILUS_SENDTO_CFLAGS) -DUIDIR=\""$(uidir)"\"
-libnstcommon_la_LIBADD = $(NAUTILUS_SENDTO_LIBS)
-
-EXTRA_DIST = $(NST_COMMON_SOURCES)
-
 nautilus_sendto_includedir = $(includedir)/nautilus-sendto/
-nautilus_sendto_include_HEADERS = nautilus-sendto-plugin.h
+nautilus_sendto_include_HEADERS = nautilus-sendto-plugin.h nst-common.h nautilus-sendto-packer.h
 
 lib_LTLIBRARIES = libnautilussendto-1.0.la
-libnautilussendto_1_0_la_SOURCES = nautilus-sendto-plugin.h nautilus-sendto-plugin.c
+libnautilussendto_1_0_la_SOURCES =				\
+	nautilus-sendto-plugin.c				\
+	nst-common.c						\
+	nautilus-sendto-packer.c				\
+	$(nautilus_sendto_include_HEADERS)
 libnautilussendto_1_0_la_LIBADD = $(NAUTILUS_SENDTO_LIBS)
-libnautilussendto_1_0_la_CFLAGS = $(NAUTILUS_SENDTO_CFLAGS)
+libnautilussendto_1_0_la_CFLAGS = $(NAUTILUS_SENDTO_CFLAGS) -DUIDIR=\""$(uidir)"\"
 
 uidir = $(datadir)/nautilus-sendto/ui
 
-if HAVE_INTROSPECTION
 -include $(INTROSPECTION_MAKEFILE)
 INTROSPECTION_GIRS = NautilusSendto-1.0.gir
 INTROSPECTION_SCANNER_ARGS = --add-include-path=$(top_builddir)/src --warn-all
@@ -42,5 +36,4 @@ typelibdir = $(libdir)/girepository-1.0
 typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 
 CLEANFILES = $(gir_DATA) $(typelib_DATA)
-endif
 
diff --git a/src/plugins/evolution/Makefile.am b/src/plugins/evolution/Makefile.am
index de4e539..e5ce04e 100644
--- a/src/plugins/evolution/Makefile.am
+++ b/src/plugins/evolution/Makefile.am
@@ -32,7 +32,7 @@ plugin_LTLIBRARIES = libnstevolution.la
 
 libnstevolution_la_SOURCES = evolution.c $(CLA_FILES) $(MARSHALFILES)
 libnstevolution_la_LDFLAGS = -module -avoid-version
-libnstevolution_la_LIBADD = $(NST_EBOOK_LIBS) $(NAUTILUS_SENDTO_LIBS) $(builddir)/../libnstcommon.la $(builddir)/../libnautilussendto-1.0.la
+libnstevolution_la_LIBADD = $(NST_EBOOK_LIBS) $(NAUTILUS_SENDTO_LIBS) $(builddir)/../libnautilussendto-1.0.la
 
 EXTRA_DIST = $(CLA_FILES) $(plugin_in_files)
 CLEANFILES = econtactentry-marshal.c econtactentry-marshal.h
diff --git a/src/plugins/evolution/evolution.c b/src/plugins/evolution/evolution.c
index 5731c59..34cda98 100644
--- a/src/plugins/evolution/evolution.c
+++ b/src/plugins/evolution/evolution.c
@@ -26,7 +26,7 @@
 #include <glib/gi18n-lib.h>
 #include <string.h>
 #include "nautilus-sendto-plugin.h"
-#include "nst-common.h"
+#include "nautilus-sendto-packer.h"
 
 #define EVOLUTION_TYPE_PLUGIN         (evolution_plugin_get_type ())
 #define EVOLUTION_PLUGIN(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), EVOLUTION_TYPE_PLUGIN, EvolutionPlugin))
diff --git a/src/plugins/nautilus-sendto-packer.c b/src/plugins/nautilus-sendto-packer.c
new file mode 100644
index 0000000..1d4cab5
--- /dev/null
+++ b/src/plugins/nautilus-sendto-packer.c
@@ -0,0 +1,434 @@
+/*
+ *
+ * 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 av.
+ *
+ * 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.
+ *
+ * Author:  Maxim Ermilov <ermilov maxim gmail com>
+ */
+
+#include "config.h"
+
+#include <gio/gio.h>
+#include <glib/gi18n-lib.h>
+#include "nautilus-sendto-packer.h"
+
+#define NAUTILUS_SENDTO_LAST_COMPRESS	"last-compress"
+
+struct NstPackWidgetPrivate {
+	GtkWidget *pack_combobox;
+	GtkWidget *pack_entry;
+	GtkWidget *pack_checkbutton;
+	gboolean can_send;
+};
+
+G_DEFINE_TYPE (NstPackWidget, nst_pack_widget, GTK_TYPE_VBOX)
+#define NST_PACK_WIDGET_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NST_TYPE_PACK_WIDGET, NstPackWidgetPrivate))
+
+static void pack_entry_changed_cb (GObject *object, GParamSpec *spec, NstPackWidget *widget);
+static void toggle_pack_check (GtkWidget *toggle, NstPackWidget *widget);
+
+enum {
+	PROP_0,
+	PROP_CAN_SEND
+};
+
+static char *
+get_filename_from_list (GList *file_list)
+{
+	GList *l;
+	GString *common_part = NULL;
+	gboolean matches = TRUE;
+	guint offset = 0;
+	const char *encoding;
+	gboolean use_utf8 = TRUE;
+
+	encoding = g_getenv ("G_FILENAME_ENCODING");
+
+	if (encoding != NULL && strcasecmp (encoding, "UTF-8") != 0)
+		use_utf8 = FALSE;
+
+	if (file_list == NULL)
+		return NULL;
+
+	common_part = g_string_new ("");
+
+	while (TRUE) {
+		gunichar cur_char = '\0';
+		for (l = file_list; l ; l = l->next) {
+			char *path = NULL, *name = NULL;
+			char *offset_name = NULL;
+
+			path = g_filename_from_uri ((char *) l->data, NULL, NULL);
+			if (!path)
+				break;
+
+			name = g_path_get_basename (path);
+
+			if (!use_utf8) {
+				char *tmp;
+
+				tmp = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
+				g_free (name);
+				name = tmp;
+			}
+
+			if (!name) {
+				g_free (path);
+				break;
+			}
+
+			if (offset >= g_utf8_strlen (name, -1)) {
+				g_free(name);
+				g_free(path);
+				matches = FALSE;
+				break;
+			}
+
+			offset_name = g_utf8_offset_to_pointer (name, offset);
+
+			if (offset_name == g_utf8_strrchr (name, -1, '.')) {
+				g_free (name);
+				g_free (path);
+				matches = FALSE;
+				break;
+			}
+			if (cur_char == '\0') {
+				cur_char = g_utf8_get_char (offset_name);
+			} else if (cur_char != g_utf8_get_char (offset_name)) {
+				g_free (name);
+				g_free (path);
+				matches = FALSE;
+				break;
+			}
+			g_free (name);
+			g_free (path);
+		}
+		if (matches == TRUE && cur_char != '\0') {
+			offset++;
+			common_part = g_string_append_unichar (common_part,
+					cur_char);
+		} else {
+			break;
+		}
+	}
+
+	if (g_utf8_strlen (common_part->str, -1) < 4) {
+		g_string_free (common_part, TRUE);
+		return NULL;
+	}
+
+	return g_string_free (common_part, FALSE);
+}
+
+static void
+nst_pack_widget_get_property (GObject    *object,
+			      guint       property_id,
+			      GValue     *value,
+			      GParamSpec *pspec)
+{
+	NstPackWidget *widget;
+
+	widget = NST_PACK_WIDGET (object);
+
+	switch (property_id) {
+	case PROP_CAN_SEND:
+		g_value_set_boolean (value, widget->priv->can_send);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+	}
+}
+
+static void
+nst_pack_widget_class_init (NstPackWidgetClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->get_property = nst_pack_widget_get_property;
+
+	g_object_class_install_property (object_class, PROP_CAN_SEND,
+					 g_param_spec_boolean ("can-send", "Can send", "Whether the text entry is filled if compression is active.",
+							       TRUE, G_PARAM_READABLE));
+
+	g_type_class_add_private (klass, sizeof (NstPackWidgetPrivate));
+}
+
+static void
+nst_pack_widget_init (NstPackWidget *self)
+{
+	GtkBuilder *builder;
+	GError *error = NULL;
+	GtkWidget *vbox;
+	NstPackWidgetPrivate *priv;
+	GSettings *settings;
+	const char *ui_file;
+
+	self->priv = NST_PACK_WIDGET_GET_PRIVATE (self);
+	priv = self->priv;
+
+	builder = gtk_builder_new ();
+	if (g_getenv ("NST_RUN_FROM_BUILDDIR") != NULL)
+		ui_file = "../data/pack-entry.ui";
+	else
+		ui_file = UIDIR "/" "pack-entry.ui";
+
+	if (!gtk_builder_add_from_file (builder, ui_file, &error)) {
+		g_warning ("Couldn't load builder file '%s': %s", ui_file, error->message);
+		g_error_free (error);
+	}
+
+	vbox = GTK_WIDGET (gtk_builder_get_object (builder, "vbox4"));
+	priv->pack_combobox = GTK_WIDGET (gtk_builder_get_object (builder, "pack_combobox"));
+	priv->pack_entry = GTK_WIDGET (gtk_builder_get_object (builder, "pack_entry"));
+	priv->pack_checkbutton = GTK_WIDGET (gtk_builder_get_object (builder, "pack_checkbutton"));
+
+	gtk_entry_set_text (GTK_ENTRY (priv->pack_entry), _("Files"));
+
+	g_signal_connect (G_OBJECT (priv->pack_entry), "notify::text",
+			  G_CALLBACK (pack_entry_changed_cb), self);
+	g_signal_connect (G_OBJECT (priv->pack_checkbutton), "toggled",
+			  G_CALLBACK (toggle_pack_check), self);
+	nst_pack_widget_set_enabled (self, FALSE);
+	/* Because the default is FALSE, and we're not changing the value */
+	toggle_pack_check (priv->pack_checkbutton, self);
+
+	settings = g_settings_new ("org.gnome.Nautilus.Sendto");
+	gtk_combo_box_set_active (GTK_COMBO_BOX (priv->pack_combobox),
+				  g_settings_get_int (settings,
+						      NAUTILUS_SENDTO_LAST_COMPRESS));
+	g_object_unref (settings);
+
+	gtk_container_add (GTK_CONTAINER (self), vbox);
+}
+
+void
+nst_pack_widget_set_enabled (NstPackWidget *widget,
+			     gboolean       enabled)
+{
+	g_return_if_fail (NST_PACK_WIDGET (widget));
+
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget->priv->pack_checkbutton), enabled);
+	/* The toggled callback will take care of making the entry unsensitive */
+}
+
+gboolean
+nst_pack_widget_get_enabled (NstPackWidget *widget)
+{
+	g_return_val_if_fail (NST_PACK_WIDGET (widget), FALSE);
+
+	return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget->priv->pack_checkbutton));
+}
+
+void
+nst_pack_widget_set_force_enabled (NstPackWidget *widget,
+				   gboolean       force_enabled)
+{
+	g_return_if_fail (NST_PACK_WIDGET (widget));
+
+	if (force_enabled) {
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget->priv->pack_checkbutton), TRUE);
+		gtk_widget_set_sensitive (widget->priv->pack_checkbutton, FALSE);
+	} else {
+		gtk_widget_set_sensitive (widget->priv->pack_checkbutton, TRUE);
+	}
+}
+
+gboolean
+nst_pack_widget_get_force_enabled (NstPackWidget *widget)
+{
+	g_return_val_if_fail (NST_PACK_WIDGET (widget), FALSE);
+
+	return gtk_widget_get_sensitive (widget->priv->pack_checkbutton);
+}
+
+void
+nst_pack_widget_set_from_names (NstPackWidget *widget,
+				GList         *file_list)
+{
+	NstPackWidgetPrivate *priv;
+	gboolean one_file;
+
+	priv = widget->priv;
+
+	if (file_list != NULL && file_list->next != NULL)
+		one_file = FALSE;
+	else if (file_list != NULL)
+		one_file = TRUE;
+
+	if (one_file) {
+		char *filepath, *filename;
+
+		filepath = g_filename_from_uri ((char *)file_list->data,
+						NULL, NULL);
+		filename = NULL;
+
+		if (filepath != NULL)
+			filename = g_path_get_basename (filepath);
+		if (filename != NULL && filename[0] != '\0')
+			gtk_entry_set_text (GTK_ENTRY (priv->pack_entry), filename);
+
+		g_free (filename);
+		g_free (filepath);
+	} else {
+		char *filename;
+
+		filename = get_filename_from_list (file_list);
+		if (filename != NULL && filename[0] != '\0') {
+			gtk_entry_set_text (GTK_ENTRY (priv->pack_entry),
+					    filename);
+		}
+		g_free (filename);
+	}
+}
+
+char *
+nst_pack_widget_pack_files (NstPackWidget *widget,
+			    GList         *file_list)
+{
+	char *file_roller_cmd;
+	const char *filename;
+	GList *l;
+	GString *cmd, *tmp;
+	char *pack_type, *tmp_dir, *tmp_work_dir, *packed_file;
+	NstPackWidgetPrivate *priv;
+	GSettings *settings;
+
+	priv = widget->priv;
+	file_roller_cmd = g_find_program_in_path ("file-roller");
+	filename = gtk_entry_get_text (GTK_ENTRY (widget->priv->pack_entry));
+
+	g_assert (filename != NULL && *filename != '\0');
+
+	tmp_dir = g_strdup_printf ("%s/nautilus-sendto-%s",
+				   g_get_tmp_dir (), g_get_user_name ());
+	g_mkdir (tmp_dir, 0700);
+	tmp_work_dir = g_strdup_printf ("%s/nautilus-sendto-%s/%li",
+					g_get_tmp_dir (), g_get_user_name (),
+					time (NULL));
+	g_mkdir (tmp_work_dir, 0700);
+	g_free (tmp_dir);
+
+	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (priv->pack_combobox)))
+	{
+	case 0:
+		pack_type = g_strdup (".zip");
+		break;
+	case 1:
+		pack_type = g_strdup (".tar.gz");
+		break;
+	case 2:
+		pack_type = g_strdup (".tar.bz2");
+		break;
+	default:
+		pack_type = NULL;
+		g_assert_not_reached ();
+	}
+
+	settings = g_settings_new ("org.gnome.Nautilus.Sendto");
+	g_settings_set_int (settings,
+			    NAUTILUS_SENDTO_LAST_COMPRESS,
+			    gtk_combo_box_get_active (GTK_COMBO_BOX (priv->pack_combobox)));
+	g_object_unref (settings);
+
+	cmd = g_string_new ("");
+	g_string_printf (cmd, "%s --add-to=\"%s/%s%s\"",
+			 file_roller_cmd, tmp_work_dir,
+			 filename,
+			 pack_type);
+
+	/* file-roller doesn't understand URIs */
+	for (l = file_list ; l; l=l->next){
+		char *file;
+
+		file = g_filename_from_uri (l->data, NULL, NULL);
+		g_string_append_printf (cmd," \"%s\"", file);
+		g_free (file);
+	}
+
+	g_spawn_command_line_sync (cmd->str, NULL, NULL, NULL, NULL);
+	g_string_free (cmd, TRUE);
+	tmp = g_string_new("");
+	g_string_printf (tmp,"%s/%s%s", tmp_work_dir,
+			 filename,
+			 pack_type);
+	g_free (tmp_work_dir);
+	packed_file = g_filename_to_uri (tmp->str, NULL, NULL);
+	g_string_free(tmp, TRUE);
+
+	return packed_file;
+}
+
+static void
+pack_entry_set_send_enabled (NstPackWidget *widget,
+			     gboolean       send_enabled)
+{
+	if (send_enabled != widget->priv->can_send) {
+		widget->priv->can_send = send_enabled;
+
+		g_object_notify (G_OBJECT (widget), "can-send");
+	}
+}
+
+static void
+toggle_pack_check (GtkWidget *toggle, NstPackWidget *widget)
+{
+	GtkToggleButton *t = GTK_TOGGLE_BUTTON (toggle);
+	gboolean enabled, send_enabled;
+	NstPackWidgetPrivate *priv;
+
+	priv = widget->priv;
+	enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (t));
+	gtk_widget_set_sensitive (priv->pack_combobox, enabled);
+	gtk_widget_set_sensitive (priv->pack_entry, enabled);
+
+	send_enabled = TRUE;
+
+	if (enabled) {
+		const char *filename;
+
+		filename = gtk_entry_get_text (GTK_ENTRY (priv->pack_entry));
+		if (filename == NULL || *filename == '\0')
+			send_enabled = FALSE;
+	}
+
+	pack_entry_set_send_enabled (widget, send_enabled);
+}
+
+static void
+pack_entry_changed_cb (GObject *object, GParamSpec *spec, NstPackWidget *widget)
+{
+	gboolean send_enabled;
+	NstPackWidgetPrivate *priv;
+
+	priv = widget->priv;
+	send_enabled = TRUE;
+
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->pack_checkbutton))) {
+		const char *filename;
+
+		filename = gtk_entry_get_text(GTK_ENTRY(priv->pack_entry));
+		if (filename == NULL || *filename == '\0')
+			send_enabled = FALSE;
+	}
+
+	pack_entry_set_send_enabled (widget, send_enabled);
+}
+
+GtkWidget *
+nst_pack_widget_new (void)
+{
+	return g_object_new (NST_TYPE_PACK_WIDGET, NULL);
+}
+
diff --git a/src/plugins/nautilus-sendto-packer.h b/src/plugins/nautilus-sendto-packer.h
new file mode 100644
index 0000000..05f4581
--- /dev/null
+++ b/src/plugins/nautilus-sendto-packer.h
@@ -0,0 +1,54 @@
+/*
+ * 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 av.
+ *
+ * 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.
+ *
+ * Author:  Maxim Ermilov <ermilov maxim gmail com>
+ *          Bastien Nocera <hadess hadess net>
+ */
+
+#include <gtk/gtk.h>
+
+#define NST_TYPE_PACK_WIDGET         (nst_pack_widget_get_type ())
+#define NST_PACK_WIDGET(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NST_TYPE_PACK_WIDGET, NstPackWidget))
+#define NST_PACK_WIDGET_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NST_TYPE_PACK_WIDGET, NstPackWidget))
+#define NST_IS_PACK_WIDGET(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NST_TYPE_PACK_WIDGET))
+#define NST_IS_PACK_WIDGET_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NST_TYPE_PACK_WIDGET))
+#define NST_PACK_WIDGET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NST_TYPE_PACK_WIDGET, NstPackWidgetClass))
+
+typedef struct NstPackWidgetPrivate NstPackWidgetPrivate;
+
+typedef struct {
+	GtkVBox parent;
+	NstPackWidgetPrivate *priv;
+} NstPackWidget;
+
+typedef struct {
+	GtkVBoxClass parent;
+} NstPackWidgetClass;
+
+GType nst_pack_widget_get_type      (void);
+GtkWidget *nst_pack_widget_new      (void);
+
+char *nst_pack_widget_pack_files     (NstPackWidget *widget,
+				      GList         *file_list);
+void nst_pack_widget_set_from_names  (NstPackWidget *widget,
+				      GList         *file_list);
+void nst_pack_widget_set_enabled     (NstPackWidget *widget,
+				      gboolean       enabled);
+gboolean nst_pack_widget_get_enabled (NstPackWidget *widget);
+void nst_pack_widget_set_force_enabled     (NstPackWidget *widget,
+					    gboolean       force_enabled);
+gboolean nst_pack_widget_get_force_enabled (NstPackWidget *widget);
+
diff --git a/src/plugins/nst-common.c b/src/plugins/nst-common.c
index 03afb9d..cd8d1c8 100644
--- a/src/plugins/nst-common.c
+++ b/src/plugins/nst-common.c
@@ -101,411 +101,3 @@ copy_files_to (GList *file_list, GFile *dest)
 	return retval;
 }
 
-#define NAUTILUS_SENDTO_LAST_COMPRESS	"last-compress"
-
-struct NstPackWidgetPrivate {
-	GtkWidget *pack_combobox;
-	GtkWidget *pack_entry;
-	GtkWidget *pack_checkbutton;
-	gboolean can_send;
-};
-
-G_DEFINE_TYPE (NstPackWidget, nst_pack_widget, GTK_TYPE_VBOX)
-#define NST_PACK_WIDGET_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NST_TYPE_PACK_WIDGET, NstPackWidgetPrivate))
-
-static void pack_entry_changed_cb (GObject *object, GParamSpec *spec, NstPackWidget *widget);
-static void toggle_pack_check (GtkWidget *toggle, NstPackWidget *widget);
-
-enum {
-	PROP_0,
-	PROP_CAN_SEND
-};
-
-static char *
-get_filename_from_list (GList *file_list)
-{
-	GList *l;
-	GString *common_part = NULL;
-	gboolean matches = TRUE;
-	guint offset = 0;
-	const char *encoding;
-	gboolean use_utf8 = TRUE;
-
-	encoding = g_getenv ("G_FILENAME_ENCODING");
-
-	if (encoding != NULL && strcasecmp (encoding, "UTF-8") != 0)
-		use_utf8 = FALSE;
-
-	if (file_list == NULL)
-		return NULL;
-
-	common_part = g_string_new ("");
-
-	while (TRUE) {
-		gunichar cur_char = '\0';
-		for (l = file_list; l ; l = l->next) {
-			char *path = NULL, *name = NULL;
-			char *offset_name = NULL;
-
-			path = g_filename_from_uri ((char *) l->data, NULL, NULL);
-			if (!path)
-				break;
-
-			name = g_path_get_basename (path);
-
-			if (!use_utf8) {
-				char *tmp;
-
-				tmp = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
-				g_free (name);
-				name = tmp;
-			}
-
-			if (!name) {
-				g_free (path);
-				break;
-			}
-
-			if (offset >= g_utf8_strlen (name, -1)) {
-				g_free(name);
-				g_free(path);
-				matches = FALSE;
-				break;
-			}
-
-			offset_name = g_utf8_offset_to_pointer (name, offset);
-
-			if (offset_name == g_utf8_strrchr (name, -1, '.')) {
-				g_free (name);
-				g_free (path);
-				matches = FALSE;
-				break;
-			}
-			if (cur_char == '\0') {
-				cur_char = g_utf8_get_char (offset_name);
-			} else if (cur_char != g_utf8_get_char (offset_name)) {
-				g_free (name);
-				g_free (path);
-				matches = FALSE;
-				break;
-			}
-			g_free (name);
-			g_free (path);
-		}
-		if (matches == TRUE && cur_char != '\0') {
-			offset++;
-			common_part = g_string_append_unichar (common_part,
-					cur_char);
-		} else {
-			break;
-		}
-	}
-
-	if (g_utf8_strlen (common_part->str, -1) < 4) {
-		g_string_free (common_part, TRUE);
-		return NULL;
-	}
-
-	return g_string_free (common_part, FALSE);
-}
-
-static void
-nst_pack_widget_get_property (GObject    *object,
-			      guint       property_id,
-			      GValue     *value,
-			      GParamSpec *pspec)
-{
-	NstPackWidget *widget;
-
-	widget = NST_PACK_WIDGET (object);
-
-	switch (property_id) {
-	case PROP_CAN_SEND:
-		g_value_set_boolean (value, widget->priv->can_send);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-	}
-}
-
-static void
-nst_pack_widget_class_init (NstPackWidgetClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-	object_class->get_property = nst_pack_widget_get_property;
-
-	g_object_class_install_property (object_class, PROP_CAN_SEND,
-					 g_param_spec_boolean ("can-send", "Can send", "Whether the text entry is filled if compression is active.",
-							       TRUE, G_PARAM_READABLE));
-
-	g_type_class_add_private (klass, sizeof (NstPackWidgetPrivate));
-}
-
-static void
-nst_pack_widget_init (NstPackWidget *self)
-{
-	GtkBuilder *builder;
-	GError *error = NULL;
-	GtkWidget *vbox;
-	NstPackWidgetPrivate *priv;
-	GSettings *settings;
-	const char *ui_file;
-
-	self->priv = NST_PACK_WIDGET_GET_PRIVATE (self);
-	priv = self->priv;
-
-	builder = gtk_builder_new ();
-	if (g_getenv ("NST_RUN_FROM_BUILDDIR") != NULL)
-		ui_file = "../data/pack-entry.ui";
-	else
-		ui_file = UIDIR "/" "pack-entry.ui";
-
-	if (!gtk_builder_add_from_file (builder, ui_file, &error)) {
-		g_warning ("Couldn't load builder file '%s': %s", ui_file, error->message);
-		g_error_free (error);
-	}
-
-	vbox = GTK_WIDGET (gtk_builder_get_object (builder, "vbox4"));
-	priv->pack_combobox = GTK_WIDGET (gtk_builder_get_object (builder, "pack_combobox"));
-	priv->pack_entry = GTK_WIDGET (gtk_builder_get_object (builder, "pack_entry"));
-	priv->pack_checkbutton = GTK_WIDGET (gtk_builder_get_object (builder, "pack_checkbutton"));
-
-	gtk_entry_set_text (GTK_ENTRY (priv->pack_entry), _("Files"));
-
-	g_signal_connect (G_OBJECT (priv->pack_entry), "notify::text",
-			  G_CALLBACK (pack_entry_changed_cb), self);
-	g_signal_connect (G_OBJECT (priv->pack_checkbutton), "toggled",
-			  G_CALLBACK (toggle_pack_check), self);
-	nst_pack_widget_set_enabled (self, FALSE);
-	/* Because the default is FALSE, and we're not changing the value */
-	toggle_pack_check (priv->pack_checkbutton, self);
-
-	settings = g_settings_new ("org.gnome.Nautilus.Sendto");
-	gtk_combo_box_set_active (GTK_COMBO_BOX (priv->pack_combobox),
-				  g_settings_get_int (settings,
-						      NAUTILUS_SENDTO_LAST_COMPRESS));
-	g_object_unref (settings);
-
-	gtk_container_add (GTK_CONTAINER (self), vbox);
-}
-
-void
-nst_pack_widget_set_enabled (NstPackWidget *widget,
-			     gboolean       enabled)
-{
-	g_return_if_fail (NST_PACK_WIDGET (widget));
-
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget->priv->pack_checkbutton), enabled);
-	/* The toggled callback will take care of making the entry unsensitive */
-}
-
-gboolean
-nst_pack_widget_get_enabled (NstPackWidget *widget)
-{
-	g_return_val_if_fail (NST_PACK_WIDGET (widget), FALSE);
-
-	return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget->priv->pack_checkbutton));
-}
-
-void
-nst_pack_widget_set_force_enabled (NstPackWidget *widget,
-				   gboolean       force_enabled)
-{
-	g_return_if_fail (NST_PACK_WIDGET (widget));
-
-	if (force_enabled) {
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget->priv->pack_checkbutton), TRUE);
-		gtk_widget_set_sensitive (widget->priv->pack_checkbutton, FALSE);
-	} else {
-		gtk_widget_set_sensitive (widget->priv->pack_checkbutton, TRUE);
-	}
-}
-
-gboolean
-nst_pack_widget_get_force_enabled (NstPackWidget *widget)
-{
-	g_return_val_if_fail (NST_PACK_WIDGET (widget), FALSE);
-
-	return gtk_widget_get_sensitive (widget->priv->pack_checkbutton);
-}
-
-void
-nst_pack_widget_set_from_names (NstPackWidget *widget,
-				GList         *file_list)
-{
-	NstPackWidgetPrivate *priv;
-	gboolean one_file;
-
-	priv = widget->priv;
-
-	if (file_list != NULL && file_list->next != NULL)
-		one_file = FALSE;
-	else if (file_list != NULL)
-		one_file = TRUE;
-
-	if (one_file) {
-		char *filepath, *filename;
-
-		filepath = g_filename_from_uri ((char *)file_list->data,
-						NULL, NULL);
-		filename = NULL;
-
-		if (filepath != NULL)
-			filename = g_path_get_basename (filepath);
-		if (filename != NULL && filename[0] != '\0')
-			gtk_entry_set_text (GTK_ENTRY (priv->pack_entry), filename);
-
-		g_free (filename);
-		g_free (filepath);
-	} else {
-		char *filename;
-
-		filename = get_filename_from_list (file_list);
-		if (filename != NULL && filename[0] != '\0') {
-			gtk_entry_set_text (GTK_ENTRY (priv->pack_entry),
-					    filename);
-		}
-		g_free (filename);
-	}
-}
-
-char *
-nst_pack_widget_pack_files (NstPackWidget *widget,
-			    GList         *file_list)
-{
-	char *file_roller_cmd;
-	const char *filename;
-	GList *l;
-	GString *cmd, *tmp;
-	char *pack_type, *tmp_dir, *tmp_work_dir, *packed_file;
-	NstPackWidgetPrivate *priv;
-	GSettings *settings;
-
-	priv = widget->priv;
-	file_roller_cmd = g_find_program_in_path ("file-roller");
-	filename = gtk_entry_get_text (GTK_ENTRY (widget->priv->pack_entry));
-
-	g_assert (filename != NULL && *filename != '\0');
-
-	tmp_dir = g_strdup_printf ("%s/nautilus-sendto-%s",
-				   g_get_tmp_dir (), g_get_user_name ());
-	g_mkdir (tmp_dir, 0700);
-	tmp_work_dir = g_strdup_printf ("%s/nautilus-sendto-%s/%li",
-					g_get_tmp_dir (), g_get_user_name (),
-					time (NULL));
-	g_mkdir (tmp_work_dir, 0700);
-	g_free (tmp_dir);
-
-	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (priv->pack_combobox)))
-	{
-	case 0:
-		pack_type = g_strdup (".zip");
-		break;
-	case 1:
-		pack_type = g_strdup (".tar.gz");
-		break;
-	case 2:
-		pack_type = g_strdup (".tar.bz2");
-		break;
-	default:
-		pack_type = NULL;
-		g_assert_not_reached ();
-	}
-
-	settings = g_settings_new ("org.gnome.Nautilus.Sendto");
-	g_settings_set_int (settings,
-			    NAUTILUS_SENDTO_LAST_COMPRESS,
-			    gtk_combo_box_get_active (GTK_COMBO_BOX (priv->pack_combobox)));
-	g_object_unref (settings);
-
-	cmd = g_string_new ("");
-	g_string_printf (cmd, "%s --add-to=\"%s/%s%s\"",
-			 file_roller_cmd, tmp_work_dir,
-			 filename,
-			 pack_type);
-
-	/* file-roller doesn't understand URIs */
-	for (l = file_list ; l; l=l->next){
-		char *file;
-
-		file = g_filename_from_uri (l->data, NULL, NULL);
-		g_string_append_printf (cmd," \"%s\"", file);
-		g_free (file);
-	}
-
-	g_spawn_command_line_sync (cmd->str, NULL, NULL, NULL, NULL);
-	g_string_free (cmd, TRUE);
-	tmp = g_string_new("");
-	g_string_printf (tmp,"%s/%s%s", tmp_work_dir,
-			 filename,
-			 pack_type);
-	g_free (tmp_work_dir);
-	packed_file = g_filename_to_uri (tmp->str, NULL, NULL);
-	g_string_free(tmp, TRUE);
-
-	return packed_file;
-}
-
-static void
-pack_entry_set_send_enabled (NstPackWidget *widget,
-			     gboolean       send_enabled)
-{
-	if (send_enabled != widget->priv->can_send) {
-		widget->priv->can_send = send_enabled;
-
-		g_object_notify (G_OBJECT (widget), "can-send");
-	}
-}
-
-static void
-toggle_pack_check (GtkWidget *toggle, NstPackWidget *widget)
-{
-	GtkToggleButton *t = GTK_TOGGLE_BUTTON (toggle);
-	gboolean enabled, send_enabled;
-	NstPackWidgetPrivate *priv;
-
-	priv = widget->priv;
-	enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (t));
-	gtk_widget_set_sensitive (priv->pack_combobox, enabled);
-	gtk_widget_set_sensitive (priv->pack_entry, enabled);
-
-	send_enabled = TRUE;
-
-	if (enabled) {
-		const char *filename;
-
-		filename = gtk_entry_get_text (GTK_ENTRY (priv->pack_entry));
-		if (filename == NULL || *filename == '\0')
-			send_enabled = FALSE;
-	}
-
-	pack_entry_set_send_enabled (widget, send_enabled);
-}
-
-static void
-pack_entry_changed_cb (GObject *object, GParamSpec *spec, NstPackWidget *widget)
-{
-	gboolean send_enabled;
-	NstPackWidgetPrivate *priv;
-
-	priv = widget->priv;
-	send_enabled = TRUE;
-
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->pack_checkbutton))) {
-		const char *filename;
-
-		filename = gtk_entry_get_text(GTK_ENTRY(priv->pack_entry));
-		if (filename == NULL || *filename == '\0')
-			send_enabled = FALSE;
-	}
-
-	pack_entry_set_send_enabled (widget, send_enabled);
-}
-
-GtkWidget *
-nst_pack_widget_new (void)
-{
-	return g_object_new (NST_TYPE_PACK_WIDGET, NULL);
-}
-
diff --git a/src/plugins/nst-common.h b/src/plugins/nst-common.h
index 7a439ce..3b312ed 100644
--- a/src/plugins/nst-common.h
+++ b/src/plugins/nst-common.h
@@ -22,37 +22,3 @@
 
 gboolean copy_files_to (GList *file_list, GFile *dest);
 
-#include <gtk/gtk.h>
-
-#define NST_TYPE_PACK_WIDGET         (nst_pack_widget_get_type ())
-#define NST_PACK_WIDGET(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NST_TYPE_PACK_WIDGET, NstPackWidget))
-#define NST_PACK_WIDGET_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NST_TYPE_PACK_WIDGET, NstPackWidget))
-#define NST_IS_PACK_WIDGET(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NST_TYPE_PACK_WIDGET))
-#define NST_IS_PACK_WIDGET_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NST_TYPE_PACK_WIDGET))
-#define NST_PACK_WIDGET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NST_TYPE_PACK_WIDGET, NstPackWidgetClass))
-
-typedef struct NstPackWidgetPrivate NstPackWidgetPrivate;
-
-typedef struct {
-	GtkVBox parent;
-	NstPackWidgetPrivate *priv;
-} NstPackWidget;
-
-typedef struct {
-	GtkVBoxClass parent;
-} NstPackWidgetClass;
-
-GType nst_pack_widget_get_type      (void);
-GtkWidget *nst_pack_widget_new      (void);
-
-char *nst_pack_widget_pack_files     (NstPackWidget *widget,
-				      GList         *file_list);
-void nst_pack_widget_set_from_names  (NstPackWidget *widget,
-				      GList         *file_list);
-void nst_pack_widget_set_enabled     (NstPackWidget *widget,
-				      gboolean       enabled);
-gboolean nst_pack_widget_get_enabled (NstPackWidget *widget);
-void nst_pack_widget_set_force_enabled     (NstPackWidget *widget,
-					    gboolean       force_enabled);
-gboolean nst_pack_widget_get_force_enabled (NstPackWidget *widget);
-
diff --git a/src/plugins/removable-devices/Makefile.am b/src/plugins/removable-devices/Makefile.am
index ee71da4..6dfcd17 100644
--- a/src/plugins/removable-devices/Makefile.am
+++ b/src/plugins/removable-devices/Makefile.am
@@ -19,6 +19,6 @@ plugin_LTLIBRARIES = libnstremovable_devices.la
 
 libnstremovable_devices_la_SOURCES = removable-devices.c
 libnstremovable_devices_la_LDFLAGS = -module -avoid-version
-libnstremovable_devices_la_LIBADD = $(GIO_LIBS) $(NAUTILUS_SENDTO_LIBS) $(builddir)/../libnstcommon.la $(builddir)/../libnautilussendto-1.0.la
+libnstremovable_devices_la_LIBADD = $(GIO_LIBS) $(NAUTILUS_SENDTO_LIBS) $(builddir)/../libnautilussendto-1.0.la
 
 EXTRA_DIST = $(plugin_in_files)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]