]> err.no Git - mapper/commitdiff
Path bug fixes and checks for valid Path
authorKaj-Michael Lang <milang@tal.org>
Fri, 25 Apr 2008 13:15:46 +0000 (16:15 +0300)
committerKaj-Michael Lang <milang@tal.org>
Fri, 25 Apr 2008 13:15:46 +0000 (16:15 +0300)
src/path.c
src/path.h
src/route.c
src/route.h

index 2a6268c64b050a7c54eb9a04c6f054fe0e3116d2..a26d874d0b9f457449b57874ecc92a218b92d3a6 100644 (file)
 #include "gpx.h"
 
 struct sql_select_stmt {
-    sqlite3_stmt *select_path;
-    sqlite3_stmt *select_path_nodes;
-    sqlite3_stmt *insert_path;
-    sqlite3_stmt *insert_path_node;
-    sqlite3_stmt *delete_path_nodes;
-    sqlite3_stmt *delete_path;
+       sqlite3_stmt *select_paths;
+       sqlite3_stmt *select_path_nodes;
+
+       sqlite3_stmt *insert_path;
+       sqlite3_stmt *insert_path_node;
+
+       sqlite3_stmt *delete_path;
+       sqlite3_stmt *delete_path_nodes;
 };
 static struct sql_select_stmt sql;
 
+#define PATH_TABLE_PATHS "create table IF NOT EXISTS paths ( \
+       nid             int primary key, \
+       name    text not null, \
+       desc    text, \
+       t               int not null);"
+
+#define PATH_TABLE_NODES "create table IF NOT EXISTS path_nodes ( \
+       nid             int not null, \
+       lat     real not null, \
+       lon     real not null, \
+       sats    int, \
+       speed   real, \
+       course  real, \
+       pdop    real, \
+       hdop    real, \
+       vdop    real, \
+       name    text default null, \
+       t               int not null);"
+
 /* Path point add sensitivity */
 static gint sensitivity=3;
 
@@ -75,10 +96,14 @@ p->points=0;
 gboolean 
 path_resize(Path *path, guint size)
 {
+g_return_val_if_fail(path, FALSE);
+
 if (path->head + size != path->cap) {
-       Point *old_head = path->head;
        WayPoint *curr;
+       Point *old_head = path->head;
+
        path->head = g_renew(Point, old_head, size);
+       g_assert(path->head);
        path->cap = path->head + size;
        if (path->head != old_head) {
                path->tail = path->head + (path->tail - old_head);
@@ -95,11 +120,15 @@ return FALSE;
 gboolean 
 path_wresize(Path *path, guint wsize)
 {
+g_return_val_if_fail(path, FALSE);
+
 if (path->whead + wsize != path->wcap) {
        WayPoint *old_whead = path->whead;
+
        path->whead = g_renew(WayPoint, old_whead, wsize);
        path->wtail = path->whead + (path->wtail - old_whead);
        path->wcap = path->whead + wsize;
+
        return TRUE;
 }
 return FALSE;
@@ -108,6 +137,8 @@ return FALSE;
 gboolean
 path_add_point(Path *path, GpsData *gps)
 {
+g_return_val_if_fail(path, FALSE);
+
 if (!gps) {
        MACRO_PATH_INCREMENT_TAIL(*path);
        *path->tail=_point_null;
@@ -139,11 +170,8 @@ return TRUE;
 gboolean 
 path_insert_break(Path *path)
 {
-if (!path)
-       return FALSE;
-
-if (!path->tail)
-       return FALSE;
+g_return_val_if_fail(path, FALSE);
+g_return_val_if_fail(path->tail, FALSE);
 
 if (path->tail->unity) {
        guint x1, y1;
@@ -171,6 +199,8 @@ path_find_last_point(Path *path)
 {
 Point *p=NULL;
 
+g_return_val_if_fail(path, NULL);
+
 if (path->head == path->tail)
        return p;
 
@@ -185,6 +215,8 @@ path_get_distance_to(Path *path, Point *point, gdouble lat, gdouble lon)
 gdouble lat1, lon1, lat2, lon2;
 gdouble sum=0.0;
 
+g_return_val_if_fail(path, 0.0);
+
 /* If point is NULL, use the next waypoint. */
 if (point == NULL && path->next_way)
        point = path->next_way->point;
@@ -233,6 +265,10 @@ gchar *pfile;
 gchar *bytes;
 gint size;
 
+g_return_val_if_fail(path, FALSE);
+g_return_val_if_fail(config_dir, FALSE);
+g_return_val_if_fail(file, FALSE);
+
 pfile = gnome_vfs_uri_make_full_from_relative(config_dir, file);
 if (gnome_vfs_read_entire_file(pfile, &size, &bytes)==GNOME_VFS_OK)
        gpx_parse(path, bytes, size, GPX_PATH_NEW);
@@ -245,6 +281,11 @@ path_save(Path *path, const gchar *config_dir, const gchar *file)
 {
 GnomeVFSHandle *handle;
 gchar *tfile;
+
+g_return_val_if_fail(path, FALSE);
+g_return_val_if_fail(config_dir, FALSE);
+g_return_val_if_fail(file, FALSE);
+
 tfile=gnome_vfs_uri_make_full_from_relative(config_dir, file);
 if (gnome_vfs_create(&handle, tfile, GNOME_VFS_OPEN_WRITE, FALSE, 0600)==GNOME_VFS_OK) {
        gpx_write(path, handle);
@@ -261,7 +302,7 @@ return TRUE;
 void 
 path_insert_mark_text(Path *path, gchar *text)
 {
-g_assert(path);
+g_return_if_fail(path);
 MACRO_PATH_INCREMENT_WTAIL(*path);
 path->wtail->point=path->tail;
 if (text) {
@@ -284,28 +325,26 @@ gchar tmp1[16], tmp2[16];
 gdouble lat1, lon1, lat2, lon2;
 gdouble sum=0.0;
 
-if (path->whead==path->wtail)
-       return NULL;
+g_return_val_if_fail(path, NULL);
 
 wcurr=path->whead;
 
-if (!wcurr)
-       return NULL;
+g_return_val_if_fail(wcurr, NULL);
+g_return_val_if_fail(wcurr->point, NULL);
 
-if (!wcurr->point)
-       return NULL;
+store=gtk_list_store_new(ROUTE_NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
 
-unit2latlon(wcurr->point->unitx, wcurr->point->unity, lat1, lon1);
+if (path->whead==path->wtail)
+       return store;
 
-store=gtk_list_store_new(ROUTE_NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
+unit2latlon(wcurr->point->unitx, wcurr->point->unity, lat1, lon1);
 
 while (wcurr!=path->wtail) {
-       if (!wcurr) {
+       if (!wcurr)
                break;
-       }
 
        if (!wcurr->point) {
-               g_debug("No point for waypoint (%s) skipping", wcurr->desc);
+               g_debug("PSTORE: No point for waypoint (%s) skipping", wcurr->desc);
                wcurr++;
                continue;
        }
@@ -339,14 +378,8 @@ return store;
 void
 position_set(Position *pos, gboolean valid, gdouble lat, gdouble lon)
 {
+g_assert(pos);
 pos->valid=valid;
 pos->lat=valid ? lat : NAN;
 pos->lon=valid ? lon : NAN;
 }
-
-void
-position_update(Position *pos, GpsData *data)
-{
-if (!pos->valid)
-       return;
-}
index a949178fbe37b132deeedc495e8cd51ba83d10ce..95f977c688d712a16d965db0b262286c2a0b4cee 100644 (file)
@@ -119,6 +119,8 @@ void path_insert_mark_text(Path *path, gchar *text);
 void path_insert_mark_autonumber(Path *path);
 void path_insert_mark_audio(Path *path, gchar *audio);
 
+void position_set(Position *pos, gboolean valid, gdouble lat, gdouble lon);
+
 GtkListStore *path_generate_store(Path *path);
 
 #define MACRO_PATH_INIT(path) { \
index e972975c40609255f19a7055dc9fd07545a373ca..88fd3fe5a0f16dcca3b5c11723face2a2febe3b3 100644 (file)
@@ -56,6 +56,8 @@ route_clear(Path *route)
 GtkWidget *confirm;
 gboolean r=FALSE;
 
+g_return_val_if_fail(route, FALSE);
+
 confirm=hildon_note_new_confirmation(GTK_WINDOW(_window), _("Really clear the route?"));
 
 if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
@@ -78,8 +80,8 @@ route_check_waypoint_announce(Path *route, GpsData *gps)
 {
 guint announce_thres_unsquared;
 
-if (!gps)
-       return;
+g_return_if_fail(route);
+g_return_if_fail(gps);
 
 if (!_announce_waypoints)
        return;
@@ -102,6 +104,8 @@ if (route->next_way_dist_squared<(announce_thres_unsquared * announce_thres_unsq
 void
 route_autoroute_check(Path *route)
 {
+g_return_if_fail(route);
+
 if (_autoroute_data.enabled && !_autoroute_data.in_progress && route->near_point_dist_squared > 400) {
        MACRO_BANNER_SHOW_INFO(_window, _("Recalculating directions..."));
        _autoroute_data.in_progress = TRUE;
@@ -116,6 +120,8 @@ route_open_file(Path *route)
 gchar *buffer;
 gint size;
 
+g_return_val_if_fail(route, FALSE);
+
 if (file_open_get_contents(&_route_dir_uri, &buffer, &size)) {
        /* If auto is enabled, append the route, otherwise replace it. */
        if (gpx_parse(route, buffer, size, _autoroute_data.enabled ? GPX_PATH_APPEND : GPX_PATH_NEW)) {
@@ -124,7 +130,7 @@ if (file_open_get_contents(&_route_dir_uri, &buffer, &size)) {
                MACRO_BANNER_SHOW_INFO(_window, _("Route Opened"));
                /* Find the nearest route point, if we're connected. */
                route_find_nearest_point(route);
-               route_set_destination_from_last(route);
+               route_set_destination_from_last(route, &_dest);
                return TRUE;
        } else {
                popup_error(_window, _("Error parsing GPX file."));
@@ -143,6 +149,8 @@ route_save(Path *route)
 {
 GnomeVFSHandle *handle;
 
+g_return_val_if_fail(route, FALSE);
+
 if (route->head==route->tail) {
        MACRO_BANNER_SHOW_INFO(_window, _("No route exist."));
        return FALSE;
@@ -464,7 +472,7 @@ while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
 
                MACRO_BANNER_SHOW_INFO(_window, _("Route Downloaded"));
                g_free(rdl_data.bytes);
-               route_set_destination_from_last(route);
+               route_set_destination_from_last(route, &_dest);
 
                /* Success! Get out of the while loop. */
                r=TRUE;
@@ -489,6 +497,8 @@ WayPoint *wnear;
 guint64 nearest_squared;
 Point pos = { unitx, unity, 0, NAN };
 
+g_return_val_if_fail(route, NULL);
+
 wcurr = wnear = route->whead;
 if (wcurr && wcurr->point && wcurr != route->wtail) {
        nearest_squared = DISTANCE_SQUARED(pos, *(wcurr->point));
@@ -528,6 +538,8 @@ Point *curr, *near;
 WayPoint *wcurr, *wnext;
 guint64 near_dist_squared;
 
+g_return_val_if_fail(route, FALSE);
+
 /* If we have waypoints (_next_way != NULL), then determine the "next
  * waypoint", which is defined as the waypoint after the nearest point,
  * UNLESS we've passed that waypoint, in which case the waypoint after
@@ -616,6 +628,8 @@ return ret;
 void 
 route_find_nearest_point(Path *route)
 {
+g_return_if_fail(route);
+
 /* Initialize near_point to first non-zero point. */
 route->near_point = route->head;
 while (!route->near_point->unity && route->near_point != route->tail)
@@ -649,6 +663,9 @@ gchar buffer[80];
 gdouble lat, lon;
 gdouble sum;
 
+g_return_val_if_fail(route, FALSE);
+g_return_val_if_fail(point, FALSE);
+
 unit2latlon(_gps->data.unitx, _gps->data.unity, lat, lon);
 sum=path_get_distance_to(route, point, lat, lon);
 g_snprintf(buffer, sizeof(buffer), "%s: %.02f %s", _("Distance"), sum * UNITS_CONVERT[_units], UNITS_TEXT[_units]);
@@ -660,6 +677,8 @@ return TRUE;
 void 
 route_show_distance_to_next(Path *route)
 {
+g_return_if_fail(route);
+
 if (!route_show_distance_to(route, NULL))
        MACRO_BANNER_SHOW_INFO(_window, _("There is no next waypoint."));
 }
@@ -670,6 +689,9 @@ route_set_destination_from_last(Path *route, Position *pos)
 Point *p;
 gdouble lat,lon;
 
+g_return_val_if_fail(route, FALSE);
+g_return_val_if_fail(pos, FALSE);
+
 if (route->head==route->tail) {
        position_set(pos, FALSE, NAN, NAN);
        return FALSE;
@@ -686,6 +708,8 @@ return TRUE;
 void 
 route_show_distance_to_last(Path *route)
 {
+g_return_if_fail(route);
+
 if (route->head != route->tail) {
        route_show_distance_to(route, path_find_last_point(route));
 } else {
index 39450c6c02115d281ee557e11a4b0637c6ba1b27..b39dca1dc3bce5d6b38cd2cde741aafa6daf02b9 100644 (file)
@@ -41,6 +41,8 @@ WayPoint *route_find_nearest_waypoint(Path *route, guint unitx, guint unity);
 
 gboolean route_update_nears(Path *route, gboolean quick);
 
+gboolean route_set_destination_from_last(Path *route, Position *pos);
+
 gboolean route_show_distance_to(Path *route, Point *point);
 void route_show_distance_to_last(Path *route);
 void route_show_distance_to_next(Path *route);