2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <json-glib/json-glib.h>
19 #include "mapquest_jsonparser.h"
20 #include "mapquest_queue.h"
21 #include "mapquest_debug.h"
22 #include "mapquest_util.h"
24 #define ROUTE_UNIT_CONVERSION_MILE_TO_M(x) (1609.34 * (x))
25 #define ROUTE_UNIT_CONVERSION_MILE_TO_KM(x) (1.60934 * (x))
26 #define ROUTE_UNIT_CONVERSION_MILE_TO_FT(x) (5280 * (x))
27 #define ROUTE_UNIT_CONVERSION_MILE_TO_YD(x) (1760 * (x))
29 static route_unit __route_unit = ROUTE_UNIT_M;
30 static int __maneuver_index = 0;
31 static coords_s __destination_point;
33 static mapquest_error_e __convert_status(int status)
35 mapquest_error_e error = MAPQUEST_ERROR_UNKNOWN;
39 /* Successful Geocode call */
40 error = MAPQUEST_ERROR_NONE;
45 /* Error with input - Illegal argument from request */
46 error = MAPQUEST_ERROR_INVALID_PARAMETER;
51 /* Key related error - Invalid key */
52 error = MAPQUEST_ERROR_KEY_NOT_AVAILABLE;
58 error = MAPQUEST_ERROR_UNKNOWN;
64 error = MAPQUEST_ERROR_NETWORK_UNREACHABLE;
72 /************ GEOCODE ***************/
74 static void __parse_lat_lng(JsonNode *node, GList **coordsList)
76 if (!node || !coordsList) return;
78 gdouble latitude = 0.0;
79 gdouble longitude = 0.0;
80 JsonObject *resultObj = json_node_get_object(node);
83 JsonNode *latNode = json_object_get_member(resultObj, "lat");
86 latitude = json_node_get_double(latNode);
87 MAP_DEBUG("Latitude :: >>> %f", latitude);
90 JsonNode *lngNode = json_object_get_member(resultObj, "lng");
93 longitude = json_node_get_double(lngNode);
94 MAP_DEBUG("Longitude :: >>> %f", longitude);
97 coords_s *coords = (coords_s *)g_malloc0(sizeof(coords_s));
99 MAP_DEBUG("Storing the latitude and longitude data..");
100 coords->latitude = latitude;
101 coords->longitude = longitude;
104 if (*coordsList == NULL)
105 *coordsList = g_list_append(*coordsList, coords);
107 *coordsList = g_list_insert_before(*coordsList, NULL, coords);
111 static void __parse_locations(JsonNode *node, GList **coordsList)
113 if (!node || !coordsList) return;
115 JsonArray *resultArray = json_node_get_array(node);
117 int length = json_array_get_length(resultArray);
120 for (index = 0; index < length; index++) {
122 JsonObject *obj = json_array_get_object_element(resultArray, index);
125 JsonNode *latLngNode = json_object_get_member(obj, "latLng");
128 __parse_lat_lng(latLngNode, coordsList);
133 static void __parse_geocode_response(char *response, int size, int *status, GList **coordsList)
135 if (!response || !status || !coordsList) return;
139 JsonParser *parser = NULL;
140 JsonNode *root = NULL;
141 JsonNode *node = NULL;
142 JsonObject *object = NULL;
143 GError *error = NULL;
146 parser = json_parser_new();
148 strncpy(data, response, size);
151 if (!json_parser_load_from_data(parser, data, -1, &error)) {
152 MAP_DEBUG("Error in file parsing JSON..");
154 g_object_unref(parser);
158 root = json_parser_get_root(parser);
160 object = json_node_get_object(root);
162 node = json_object_get_member(object, "info");
163 JsonObject *infoObj = json_node_get_object(node);
165 JsonNode *statusNode = json_object_get_member(infoObj, "statuscode");
168 *status = json_node_get_int(statusNode);
169 MAP_DEBUG("status :: >>> %d", *status);
173 if (*status != 0) { /* SUCCESS */
178 node = json_object_get_member(object, "results");
179 JsonArray *resultArray = json_node_get_array(node);
181 int length = json_array_get_length(resultArray);
184 for (index = 0; index < length; index++) {
186 JsonObject *obj = json_array_get_object_element(resultArray, index);
189 JsonNode *locNode = json_object_get_member(obj, "locations");
192 __parse_locations(locNode, coordsList);
196 g_object_unref(parser);
199 /****************** REVERSE GEOCODE *********************/
201 static void __parse_revgeocode_address(JsonNode *node, mapquest_address_resp_s **respAddr)
203 if (!node || !respAddr) return;
205 char *streetAddr = NULL;
206 char *neighbourhood = NULL;
210 char *country = NULL;
211 char *postalCode = NULL;
213 JsonArray *resultArray = json_node_get_array(node);
215 int length = json_array_get_length(resultArray);
218 for (index = 0; index < length; index++) {
220 JsonObject *obj = json_array_get_object_element(resultArray, index);
223 JsonNode *tmp = NULL;
226 tmp = json_object_get_member(obj, "street");
228 streetAddr = (char *) json_node_get_string(tmp);
229 if (streetAddr && strlen(streetAddr) <= 0)
236 tmp = json_object_get_member(obj, "adminArea6");
238 neighbourhood = (char *) json_node_get_string(tmp);
239 if (neighbourhood && strlen(neighbourhood) <= 0)
240 neighbourhood = NULL;
242 neighbourhood = NULL;
246 tmp = json_object_get_member(obj, "adminArea5");
248 city = (char *) json_node_get_string(tmp);
249 if (city && strlen(city) <= 0)
256 tmp = json_object_get_member(obj, "adminArea3");
258 state = (char *) json_node_get_string(tmp);
259 if (state && strlen(state) <= 0)
266 tmp = json_object_get_member(obj, "adminArea4");
268 county = (char *) json_node_get_string(tmp);
269 if (county && strlen(county) <= 0)
276 tmp = json_object_get_member(obj, "adminArea1");
278 country = (char *) json_node_get_string(tmp);
279 if (country && strlen(country) <= 0)
286 tmp = json_object_get_member(obj, "postalCode");
288 postalCode = (char *) json_node_get_string(tmp);
289 if (postalCode && strlen(postalCode) <= 0)
295 if (!streetAddr && !neighbourhood && !city && !state && !county && !country && !postalCode)
298 *respAddr = (mapquest_address_resp_s *)g_malloc(sizeof(mapquest_address_resp_s));
300 if (*respAddr != NULL) {
302 if (streetAddr != NULL) {
303 (*respAddr)->street_add = (gchar *)g_malloc(strlen((char *)streetAddr) + 1);
304 STRCPY((*respAddr)->street_add, (char *) streetAddr);
306 MAP_DEBUG("street is NULL");
307 (*respAddr)->street_add = NULL;
311 if (neighbourhood != NULL) {
312 (*respAddr)->neighbourhood = (gchar *)g_malloc(strlen((char *)neighbourhood) + 1);
313 STRCPY((*respAddr)->neighbourhood, (char *) neighbourhood);
315 MAP_DEBUG("neighbourhood is NULL");
316 (*respAddr)->neighbourhood = NULL;
321 (*respAddr)->city = (gchar *)g_malloc(strlen((char *)city) + 1);
322 STRCPY((*respAddr)->city, (char *) city);
324 MAP_DEBUG("city is NULL");
325 (*respAddr)->city = NULL;
329 if (county != NULL) {
330 (*respAddr)->county = (gchar *)g_malloc(strlen((char *)county) + 1);
331 STRCPY((*respAddr)->county, (char *) county);
333 MAP_DEBUG("county is NULL");
334 (*respAddr)->county = NULL;
339 (*respAddr)->state = (gchar *)g_malloc(strlen((char *)state) + 1);
340 STRCPY((*respAddr)->state, (char *) state);
342 MAP_DEBUG("state is NULL");
343 (*respAddr)->state = NULL;
347 if (country != NULL) {
348 (*respAddr)->country = (gchar *)g_malloc(strlen((char *)country) + 1);
349 STRCPY((*respAddr)->country, (char *) country);
351 MAP_DEBUG("country is NULL");
352 (*respAddr)->country = NULL;
356 MAP_DEBUG("country code is NULL");
357 (*respAddr)->country_code = NULL;
360 if (postalCode != NULL) {
361 (*respAddr)->postal_code = (gchar *)g_malloc(strlen((char *)postalCode) + 1);
362 STRCPY((*respAddr)->postal_code, (char *) postalCode);
364 MAP_DEBUG("postal_code is NULL");
365 (*respAddr)->postal_code = NULL;
372 static void __parse_revgeocode_response(char *response, int size, int *status, mapquest_address_resp_s **respAddr)
374 if (!response || !status || !respAddr) return;
382 GError *error = NULL;
385 parser = json_parser_new();
387 strncpy(data, response, size);
390 if (!json_parser_load_from_data(parser, data, -1, &error)) {
391 MAP_DEBUG("Error in file parsing JSON..");
393 g_object_unref(parser);
397 root = json_parser_get_root(parser);
399 object = json_node_get_object(root);
401 node = json_object_get_member(object, "info");
402 JsonObject *infoObj = json_node_get_object(node);
404 JsonNode *statusNode = json_object_get_member(infoObj, "statuscode");
407 *status = json_node_get_int(statusNode);
408 MAP_DEBUG("status :: >>> %d", *status);
412 if (*status != 0) { /* SUCCESS */
417 node = json_object_get_member(object, "results");
418 JsonArray *resultArray = json_node_get_array(node);
420 int length = json_array_get_length(resultArray);
423 for (index = 0; index < length; index++) {
425 JsonObject *obj = json_array_get_object_element(resultArray, index);
428 JsonNode *locNode = json_object_get_member(obj, "locations");
431 __parse_revgeocode_address(locNode, respAddr);
435 g_object_unref(parser);
438 /**************** PLACE SEARCH ********************/
440 static void __place_address_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
442 if (!object || !member_name || !member_node || !user_data) return;
444 mapquest_address_resp_s **respAddr = (mapquest_address_resp_s **) user_data;
447 JsonNode *tmp = json_object_get_member(object, member_name);
449 if (!strcmp(member_name, "road"))
450 (*respAddr)->street_add = (char *) json_node_dup_string(tmp);
451 else if (!strcmp(member_name, "neighbourhood"))
452 (*respAddr)->neighbourhood = (char *) json_node_dup_string(tmp);
453 else if (!strcmp(member_name, "house_number"))
454 (*respAddr)->building_number = (char *) json_node_dup_string(tmp);
455 else if (!strcmp(member_name, "city"))
456 (*respAddr)->city = (char *) json_node_dup_string(tmp);
457 else if (!strcmp(member_name, "county"))
458 (*respAddr)->county = (char *) json_node_dup_string(tmp);
459 else if (!strcmp(member_name, "state"))
460 (*respAddr)->state = (char *) json_node_dup_string(tmp);
461 else if (!strcmp(member_name, "country"))
462 (*respAddr)->country = (char *) json_node_dup_string(tmp);
463 else if (!strcmp(member_name, "country_code"))
464 (*respAddr)->country_code = (char *) json_node_dup_string(tmp);
465 else if (!strcmp(member_name, "postcode"))
466 (*respAddr)->postal_code = (char *) json_node_dup_string(tmp);
472 static void __place_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
474 if (!object || !member_name || !member_node || !user_data) return;
476 mapquest_place_resp_s **respPlaces = (mapquest_place_resp_s **) user_data;
478 JsonNode *tmp = json_object_get_member(object, member_name);
481 if (!strcmp(member_name, "place_id")) {
482 (*respPlaces)->place_id = (char *) json_node_get_string(tmp);
483 } else if (!strcmp(member_name, "lat")) {
484 str = (char *) json_node_get_string(tmp);
485 ((*respPlaces)->coordinates).latitude = (str ? atof(str) : 0);
486 } else if (!strcmp(member_name, "lon")) {
487 str = (char *) json_node_get_string(tmp);
488 ((*respPlaces)->coordinates).longitude = (str ? atof(str) : 0);
489 } else if (!strcmp(member_name, "class")) {
490 (*respPlaces)->category = (char *) json_node_dup_string(tmp);
491 } else if (!strcmp(member_name, "type")) {
492 (*respPlaces)->subcategory = (char *) json_node_dup_string(tmp);
493 } else if (!strcmp(member_name, "display_name")) {
494 (*respPlaces)->display_name = (char *) json_node_dup_string(tmp);
495 } else if (!strcmp(member_name, "address")) {
496 JsonObject *obj = json_node_get_object(member_node);
498 (*respPlaces)->address = (mapquest_address_resp_s *)g_malloc(sizeof(mapquest_address_resp_s));
499 if ((*respPlaces)->address) {
500 (*respPlaces)->address->street_add = NULL;
501 (*respPlaces)->address->neighbourhood = NULL;
502 (*respPlaces)->address->building_number = NULL;
503 (*respPlaces)->address->city = NULL;
504 (*respPlaces)->address->county = NULL;
505 (*respPlaces)->address->state = NULL;
506 (*respPlaces)->address->country = NULL;
507 (*respPlaces)->address->country_code = NULL;
508 (*respPlaces)->address->postal_code = NULL;
511 json_object_foreach_member(obj, __place_address_foreach, &((*respPlaces)->address));
512 } else if (!strcmp(member_name, "icon")) {
513 (*respPlaces)->icon_url = (char *) json_node_get_string(tmp);
517 static void __parse_place_response(char *response, int size, GList **placeList)
519 if (!response || !placeList) return;
525 GError *error = NULL;
528 parser = json_parser_new();
531 strncpy(data, response, size);
534 if (!json_parser_load_from_data(parser, data, -1, &error)) {
535 MAP_DEBUG("Error in file parsing JSON..");
537 g_object_unref(parser);
541 root = json_parser_get_root(parser);
543 JsonArray *placeArray = json_node_get_array(root);
545 int length = json_array_get_length(placeArray);
546 MAP_DEBUG("Places result count :: %d", length);
549 for (index = 0; index < length; index++) {
551 JsonObject *obj = json_array_get_object_element(placeArray, index);
554 mapquest_place_resp_s *respPlaces = (mapquest_place_resp_s *)g_malloc(sizeof(mapquest_place_resp_s));
557 respPlaces->place_id = NULL;
558 respPlaces->category = NULL;
559 respPlaces->subcategory = NULL;
560 respPlaces->display_name = NULL;
561 respPlaces->address = NULL;
562 respPlaces->icon_url = NULL;
564 json_object_foreach_member(obj, __place_foreach, &respPlaces);
566 if (*placeList == NULL)
567 *placeList = g_list_append(*placeList, respPlaces);
569 *placeList = g_list_insert_before(*placeList, NULL, respPlaces);
574 g_object_unref(parser);
577 /********************* ROUTE RESPONSE ***********************/
579 static double __convert_distance_unit(double distance)
582 switch (__route_unit) {
584 val = ROUTE_UNIT_CONVERSION_MILE_TO_M(distance);
587 val = ROUTE_UNIT_CONVERSION_MILE_TO_KM(distance);
590 val = ROUTE_UNIT_CONVERSION_MILE_TO_FT(distance);
593 val = ROUTE_UNIT_CONVERSION_MILE_TO_YD(distance);
600 static void __maneuver_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
602 if (!object || !member_name || !member_node || !user_data) return;
604 mapquest_route_maneuver **maneuver = (mapquest_route_maneuver **) user_data;
606 JsonNode *tmp = json_object_get_member(object, member_name);
608 if (!strcmp(member_name, "startPoint")) {
609 JsonObject *coordsObj = json_node_get_object(tmp);
612 double latitude = 0.0;
613 double longitude = 0.0;
614 JsonNode *latNode = json_object_get_member(coordsObj, "lat");
617 latitude = json_node_get_double(latNode);
619 JsonNode *lngNode = json_object_get_member(coordsObj, "lng");
622 longitude = json_node_get_double(lngNode);
624 coords_s start_point;
625 start_point.latitude = latitude;
626 start_point.longitude = longitude;
628 (*maneuver)->start_point = start_point;
630 } else if (!strcmp(member_name, "narrative")) {
631 (*maneuver)->instruction = (char *) json_node_dup_string(tmp);
632 } else if (!strcmp(member_name, "distance")) {
633 double dist = json_node_get_double(tmp);
634 (*maneuver)->distance = __convert_distance_unit(dist);
635 } else if (!strcmp(member_name, "time")) {
636 (*maneuver)->time = json_node_get_int(tmp);
637 } else if (!strcmp(member_name, "formattedTime")) {
638 (*maneuver)->formatted_time = (char *) json_node_dup_string(tmp);
639 } else if (!strcmp(member_name, "attributes")) {
640 (*maneuver)->attribute = json_node_get_int(tmp);
641 } else if (!strcmp(member_name, "turnType")) {
642 (*maneuver)->turn_type = json_node_get_int(tmp);
643 } else if (!strcmp(member_name, "direction")) {
644 (*maneuver)->direction = json_node_get_int(tmp);
645 } else if (!strcmp(member_name, "directionName")) {
646 (*maneuver)->direction_name = (char *) json_node_dup_string(tmp);
647 } else if (!strcmp(member_name, "index")) {
648 (*maneuver)->index = json_node_get_int(tmp);
649 } else if (!strcmp(member_name, "streets")) {
650 JsonArray *streetsArray = json_node_get_array(tmp);
652 int length = json_array_get_length(streetsArray);
654 char street_name[512];
655 STRCPY(street_name, "");
657 for (index = 0; index < length; index++) {
658 char *name = (char *) json_array_get_string_element(streetsArray, index);
661 strncpy(street_name, name, sizeof(street_name)-1);
663 STRCAT(street_name, "/");
664 strncat(street_name, name, sizeof(street_name)-strlen(street_name)-1);
669 if (strlen(street_name) > 0) {
670 (*maneuver)->street_name = (gchar *)g_malloc0((strlen((char *)street_name)) + 1);
671 if ((*maneuver)->street_name)
672 STRCPY((*maneuver)->street_name, (char *) street_name);
674 (*maneuver)->street_name = NULL;
679 static void __parse_maneuvers(JsonNode *node, mapquest_route_resp_s **routeResp)
681 if (!node || !routeResp) return;
683 JsonArray *resultArray = json_node_get_array(node);
685 int length = json_array_get_length(resultArray);
688 for (index = 0; index < length; index++) {
690 JsonObject *obj = json_array_get_object_element(resultArray, index);
693 mapquest_route_maneuver *maneuver = (mapquest_route_maneuver *)g_malloc(sizeof(mapquest_route_maneuver));
696 json_object_foreach_member(obj, __maneuver_foreach, &maneuver);
698 if (__maneuver_index != 0) {
699 if (maneuver->distance == 0.0 && maneuver->time == 0) {
700 maneuver->start_point = __destination_point;
701 maneuver->end_point = __destination_point;
707 list = g_list_last((*routeResp)->maneuvers);
709 mapquest_route_maneuver *tmp = (mapquest_route_maneuver *)list->data;
710 tmp->end_point = maneuver->start_point;
714 if ((*routeResp)->maneuvers == NULL)
715 (*routeResp)->maneuvers = g_list_append((*routeResp)->maneuvers, (gpointer)maneuver);
717 (*routeResp)->maneuvers = g_list_insert_before((*routeResp)->maneuvers, NULL, (gpointer)maneuver);
724 static void __shape_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
726 if (!object || !member_name || !member_node || !user_data) return;
728 mapquest_route_resp_s **routeResp = (mapquest_route_resp_s **) user_data;
730 JsonNode *tmp = json_object_get_member(object, member_name);
732 if (!strcmp(member_name, "shapePoints")) {
733 JsonArray *shapePointsArray = json_node_get_array(tmp);
735 int length = json_array_get_length(shapePointsArray);
739 coords_s *coords = NULL;
740 for (index = 0; index < length; index++) {
742 val = (double) json_array_get_double_element(shapePointsArray, index);
744 if ((index % 2) == 0) {
746 coords = (coords_s *)g_malloc0(sizeof(coords_s));
748 coords->latitude = val;
752 coords->longitude = val;
753 if ((*routeResp)->shapePoints == NULL)
754 (*routeResp)->shapePoints = g_list_append((*routeResp)->shapePoints, (gpointer)coords);
756 (*routeResp)->shapePoints = g_list_insert_before((*routeResp)->shapePoints, NULL, (gpointer)coords);
764 static void __bbox_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
766 if (!object || !member_name || !member_node || !user_data) return;
768 mapquest_route_resp_s **routeResp = (mapquest_route_resp_s **) user_data;
770 JsonNode *tmp = json_object_get_member(object, member_name);
772 JsonObject *coordsObj = json_node_get_object(tmp);
773 double latitude = 0.0;
774 double longitude = 0.0;
777 JsonNode *latNode = json_object_get_member(coordsObj, "lat");
780 latitude = json_node_get_double(latNode);
782 JsonNode *lngNode = json_object_get_member(coordsObj, "lng");
785 longitude = json_node_get_double(lngNode);
788 if (!strcmp(member_name, "ul")) {
789 ((*routeResp)->bounding_box).top_left.latitude = latitude;
790 ((*routeResp)->bounding_box).top_left.longitude = longitude;
791 } else if (!strcmp(member_name, "lr")) {
792 ((*routeResp)->bounding_box).bottom_right.latitude = latitude;
793 ((*routeResp)->bounding_box).bottom_right.longitude = longitude;
797 static void __parse_route_response(char *response, int size, int *status, mapquest_route_resp_s **routeResp)
799 if (!response || !status || !routeResp) return;
807 GError *error = NULL;
810 parser = json_parser_new();
812 strncpy(data, response, size);
815 if (!json_parser_load_from_data(parser, data, -1, &error)) {
816 MAP_DEBUG("Error in file parsing JSON..");
818 g_object_unref(parser);
822 root = json_parser_get_root(parser);
824 object = json_node_get_object(root);
826 node = json_object_get_member(object, "info");
827 JsonObject *infoObj = json_node_get_object(node);
829 JsonNode *statusNode = json_object_get_member(infoObj, "statuscode");
832 *status = json_node_get_int(statusNode);
833 MAP_DEBUG("status :: >>> %d", *status);
837 if (*status != 0) { /* SUCCESS */
842 *routeResp = (mapquest_route_resp_s *)g_malloc(sizeof(mapquest_route_resp_s));
847 (*routeResp)->maneuvers = NULL;
848 (*routeResp)->shapePoints = NULL;
850 node = json_object_get_member(object, "route");
855 JsonObject *routeObject = json_node_get_object(node);
857 JsonNode *tmp = json_object_get_member(routeObject, "distance");
860 double dist = json_node_get_double(tmp);
861 (*routeResp)->distance = __convert_distance_unit(dist);
862 (*routeResp)->distance_unit = __route_unit;
865 tmp = json_object_get_member(routeObject, "boundingBox");
868 JsonObject *bbox = json_node_get_object(tmp);
870 json_object_foreach_member(bbox, __bbox_foreach, routeResp);
873 tmp = json_object_get_member(routeObject, "formattedTime");
876 (*routeResp)->formatted_time = (char *) json_node_dup_string(tmp);
878 tmp = json_object_get_member(routeObject, "routeType");
880 (*routeResp)->type = ROUTE_TYPE_BICYCLE;
882 char *type = (char *) json_node_get_string(tmp);
884 if (!strcmp(type, "FASTEST"))
885 (*routeResp)->type = ROUTE_TYPE_FASTEST;
886 else if (!strcmp(type, "SHORTEST"))
887 (*routeResp)->type = ROUTE_TYPE_SHORTEST;
888 else if (!strcmp(type, "PEDESTRIAN"))
889 (*routeResp)->type = ROUTE_TYPE_PEDESTRIAN;
890 else if (!strcmp(type, "MULTIMODAL"))
891 (*routeResp)->type = ROUTE_TYPE_MULTIMODAL;
895 tmp = json_object_get_member(routeObject, "time");
898 int time = json_node_get_int(tmp);
899 (*routeResp)->time = time;
902 tmp = json_object_get_member(routeObject, "legs");
905 JsonArray *legsArray = json_node_get_array(tmp);
907 int length = json_array_get_length(legsArray);
910 for (index = 0; index < length; index++) {
912 JsonObject *obj = json_array_get_object_element(legsArray, index);
915 JsonNode *maneuversNode = json_object_get_member(obj, "maneuvers");
918 __parse_maneuvers(maneuversNode, routeResp);
923 tmp = json_object_get_member(routeObject, "shape");
926 JsonObject *shape = json_node_get_object(tmp);
928 json_object_foreach_member(shape, __shape_foreach, routeResp);
931 g_object_unref(parser);
934 void post_curl_response(char *response, int size, mapquest_resp_type type, void *user_data)
936 if (!response) return;
939 MAP_DEBUG("Response data is NULL");
943 MAP_DEBUG("Response received from Curl. [Size=%d]", size);
945 case RESP_TYPE_GEOCODE:
947 MAP_DEBUG("Inside Geocode JSON Parsing..");
949 MapquestGeocodeQueryData *queryData = (MapquestGeocodeQueryData *)user_data;
950 MapquestGeocodeResponseData *responseData = (MapquestGeocodeResponseData *)g_malloc(sizeof(MapquestGeocodeResponseData));
953 responseData->requestId = queryData->requestId;
954 responseData->geocode_cb = queryData->geocode_cb;
955 responseData->user_data = queryData->user_data;
957 if (response && (size > 0)) {
958 GList *coordsList = NULL;
959 __parse_geocode_response(response, size, &status, &coordsList);
961 if (coordsList != NULL) {
962 /* Put the response in queue */
963 responseData->error = __convert_status(status);
964 responseData->coords = coordsList;
966 /* Response parsing failure */
967 responseData->error = __convert_status(status);
968 responseData->coords = NULL;
971 responseData->error = __convert_status(status);
972 responseData->coords = NULL;
975 mapquest_push_to_queue(type, (gpointer)responseData);
984 case RESP_TYPE_REVGEOCODE:
986 MAP_DEBUG("Inside Rev Geocode JSON Parsing..");
988 MapquestRevGeocodeQueryData *queryData = (MapquestRevGeocodeQueryData *)user_data;
989 MapquestRevGeocodeResponseData *responseData = (MapquestRevGeocodeResponseData *)g_malloc(sizeof(MapquestRevGeocodeResponseData));
992 responseData->requestId = queryData->requestId;
993 responseData->reverse_geocode_cb = queryData->reverse_geocode_cb;
994 responseData->user_data = queryData->user_data;
996 if (response && (size > 0)) {
997 /* Coords Result GList */
998 mapquest_address_resp_s *addrResponse = NULL;
1000 MAP_DEBUG("Rev Geocode :- Parsing json Response");
1001 __parse_revgeocode_response(response, size, &status, &addrResponse);
1003 if (addrResponse != NULL) {
1004 /* Put the response in queue */
1005 responseData->error = __convert_status(status);
1006 responseData->addressDetails = addrResponse;
1008 /* REPSONSE PARSING FAILURE */
1009 MAP_DEBUG("addr Response is NULL");
1010 responseData->error = __convert_status(status);
1011 responseData->addressDetails = NULL;
1014 MAP_DEBUG("JSON Response is NULL..");
1015 responseData->error = __convert_status(status);
1016 responseData->addressDetails = NULL;
1019 mapquest_push_to_queue(type, (gpointer)responseData);
1028 case RESP_TYPE_PLACES:
1030 MAP_DEBUG("Inside Places JSON Parsing..");
1031 MapquestPlaceQueryData *queryData = (MapquestPlaceQueryData *)user_data;
1032 MapquestPlaceResponseData *responseData = (MapquestPlaceResponseData *)g_malloc(sizeof(MapquestPlaceResponseData));
1035 responseData->requestId = queryData->requestId;
1036 responseData->place_search_cb = queryData->place_search_cb;
1037 responseData->user_data = queryData->user_data;
1039 if (response && (size > 0)) {
1040 /* Coords Result GList */
1041 GList *placeList = NULL;
1043 MAP_DEBUG("Search Places :- Parsing Json Response");
1044 __parse_place_response(response, size, &placeList);
1046 if (placeList != NULL) {
1047 /* Put the response in queue */
1048 responseData->error = MAPQUEST_ERROR_NONE;
1049 responseData->places = placeList;
1051 /* REPSONSE PARSING FAILURE */
1052 MAP_DEBUG("addr Response is NULL");
1053 responseData->error = MAPQUEST_ERROR_UNKNOWN;
1054 responseData->places = NULL;
1057 responseData->error = MAPQUEST_ERROR_UNKNOWN;
1058 responseData->places = NULL;
1061 mapquest_push_to_queue(type, (gpointer)responseData);
1071 case RESP_TYPE_ROUTE:
1073 MAP_DEBUG("Inside Route JSON Parsing..");
1075 MapquestRouteQueryData *queryData = (MapquestRouteQueryData *)user_data;
1076 __route_unit = queryData->unit;
1077 __maneuver_index = 0;
1078 __destination_point = queryData->destination;
1080 MapquestRouteResponseData *responseData = (MapquestRouteResponseData *)g_malloc(sizeof(MapquestRouteResponseData));
1083 responseData->requestId = queryData->requestId;
1084 responseData->route_cb = queryData->route_cb;
1085 responseData->user_data = queryData->user_data;
1087 if (response && (size > 0)) {
1088 /* Coords Result GList */
1089 mapquest_route_resp_s *routeResponse = NULL;
1091 MAP_DEBUG("Route :- Parsing Response");
1092 __parse_route_response(response, size, &status, &routeResponse);
1094 if (routeResponse != NULL) {
1095 /* Put the response in queue */
1096 responseData->error = __convert_status(status);
1097 responseData->routeResponse = routeResponse;
1099 /* REPSONSE PARSING FAILURE */
1100 MAP_DEBUG("route Response is NULL");
1101 responseData->error = __convert_status(status);
1102 responseData->routeResponse = NULL;
1105 responseData->error = __convert_status(status);
1106 responseData->routeResponse = NULL;
1109 mapquest_push_to_queue(type, (gpointer)responseData);
1121 MAP_DEBUG("Inside default JSON Parsing..");