1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-11-04 08:17:17 -05:00

bug 153, 1066: Convert session-snapshot bookmarks to/from UTF-8.

These functions now expect or return strings in UTF-8:
delete_folder_by_name (sneak in a const, too), bookmark_terminal_tabs,
open_bookmark_folder, and get_auto_save_bookmark_foldername_utf8 (new
function).
This commit is contained in:
Kalle Olavi Niemitalo 2008-11-16 22:32:32 +02:00 committed by Kalle Olavi Niemitalo
parent 11acd03eb2
commit 99d1269bc5
5 changed files with 89 additions and 18 deletions

View File

@ -267,15 +267,17 @@ delete_bookmark(struct bookmark *bm)
done_bookmark(bm);
}
/* Deletes any bookmarks with no URLs (i.e., folders) and of which
* the title matches the given argument. */
/** Deletes any bookmarks with no URLs (i.e., folders) and of which
* the title matches the given argument.
*
* @param foldername
* The title of the folder, in UTF-8. */
static void
delete_folder_by_name(unsigned char *foldername)
delete_folder_by_name(const unsigned char *foldername)
{
struct bookmark *bookmark, *next;
foreachsafe (bookmark, next, bookmarks) {
/** @todo Bug 153: bookmark->title should be UTF-8 */
if ((bookmark->url && *bookmark->url)
|| strcmp(bookmark->title, foldername))
continue;
@ -571,6 +573,7 @@ bookmark_terminal(struct terminal *term, struct bookmark *folder)
{
unsigned char title[MAX_STR_LEN], url[MAX_STR_LEN];
struct window *tab;
int term_cp = get_terminal_codepage(term);
foreachback_tab (tab, term->windows) {
struct session *ses = tab->data;
@ -581,15 +584,21 @@ bookmark_terminal(struct terminal *term, struct bookmark *folder)
if (!get_current_title(ses, title, MAX_STR_LEN))
continue;
/** @todo Bugs 153, 1066: add_bookmark() expects UTF-8. */
add_bookmark(folder, 1, title, url);
add_bookmark_cp(folder, 1, term_cp, title, url);
}
}
/** Create a bookmark for each document on the specified terminal,
* and a folder to contain those bookmarks.
*
* @param term
* The terminal whose open documents should be bookmarked.
*
* @param foldername
* The name of the new bookmark folder, in UTF-8. */
void
bookmark_terminal_tabs(struct terminal *term, unsigned char *foldername)
{
/** @todo Bug 153: add_bookmark() expects UTF-8. */
struct bookmark *folder = add_bookmark(NULL, 1, foldername, NULL);
if (!folder) return;
@ -631,23 +640,48 @@ bookmark_all_terminals(struct bookmark *folder)
}
unsigned char *
get_auto_save_bookmark_foldername_utf8(void)
{
unsigned char *foldername;
int from_cp, to_cp;
struct conv_table *convert_table;
foldername = get_opt_str("ui.sessions.auto_save_foldername");
if (!*foldername) return NULL;
/* The charset of the string returned by get_opt_str()
* seems to be documented nowhere. Let's assume it is
* the system charset. */
from_cp = get_cp_index("System");
to_cp = get_cp_index("UTF-8");
convert_table = get_translation_table(from_cp, to_cp);
if (!convert_table) return NULL;
return convert_string(convert_table,
foldername, strlen(foldername),
to_cp, CSM_NONE,
NULL, NULL, NULL);
}
void
bookmark_auto_save_tabs(struct terminal *term)
{
unsigned char *foldername;
unsigned char *foldername; /* UTF-8 */
if (get_cmd_opt_bool("anonymous")
|| !get_opt_bool("ui.sessions.auto_save"))
return;
foldername = get_opt_str("ui.sessions.auto_save_foldername");
if (!*foldername) return;
foldername = get_auto_save_bookmark_foldername_utf8();
if (!foldername) return;
/* Ensure uniqueness of the auto save folder, so it is possible to
* restore the (correct) session when starting up. */
delete_folder_by_name(foldername);
bookmark_terminal_tabs(term, foldername);
mem_free(foldername);
}
static void
@ -665,8 +699,10 @@ bookmark_snapshot(void)
add_date_to_string(&folderstring, get_opt_str("ui.date_format"), NULL);
#endif
/** @todo Bug 153: add_bookmark() expects UTF-8. */
folder = add_bookmark(NULL, 1, folderstring.source, NULL);
/* folderstring must be in the system codepage because
* add_date_to_string() uses strftime(). */
folder = add_bookmark_cp(NULL, 1, get_cp_index("System"),
folderstring.source, NULL);
done_string(&folderstring);
if (!folder) return;
@ -677,6 +713,14 @@ bookmark_snapshot(void)
}
/** Open all bookmarks from the named folder.
*
* @param ses
* The session in which to open the first bookmark. The other
* bookmarks of the folder open in new tabs on the same terminal.
*
* @param foldername
* The name of the bookmark folder, in UTF-8. */
void
open_bookmark_folder(struct session *ses, unsigned char *foldername)
{
@ -690,7 +734,6 @@ open_bookmark_folder(struct session *ses, unsigned char *foldername)
foreach (bookmark, bookmarks) {
if (bookmark->box_item->type != BI_FOLDER)
continue;
/** @todo Bug 153: bookmark->title should be UTF-8 */
if (strcmp(bookmark->title, foldername))
continue;
folder = bookmark;

View File

@ -51,6 +51,7 @@ struct bookmark *get_bookmark_by_name(struct bookmark *folder,
unsigned char *title);
struct bookmark *get_bookmark(unsigned char *url);
void bookmark_terminal_tabs(struct terminal *term, unsigned char *foldername);
unsigned char *get_auto_save_bookmark_foldername_utf8(void);
void bookmark_auto_save_tabs(struct terminal *term);
int update_bookmark(struct bookmark *, int,
unsigned char *, unsigned char *);

View File

@ -699,6 +699,28 @@ launch_bm_add_link_dialog(struct terminal *term,
Bookmark tabs dialog.
\****************************************************************************/
static void
bookmark_terminal_tabs_ok(void *term_void, unsigned char *foldername)
{
struct terminal *const term = term_void;
int from_cp = get_terminal_codepage(term);
int to_cp = get_cp_index("UTF-8");
struct conv_table *convert_table;
unsigned char *converted;
convert_table = get_translation_table(from_cp, to_cp);
if (convert_table == NULL) return; /** @todo Report the error */
converted = convert_string(convert_table,
foldername, strlen(foldername),
to_cp, CSM_NONE,
NULL, NULL, NULL);
if (converted == NULL) return; /** @todo Report the error */
bookmark_terminal_tabs(term_void, converted);
mem_free(converted);
}
void
bookmark_terminal_tabs_dialog(struct terminal *term)
{
@ -717,8 +739,7 @@ bookmark_terminal_tabs_dialog(struct terminal *term)
N_("Bookmark tabs"), N_("Enter folder name"),
term, NULL,
MAX_STR_LEN, string.source, 0, 0, NULL,
(void (*)(void *, unsigned char *)) bookmark_terminal_tabs,
NULL);
bookmark_terminal_tabs_ok, NULL);
done_string(&string);
}

View File

@ -178,6 +178,9 @@ struct document {
#endif
struct uri *uri;
/** The title of the document. The charset of this string is
* document.options.cp. */
unsigned char *title;
struct cache_entry *cached;

View File

@ -825,10 +825,13 @@ setup_first_session(struct session *ses, struct uri *uri)
#ifdef CONFIG_BOOKMARKS
} else if (!uri && get_opt_bool("ui.sessions.auto_restore")) {
unsigned char *folder;
unsigned char *folder; /* UTF-8 */
folder = get_opt_str("ui.sessions.auto_save_foldername");
open_bookmark_folder(ses, folder);
folder = get_auto_save_bookmark_foldername_utf8();
if (folder) {
open_bookmark_folder(ses, folder);
mem_free(folder);
}
return 1;
#endif
}