From 2120d394df38f53c1490942326a7ca5e915a1bd0 Mon Sep 17 00:00:00 2001 From: martin-s Date: Sat, 18 Dec 2010 20:44:41 +0000 Subject: [PATCH] Add:gui_internal:Initial work on downloading of maps within navit git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@3797 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/file.c | 47 ++++++++++++++++++++------------- navit/navit/file.h | 2 ++ navit/navit/gui/internal/gui_internal.c | 36 ++++++++++++++++++++++--- 3 files changed, 62 insertions(+), 23 deletions(-) diff --git a/navit/navit/file.c b/navit/navit/file.c index 7c2d1e2..95f075b 100644 --- a/navit/navit/file.c +++ b/navit/navit/file.c @@ -74,18 +74,35 @@ file_create(char *name, enum file_flags flags) { struct stat stat; struct file *file= g_new0(struct file,1); + int open_flags=O_LARGEFILE|O_BINARY; + char *cmd; + + if (flags & file_flag_readwrite) + open_flags |= O_RDWR; + else + open_flags |= O_RDONLY; - file->fd=open(name, O_RDONLY|O_LARGEFILE | O_BINARY); - if (file->fd == -1) { - g_free(file); - return NULL; - } - dbg(1,"fd=%d\n", file->fd); - fstat(file->fd, &stat); - file->size=stat.st_size; - dbg(1,"size=%Ld\n", file->size); file->name = g_strdup(name); - file->name_id = (int)atom(name); + if (flags & file_flag_url) { +#ifndef HAVE_API_WIN32_BASE + char *cmd=g_strdup_printf("curl '%s'",name); + file->stdfile=popen(cmd,"r"); + file->fd=fileno(file->stdfile); + file->special=1; + g_free(cmd); +#endif + } else { + file->fd=open(name, open_flags); + if (file->fd == -1) { + g_free(file); + return NULL; + } + dbg(1,"fd=%d\n", file->fd); + fstat(file->fd, &stat); + file->size=stat.st_size; + dbg(1,"size=%Ld\n", file->size); + file->name_id = (int)atom(name); + } if (file_cache && !(flags & file_flag_nocache)) file->cache=1; dbg_assert(file != NULL); @@ -96,14 +113,6 @@ file_create(char *name, enum file_flags flags) struct file * file_create_url(char *url) { - struct file *file= g_new0(struct file,1); - char *cmd=g_strdup_printf("curl %s",url); - file->name = g_strdup(url); - file->stdfile=popen(cmd,"r"); - file->fd=fileno(file->stdfile); - file->special=1; - g_free(cmd); - return file; } #endif @@ -502,7 +511,7 @@ file_destroy(struct file *f) case 0: close(f->fd); break; -#if 0 +#ifndef HAVE_API_WIN32_BASE case 1: pclose(f->stdfile); break; diff --git a/navit/navit/file.h b/navit/navit/file.h index f2bbc31..5821753 100644 --- a/navit/navit/file.h +++ b/navit/navit/file.h @@ -58,6 +58,8 @@ struct file { enum file_flags { file_flag_nocache=1, + file_flag_readwrite=2, + file_flag_url=4, }; /* prototypes */ diff --git a/navit/navit/gui/internal/gui_internal.c b/navit/navit/gui/internal/gui_internal.c index ca61055..6ab148b 100644 --- a/navit/navit/gui/internal/gui_internal.c +++ b/navit/navit/gui/internal/gui_internal.c @@ -4458,6 +4458,7 @@ gui_internal_html_start(void *dummy, const char *tag_name, const char **names, c if (!html->skip) this->html_anchor_found=1; } + html->command=find_attr_dup(names, values, "onclick"); html->href=find_attr_dup(names, values, "href"); html->refresh_cond=find_attr_dup(names, values, "refresh_cond"); break; @@ -4533,10 +4534,15 @@ gui_internal_html_end(void *dummy, const char *tag_name, void *data, void *error html->w->func=gui_internal_html_command; html->command=NULL; } - if (parent && parent->href && html->w) { + if (parent && (parent->href || parent->command) && html->w) { html->w->state |= STATE_SENSITIVE; - html->w->command=g_strdup(parent->href); - html->w->func=gui_internal_html_href; + if (parent->command) { + html->w->command=g_strdup(parent->command); + html->w->func=gui_internal_html_command; + } else { + html->w->command=g_strdup(parent->href); + html->w->func=gui_internal_html_href; + } } switch (html->tag) { case html_tag_div: @@ -6224,6 +6230,27 @@ gui_internal_cmd2_about(struct gui_priv *this, char *function, struct attr **in, graphics_draw_mode(this->gra, draw_mode_end); } +static void +gui_internal_cmd_map_downloader(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *html; + struct file *f; + int size; + if (!in || !in[0] || !ATTR_IS_STRING(in[0]->type) || !in[0]->u.str) + return; + f=file_create(in[0]->u.str, file_flag_url); + if (! f) + return; + html=file_data_read_special(f, 8192, &size); + if (size < 8192) { + html[size]='\0'; + printf("%s\n",html); + gui_internal_html_menu(this, html, NULL); + } + g_free(html); + file_destroy(f); +} + /** * @brief handles the 'next page' table event. @@ -6441,7 +6468,8 @@ static struct command_table commands[] = { {"town",command_cast(gui_internal_cmd2_town)}, {"quit",command_cast(gui_internal_cmd2_quit)}, {"write",command_cast(gui_internal_cmd_write)}, - {"about",command_cast(gui_internal_cmd2_about)} + {"about",command_cast(gui_internal_cmd2_about)}, + {"map_downloader",command_cast(gui_internal_cmd_map_downloader)} }; -- 2.7.4