]> git.street.me.uk Git - andy/viking.git/blame_incremental - src/googlesearch.c
Use the last selected date when initializing the date search.
[andy/viking.git] / src / googlesearch.c
... / ...
CommitLineData
1/*
2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
3 *
4 * Copyright (C) 2003-2005, Quy Tonthat <qtonthat@gmail.com>
5 * Copyright (C) 2009, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
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
20 */
21#ifdef HAVE_CONFIG_H
22#include "config.h"
23#endif
24#include <stdlib.h>
25#include <stdio.h>
26#include <string.h>
27#include <glib.h>
28#include <glib/gstdio.h>
29#include <glib/gprintf.h>
30#include <glib/gi18n.h>
31
32#include "viking.h"
33#include "util.h"
34#include "curl_download.h"
35
36#include "googlesearch.h"
37
38/* Compatibility */
39#if ! GLIB_CHECK_VERSION(2,22,0)
40#define g_mapped_file_unref g_mapped_file_free
41#endif
42
43#define GOOGLE_GOTO_URL_FMT "http://maps.google.com/maps?q=%s&output=js"
44#define GOOGLE_GOTO_PATTERN_1 "{center:{lat:"
45#define GOOGLE_GOTO_PATTERN_2 ",lng:"
46#define GOOGLE_GOTO_NOT_FOUND "not understand the location"
47
48static DownloadMapOptions googlesearch_options = { FALSE, FALSE, "http://maps.google.com/", 2, a_check_map_file, NULL };
49
50static void google_goto_tool_finalize ( GObject *gob );
51
52static gchar *google_goto_tool_get_url_format ( VikGotoTool *self );
53static DownloadMapOptions *google_goto_tool_get_download_options ( VikGotoTool *self );
54static gboolean google_goto_tool_parse_file_for_latlon(VikGotoTool *self, gchar *filename, struct LatLon *ll);
55
56G_DEFINE_TYPE (GoogleGotoTool, google_goto_tool, VIK_GOTO_TOOL_TYPE)
57
58static void google_goto_tool_class_init ( GoogleGotoToolClass *klass )
59{
60 GObjectClass *object_class;
61 VikGotoToolClass *parent_class;
62
63 object_class = G_OBJECT_CLASS (klass);
64
65 object_class->finalize = google_goto_tool_finalize;
66
67 parent_class = VIK_GOTO_TOOL_CLASS (klass);
68
69 parent_class->get_url_format = google_goto_tool_get_url_format;
70 parent_class->get_download_options = google_goto_tool_get_download_options;
71 parent_class->parse_file_for_latlon = google_goto_tool_parse_file_for_latlon;
72}
73
74GoogleGotoTool *google_goto_tool_new ()
75{
76 return GOOGLE_GOTO_TOOL ( g_object_new ( GOOGLE_GOTO_TOOL_TYPE, "label", "Google", NULL ) );
77}
78
79static void google_goto_tool_init ( GoogleGotoTool *vlp )
80{
81}
82
83static void google_goto_tool_finalize ( GObject *gob )
84{
85 G_OBJECT_GET_CLASS(gob)->finalize(gob);
86}
87
88static gboolean google_goto_tool_parse_file_for_latlon(VikGotoTool *self, gchar *file_name, struct LatLon *ll)
89{
90 gchar *text, *pat;
91 GMappedFile *mf;
92 gsize len;
93 gboolean found = TRUE;
94 gchar lat_buf[32], lon_buf[32];
95 gchar *s;
96
97 lat_buf[0] = lon_buf[0] = '\0';
98
99 if ((mf = g_mapped_file_new(file_name, FALSE, NULL)) == NULL) {
100 g_critical(_("couldn't map temp file"));
101 return FALSE;
102 }
103 len = g_mapped_file_get_length(mf);
104 text = g_mapped_file_get_contents(mf);
105
106 if (g_strstr_len(text, len, GOOGLE_GOTO_NOT_FOUND) != NULL) {
107 found = FALSE;
108 goto done;
109 }
110
111 if ((pat = g_strstr_len(text, len, GOOGLE_GOTO_PATTERN_1)) == NULL) {
112 found = FALSE;
113 goto done;
114 }
115 pat += strlen(GOOGLE_GOTO_PATTERN_1);
116 s = lat_buf;
117 if (*pat == '-')
118 *s++ = *pat++;
119 while ((s < (lat_buf + sizeof(lat_buf))) && (pat < (text + len)) &&
120 (g_ascii_isdigit(*pat) || (*pat == '.')))
121 *s++ = *pat++;
122 *s = '\0';
123 if ((pat >= (text + len)) || (lat_buf[0] == '\0')) {
124 found = FALSE;
125 goto done;
126 }
127
128 if (strncmp(pat, GOOGLE_GOTO_PATTERN_2, strlen(GOOGLE_GOTO_PATTERN_2))) {
129 found = FALSE;
130 goto done;
131 }
132
133 pat += strlen(GOOGLE_GOTO_PATTERN_2);
134 s = lon_buf;
135
136 if (*pat == '-')
137 *s++ = *pat++;
138 while ((s < (lon_buf + sizeof(lon_buf))) && (pat < (text + len)) &&
139 (g_ascii_isdigit(*pat) || (*pat == '.')))
140 *s++ = *pat++;
141 *s = '\0';
142 if ((pat >= (text + len)) || (lon_buf[0] == '\0')) {
143 found = FALSE;
144 goto done;
145 }
146
147 ll->lat = g_ascii_strtod(lat_buf, NULL);
148 ll->lon = g_ascii_strtod(lon_buf, NULL);
149
150done:
151 g_mapped_file_unref(mf);
152 return (found);
153
154}
155
156static gchar *google_goto_tool_get_url_format ( VikGotoTool *self )
157{
158 return GOOGLE_GOTO_URL_FMT;
159}
160
161DownloadMapOptions *google_goto_tool_get_download_options ( VikGotoTool *self )
162{
163 return &googlesearch_options;
164}