/*
- * This file is part of maemo-mapper
+ * This file is part of mapper
*
+ * Copyright (C) 2007 Kaj-Michael Lang
* Copyright (C) 2006-2007 John Costigan.
*
* POI and GPS-Info code originally written by Cezary Jackiewicz.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
-
-#define _(String) gettext(String)
-
#include <config.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
#include <glib/gstdio.h>
+#include <glib/gi18n.h>
#ifdef WITH_GST
#include <gst/gst.h>
#endif
#include <gtk/gtk.h>
#include <fcntl.h>
#include <gdk/gdkkeysyms.h>
+#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
#include <libgnomevfs/gnome-vfs.h>
#include <curl/multi.h>
#include <libintl.h>
#include <locale.h>
-#include "hildon-mapper.h"
+#ifdef WITH_HILDON_DBUS_BT
+#include <bt-dbus.h>
+#endif
+#include "mapper.h"
+#include "hildon-mapper.h"
#include "utils.h"
#include "mapper-types.h"
#include "settings.h"
#include "gps.h"
+#include "gps-conn.h"
#include "map.h"
#include "route.h"
#include "track.h"
-#include "bt.h"
#include "ui-common.h"
#include "db.h"
#include "osm-db.h"
+#include "poi.h"
#include "cb.h"
#include "speak.h"
#include "gpx.h"
{0, 0xa000, 0x0000, 0xa000} /* COLORABLE_POI */
};
+enum {
+ MAPPER_INIT_START=0,
+ MAPPER_INIT_MISC,
+ MAPPER_INIT_CONFIG,
+ MAPPER_INIT_DB,
+ MAPPER_INIT_POI,
+ MAPPER_INIT_OSM,
+ MAPPER_INIT_VOICE,
+ MAPPER_INIT_UI,
+ MAPPER_INIT_GOTO,
+ MAPPER_INIT_DONE
+} mapper_init_state;
+
+guint mis=MAPPER_INIT_START;
+
+static GtkWidget *init_progress;
+static GtkWidget *init_dialog;
/**
- * Save state and destroy all non-UI elements created by this program in
- * preparation for exiting.
+ * Initialize arrays
*/
-void mapper_destroy(void)
+static void
+variables_init(void)
{
- printf("%s()\n", __PRETTY_FUNCTION__);
-
- if (_curl_sid) {
- g_source_remove(_curl_sid);
- _curl_sid = 0;
- }
- config_save();
- config_save_repo();
- rcvr_disconnect();
- /* _program and widgets have already been destroyed. */
-
- osm_deinit();
- db_close(&_db);
-
- MACRO_PATH_FREE(_track);
- MACRO_PATH_FREE(_route);
-
- /* Clean up CURL. */
- if (_curl_multi) {
- CURL *curr;
- CURLMsg *msg;
- gint num_transfers, num_msgs;
-
- /* First, remove all downloads from _pui_tree. */
- g_tree_destroy(_pui_tree);
-
- /* Finish up all downloads. */
- while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(_curl_multi, &num_transfers) || num_transfers) {
- /* XXX: should inform the user why it's taking so damn long... */
- }
+UNITS_TEXT[UNITS_KM] = _("km");
+UNITS_TEXT[UNITS_MI] = _("mi.");
+UNITS_TEXT[UNITS_NM] = _("n.m.");
- /* Close all finished files. */
- while ((msg = curl_multi_info_read(_curl_multi, &num_msgs))) {
- if (msg->msg == CURLMSG_DONE) {
- /* This is a map download. */
- ProgressUpdateInfo *pui = g_hash_table_lookup(_pui_by_easy, msg->easy_handle);
- g_queue_push_head(_curl_easy_queue, msg->easy_handle);
- g_hash_table_remove(_pui_by_easy, msg->easy_handle);
- fclose(pui->file);
- curl_multi_remove_handle(_curl_multi, msg->easy_handle);
- }
- }
+INFO_FONT_TEXT[INFO_FONT_XXSMALL] = "xx-small";
+INFO_FONT_TEXT[INFO_FONT_XSMALL] = "x-small";
+INFO_FONT_TEXT[INFO_FONT_SMALL] = "small";
+INFO_FONT_TEXT[INFO_FONT_MEDIUM] = "medium";
+INFO_FONT_TEXT[INFO_FONT_LARGE] = "large";
+INFO_FONT_TEXT[INFO_FONT_XLARGE] = "x-large";
+INFO_FONT_TEXT[INFO_FONT_XXLARGE] = "xx-large";
+
+CUSTOM_KEY_GCONF[CUSTOM_KEY_UP] = GCONF_KEY_PREFIX "/key_up";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_DOWN] = GCONF_KEY_PREFIX "/key_down";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_LEFT] = GCONF_KEY_PREFIX "/key_left";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_RIGHT] = GCONF_KEY_PREFIX "/key_right";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_SELECT] = GCONF_KEY_PREFIX "/key_select";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_INCREASE] = GCONF_KEY_PREFIX "/key_increase";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_DECREASE] = GCONF_KEY_PREFIX "/key_decrease";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_FULLSCREEN] = GCONF_KEY_PREFIX "/key_fullscreen";
+CUSTOM_KEY_GCONF[CUSTOM_KEY_ESC] = GCONF_KEY_PREFIX "/key_esc";
- while ((curr = g_queue_pop_tail(_curl_easy_queue)))
- curl_easy_cleanup(curr);
+CUSTOM_KEY_ICON[CUSTOM_KEY_UP] = HWK_BUTTON_UP;
+CUSTOM_KEY_ICON[CUSTOM_KEY_LEFT] = HWK_BUTTON_LEFT;
+CUSTOM_KEY_ICON[CUSTOM_KEY_DOWN] = HWK_BUTTON_DOWN;
+CUSTOM_KEY_ICON[CUSTOM_KEY_RIGHT] = HWK_BUTTON_RIGHT;
+CUSTOM_KEY_ICON[CUSTOM_KEY_SELECT] = HWK_BUTTON_SELECT;
+CUSTOM_KEY_ICON[CUSTOM_KEY_INCREASE] = HWK_BUTTON_INCREASE;
+CUSTOM_KEY_ICON[CUSTOM_KEY_DECREASE] = HWK_BUTTON_DECREASE;
+CUSTOM_KEY_ICON[CUSTOM_KEY_FULLSCREEN] = HWK_BUTTON_VIEW;
+CUSTOM_KEY_ICON[CUSTOM_KEY_ESC] = HWK_BUTTON_CANCEL;
- curl_multi_cleanup(_curl_multi);
- _curl_multi = NULL;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_UP] = CUSTOM_ACTION_PAN_NORTH;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_LEFT] = CUSTOM_ACTION_PAN_WEST;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DOWN] = CUSTOM_ACTION_PAN_SOUTH;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_RIGHT] = CUSTOM_ACTION_PAN_EAST;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_SELECT] = CUSTOM_ACTION_TOGGLE_AUTOCENTER;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_INCREASE] = CUSTOM_ACTION_ZOOM_IN;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DECREASE] = CUSTOM_ACTION_ZOOM_OUT;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_FULLSCREEN] = CUSTOM_ACTION_TOGGLE_FULLSCREEN;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_ESC] = CUSTOM_ACTION_TOGGLE_TRACKS;
- g_queue_free(_curl_easy_queue);
- g_tree_destroy(_downloading_tree);
- g_hash_table_destroy(_pui_by_easy);
- }
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_NORTH] = _("Pan North");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_WEST] = _("Pan West");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_SOUTH] = _("Pan South");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_EAST] = _("Pan East");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_AUTOCENTER] = _("Toggle Auto-Center");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_FULLSCREEN] = _("Toggle Fullscreen");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_IN] = _("Zoom In");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_OUT] = _("Zoom Out");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_TRACKS] = _("Toggle Tracks");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SCALE] = _("Toggle Scale");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_POI] = _("Toggle POIs");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_CHANGE_REPO] = _("Select Next Repository");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTNEXT] = _("Show Distance to Next Waypoint");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTLAST] = _("Show Distance to End of Route");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_BREAK] = _("Insert Track Break");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTLAST] = _("Show Distance from Last Break");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTFIRST] = _("Show Distance from Beginning");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPS] = _("Toggle GPS");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPSINFO] = _("Toggle GPS Info");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SPEEDLIMIT] = _("Toggle Speed Limit");
- vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+COLORABLE_GCONF[COLORABLE_MARK] = GCONF_KEY_PREFIX "/color_mark";
+COLORABLE_GCONF[COLORABLE_MARK_VELOCITY] = GCONF_KEY_PREFIX "/color_mark_velocity";
+COLORABLE_GCONF[COLORABLE_MARK_OLD] = GCONF_KEY_PREFIX "/color_mark_old";
+COLORABLE_GCONF[COLORABLE_TRACK] = GCONF_KEY_PREFIX "/color_track";
+COLORABLE_GCONF[COLORABLE_TRACK_MARK] = GCONF_KEY_PREFIX "/color_track_mark";
+COLORABLE_GCONF[COLORABLE_TRACK_BREAK] = GCONF_KEY_PREFIX "/color_track_break";
+COLORABLE_GCONF[COLORABLE_ROUTE] = GCONF_KEY_PREFIX "/color_route";
+COLORABLE_GCONF[COLORABLE_ROUTE_WAY] = GCONF_KEY_PREFIX "/color_route_way";
+COLORABLE_GCONF[COLORABLE_ROUTE_BREAK] = GCONF_KEY_PREFIX "/color_route_break";
+COLORABLE_GCONF[COLORABLE_POI] = GCONF_KEY_PREFIX "/color_poi";
}
-void set_var_defaults(void)
+/**
+ * Save state and destroy all non-UI elements created by this program in
+ * preparation for exiting.
+ */
+static void
+mapper_destroy(void)
{
-_conn_state = RCVR_OFF;
+config_save();
+config_save_repo();
+map_download_deinit();
+map_poi_deinit();
+#if defined (WITH_GST) && defined (WITH_ESPEAK)
+speak_deinit();
+#endif
+gps_disconnect(_gps);
+gps_free(_gps);
+osm_deinit();
+db_close(&_db);
+track_deinit();
+route_deinit();
+
+gnome_vfs_shutdown();
+#ifdef WITH_OSSO
+osso_deinitialize(_osso);
+#endif
+curl_global_cleanup();
}
-gint mapper_osso_init(void)
+static gint
+mapper_osso_init(void)
{
#ifdef WITH_OSSO
/* Initialize _osso. */
return 0;
}
-gint mapper_osso_cb_init(void)
+static gint
+mapper_osso_cb_init(void)
{
+gchar *filter_string;
+
#ifdef WITH_OSSO
if (OSSO_OK != osso_rpc_set_default_cb_f(_osso, dbus_cb_default, NULL)) {
g_printerr("osso_rpc_set_default_cb_f failed.\n");
return 1;
}
#endif
+
+#ifdef WITH_OSSO_IC
+filter_string = g_strdup_printf("interface=%s", ICD_DBUS_INTERFACE);
+/* add match */
+dbus_bus_add_match(dbus_conn, filter_string, NULL);
+g_free(filter_string);
+
+/* add the callback */
+dbus_connection_add_filter(dbus_conn, get_connection_status_signal_cb, NULL, NULL);
+osso_iap_cb(iap_callback);
+#endif
+
return 0;
}
-void timezone_init(void)
+static void
+timezone_init(void)
{
time_t time1;
struct tm time2;
_gmtoffset = time2.tm_gmtoff;
}
-gint main(gint argc, gchar * argv[])
+static gboolean
+mapper_init(gpointer data)
{
- printf("%s()\n", __PRETTY_FUNCTION__);
+GError *error = NULL;
+gboolean ret=TRUE;
+gfloat p=0;
+gchar *w="Starting";
- /* Initialize localization. */
- setlocale(LC_ALL, "");
- bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
- bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
- textdomain(GETTEXT_PACKAGE);
+switch (mis) {
+ case MAPPER_INIT_START:
+ curl_global_init(CURL_GLOBAL_NOTHING);
+ gnome_vfs_init();
+ /* XXX: Load GPS configuration, then create gps */
+ _gps=gps_new(GPS_IO_SIMULATION);
+ _gps->connection_retry=gps_retry_connection;
+ _gps->connection_error=NULL;
+ _gps->connection_progress=gps_conn_set_progress;
+ _gps->update_location=gps_location_update;
+ _gps->update_info=gps_info_update;
- g_thread_init(NULL);
- g_type_init();
-#ifdef WITH_OSSO
- if (mapper_osso_init()!=0)
- return 1;
-#endif
- set_var_defaults();
-#ifdef WITH_GST
- gst_init(&argc, &argv);
- speak_init();
-#endif
- gtk_init(&argc, &argv);
- gconf_init(argc, argv, NULL);
- gnome_vfs_init();
- curl_global_init(CURL_GLOBAL_NOTHING);
- timezone_init();
- gpx_init();
- mapper_init(argc, argv);
-#ifdef WITH_OSSO
- if (mapper_osso_cb_init()!=0)
- return 1;
-#endif
- gtk_main();
- mapper_destroy();
-#ifdef WITH_GST
- speak_deinit();
-#endif
- gnome_vfs_shutdown();
-#ifdef WITH_OSSO
- osso_deinitialize(_osso);
+ timezone_init();
+ gpx_init();
+ variables_init();
+ latlon_init();
+ track_init();
+ route_init();
+ mis=MAPPER_INIT_CONFIG;
+ p=0.1;
+ w="Init";
+ break;
+ case MAPPER_INIT_CONFIG:
+ config_init();
+ map_download_init();
+ mis=MAPPER_INIT_DB;
+ p=0.2;
+ w="Config";
+ break;
+ case MAPPER_INIT_DB:
+ if (db_connect(&_db, _mapper_db)) {
+ mis=MAPPER_INIT_POI;
+ } else {
+ mis=MAPPER_INIT_VOICE;
+ }
+ p=0.5;
+ w="Database";
+ break;
+ case MAPPER_INIT_POI:
+ poi_init(&_db);
+ mis=MAPPER_INIT_OSM;
+ p=0.6;
+ w="POIs";
+ break;
+ case MAPPER_INIT_OSM:
+ osm_init(&_db);
+ mis=MAPPER_INIT_VOICE;
+ p=0.8;
+ w="OSM";
+ break;
+ case MAPPER_INIT_VOICE:
+ #if defined (WITH_GST) && defined (WITH_ESPEAK)
+ if (speak_init("en",_voice_speed,_voice_pitch)==FALSE) {
+ g_printerr("Espeak init failed\n");
+ popup_error(_window, "Speech init failed. Disabled.");
+ }
+ #endif
+ mis=MAPPER_INIT_MISC;
+ p=0.85;
+ w="Speech";
+ break;
+ case MAPPER_INIT_MISC:
+ /* Initialize D-Bus system connection. */
+ if (NULL == (dbus_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error))) {
+ g_printerr("Failed to open connection to D-Bus: %s.\n", error->message);
+ popup_error(_window, "Failed to connect to D-Bus.");
+ error = NULL;
+ }
+
+ /* XXX: Move this */
+ #ifdef WITH_OSSO
+ osso_hw_set_event_cb(_osso, NULL, osso_cb_hw_state, NULL);
+ #endif
+
+ mis=MAPPER_INIT_UI;
+ p=0.9;
+ w="Misc";
+ break;
+ case MAPPER_INIT_UI:
+ mapper_ui_init();
+ mis=MAPPER_INIT_GOTO;
+ p=0.99;
+ w="UI";
+ break;
+ case MAPPER_INIT_GOTO:
+ if (map_goto_position(&_home)==FALSE)
+ g_printerr("Home is not set.\n");
+ else
+ map_center_unit(_center.unitx, _center.unity);
+ mis=MAPPER_INIT_DONE;
+ p=1.0;
+ w="Done";
+ break;
+ case MAPPER_INIT_DONE:
+ progress_dialog_remove(init_dialog);
+ if (_enable_gps)
+ gps_connect_now(_gps);
+ return FALSE;
+ break;
+}
+
+gtk_progress_bar_set_fraction(GTK_PROGRESS(init_progress), p);
+gtk_progress_bar_set_text(GTK_PROGRESS(init_progress), w);
+return ret;
+}
+
+gint
+main(gint argc, gchar * argv[])
+{
+/* Initialize localization. */
+setlocale(LC_ALL, "");
+bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
+bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+textdomain(GETTEXT_PACKAGE);
+
+g_thread_init(NULL);
+g_type_init();
+g_set_application_name("Mapper");
+gtk_init(&argc, &argv);
+if (mapper_osso_init()!=0)
+ return 1;
+if (mapper_osso_cb_init()!=0)
+ return 1;
+#if defined (WITH_GST)
+gst_init(&argc, &argv);
#endif
- vprintf("%s(): return\n", __PRETTY_FUNCTION__);
- return 0;
+
+init_progress=gtk_progress_bar_new();
+init_dialog=progress_dialog("Mapper is loading...",init_progress);
+g_idle_add((GSourceFunc)mapper_init, NULL);
+gtk_main();
+mapper_destroy();
+
+return 0;
}