]> git.street.me.uk Git - andy/viking.git/blame - src/googlesearch.c
Never willingly abort, remove exit() statements.
[andy/viking.git] / src / googlesearch.c
CommitLineData
369126f3
QT
1/*
2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
3 *
45ce7a38
GB
4 * Copyright (C) 2003-2005, Quy Tonthat <qtonthat@gmail.com>
5 * Copyright (C) 2009, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
369126f3
QT
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
369126f3 20 */
4c77d5e0
GB
21#ifdef HAVE_CONFIG_H
22#include "config.h"
23#endif
369126f3 24#include <stdlib.h>
8c060406 25#include <stdio.h>
369126f3 26#include <string.h>
8c060406
MA
27#include <glib.h>
28#include <glib/gstdio.h>
369126f3 29#include <glib/gprintf.h>
4c77d5e0 30#include <glib/gi18n.h>
369126f3
QT
31
32#include "viking.h"
ba4a5e11 33#include "util.h"
369126f3
QT
34#include "curl_download.h"
35
7a5b9f80
GB
36#include "googlesearch.h"
37
34e71b99
GB
38#define GOOGLE_GOTO_URL_FMT "http://maps.google.com/maps?q=%s&output=js"
39#define GOOGLE_GOTO_PATTERN_1 "{center:{lat:"
40#define GOOGLE_GOTO_PATTERN_2 ",lng:"
41#define GOOGLE_GOTO_NOT_FOUND "not understand the location"
369126f3 42
74fbca98 43static DownloadMapOptions googlesearch_options = { FALSE, FALSE, "http://maps.google.com/", 0, a_check_map_file };
a3188993 44
34e71b99
GB
45static void google_goto_tool_class_init ( GoogleGotoToolClass *klass );
46static void google_goto_tool_init ( GoogleGotoTool *vwd );
369126f3 47
34e71b99 48static void google_goto_tool_finalize ( GObject *gob );
369126f3 49
0c6b26d3 50static gchar *google_goto_tool_get_url_format ( VikGotoTool *self );
b529dc9c 51static DownloadMapOptions *google_goto_tool_get_download_options ( VikGotoTool *self );
0c6b26d3 52static gboolean google_goto_tool_parse_file_for_latlon(VikGotoTool *self, gchar *filename, struct LatLon *ll);
369126f3 53
34e71b99 54GType google_goto_tool_get_type()
7a5b9f80
GB
55{
56 static GType w_type = 0;
57
58 if (!w_type)
59 {
60 static const GTypeInfo w_info =
61 {
34e71b99 62 sizeof (GoogleGotoToolClass),
7a5b9f80
GB
63 NULL, /* base_init */
64 NULL, /* base_finalize */
34e71b99 65 (GClassInitFunc) google_goto_tool_class_init,
7a5b9f80
GB
66 NULL, /* class_finalize */
67 NULL, /* class_data */
34e71b99 68 sizeof (GoogleGotoTool),
7a5b9f80 69 0,
34e71b99 70 (GInstanceInitFunc) google_goto_tool_init,
7a5b9f80 71 };
34e71b99 72 w_type = g_type_register_static ( VIK_GOTO_TOOL_TYPE, "GoogleGotoTool", &w_info, 0 );
7a5b9f80 73 }
369126f3 74
7a5b9f80 75 return w_type;
369126f3
QT
76}
77
34e71b99 78static void google_goto_tool_class_init ( GoogleGotoToolClass *klass )
369126f3 79{
7a5b9f80 80 GObjectClass *object_class;
34e71b99 81 VikGotoToolClass *parent_class;
369126f3 82
7a5b9f80 83 object_class = G_OBJECT_CLASS (klass);
369126f3 84
34e71b99 85 object_class->finalize = google_goto_tool_finalize;
369126f3 86
34e71b99 87 parent_class = VIK_GOTO_TOOL_CLASS (klass);
369126f3 88
0c6b26d3
GB
89 parent_class->get_url_format = google_goto_tool_get_url_format;
90 parent_class->get_download_options = google_goto_tool_get_download_options;
91 parent_class->parse_file_for_latlon = google_goto_tool_parse_file_for_latlon;
7a5b9f80 92}
369126f3 93
34e71b99 94GoogleGotoTool *google_goto_tool_new ()
7a5b9f80 95{
34e71b99 96 return GOOGLE_GOTO_TOOL ( g_object_new ( GOOGLE_GOTO_TOOL_TYPE, "label", "Google", NULL ) );
7a5b9f80 97}
369126f3 98
34e71b99 99static void google_goto_tool_init ( GoogleGotoTool *vlp )
7a5b9f80
GB
100{
101}
369126f3 102
34e71b99 103static void google_goto_tool_finalize ( GObject *gob )
7a5b9f80
GB
104{
105 G_OBJECT_GET_CLASS(gob)->finalize(gob);
369126f3
QT
106}
107
0c6b26d3 108static gboolean google_goto_tool_parse_file_for_latlon(VikGotoTool *self, gchar *file_name, struct LatLon *ll)
369126f3
QT
109{
110 gchar *text, *pat;
111 GMappedFile *mf;
112 gsize len;
113 gboolean found = TRUE;
114 gchar lat_buf[32], lon_buf[32];
115 gchar *s;
116
369126f3
QT
117 lat_buf[0] = lon_buf[0] = '\0';
118
119 if ((mf = g_mapped_file_new(file_name, FALSE, NULL)) == NULL) {
4258f4e2 120 g_critical(_("couldn't map temp file"));
d84ade77 121 return FALSE;
369126f3
QT
122 }
123 len = g_mapped_file_get_length(mf);
124 text = g_mapped_file_get_contents(mf);
125
34e71b99 126 if (g_strstr_len(text, len, GOOGLE_GOTO_NOT_FOUND) != NULL) {
d1f48cc2
QT
127 found = FALSE;
128 goto done;
129 }
130
34e71b99 131 if ((pat = g_strstr_len(text, len, GOOGLE_GOTO_PATTERN_1)) == NULL) {
369126f3
QT
132 found = FALSE;
133 goto done;
134 }
34e71b99 135 pat += strlen(GOOGLE_GOTO_PATTERN_1);
369126f3
QT
136 s = lat_buf;
137 if (*pat == '-')
138 *s++ = *pat++;
139 while ((s < (lat_buf + sizeof(lat_buf))) && (pat < (text + len)) &&
140 (g_ascii_isdigit(*pat) || (*pat == '.')))
141 *s++ = *pat++;
142 *s = '\0';
143 if ((pat >= (text + len)) || (lat_buf[0] == '\0')) {
144 found = FALSE;
145 goto done;
146 }
147
34e71b99 148 if (strncmp(pat, GOOGLE_GOTO_PATTERN_2, strlen(GOOGLE_GOTO_PATTERN_2))) {
369126f3
QT
149 found = FALSE;
150 goto done;
151 }
369126f3 152
34e71b99 153 pat += strlen(GOOGLE_GOTO_PATTERN_2);
369126f3
QT
154 s = lon_buf;
155
156 if (*pat == '-')
157 *s++ = *pat++;
158 while ((s < (lon_buf + sizeof(lon_buf))) && (pat < (text + len)) &&
159 (g_ascii_isdigit(*pat) || (*pat == '.')))
160 *s++ = *pat++;
161 *s = '\0';
162 if ((pat >= (text + len)) || (lon_buf[0] == '\0')) {
163 found = FALSE;
164 goto done;
165 }
166
167 ll->lat = g_ascii_strtod(lat_buf, NULL);
168 ll->lon = g_ascii_strtod(lon_buf, NULL);
169
369126f3
QT
170done:
171 g_mapped_file_free(mf);
369126f3
QT
172 return (found);
173
174}
175
0c6b26d3 176static gchar *google_goto_tool_get_url_format ( VikGotoTool *self )
369126f3 177{
0c6b26d3
GB
178 return GOOGLE_GOTO_URL_FMT;
179}
369126f3 180
b529dc9c 181DownloadMapOptions *google_goto_tool_get_download_options ( VikGotoTool *self )
0c6b26d3
GB
182{
183 return &googlesearch_options;
369126f3 184}