[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r18802 - in gnunet-gtk/src: fs include lib
From: |
gnunet |
Subject: |
[GNUnet-SVN] r18802 - in gnunet-gtk/src: fs include lib |
Date: |
Sat, 24 Dec 2011 22:43:31 +0100 |
Author: grothoff
Date: 2011-12-24 22:43:31 +0100 (Sat, 24 Dec 2011)
New Revision: 18802
Modified:
gnunet-gtk/src/fs/gnunet-fs-gtk-common.c
gnunet-gtk/src/fs/gnunet-fs-gtk-common.h
gnunet-gtk/src/fs/gnunet-fs-gtk-download.c
gnunet-gtk/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c
gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_file_publish.c
gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_open_directory.c
gnunet-gtk/src/fs/gnunet-fs-gtk.c
gnunet-gtk/src/include/gnunet_gtk.h
gnunet-gtk/src/lib/nls.c
Log:
-LRN: make code more robust to LE and files not being in utf-8;
0001-Temporary-fix-for-charset-conversion patch from #2031
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-common.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-common.c 2011-12-24 21:40:49 UTC (rev
18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-common.c 2011-12-24 21:43:31 UTC (rev
18802)
@@ -26,6 +26,53 @@
#include "gnunet-fs-gtk-common.h"
/**
+ * Converts metadata specified by @data of size @data_len
+ * and saved in format @format to UTF-8 encoded string.
+ * Works only for C-string and UTF8 metadata formats
+ * (returns NULL for everything else).
+ * Verifies UTF-8 strings.
+ *
+ * @param format format of the @data
+ * @param data data to convert
+ * @param data_len length of the data buffer (in bytes)
+ * @return NULL if can't be converted, allocated string otherwise,
+ * freeable with GNUNET_free* ().
+ */
+char *
+GNUNET_FS_GTK_dubious_meta_to_utf8 (enum EXTRACTOR_MetaFormat format, const
char *data, size_t data_len)
+{
+ gchar *result = NULL;
+
+ if (format == EXTRACTOR_METAFORMAT_UTF8)
+ {
+ /* data must not contain NULLs (hence the -1) */
+ if (g_utf8_validate (data, data_len - 1, NULL))
+ result = GNUNET_strdup (data);
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Failed to validate supposedly utf-8 string `%s' of length %u,
assuming it to be a C string\n",
+ data, data_len);
+ format = EXTRACTOR_METAFORMAT_C_STRING;
+ }
+ }
+ if (format == EXTRACTOR_METAFORMAT_C_STRING)
+ {
+ if (data_len > 0)
+ { /* There are no guarantees that data is NULL-terminated, AFAIU,
+ * so let's play it safe, shall we?
+ */
+ char *data_copy = GNUNET_malloc (data_len + 1);
+ memcpy (data_copy, data, data_len);
+ data_copy[data_len] = '\0';
+ result = GNUNET_GTK_from_loc_to_utf8 (data_copy);
+ GNUNET_free (data_copy);
+ }
+ }
+ return result;
+}
+
+/**
* Add meta data to list store.
*
* @param cls closure (the GtkListStore)
@@ -49,44 +96,17 @@
const char *data, size_t data_len)
{
GtkListStore *ls = GTK_LIST_STORE (cls);
- const gchar *data_to_insert = NULL;
- gchar *free_data = NULL;
- gsize rd;
- gsize wr;
+ gchar *data_to_insert = NULL;
- if (format == EXTRACTOR_METAFORMAT_UTF8)
- {
- if (g_utf8_validate (data, data_len, NULL))
- data_to_insert = data;
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Failed to validate supposedly utf-8 string `%s' of length %u,
assuming it to be a C string\n",
- data, data_len);
- format = EXTRACTOR_METAFORMAT_C_STRING;
- }
- }
- if (format == EXTRACTOR_METAFORMAT_C_STRING)
- {
- GError *gerr = NULL;
- rd = wr = 0;
- free_data = g_locale_to_utf8 (data, data_len, &rd, &wr, &gerr);
- if (gerr != NULL)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Error when converting a C string `%s' of length %u to utf-8
(converted %u to %u bytes): %s\n",
- data, data_len, rd, wr, gerr->message);
- g_error_free (gerr);
- }
- data_to_insert = free_data;
- }
+ data_to_insert = GNUNET_FS_GTK_dubious_meta_to_utf8 (format, data, data_len);
if (NULL != data_to_insert)
+ {
gtk_list_store_insert_with_values (ls, NULL, G_MAXINT, 0, type, 1, format,
2, EXTRACTOR_metatype_to_string (type),
- 3, data_to_insert, -1);
- if (NULL != free_data)
- g_free (free_data);
+ 3, data_to_insert, -1);
+ g_free (data_to_insert);
+ }
return 0;
}
@@ -194,5 +214,4 @@
GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close (fh));
}
-
/* end of gnunet-fs-gtk-common.c */
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-common.h
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-common.h 2011-12-24 21:40:49 UTC (rev
18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-common.h 2011-12-24 21:43:31 UTC (rev
18802)
@@ -101,5 +101,23 @@
const char *data_mime_type,
const char *data, size_t data_len);
+/**
+ * Converts metadata specified by @data of size @data_len
+ * and saved in format @format to UTF-8 encoded string.
+ * Works only for C-string and UTF8 metadata formats
+ * (returns NULL for everything else).
+ * Verifies UTF-8 strings.
+ *
+ * @param format format of the @data
+ * @param data data to convert
+ * @param data_len length of the data buffer (in bytes)
+ * @return NULL if can't be converted, allocated string otherwise,
+ * freeable with GNUNET_free* ().
+ */
+char *
+GNUNET_FS_GTK_dubious_meta_to_utf8 (enum EXTRACTOR_MetaFormat format,
+ const char *data, size_t data_len);
+
+
#endif
/* end of gnunet-fs-gtk-common.h */
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-download.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-download.c 2011-12-24 21:40:49 UTC (rev
18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-download.c 2011-12-24 21:43:31 UTC (rev
18802)
@@ -73,7 +73,7 @@
return FALSE;
}
GNUNET_free_non_null (dc->filename);
- dc->filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER
(dlc->dialog));
+ dc->filename = GNUNET_GTK_filechooser_get_filename_loc (GTK_FILE_CHOOSER
(dlc->dialog));
dc->is_recursive =
(TRUE ==
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cb))) ? GNUNET_YES :
@@ -165,6 +165,7 @@
if (dc->filename != NULL)
{
char buf[1024];
+ char *buf_utf8;
if (NULL != getcwd (buf, sizeof (buf)))
{
@@ -173,7 +174,12 @@
strcat (buf, DIR_SEPARATOR_STR);
strcat (buf, dc->filename);
}
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (ad), buf);
+ buf_utf8 = GNUNET_GTK_from_loc_to_utf8 (buf);
+ if (buf_utf8 != NULL)
+ {
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (ad), buf_utf8);
+ GNUNET_free (buf_utf8);
+ }
}
}
dlc = g_new0 (struct dialog_context, 1);
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-edit_publish_dialog.c 2011-12-24
21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-edit_publish_dialog.c 2011-12-24
21:43:31 UTC (rev 18802)
@@ -530,6 +530,7 @@
(builder,
"GNUNET_GTK_edit_publication_metadata_preview_image"));
gtk_image_set_from_file (image, fn);
+ g_free (fn);
state->preview_changed = GNUNET_YES;
}
@@ -589,7 +590,7 @@
GNUNET_break (0);
return 0;
}
-
+ /* FIXME: make sure this is all correct UTF-8-wise */
keep = GNUNET_NO;
switch (format)
{
@@ -808,6 +809,7 @@
}
g_object_unref (finfo);
g_object_unref (f);
+ g_free (fn);
}
GNUNET_CONTAINER_meta_data_destroy (nm);
@@ -1016,6 +1018,7 @@
/**
* Open the dialog to edit file information data.
+ * short_fn MUST be UTF-8-encoded
*/
void
GNUNET_FS_GTK_edit_publish_dialog (GtkBuilder *builder,
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c 2011-12-24 21:40:49 UTC
(rev 18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-event_handler.c 2011-12-24 21:43:31 UTC
(rev 18802)
@@ -548,6 +548,7 @@
GtkTreeIter iter;
GtkTreePath *path;
struct SearchResult *srp;
+ gchar *filename_utf8;
if (de == NULL)
{
@@ -587,13 +588,15 @@
return de;
}
gtk_tree_path_free (path);
+ filename_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) filename);
gtk_tree_store_set (de->ts, &iter, 4,
(guint) ((size >
0) ? (100 * completed /
size) : 100) /* progress */ ,
- 6, filename /* filename/description */ ,
+ 6, filename_utf8 /* filename/description */ ,
8, "blue" /* status colour: pending */ ,
-1);
+ GNUNET_free_non_null (filename_utf8);
return de;
}
@@ -1111,6 +1114,7 @@
}
else
{
+ /* FS_uri functions should produce UTF-8, so let them be */
if (GNUNET_FS_uri_test_ksk (query))
tab->query_txt = GNUNET_FS_uri_ksk_to_string_fancy (query);
else
@@ -1291,6 +1295,16 @@
-1);
if (desc == NULL)
desc = GNUNET_strdup (_("no description supplied"));
+ else
+ {
+ char *utf8_desc = NULL;
+ utf8_desc = GNUNET_FS_GTK_dubious_meta_to_utf8 (EXTRACTOR_METAFORMAT_UTF8,
desc, strlen (desc) + 1);
+ GNUNET_free (desc);
+ if (utf8_desc != NULL)
+ desc = utf8_desc;
+ else
+ desc = NULL;
+ }
if (uri == NULL)
uris = GNUNET_strdup (_("no URI"));
else
@@ -1348,7 +1362,7 @@
if (pixbuf != NULL)
g_object_unref (pixbuf);
GNUNET_free (uris);
- GNUNET_free (desc);
+ GNUNET_free_non_null (desc);
GNUNET_free_non_null (mime);
tp = gtk_tree_model_get_path (GTK_TREE_MODEL (ts), iter);
sr->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (ts), tp);
@@ -1468,6 +1482,16 @@
-1);
if (desc == NULL)
desc = GNUNET_strdup (_("no description supplied"));
+ else
+ {
+ char *utf8_desc = NULL;
+ utf8_desc = GNUNET_FS_GTK_dubious_meta_to_utf8 (EXTRACTOR_METAFORMAT_UTF8,
desc, strlen (desc) + 1);
+ GNUNET_free (desc);
+ if (utf8_desc != NULL)
+ desc = utf8_desc;
+ else
+ desc = NULL;
+ }
mime =
GNUNET_CONTAINER_meta_data_get_first_by_types (meta,
EXTRACTOR_METATYPE_MIMETYPE,
@@ -1497,7 +1521,7 @@
(gint) availability_rank, -1);
if (pixbuf != NULL)
g_object_unref (pixbuf);
- GNUNET_free (desc);
+ GNUNET_free_non_null (desc);
GNUNET_free_non_null (mime);
notebook =
@@ -1610,6 +1634,7 @@
GtkWidget *close_button;
GtkNotebook *notebook;
char *size_fancy;
+ char *fn_utf8 = NULL;
if (NULL == parent)
{
@@ -1676,11 +1701,14 @@
ent = GNUNET_malloc (sizeof (struct PublishEntry));
ent->is_top = (parent == NULL) ? GNUNET_YES : GNUNET_NO;
ent->tab = publish_tab;
- gtk_tree_store_insert_with_values (publish_tab->ts, &iter, pitrptr,
G_MAXINT, 0, fn,
+ fn_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) fn);
+ gtk_tree_store_insert_with_values (publish_tab->ts, &iter, pitrptr, G_MAXINT,
+ 0, fn_utf8,
1, size_fancy, 2, "white", 3,
(guint) 0 /* progress */ ,
4, ent,
-1);
+ GNUNET_free_non_null (fn_utf8);
path = gtk_tree_model_get_path (GTK_TREE_MODEL (publish_tab->ts), &iter);
GNUNET_assert (NULL != path);
ent->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (publish_tab->ts),
path);
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c 2011-12-24
21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c 2011-12-24
21:43:31 UTC (rev 18802)
@@ -48,12 +48,14 @@
{
GtkListStore *ls = cls;
GtkTreeIter iter;
+ char *name_utf8;
+ name_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) name);
- gtk_list_store_insert_with_values (ls, &iter, -1, 0, name, 1,
+ gtk_list_store_insert_with_values (ls, &iter, -1, 0, name_utf8, 1,
GNUNET_FS_namespace_create
(GNUNET_FS_GTK_get_fs_handle (), name),
-1);
-
+ GNUNET_free_non_null (name_utf8);
}
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
2011-12-24 21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
2011-12-24 21:43:31 UTC (rev 18802)
@@ -31,6 +31,7 @@
gint response_id, gpointer user_data)
{
const char *name;
+ gchar *name_loc;
struct GNUNET_FS_Namespace *ns;
GtkWidget *ad;
GtkBuilder *builder;
@@ -51,8 +52,13 @@
(builder,
"GNUNET_GTK_create_namespace_name_entry")));
/* FIXME: show busy dialog while doing key creation */
- ns = GNUNET_FS_namespace_create (GNUNET_FS_GTK_get_fs_handle (), name);
- GNUNET_FS_namespace_delete (ns, GNUNET_NO);
+ name_loc = GNUNET_GTK_from_utf8_to_loc ((char *) name);
+ if (NULL != name_loc)
+ {
+ ns = GNUNET_FS_namespace_create (GNUNET_FS_GTK_get_fs_handle (), name_loc);
+ GNUNET_FS_namespace_delete (ns, GNUNET_NO);
+ GNUNET_free (name_loc);
+ }
gtk_widget_destroy (ad);
g_object_unref (G_OBJECT (builder));
}
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_file_publish.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_file_publish.c 2011-12-24
21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_file_publish.c 2011-12-24
21:43:31 UTC (rev 18802)
@@ -211,6 +211,7 @@
GtkTreePath *path;
uint64_t file_size;
const char *short_fn;
+ char *short_fn_utf8;
struct GNUNET_CONTAINER_MetaData *meta;
struct GNUNET_FS_Uri *ksk_uri;
GtkTreeStore *ts;
@@ -248,10 +249,11 @@
short_fn = filename;
while (NULL != (ss = strstr (short_fn, DIR_SEPARATOR_STR)))
short_fn = 1 + ss;
+ short_fn_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) short_fn);
GNUNET_CONTAINER_meta_data_insert (meta, "<gnunet-gtk>",
EXTRACTOR_METATYPE_FILENAME,
EXTRACTOR_METAFORMAT_UTF8, "text/plain",
- short_fn, strlen (short_fn) + 1);
+ short_fn_utf8, strlen (short_fn_utf8) +
1);
ksk_uri = GNUNET_FS_uri_ksk_create_from_meta_data (meta);
gtk_tree_store_insert_before (ts, &pos, iter, NULL);
path = gtk_tree_model_get_path (GTK_TREE_MODEL (ts), &pos);
@@ -268,8 +270,9 @@
else
file_size_fancy = GNUNET_STRINGS_byte_size_fancy (file_size);
gtk_tree_store_set (ts, &pos, 0, file_size_fancy, 1, (gboolean) do_index, 2,
- short_fn, 3, (guint) bo->anonymity_level, 4,
+ short_fn_utf8, 3, (guint) bo->anonymity_level, 4,
(guint) bo->content_priority, 5, fi, -1);
+ GNUNET_free_non_null (short_fn_utf8);
GNUNET_free (file_size_fancy);
update_selectivity (data);
}
@@ -294,6 +297,7 @@
GtkTreeStore *ts;
GtkBuilder *builder;
+
builder = GTK_BUILDER (data);
ts = GTK_TREE_STORE (gtk_builder_get_object
@@ -504,6 +508,7 @@
GNUNET_HashCode hc;
const char *short_fn;
const char *ss;
+ char *short_fn_utf8;
adc->dir_entry_count++;
pd = GNUNET_malloc (sizeof (struct PublishData));
@@ -515,12 +520,13 @@
short_fn = filename;
while (NULL != (ss = strstr (short_fn, DIR_SEPARATOR_STR)))
short_fn = 1 + ss;
+ short_fn_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) short_fn);
GNUNET_CONTAINER_meta_data_insert (pd->meta, "<gnunet-gtk>",
EXTRACTOR_METATYPE_FILENAME,
EXTRACTOR_METAFORMAT_UTF8, "text/plain",
- short_fn, strlen (short_fn) + 1);
+ short_fn, strlen (short_fn_utf8) + 1);
+ GNUNET_free_non_null (short_fn_utf8);
-
gtk_tree_store_insert_before (adc->ts, &pd->iter, adc->parent, NULL);
GNUNET_CRYPTO_hash (filename, strlen (filename), &hc);
GNUNET_CONTAINER_multihashmap_put (adc->metamap, &hc, pd,
@@ -576,6 +582,7 @@
struct GNUNET_FS_Uri *kill_ksk;
const char *ss;
const char *short_fn;
+ char *short_fn_utf8;
struct stat sbuf;
if (0 != STAT (filename, &sbuf))
@@ -627,9 +634,11 @@
short_fn = filename;
while (NULL != (ss = strstr (short_fn, DIR_SEPARATOR_STR)))
short_fn = 1 + ss;
+ short_fn_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) short_fn);
gtk_tree_store_set (ts, iter, 0, file_size_fancy, 1, (gboolean) do_index, 2,
- short_fn, 3, (guint) bo->anonymity_level, 4,
+ short_fn_utf8, 3, (guint) bo->anonymity_level, 4,
(guint) bo->content_priority, 5, fi, -1);
+ GNUNET_free_non_null (short_fn_utf8);
GNUNET_free (file_size_fancy);
}
@@ -774,8 +783,19 @@
}
else
{
+ char *filename_utf8;
+ const char *ss, *short_fn;
GNUNET_assert (mcm == NULL);
/* we're top-level */
+ short_fn = filename;
+ while (NULL != (ss = strstr (short_fn, DIR_SEPARATOR_STR)))
+ short_fn = 1 + ss;
+ filename_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) short_fn);
+ GNUNET_CONTAINER_meta_data_insert (pd->meta, "<gnunet-gtk>",
+ EXTRACTOR_METATYPE_FILENAME,
+ EXTRACTOR_METAFORMAT_UTF8,
"text/plain",
+ filename_utf8, strlen (filename_utf8)
+ 1);
+ GNUNET_free_non_null (filename_utf8);
add_entry_to_ts (adc->ts, &pd->iter, filename, &adc->bo, adc->do_index,
NULL, pd->meta);
}
@@ -1384,7 +1404,7 @@
"GNUNET_GTK_publish_directory_dialog"));
if (response_id == -5)
{
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
+ filename = GNUNET_GTK_filechooser_get_filename_loc (GTK_FILE_CHOOSER (ad));
sb = GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
"GNUNET_GTK_publish_directory_dialog_expiration_year_spin_button"));
if (!GNUNET_GTK_get_selected_anonymity_level (builder,
@@ -1539,6 +1559,18 @@
EXTRACTOR_METATYPE_COMMENT,
EXTRACTOR_METATYPE_SUBJECT,
-1);
+ if (desc == NULL)
+ desc = GNUNET_strdup (_("no description supplied"));
+ else
+ {
+ char *utf8_desc = NULL;
+ utf8_desc = GNUNET_FS_GTK_dubious_meta_to_utf8 (EXTRACTOR_METAFORMAT_UTF8,
desc, strlen (desc) + 1);
+ GNUNET_free (desc);
+ if (utf8_desc != NULL)
+ desc = utf8_desc;
+ else
+ desc = NULL;
+ }
gtk_tree_store_insert_with_values (uc->ts, &iter, uc->parent, G_MAXINT, 0,
uc->namespace_name, 1, uc->ns, 2, last_id,
3, GNUNET_FS_uri_dup (last_uri), 4,
@@ -1586,13 +1618,15 @@
GtkTreeStore *ts = cls;
struct UpdateableContext uc;
GtkTreeIter iter;
+ gchar *name_utf8;
uc.parent = &iter;
uc.namespace_name = name;
uc.ts = ts;
uc.ns = GNUNET_FS_namespace_create (GNUNET_FS_GTK_get_fs_handle (), name);
uc.update_called = GNUNET_NO;
- gtk_tree_store_insert_with_values (ts, &iter, NULL, G_MAXINT, 0, name, 1,
+ name_utf8 = GNUNET_GTK_from_loc_to_utf8 ((char *) name);
+ gtk_tree_store_insert_with_values (ts, &iter, NULL, G_MAXINT, 0, name_utf8,
1,
uc.ns, 2, NULL /* last-id */ ,
3, NULL /* last-uri */ ,
4, NULL /* meta */ ,
@@ -1601,6 +1635,7 @@
7, TRUE /* update editable */ ,
8, TRUE /* current editable */ ,
-1);
+ GNUNET_free_non_null (name_utf8);
uc.seen = GNUNET_CONTAINER_multihashmap_create (128);
GNUNET_FS_namespace_list_updateable (uc.ns, NULL, &add_updateable_to_ts,
&uc);
GNUNET_CONTAINER_multihashmap_destroy (uc.seen);
@@ -1726,6 +1761,7 @@
do
{
fi = get_file_information (tm, &iter);
+ /* FIXME: should we convert namespace id and uid from UTF8? */
GNUNET_FS_publish_start (GNUNET_FS_GTK_get_fs_handle (), fi, namespace,
namespace_id, namespace_uid,
GNUNET_FS_PUBLISH_OPTION_NONE);
@@ -1801,7 +1837,6 @@
if (response_id == -5)
{
/* OK */
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
sb = GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
"GNUNET_GTK_publish_file_dialog_expiration_year_spin_button"));
@@ -1816,6 +1851,8 @@
do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
gtk_builder_get_object (builder,
"GNUNET_GTK_publish_file_dialog_do_index_checkbutton")));
+
+ filename = GNUNET_GTK_filechooser_get_filename_loc (GTK_FILE_CHOOSER (ad));
add_file_at_iter (user_data, filename, &bo, do_index, NULL);
g_free (filename);
update_selectivity (user_data);
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_open_directory.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_open_directory.c
2011-12-24 21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk-main_window_open_directory.c
2011-12-24 21:43:31 UTC (rev 18802)
@@ -67,7 +67,7 @@
dmeta = GNUNET_CONTAINER_meta_data_duplicate (meta);
GNUNET_CONTAINER_meta_data_insert (dmeta, "<user>",
EXTRACTOR_METATYPE_FILENAME,
- EXTRACTOR_METAFORMAT_C_STRING,
+ EXTRACTOR_METAFORMAT_UTF8,
"text/plain", acc->filename,
strlen (acc->filename) + 1);
acc->tab = GNUNET_GTK_add_to_uri_tab (&acc->iter, &acc->par, dmeta, NULL);
@@ -91,7 +91,7 @@
{
GtkBuilder *builder;
GtkWidget *ad;
- char *filename;
+ char *filename, *filename_utf8;
struct AddChildContext acc;
builder = GTK_BUILDER (user_data);
@@ -105,12 +105,14 @@
return;
}
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
+ filename = GNUNET_GTK_filechooser_get_filename_loc (GTK_FILE_CHOOSER (ad));
+ filename_utf8 = GNUNET_GTK_filechooser_get_filename_utf8 (GTK_FILE_CHOOSER
(ad));
gtk_widget_destroy (ad);
g_object_unref (G_OBJECT (builder));
- acc.filename = filename;
+ acc.filename = filename_utf8;
acc.ts = NULL;
GNUNET_FS_GTK_mmap_and_scan (filename, &add_child, &acc);
+ g_free (filename_utf8);
g_free (filename);
}
Modified: gnunet-gtk/src/fs/gnunet-fs-gtk.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk.c 2011-12-24 21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk.c 2011-12-24 21:43:31 UTC (rev 18802)
@@ -501,8 +501,11 @@
mime_keyword = NULL;
if (mime_model && gtk_combo_box_get_active_iter (mime_combo, &iter))
gtk_tree_model_get (mime_model, &iter, 0, &mime_keyword, -1);
- if (mime_keyword == NULL)
- mime_keyword = g_strdup ("");
+ if (strcmp (mime_keyword, " ") == 0)
+ {
+ g_free (mime_keyword);
+ mime_keyword = NULL;
+ }
ref = g_object_get_data (G_OBJECT (toggle_button), "selected-row-reference");
if (ref)
@@ -516,7 +519,7 @@
query_entry = GTK_ENTRY (gtk_builder_get_object (builder,
"main_window_search_entry"));
entry_keywords = gtk_entry_get_text (query_entry);
- keywords = g_strdup_printf ("%s +%s", entry_keywords, mime_keyword);
+ keywords = g_strdup_printf ("%s %s%s", entry_keywords, mime_keyword ? "+" :
"", mime_keyword ? mime_keyword : "");
g_free (mime_keyword);
if (nsid != NULL)
{
@@ -610,6 +613,18 @@
EXTRACTOR_METATYPE_SUBJECT,
EXTRACTOR_METATYPE_KEYWORDS,
-1);
+ if (description == NULL)
+ description = g_strdup (_("no description supplied"));
+ else
+ {
+ char *utf8_desc = NULL;
+ utf8_desc = GNUNET_FS_GTK_dubious_meta_to_utf8 (EXTRACTOR_METAFORMAT_UTF8,
description, strlen (description));
+ GNUNET_free (description);
+ if (utf8_desc != NULL)
+ description = utf8_desc;
+ else
+ description = NULL;
+ }
gtk_tree_store_insert_with_values (ts, &iter, NULL, G_MAXINT, 0, ns_name, 1,
nsid, 2, root, 3, description, -1);
GNUNET_free (ns_name);
Modified: gnunet-gtk/src/include/gnunet_gtk.h
===================================================================
--- gnunet-gtk/src/include/gnunet_gtk.h 2011-12-24 21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/include/gnunet_gtk.h 2011-12-24 21:43:31 UTC (rev 18802)
@@ -121,7 +121,35 @@
void
GNUNET_GTK_tray_icon_destroy (void);
+char *
+GNUNET_GTK_from_utf8_to_loc (gchar *str_utf8);
+char *
+GNUNET_GTK_from_loc_to_utf8 (gchar *str_loc);
+
+char *
+GNUNET_GTK_from_filename_to_utf8 (gchar *filename);
+
+char *
+GNUNET_GTK_from_utf8_to_filename (gchar *str_utf8);
+
+char *
+GNUNET_GTK_from_loc_to_filename (gchar *str_loc);
+
+char *
+GNUNET_GTK_from_filename_to_loc (gchar *filename);
+
+/* Returns filename form filechooser, encoded in locale-dependent
+ * encoding, suitable to be given to CRT and/or GNUnet
+ */
+char *
+GNUNET_GTK_filechooser_get_filename_loc (GtkFileChooser *fc);
+
+gchar *
+GNUNET_GTK_filechooser_get_filename_utf8 (GtkFileChooser *fc);
+
+
+
/* ******************* main loop ***************** */
/**
Modified: gnunet-gtk/src/lib/nls.c
===================================================================
--- gnunet-gtk/src/lib/nls.c 2011-12-24 21:40:49 UTC (rev 18801)
+++ gnunet-gtk/src/lib/nls.c 2011-12-24 21:43:31 UTC (rev 18802)
@@ -53,4 +53,171 @@
#endif
}
+
+char *
+GNUNET_GTK_from_utf8_to_loc (gchar *str_utf8)
+{
+ char *str_loc;
+ const char *loc_charset;
+ gboolean is_UTF8;
+
+ if (NULL == str_utf8)
+ return NULL;
+
+ is_UTF8 = g_get_charset (&loc_charset);
+ if (is_UTF8)
+ str_loc = GNUNET_strdup (str_utf8);
+ else
+ str_loc = GNUNET_STRINGS_from_utf8 (str_utf8, strlen (str_utf8),
loc_charset);
+
+ return str_loc;
+}
+
+char *
+GNUNET_GTK_from_loc_to_utf8 (gchar *str_loc)
+{
+ char *str_utf8;
+ const char *loc_charset;
+ gboolean is_UTF8;
+
+ if (NULL == str_loc)
+ return NULL;
+
+ is_UTF8 = g_get_charset (&loc_charset);
+ if (is_UTF8)
+ str_utf8 = GNUNET_strdup (str_loc);
+ else
+ str_utf8 = GNUNET_STRINGS_to_utf8 (str_loc, strlen (str_loc), loc_charset);
+
+ return str_utf8;
+}
+
+/* This is copied from GLib */
+static gboolean
+get_filename_charset (const gchar **filename_charset)
+{
+ const gchar **charsets;
+ gboolean is_utf8;
+
+ is_utf8 = g_get_filename_charsets (&charsets);
+
+ if (filename_charset)
+ *filename_charset = charsets[0];
+
+ return is_utf8;
+}
+
+char *
+GNUNET_GTK_from_filename_to_utf8 (gchar *filename)
+{
+ char *str_utf8;
+ const char *filename_charset;
+ gboolean is_UTF8;
+
+ if (NULL == filename)
+ return NULL;
+
+ is_UTF8 = get_filename_charset (&filename_charset);
+ if (is_UTF8)
+ str_utf8 = GNUNET_strdup (filename);
+ else
+ str_utf8 = GNUNET_STRINGS_to_utf8 (filename, strlen (filename),
filename_charset);
+
+ return str_utf8;
+}
+
+char *
+GNUNET_GTK_from_utf8_to_filename (gchar *str_utf8)
+{
+ char *filename;
+ const char *filename_charset;
+ gboolean is_UTF8;
+
+ if (NULL == str_utf8)
+ return NULL;
+
+ is_UTF8 = get_filename_charset (&filename_charset);
+ if (is_UTF8)
+ filename = GNUNET_strdup (str_utf8);
+ else
+ filename = GNUNET_STRINGS_from_utf8 (str_utf8, strlen (str_utf8),
filename_charset);
+
+ return filename;
+}
+
+char *
+GNUNET_GTK_from_loc_to_filename (gchar *str_loc)
+{
+ char *filename;
+ const char *filename_charset;
+ const char *loc_charset;
+ gboolean is_filename_UTF8, is_loc_UTF8;
+
+ if (NULL == str_loc)
+ return NULL;
+
+ is_filename_UTF8 = get_filename_charset (&filename_charset);
+ is_loc_UTF8 = g_get_charset (&loc_charset);
+ if (is_filename_UTF8 && is_loc_UTF8)
+ filename = GNUNET_strdup (str_loc);
+ else if (is_filename_UTF8)
+ filename = GNUNET_STRINGS_to_utf8 (str_loc, strlen (str_loc), loc_charset);
+ else if (is_loc_UTF8)
+ filename = GNUNET_STRINGS_from_utf8 (str_loc, strlen (str_loc),
filename_charset);
+ else
+ /* Pray that iconv() knows these charsets */
+ filename = GNUNET_STRINGS_conv (str_loc, strlen (str_loc), loc_charset,
filename_charset);
+
+ return filename;
+}
+
+char *
+GNUNET_GTK_from_filename_to_loc (gchar *filename)
+{
+ char *str_loc;
+ const char *loc_charset;
+ const char *filename_charset;
+ gboolean is_loc_UTF8, is_filename_UTF8;
+
+ if (NULL == filename)
+ return NULL;
+
+ is_filename_UTF8 = get_filename_charset (&filename_charset);
+ is_loc_UTF8 = g_get_charset (&loc_charset);
+ if (is_loc_UTF8 && is_filename_UTF8)
+ str_loc = GNUNET_strdup (filename);
+ else if (is_loc_UTF8)
+ str_loc = GNUNET_STRINGS_to_utf8 (filename, strlen (filename),
filename_charset);
+ else if (is_filename_UTF8)
+ str_loc = GNUNET_STRINGS_from_utf8 (filename, strlen (filename),
loc_charset);
+ else
+ /* Pray that iconv() knows these charsets */
+ str_loc = GNUNET_STRINGS_conv (filename, strlen (filename),
filename_charset, loc_charset);
+
+ return str_loc;
+}
+
+/* Returns filename form filechooser, encoded in locale-dependent
+ * encoding, suitable to be given to CRT and/or GNUnet
+ */
+char *
+GNUNET_GTK_filechooser_get_filename_loc (GtkFileChooser *fc)
+{
+ char *filename_loc;
+ gchar *filename = gtk_file_chooser_get_filename (fc);
+ filename_loc = GNUNET_GTK_from_filename_to_loc (filename);
+ g_free (filename);
+ return filename_loc;
+}
+
+gchar *
+GNUNET_GTK_filechooser_get_filename_utf8 (GtkFileChooser *fc)
+{
+ char *filename_utf8;
+ gchar *filename = gtk_file_chooser_get_filename (fc);
+ filename_utf8 = GNUNET_GTK_from_filename_to_utf8 (filename);
+ g_free (filename);
+ return filename_utf8;
+}
+
/* end of nls.c */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18802 - in gnunet-gtk/src: fs include lib,
gnunet <=