diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/app/gtk/clipdetails.cpp realplay-10.0.4/player/app/gtk/clipdetails.cpp --- realplay-10.0.4.orig/player/app/gtk/clipdetails.cpp 2005-04-25 16:39:02.000000000 +0800 +++ realplay-10.0.4/player/app/gtk/clipdetails.cpp 2005-04-28 13:07:55.000000000 +0800 @@ -52,6 +52,7 @@ #include "commonapp.h" #include +#include "mainapp.h" typedef struct { @@ -83,10 +84,11 @@ update_clip_info(HXClipDetailsDialog* di GValue value; gboolean result; const gchar* prop; - + HXURL* hu; memset(&value, 0, sizeof(value)); - url = hx_player_get_url(dialog->player); + hu = hu_from_url(hx_player_get_url(dialog->player)); + url = hu_to_url_without_charset(hu); gtk_label_set_text(GTK_LABEL(dialog->url_label), url? url: ""); result = hx_player_get_statistic(dialog->player, "title", &value); @@ -136,6 +138,9 @@ update_clip_info(HXClipDetailsDialog* di gtk_label_set_text(GTK_LABEL(dialog->keywords_label), prop); g_value_unset(&value); } + + g_free(url); + hu_free(hu); } static void diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/app/gtk/commonapp.cpp realplay-10.0.4/player/app/gtk/commonapp.cpp --- realplay-10.0.4.orig/player/app/gtk/commonapp.cpp 2005-04-25 16:39:02.000000000 +0800 +++ realplay-10.0.4/player/app/gtk/commonapp.cpp 2005-04-29 21:18:05.000000000 +0800 @@ -1125,15 +1125,17 @@ hxcommon_load_preferences(HXMainWindow* enum SectionNameType { HELIX_SECTION = 0, - RECENT_URLS_SECTION = 1, - PLAYER_SECTION = 2, - FAVORITES_SECTION = 3, - SIGN_IN_SECTION = 4 + ENCODING_SECTION = 1, + RECENT_URLS_SECTION = 2, + PLAYER_SECTION = 3, + FAVORITES_SECTION = 4, + SIGN_IN_SECTION = 5 } section_name; const gchar* section_labels[] = { "helix", + "encoding", "recent_urls", "player", "favorites", @@ -1211,7 +1213,7 @@ hxcommon_load_preferences(HXMainWindow* guint i; *pos = '\0'; section = line + 1; - + section_name = HELIX_SECTION; // default to helix for(i = 0; i < sizeof(section_labels) / sizeof(*section_labels); i++) @@ -1261,7 +1263,22 @@ hxcommon_load_preferences(HXMainWindow* override_open_audio_pref = FALSE; } break; - + + /* + * encoding section must be comes before recent urls & + * favorites section + */ + case ENCODING_SECTION: + if (strcmp(key, "MetaDataEncoding") == 0) + hx_set_meta_data_encodings(value_str); + else if (strcmp(key, "RemoteUrlEncoding") == 0) + hx_set_remote_url_encodings(value_str); + else + { + g_warning("Parse error reading encoding section"); + } + break; + case RECENT_URLS_SECTION: if(window) { @@ -1275,7 +1292,7 @@ hxcommon_load_preferences(HXMainWindow* case PLAYER_SECTION: if(window) { - GValue value; + GValue value; memset(&value, 0, sizeof(value)); g_value_init(&value, G_TYPE_STRING); g_value_set_string(&value, value_str); diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/app/gtk/favorites.cpp realplay-10.0.4/player/app/gtk/favorites.cpp --- realplay-10.0.4.orig/player/app/gtk/favorites.cpp 2005-04-25 16:39:03.000000000 +0800 +++ realplay-10.0.4/player/app/gtk/favorites.cpp 2005-04-29 21:21:09.000000000 +0800 @@ -76,7 +76,8 @@ void hx_favorite_free(HXFavorite* favorite) { g_free(favorite->title); - g_free(favorite->url); + //g_free(favorite->url); + hu_free(favorite->hu); g_free(favorite); } @@ -119,14 +120,18 @@ favorites_export_to_m3u(const gchar* fil { HXFavorite* favorite = (HXFavorite*)favorites_iter->data; gchar* line; + gchar* url; GError* error = NULL; gsize bytes_written; gsize len; GIOStatus status; - line = g_strdup_printf("%s\n", favorite->url); + //line = g_strdup_printf("%s\n", favorite->url); + url = hu_to_url(favorite->hu); + line = g_strdup_printf("%s\n", url); len = strlen(line); status = g_io_channel_write_chars(chan, line, len, &bytes_written, &error); + g_free(url); g_free(line); if(error) @@ -157,7 +162,7 @@ favorites_import_from_m3u(const gchar* f GIOChannel* chan; GError *error = NULL; GList* favorites_list = *favorites_list_ptr; - + chan = g_io_channel_new_file(filename, "r", &error); if(error) { @@ -208,9 +213,14 @@ favorites_import_from_m3u(const gchar* f HXFavorite* favorite; gchar* filename; + gchar* url; favorite = hx_favorite_new(); - filename = strrchr(line, '/'); + + favorite->hu = hu_from_url(line); + + url = hu_to_url_without_charset(favorite->hu); + filename = strrchr(url, '/'); if(filename) { filename++; @@ -222,11 +232,12 @@ favorites_import_from_m3u(const gchar* f if(!favorite->title) { - favorite->title = g_strdup(line); + favorite->title = g_strdup(url); } + + g_free(line); + g_free(url); - favorite->url = line; - favorites_list = g_list_append(favorites_list, favorite); } @@ -350,6 +361,7 @@ hfd_cell_edited(GtkCellRendererText *cel GtkTreeIter iter; gint column; HXFavorite* favorite = NULL; + gchar* text; column = (gint)g_object_get_data (G_OBJECT (cell), "column"); model = (GtkTreeModel*)g_object_get_data (G_OBJECT (cell), "model"); @@ -375,11 +387,18 @@ hfd_cell_edited(GtkCellRendererText *cel break; case COLUMN_URL: - g_free(favorite->url); - favorite->url = g_strdup(new_text); - gtk_list_store_set(GTK_LIST_STORE(model), &iter, - COLUMN_URL, favorite->url, - -1); + //g_free(favorite->url); + //favorite->url = g_strdup(new_text); + text = hu_get_utf8_url(favorite->hu) ? \ + hu_get_utf8_url(favorite->hu) : hu_get_raw_url(favorite->hu); + if (text == NULL || strcmp(text, new_text) != 0) { + hu_set_utf8_url(favorite->hu, new_text, hu_get_charset(favorite->hu)); + text = hu_to_url_without_charset(favorite->hu); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, + COLUMN_URL, text, + -1); + g_free(text); + } break; } @@ -476,15 +495,18 @@ hxplay_manage_favorites_dialog_new(GList while(favorites_list_iter) { HXFavorite* favorite = (HXFavorite*)favorites_list_iter->data; - + gchar *text; + + text = hu_get_utf8_url(favorite->hu) ? \ + hu_get_utf8_url(favorite->hu) : hu_get_raw_url(favorite->hu); gtk_list_store_append(store, &tree_iter); - gtk_list_store_set (store, &tree_iter, - COLUMN_TITLE, favorite->title, - COLUMN_URL, favorite->url, + gtk_list_store_set (store, &tree_iter, + COLUMN_TITLE, favorite->title ? favorite->title : "", + COLUMN_URL, text, COLUMN_EDITABLE, TRUE, COLUMN_FAVORITE, favorite, -1); - + favorites_list_iter = g_list_next(favorites_list_iter); } @@ -552,7 +574,7 @@ void hfd_new_favorite(GtkWidget* widget) GtkTreeIter tree_iter; GtkWidget* tree_view; GtkTreePath* path; - + gchar* text; GtkWidget* dialog = gtk_widget_get_toplevel(widget); favorites_list_ptr = (GList**)g_object_get_data(G_OBJECT(dialog), "favorites_list_ptr"); @@ -564,14 +586,17 @@ void hfd_new_favorite(GtkWidget* widget) favorite = hx_favorite_new(); favorite->title = g_strdup(_("Untitled")); - favorite->url = g_strdup("http://"); - + //favorite->url = g_strdup("http://"); + favorite->hu = hu_new(); + hu_set_utf8_url(favorite->hu, "http://", NULL); + text = hu_get_utf8_url(favorite->hu) ? \ + hu_get_utf8_url(favorite->hu) : hu_get_raw_url(favorite->hu); favorites_list = g_list_append(favorites_list, favorite); gtk_list_store_append(list_store, &tree_iter); gtk_list_store_set (list_store, &tree_iter, COLUMN_TITLE, favorite->title, - COLUMN_URL, favorite->url, + COLUMN_URL, text, COLUMN_EDITABLE, TRUE, COLUMN_FAVORITE, favorite, -1); diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/app/gtk/favorites.h realplay-10.0.4/player/app/gtk/favorites.h --- realplay-10.0.4.orig/player/app/gtk/favorites.h 2005-04-25 16:39:03.000000000 +0800 +++ realplay-10.0.4/player/app/gtk/favorites.h 2005-04-28 11:46:49.000000000 +0800 @@ -51,14 +51,15 @@ #define _FAVOURITES_H_ #include +#include G_BEGIN_DECLS typedef struct _HXFavorite { gchar* title; - gchar* url; - + /*gchar* url;*/ + HXURL* hu; } HXFavorite; HXFavorite* hx_favorite_new (void); diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/app/gtk/mainapp.cpp realplay-10.0.4/player/app/gtk/mainapp.cpp --- realplay-10.0.4.orig/player/app/gtk/mainapp.cpp 2005-04-25 16:39:02.000000000 +0800 +++ realplay-10.0.4/player/app/gtk/mainapp.cpp 2005-04-29 21:24:39.000000000 +0800 @@ -144,6 +144,16 @@ /* Data structures * =============== */ +extern "C" { + typedef struct _HXURL { + /* original url*/ + gchar *url; + /* utf8 formated url*/ + gchar *url_utf8; + /* original url charset*/ + gchar *charset; + }HXURL; +} typedef enum { ON_TOP_NEVER, @@ -267,6 +277,10 @@ typedef struct _HXMainWindow typedef struct { + /*Encodings*/ + gchar** remote_url_encodings; + gchar** meta_data_encodings; + /* Players */ GList* windows_list; @@ -350,7 +364,7 @@ void hmw_on_top_never (GtkWid void hmw_on_top_while_playing(GtkWidget *widget); void hmw_on_top_always (GtkWidget *widget); void hmw_play_from_menu_item (GtkWidget* widget, - gchar* url); + HXURL* hu); void hmw_play_group (GtkWidget* widget, guint group); @@ -412,7 +426,342 @@ void hmw_drag_data_received(GtkWidget* static HXMainWindow* hxwindow_get_from_widget (GtkWidget* widget); static void hxwindow_destroy (HXMainWindow* window); -}; // extern "C" +void hx_set_meta_data_encodings (gchar *encodings) +{ + g_return_if_fail(g_hx_main_app != NULL && encodings != NULL); + + /*FIXME:this function shouldn't be called more than once*/ + if (g_hx_main_app->meta_data_encodings) + return; + g_hx_main_app->meta_data_encodings = g_strsplit_set(encodings, ";,", 0); +} + +void hx_set_remote_url_encodings (gchar *encodings) +{ + g_return_if_fail(g_hx_main_app != NULL && encodings != NULL); + + /*FIXME:this function shouldn't be called more than once*/ + if (g_hx_main_app->remote_url_encodings) + return; + g_hx_main_app->remote_url_encodings = g_strsplit_set(encodings, ";,", 0); +} + +G_CONST_RETURN gchar** hx_get_meta_data_encodings () +{ + return g_hx_main_app->meta_data_encodings; +} + +G_CONST_RETURN gchar** hx_get_remote_url_encodings () +{ + return g_hx_main_app->remote_url_encodings; +} + +gboolean hx_is_valid_url_charset (const char *charset) +{ + gchar* locale_charset; + g_return_val_if_fail(charset != NULL, FALSE); + + if (charset && *charset) { + gchar **ep = hx_get_remote_url_encodings(); + while (ep && *ep) { + if (strcmp(*ep, charset) == 0) + return TRUE; + ep ++; + } + } + + g_get_charset(&locale_charset); + if (strcmp(charset, locale_charset) == 0) + return TRUE; + + return FALSE; +} + +/*convert meta data to utf8 encoded data + *@data meta data + *@return should be free by caller + */ +gchar *hx_meta_data_to_utf8 (G_CONST_RETURN gchar* data) +{ + gchar** sp; + gchar* utf8_data; + + g_return_val_if_fail(data != NULL, NULL); + + if (g_utf8_validate(data, -1, NULL)) + return g_strdup(data); + + sp = hx_get_meta_data_encodings(); + utf8_data = NULL; + + + while (sp && *sp && utf8_data == NULL) { + utf8_data = g_convert(data, strlen(data), "UTF-8", *sp, NULL, NULL, NULL); + sp ++; + } + + if (utf8_data == NULL) + utf8_data = g_locale_to_utf8(data, -1, NULL, NULL, NULL); + + if (utf8_data == NULL) + utf8_data = g_convert(data, strlen(data), "UTF-8", "ISO-8859-1", NULL, NULL, NULL); + + return utf8_data; +} + +HXURL *hu_new () +{ + return g_new0 (HXURL, 1); +} + +void hu_free (HXURL* hu) +{ + if (hu) { + g_free(hu->url); + g_free(hu->url_utf8); + g_free(hu); + } +} + +HXURL* hu_dup(HXURL* hu) +{ + HXURL* hu_copy; + + g_return_val_if_fail(hu != NULL, NULL); + + hu_copy = hu_new(); + g_return_val_if_fail(hu_copy != NULL, NULL); + + hu_copy->url = g_strdup(hu->url); + if (hu->url_utf8) + hu_copy->url_utf8 = g_strdup(hu->url_utf8); + hu_copy->charset = hu->charset; + + return hu_copy; +} + +void hu_set_url (HXURL *hu, const gchar *url, const gchar *charset) +{ + gint url_len; + gchar** encodings; + + g_return_if_fail(hu != NULL && url != NULL); + + if (hu->url) + g_free(hu->url); + if (hu->url_utf8) + g_free(hu->url_utf8); + + g_warning ("hu_set_url:url: %s", url); + g_warning ("hu_set_url:charset: %s", charset); + encodings = hx_get_remote_url_encodings(); + + if (strchr(url, '%')) { + hu->url = hxcommon_strdup_and_unescape_url(url); + } else { + hu->url = g_strdup(url); + } + hu->url_utf8 = NULL; + if (charset) { + gchar **ep = encodings; + while (ep && *ep && hu->url_utf8 == NULL) { + g_warning("encoding:%s\n", *ep); + if (strcmp(charset, *ep) == 0) { + hu->url_utf8 = g_convert (hu->url, strlen(hu->url), "UTF-8", *ep, NULL, NULL, NULL); + hu->charset = *ep; + break; + } + ep ++; + } + } + + g_warning ("hu->url:%s\n", hu->url); + g_warning ("hu->url_utf8:%s\n", hu->url_utf8); + g_warning ("hu->charset:%s\n", hu->charset); + if (hu->url_utf8) + return; + + url_len = strlen(hu->url); + if (!g_utf8_validate(hu->url, -1, NULL)) { + gchar **ep = encodings; + hu->url_utf8 = NULL; + while (ep && *ep && hu->url_utf8 == NULL) { + g_warning ("charset:%s\n", *ep); + hu->url_utf8 = g_convert(hu->url, url_len, "UTF-8", *ep, NULL, NULL, NULL); + hu->charset = *ep; + ep++; + } + } + + g_warning ("hu->url:%s\n", hu->url); + g_warning ("hu->url_utf8:%s\n", hu->url_utf8); + g_warning ("hu->charset:%s\n", hu->charset); + + if (hu->url_utf8 == NULL) { + hu->url_utf8 = g_locale_to_utf8 (hu->url, -1, NULL, NULL, NULL); + g_get_charset(&hu->charset); + + if (hu->url_utf8 == NULL) { + hu->url_utf8 = g_convert(hu->url, url_len, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); + hu->charset = NULL; + g_free(hu->url); + hu->url = g_strdup(hu->url_utf8); + return; + } + } +} + +void hu_set_utf8_url (HXURL *hu, const gchar *url, const gchar *charset) +{ + g_return_if_fail(hu != NULL && url != NULL); + + g_warning ("hu_set_utf8_url:url:%s(charset%s)", url, charset); + if (hu->url) { + g_free(hu->url); + hu->url = NULL; + } + if (hu->url_utf8) { + g_free(hu->url_utf8); + hu->url_utf8 = NULL; + } + + if (charset && *charset) { + gchar **ep = hx_get_remote_url_encodings(); + while (ep && *ep) { + if (strcmp(*ep, charset) == 0) { + hu->url = g_convert(url, strlen(url), charset, "UTF-8", NULL, NULL, NULL); + hu->url_utf8 = g_strdup(url); + hu->charset = *ep; + } + ep++; + } + } + + if (hu->url == NULL) { + g_get_charset(&hu->charset); + hu->url = g_locale_from_utf8(url, -1, NULL, NULL, NULL); + } + + if (hu->url == NULL) { + hu->url = g_convert(url, strlen(url), "ISO-8859-1", "UTF-8", NULL, NULL, NULL); + hu->url_utf8 = g_strdup(url); + hu->charset = NULL; + } + + g_warning ("hu->url:%s\n", hu->url); + g_warning ("hu->url_utf8:%s\n", hu->url_utf8); + g_warning ("hu->charset:%s\n", hu->charset); +} + +gchar* hu_get_raw_url (HXURL *hu) +{ + g_return_val_if_fail(hu != NULL, NULL); + + return hu->url; +} + +gchar* hu_get_utf8_url (HXURL *hu) +{ + g_return_val_if_fail(hu != NULL, NULL); + + return hu->url_utf8; +} + +gchar* hu_get_charset (HXURL *hu) +{ + g_return_val_if_fail(hu != NULL, NULL); + + return hu->charset; +} + +gboolean hu_is_equal (HXURL *left, HXURL*right) +{ + g_assert(left != NULL && right != NULL); + + if (strcmp(left->url, right->url) == 0) { + //return (strcmp (left->charset, right->charset) == 0); + return TRUE; + } + + return FALSE; +} + +HXURL* hu_from_url (const gchar *url) +{ + gchar* url_copy; + gchar* url_end; + gchar* url_charset; + HXURL* hu; + + g_return_val_if_fail (url != NULL, NULL); + + /*url with follow format: + * original url|url charset + * */ + url_copy = g_strdup(url); + url_end = strrchr(url_copy, '#'); + if (url_end && url_end[1] != '\0') { + url_charset = url_end + 1; + url_end[0] = '\0'; + } + else url_charset = NULL; + + hu = hu_new(); + if (url_charset && hx_is_valid_url_charset(url_charset) && g_utf8_validate(url_copy, -1, NULL)) + hu_set_utf8_url(hu, url_copy, url_charset); + else + hu_set_url(hu, url, NULL); + + g_free(url_copy); + + return hu; +} + +gchar* hu_to_url (const HXURL *hu) +{ + gchar* url; + + g_return_val_if_fail(hu != NULL, NULL); + + if (hu->charset && *hu->charset) + url = g_strdup_printf("%s#%s", hu->url_utf8 ? hu->url_utf8 : hu->url, hu->charset); + else + url = g_strdup(hu->url); + + return url; +} + +gchar* hu_to_url_without_charset (const HXURL *hu) +{ + gchar* url; + + g_return_val_if_fail(hu != NULL, NULL); + + if (hu->charset && *hu->charset) + url = g_strdup_printf("%s", hu->url_utf8 ? hu->url_utf8 : hu->url); + else + url = g_strdup(hu->url); + + return url; +} +}; //extern "C" + +static HXURL* hxwindow_find_hu_by_url (HXMainWindow *window, const gchar *url) +{ + g_return_val_if_fail(window != NULL && url != NULL, NULL); + + GList* iter = window->recent_urls_list; + HXURL* hu; + while (iter) { + hu = (HXURL *)iter->data; + if (strcmp(url, hu_get_raw_url(hu)) == 0) + return hu; + + iter = g_list_next(iter); + } + + return NULL; +} /* Recent url management implementation * ==================================== @@ -486,8 +835,12 @@ recent_urls_menu_populate(HXMainWindow* gchar* menu_item_text; gchar* title; gchar* url; + HXURL* hu; - url = g_strdup((const char*)iter->data); + //url = g_strdup((const char*)iter->data); + hu = (HXURL *)iter->data; + + url = hu_to_url_without_charset(hu); title = hxcommon_get_title_from_url(url); escaped_filename = hxcommon_escape_underscores(title); @@ -505,7 +858,7 @@ recent_urls_menu_populate(HXMainWindow* g_object_set_data(G_OBJECT(menu_item), "item_type", (gpointer) PLAY_MENU_TYPE_MRU); g_signal_connect(G_OBJECT(menu_item), "activate", - G_CALLBACK(hmw_play_from_menu_item), url); + G_CALLBACK(hmw_play_from_menu_item), hu); g_object_set_data(G_OBJECT(menu_item), "url", url); @@ -549,14 +902,22 @@ recent_urls_add(HXMainWindow* window, GList* last; GList* pos; GList* iter; + HXURL* hu; + HXURL* hu_add; + hu_add = hu_from_url(url); /* Check for duplicates */ iter = window->recent_urls_list; while(iter) { - if(strcmp(url, (gchar*)iter->data) == 0) + hu = (HXURL *)iter->data; + /*if(strcmp(url, (gchar*)iter->data) == 0)*/ + /*if the raw url & its charset are the same, they are duplicates. + * */ + if (hu_is_equal(hu, hu_add)) { /* Already in our list */ + hu_free(hu_add); return; } @@ -572,7 +933,8 @@ recent_urls_add(HXMainWindow* window, the right number of urls */ pos = g_list_previous(last); - g_free(last->data); + //g_free(last->data); + hu_free(last->data); window->recent_urls_list = g_list_delete_link(window->recent_urls_list, last); last = pos; @@ -583,13 +945,15 @@ recent_urls_add(HXMainWindow* window, { window->recent_urls_list = g_list_append(window->recent_urls_list, - g_strdup(url)); + hu_add); + //g_strdup(url)); } else { window->recent_urls_list = g_list_prepend(window->recent_urls_list, - g_strdup(url)); + hu_add); + //g_strdup(url)); } /* Refresh the menu */ @@ -636,7 +1000,8 @@ populate_clip_list_menu(HXMainWindow* wi if(group_title_raw) { - group_title = g_strdup(group_title_raw); + //group_title = g_strdup(group_title_raw); + group_title = hx_meta_data_to_utf8(group_title_raw); if(strlen(group_title_raw) > MAX_GROUP_TITLE_LENGTH) { group_title[MAX_GROUP_TITLE_LENGTH] = '\0'; @@ -724,7 +1089,8 @@ show_setup_assistant(HXMainWindow* windo void hxwindow_recent_urls_remove_all(HXMainWindow* window) { - g_list_foreach(window->recent_urls_list, (GFunc)g_free, NULL); + //g_list_foreach(window->recent_urls_list, (GFunc)g_free, NULL); + g_list_foreach(window->recent_urls_list, (GFunc)hu_free, NULL); g_list_free(window->recent_urls_list); window->recent_urls_list = NULL; @@ -832,7 +1198,7 @@ favorites_menu_populate(HXMainWindow* wi { gchar* escaped_title; gchar* menu_item_text; - gchar* url; + /*gchar* url;*/ HXFavorite* favorite = (HXFavorite*)iter->data; escaped_title = hxcommon_escape_underscores(favorite->title); @@ -847,13 +1213,13 @@ favorites_menu_populate(HXMainWindow* wi g_object_set_data(G_OBJECT(menu_item), "item_type", (gpointer) PLAY_MENU_TYPE_FAVORITE); - url = g_strdup(favorite->url); + //url = hu_to_url_without_charset(favorite->hu); g_signal_connect(G_OBJECT(menu_item), "activate", - G_CALLBACK(hmw_play_from_menu_item), url); + G_CALLBACK(hmw_play_from_menu_item), favorite->hu); /* Free the g_strdup'd url from above on menu destruction */ - g_signal_connect_swapped(G_OBJECT(menu_item), "destroy", - G_CALLBACK(g_free), url); + /*g_signal_connect_swapped(G_OBJECT(menu_item), "destroy", + G_CALLBACK(g_free), url);*/ i++; pos++; iter = g_list_next(iter); @@ -873,9 +1239,14 @@ hxwindow_favorite_add(HXMainWindow* wind const gchar* favorite_url) { HXFavorite* favorite = hx_favorite_new(); - - favorite->title = g_strdup(favorite_title); - favorite->url = g_strdup(favorite_url); + HXURL* hu; + favorite->title = hx_meta_data_to_utf8(favorite_title); + + hu = hxwindow_find_hu_by_url(window, favorite_url); + if (hu) + favorite->hu = hu_dup(hu); + else + favorite->hu = hu_from_url(favorite_url); g_hx_main_app->favorites_list = g_list_append(g_hx_main_app->favorites_list, favorite); @@ -1207,10 +1578,10 @@ hxwindow_set_property(HXMainWindow* wind { const gchar* origcode = g_value_get_string(value); snprintf(window->origcode, sizeof(window->origcode), "%s", origcode); - } + } else { - g_warning("Unknown property %s in config file", key); + g_warning("hxwindow_set_property:Unknown property `%s\' in config file", key); } } @@ -1268,7 +1639,7 @@ hxwindow_get_property(HXMainWindow* wind } else { - g_warning("Unknown property %s in config file", key); + g_warning("hxwindow_get_property:Unknown property `%s\' in config file", key); ret = FALSE; } @@ -1337,6 +1708,7 @@ hxwindow_save_preferences(HXMainWindow* gboolean result; guint i; GValue val; + gchar* url; /* Write out window preferences */ @@ -1361,9 +1733,34 @@ hxwindow_save_preferences(HXMainWindow* "WebBrowserPath", "LastBrowsedDirectory", "DistCode", - "OrigCode" + "OrigCode", }; + hxcommon_channel_write(chan, "\n[encoding]\n"); + + gchar** encodings; + gchar* encoding; + + encodings = hx_get_remote_url_encodings(); + if (encodings) { + encoding = g_strjoinv(",", encodings); + line = g_strdup_printf("RemoteUrlEncoding=%s\n", encoding); + hxcommon_channel_write(chan, line); + g_free(line); + g_free(encoding); + } else + hxcommon_channel_write(chan, "RemoteUrlEncoding=\n"); + + encodings = hx_get_meta_data_encodings(); + if (encodings) { + encoding = g_strjoinv(",", encodings); + line = g_strdup_printf("MetaDataEncoding=%s\n", encoding); + hxcommon_channel_write(chan, line); + g_free(line); + g_free(encoding); + } else + hxcommon_channel_write(chan, "MetaDataEncoding=\n"); + memset(&val, 0, sizeof(val)); hxcommon_channel_write(chan, "\n[player]\n"); @@ -1419,13 +1816,21 @@ hxwindow_save_preferences(HXMainWindow* /* Step 3: Write out recently used url's */ GList* recent_iter; + HXURL* hu; hxcommon_channel_write(chan, "\n[recent_urls]\n"); i = 0; recent_iter = window->recent_urls_list; while(recent_iter) { - line = g_strdup_printf("url%d=%s\n", i, (gchar*)recent_iter->data); + hu = (HXURL *) recent_iter->data; + //line = g_strdup_printf("url%d=%s\n", i, (gchar*)recent_iter->data); + //if url isn't utf8 encoding, then save url as following format: + //url(utf8)|charset + if (hu_get_utf8_url(hu) && hu_get_charset(hu)) + line = g_strdup_printf("url%d=%s#%s\n", i, hu_get_utf8_url(hu), hu_get_charset(hu)); + else + line = g_strdup_printf("url%d=%s\n", i, hu_get_raw_url(hu)); result = hxcommon_channel_write(chan, line); g_free(line); @@ -1450,7 +1855,11 @@ hxwindow_save_preferences(HXMainWindow* result = hxcommon_channel_write(chan, line); g_free(line); - line = g_strdup_printf("favorite_url%d=%s\n", i, favorite->url); + //line = g_strdup_printf("favorite_url%d=%s\n", i, favorite->url); + + url = hu_to_url(favorite->hu); + line = g_strdup_printf("favorite_url%d=%s\n", i, url ? url : ""); + g_free(url); result = hxcommon_channel_write(chan, line); g_free(line); @@ -2287,7 +2696,9 @@ hxwindow_open_location(HXMainWindow* win { if(!window->open_location_dialog) { - window->open_location_dialog = hxplay_open_location_dialog_new (window->recent_urls_list); + //window->open_location_dialog = hxplay_open_location_dialog_new (window->recent_urls_list); + //FIXME: + window->open_location_dialog = hxplay_open_location_dialog_new (NULL); if(window->open_location_dialog) { gtk_window_set_transient_for(GTK_WINDOW(window->open_location_dialog), @@ -3577,11 +3988,11 @@ hmw_hxbin_size_allocate(HXMainWindow* wi } void -hmw_play_from_menu_item(GtkWidget* widget, gchar* url) +hmw_play_from_menu_item(GtkWidget* widget, HXURL* hu) { HXMainWindow* window = hxwindow_get_from_widget(widget); - - hxwindow_open(window, url); + + hxwindow_open(window, hu_get_raw_url(hu)); } void @@ -3632,6 +4043,13 @@ hpw_play(HXMainWindow* window) } } + /*convert window title to utf8 encoded string + * */ + gchar* window_utf8_title = hx_meta_data_to_utf8(window_title); + if (window_utf8_title) { + g_free(window_title); + window_title = window_utf8_title; + } gtk_window_set_title(GTK_WINDOW(window->window), window_title); g_free(window_title); @@ -4535,7 +4953,7 @@ static void hxwindow_destroy(HXMainWindow* window) { GList* item; - + #ifdef HELIX_FEATURE_RP_SIGN_IN /* Init sign-in and add a menu item */ sign_in_destroy(); @@ -4543,7 +4961,8 @@ hxwindow_destroy(HXMainWindow* window) hxcommon_save_preferences(window); - g_list_foreach(window->recent_urls_list, (GFunc)g_free, NULL); + //g_list_foreach(window->recent_urls_list, (GFunc)g_free, NULL); + g_list_foreach(window->recent_urls_list, (GFunc)hu_free, NULL); g_list_free(window->recent_urls_list); if(window->context_menu) @@ -4564,6 +4983,8 @@ hxwindow_destroy(HXMainWindow* window) { if(g_hx_main_app) { + g_strfreev(g_hx_main_app->remote_url_encodings); + g_strfreev(g_hx_main_app->meta_data_encodings); g_free(g_hx_main_app); } diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/app/gtk/mainapp.h realplay-10.0.4/player/app/gtk/mainapp.h --- realplay-10.0.4.orig/player/app/gtk/mainapp.h 2005-04-25 16:39:03.000000000 +0800 +++ realplay-10.0.4/player/app/gtk/mainapp.h 2005-04-28 11:51:56.000000000 +0800 @@ -57,7 +57,9 @@ G_BEGIN_DECLS struct _HXMainWindow; typedef struct _HXMainWindow HXMainWindow; - +struct _HXURL; +typedef struct _HXURL HXURL; + typedef enum { NORMAL_SIZE = 0, @@ -139,7 +141,26 @@ G_CONST_RETURN gchar* hxwindow_get_sign_in_property(HXMainWindow* window, const gchar* key); #endif - + +void hx_set_meta_data_encodings (gchar *encodings); +void hx_set_remote_url_encodings (gchar *encodings); +G_CONST_RETURN gchar** hx_get_meta_data_encodings (); +G_CONST_RETURN gchar** hx_get_remote_url_encodings (); + +gchar* hx_meta_data_to_utf8 (G_CONST_RETURN gchar* data); + +HXURL* hu_new (); +void hu_free (HXURL *hu); +void hu_set_url (HXURL *hu, const gchar *url, const gchar *charset) ; +void hu_set_utf8_url (HXURL *hu, const gchar *url, const gchar *charset); +gchar* hu_get_raw_url (HXURL *hu); +gchar* hu_get_utf8_url (HXURL *hu); +gchar* hu_get_charset (HXURL *hu); +gboolean hu_is_equal (HXURL *left, HXURL*right); +HXURL* hu_from_url (const gchar *url); +gchar* hu_to_url (const HXURL *hu); +gchar* hu_to_url_without_charset (const HXURL *hu); + G_END_DECLS #endif diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/app/gtk/open.cpp realplay-10.0.4/player/app/gtk/open.cpp --- realplay-10.0.4.orig/player/app/gtk/open.cpp 2005-04-25 16:39:03.000000000 +0800 +++ realplay-10.0.4/player/app/gtk/open.cpp 2005-04-29 21:19:58.000000000 +0800 @@ -145,7 +145,8 @@ hxplay_open_file_dialog_response(GtkWidg g_return_if_fail(info != NULL); g_return_if_fail(info->window != NULL); - if(response_id == GTK_RESPONSE_OK) + g_warning ("your response is %d(OK is %d)", response_id, GTK_RESPONSE_OK); + if(response_id == GTK_RESPONSE_OK || response_id == GTK_RESPONSE_ACCEPT) { const gchar* str; @@ -158,12 +159,15 @@ hxplay_open_file_dialog_response(GtkWidg if(str && *str) { GValue value; - + HXURL* hu; + memset(&value, 0, sizeof(value)); g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, g_path_get_dirname(str)); + hu = hu_from_url(g_path_get_dirname(str)); + g_value_set_string(&value, hu_to_url(hu)); hxwindow_set_property(info->window, "LastBrowsedDirectory", &value); - g_value_unset(&value); + g_value_unset(&value); + hu_free(hu); } } } @@ -197,14 +201,20 @@ hxplay_open_file_dialog_new(HXMainWindow str = g_value_get_string(&value); if(str && *str) { - path = g_strdup_printf("%s/", str); + gchar* path_orig; + HXURL* hu; + + hu = hu_from_url(str); + path_orig = hu_get_raw_url(hu); + path = g_strdup_printf("%s/", path_orig ? path_orig : str); + hu_free(hu); } g_value_unset(&value); } } const gchar* select_files = _("Select files"); - + #if GTK_CHECK_VERSION(2, 4, 0) fs = gtk_file_chooser_dialog_new(select_files, NULL, diff -urp --exclude Makefile --exclude '*.o' --exclude rel --exclude dbg --exclude debug --exclude release realplay-10.0.4.orig/player/common/gtk/hxplayer.cpp realplay-10.0.4/player/common/gtk/hxplayer.cpp --- realplay-10.0.4.orig/player/common/gtk/hxplayer.cpp 2005-04-25 16:39:03.000000000 +0800 +++ realplay-10.0.4/player/common/gtk/hxplayer.cpp 2005-04-28 11:13:58.000000000 +0800 @@ -288,9 +288,10 @@ OnTitleChanged(void* userInfo, if(pTitle) { - in = strlen(pTitle) + 1; + /*in = strlen(pTitle) + 1; out = 0; - title = g_convert(pTitle, in - 1, "UTF-8", "ISO-8859-1", &in, &out, NULL); + title = g_convert(pTitle, in - 1, "UTF-8", "ISO-8859-1", &in, &out, NULL);*/ + title = g_strdup(pTitle); } g_signal_emit (G_OBJECT (player), signals[TITLE_CHANGED_SIGNAL], 0, title); @@ -2161,7 +2162,7 @@ hx_player_get_title(HXPlayer* player) if(szTitle) { - if(g_utf8_validate(szTitle, -1, NULL)) + /*if(g_utf8_validate(szTitle, -1, NULL)) { player->title_buf = g_strdup(szTitle); } @@ -2173,7 +2174,8 @@ hx_player_get_title(HXPlayer* player) in = strlen(szTitle) + 1; out = 0; player->title_buf = g_convert(szTitle, in - 1, "UTF-8", "ISO-8859-1", &in, &out, NULL); - } + }*/ + player->title_buf = g_strdup(szTitle); } return player->title_buf; @@ -2224,14 +2226,14 @@ hx_player_get_group_title(HXPlayer* play buf[buf_used] = '\0'; - if(g_utf8_validate(buf, -1, NULL)) + /*if(g_utf8_validate(buf, -1, NULL)) { player->group_title_buf = buf; } else - { + {*/ /* Convert to utf-8 */ - gsize in; + /*gsize in; gsize out; in = strlen(buf) + 1; @@ -2240,10 +2242,18 @@ hx_player_get_group_title(HXPlayer* play g_free(buf); } + */ + player->group_title_buf = buf; return player->group_title_buf; } +/* mainapp.cpp + */ +extern "C" { + gchar* hx_meta_data_to_utf8 (G_CONST_RETURN gchar* data); +}; + gboolean hx_player_get_statistic(HXPlayer* player, const gchar* key, @@ -2296,22 +2306,10 @@ hx_player_get_statistic(HXPlayer* pla } g_assert(buf_used == buf_desired); str_value[buf_used] = '\0'; - - if(g_utf8_validate(str_value, -1, NULL)) - { - utf8_val = str_value; - } - else - { - in = buf_used + 1; - out = 0; - utf8_val = g_convert(str_value, buf_used, "UTF-8", "ISO-8859-1", &in, &out, NULL); - g_assert(utf8_val); - g_free(str_value); - } - + utf8_val = hx_meta_data_to_utf8(str_value); g_value_init(value, G_TYPE_STRING); g_value_set_string_take_ownership(value, utf8_val); + g_free(str_value); break; default: