static JsonNode *line_to_location(char *line) { JsonNode *json, *o, *j; char *ghash; char tstamp[64], *bp; double lat, lon; long tst; snprintf(tstamp, 21, "%s", line); if ((bp = strchr(line, '{')) == NULL) return (NULL); if ((json = json_decode(bp)) == NULL) { return (NULL); } if ((j = json_find_member(json, "_type")) == NULL) { json_delete(json); return (NULL); } if (j->tag != JSON_STRING || strcmp(j->string_, "location") != 0) { json_delete(json); return (NULL); } o = json_mkobject(); if (json_copy_to_object(o, json, FALSE) == FALSE) { json_delete(o); json_delete(json); return (NULL); } json_delete(json); /* Done with this -- we've copied it. */ lat = lon = 0.0; if ((j = json_find_member(o, "lat")) != NULL) { lat = j->number_; } if ((j = json_find_member(o, "lon")) != NULL) { lon = j->number_; } if ((ghash = geohash_encode(lat, lon, geohash_prec())) != NULL) { json_append_member(o, "ghash", json_mkstring(ghash)); get_geo(o, ghash); free(ghash); } json_append_member(o, "isorcv", json_mkstring(tstamp)); tst = 0L; if ((j = json_find_member(o, "tst")) != NULL) { tst = j->number_; } json_append_member(o, "isotst", json_mkstring(isotime(tst))); return (o); }
/*! \brief Set a widget to a fixed size ... width in characters. \param widget is the pointer to the widget \param nchars is the number of charactors this widget should size itself for */ G_MODULE_EXPORT void set_fixed_size( GtkWidget *widget, int nchars ) { PangoRectangle geo; /*! Statically using the font size is BAD PRACTICE and should use the current theme settings, but that has its own issues! */ get_geo( widget, "8", &geo ); gtk_widget_set_size_request( widget, geo.width * nchars, geo.height ); }
void append_device_details(JsonNode *userlist, char *user, char *device) { char path[BUFSIZ]; JsonNode *node, *last, *card; snprintf(path, BUFSIZ, "%s/last/%s/%s/%s-%s.json", STORAGEDIR, user, device, user, device); last = json_mkobject(); if (json_copy_from_file(last, path) == TRUE) { JsonNode *tst; if ((tst = json_find_member(last, "tst")) != NULL) { json_append_member(last, "isotst", json_mkstring(isotime(tst->number_))); } json_append_element(userlist, last); } else { json_delete(last); } snprintf(path, BUFSIZ, "%s/cards/%s/%s.json", STORAGEDIR, user, user); card = json_mkobject(); if (json_copy_from_file(card, path) == TRUE) { json_copy_to_object(last, card, FALSE); } json_delete(card); if ((node = json_find_member(last, "ghash")) != NULL) { if (node->tag == JSON_STRING) { get_geo(last, node->string_); } } }
void append_device_details(JsonNode *userlist, char *user, char *device) { char path[BUFSIZ]; JsonNode *node, *last; snprintf(path, BUFSIZ, "%s/last/%s/%s/%s-%s.json", STORAGEDIR, user, device, user, device); last = json_mkobject(); if (json_copy_from_file(last, path) == TRUE) { JsonNode *tst; if ((tst = json_find_member(last, "tst")) != NULL) { json_append_member(last, "isotst", json_mkstring(isotime(tst->number_))); json_append_member(last, "disptst", json_mkstring(disptime(tst->number_))); } } append_card_to_object(last, user, device); if ((node = json_find_member(last, "ghash")) != NULL) { if (node->tag == JSON_STRING) { get_geo(last, node->string_); } } /* Extra data */ snprintf(path, BUFSIZ, "%s/last/%s/%s/extra.json", STORAGEDIR, user, device); json_copy_from_file(last, path); #if WITH_GREENWICH get_gw_data(user, device, last); #endif json_append_element(userlist, last); }