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"
23 #define ROUTE_UNIT_CONVERSION_MILE_TO_M(x) (1609.34 * (x))
24 #define ROUTE_UNIT_CONVERSION_MILE_TO_KM(x) (1.60934 * (x))
25 #define ROUTE_UNIT_CONVERSION_MILE_TO_FT(x) (5280 * (x))
26 #define ROUTE_UNIT_CONVERSION_MILE_TO_YD(x) (1760 * (x))
28 static route_unit __route_unit = ROUTE_UNIT_M;
29 static int __maneuver_index = 0;
30 static coords_s __destination_point;
32 static mapquest_error_e __convert_status(int status)
34 mapquest_error_e error = MAPQUEST_ERROR_UNKNOWN;
38 /* Successful Geocode call */
39 error = MAPQUEST_ERROR_NONE;
44 /* Error with input - Illegal argument from request */
45 error = MAPQUEST_ERROR_INVALID_PARAMETER;
50 /* Key related error - Invalid key */
51 error = MAPQUEST_ERROR_KEY_NOT_AVAILABLE;
57 error = MAPQUEST_ERROR_UNKNOWN;
63 error = MAPQUEST_ERROR_NETWORK_UNREACHABLE;
71 /************ GEOCODE ***************/
73 static void __parse_lat_lng(JsonNode *node, GList **coordsList)
75 if (!node || !coordsList) return;
77 gdouble latitude = 0.0;
78 gdouble longitude = 0.0;
79 JsonObject *resultObj = json_node_get_object(node);
82 JsonNode *latNode = json_object_get_member(resultObj, "lat");
85 latitude = json_node_get_double(latNode);
86 MAP_DEBUG("Latitude :: >>> %f", latitude);
89 JsonNode *lngNode = json_object_get_member(resultObj, "lng");
92 longitude = json_node_get_double(lngNode);
93 MAP_DEBUG("Longitude :: >>> %f", longitude);
96 coords_s *coords = (coords_s *)g_malloc0(sizeof(coords_s));
98 MAP_DEBUG("Storing the latitude and longitude data..");
99 coords->latitude = latitude;
100 coords->longitude = longitude;
103 if (*coordsList == NULL)
104 *coordsList = g_list_append(*coordsList, coords);
106 *coordsList = g_list_insert_before(*coordsList, NULL, coords);
110 static void __parse_locations(JsonNode *node, GList **coordsList)
112 if (!node || !coordsList) return;
114 JsonArray *resultArray = json_node_get_array(node);
116 int length = json_array_get_length(resultArray);
119 for (index = 0; index < length; index++) {
121 JsonObject *obj = json_array_get_object_element(resultArray, index);
124 JsonNode *latLngNode = json_object_get_member(obj, "latLng");
127 __parse_lat_lng(latLngNode, coordsList);
132 static void __parse_geocode_response(char *response, int size, int *status, GList **coordsList)
134 if (!response || !status || !coordsList) return;
138 JsonParser *parser = NULL;
139 JsonNode *root = NULL;
140 JsonNode *node = NULL;
141 JsonObject *object = NULL;
142 GError *error = NULL;
145 parser = json_parser_new();
147 strncpy(data, response, size);
150 if (!json_parser_load_from_data(parser, data, -1, &error)) {
151 MAP_DEBUG("Error in file parsing JSON..");
153 g_object_unref(parser);
157 root = json_parser_get_root(parser);
159 object = json_node_get_object(root);
161 node = json_object_get_member(object, "info");
162 JsonObject *infoObj = json_node_get_object(node);
164 JsonNode *statusNode = json_object_get_member(infoObj, "statuscode");
167 *status = json_node_get_int(statusNode);
168 MAP_DEBUG("status :: >>> %d", *status);
172 if (*status != 0) { /* SUCCESS */
177 node = json_object_get_member(object, "results");
178 JsonArray *resultArray = json_node_get_array(node);
180 int length = json_array_get_length(resultArray);
183 for (index = 0; index < length; index++) {
185 JsonObject *obj = json_array_get_object_element(resultArray, index);
188 JsonNode *locNode = json_object_get_member(obj, "locations");
191 __parse_locations(locNode, coordsList);
195 g_object_unref(parser);
198 /****************** REVERSE GEOCODE *********************/
200 static void __parse_revgeocode_address(JsonNode *node, mapquest_address_resp_s **respAddr)
202 if (!node || !respAddr) return;
204 char *streetAddr = NULL;
205 char *neighbourhood = NULL;
209 char *country = NULL;
210 char *postalCode = NULL;
212 JsonArray *resultArray = json_node_get_array(node);
214 int length = json_array_get_length(resultArray);
217 for (index = 0; index < length; index++) {
219 JsonObject *obj = json_array_get_object_element(resultArray, index);
222 JsonNode *tmp = NULL;
225 tmp = json_object_get_member(obj, "street");
227 streetAddr = (char *) json_node_get_string(tmp);
228 if (streetAddr && strlen(streetAddr) <= 0)
235 tmp = json_object_get_member(obj, "adminArea6");
237 neighbourhood = (char *) json_node_get_string(tmp);
238 if (neighbourhood && strlen(neighbourhood) <= 0)
239 neighbourhood = NULL;
241 neighbourhood = NULL;
245 tmp = json_object_get_member(obj, "adminArea5");
247 city = (char *) json_node_get_string(tmp);
248 if (city && strlen(city) <= 0)
255 tmp = json_object_get_member(obj, "adminArea3");
257 state = (char *) json_node_get_string(tmp);
258 if (state && strlen(state) <= 0)
265 tmp = json_object_get_member(obj, "adminArea4");
267 county = (char *) json_node_get_string(tmp);
268 if (county && strlen(county) <= 0)
275 tmp = json_object_get_member(obj, "adminArea1");
277 country = (char *) json_node_get_string(tmp);
278 if (country && strlen(country) <= 0)
285 tmp = json_object_get_member(obj, "postalCode");
287 postalCode = (char *) json_node_get_string(tmp);
288 if (postalCode && strlen(postalCode) <= 0)
294 if (!streetAddr && !neighbourhood && !city && !state && !county && !country && !postalCode)
297 *respAddr = (mapquest_address_resp_s *)g_malloc(sizeof(mapquest_address_resp_s));
299 if (*respAddr != NULL) {
301 if (streetAddr != NULL) {
302 (*respAddr)->street_add = (gchar *)g_malloc(strlen((char *)streetAddr) + 1);
303 strcpy((*respAddr)->street_add, (char *) streetAddr);
305 MAP_DEBUG("street is NULL");
306 (*respAddr)->street_add = NULL;
310 if (neighbourhood != NULL) {
311 (*respAddr)->neighbourhood = (gchar *)g_malloc(strlen((char *)neighbourhood) + 1);
312 strcpy((*respAddr)->neighbourhood, (char *) neighbourhood);
314 MAP_DEBUG("neighbourhood is NULL");
315 (*respAddr)->neighbourhood = NULL;
320 (*respAddr)->city = (gchar *)g_malloc(strlen((char *)city) + 1);
321 strcpy((*respAddr)->city, (char *) city);
323 MAP_DEBUG("city is NULL");
324 (*respAddr)->city = NULL;
328 if (county != NULL) {
329 (*respAddr)->county = (gchar *)g_malloc(strlen((char *)county) + 1);
330 strcpy((*respAddr)->county, (char *) county);
332 MAP_DEBUG("county is NULL");
333 (*respAddr)->county = NULL;
338 (*respAddr)->state = (gchar *)g_malloc(strlen((char *)state) + 1);
339 strcpy((*respAddr)->state, (char *) state);
341 MAP_DEBUG("state is NULL");
342 (*respAddr)->state = NULL;
346 if (country != NULL) {
347 (*respAddr)->country = (gchar *)g_malloc(strlen((char *)country) + 1);
348 strcpy((*respAddr)->country, (char *) country);
350 MAP_DEBUG("country is NULL");
351 (*respAddr)->country = NULL;
355 MAP_DEBUG("country code is NULL");
356 (*respAddr)->country_code = NULL;
359 if (postalCode != NULL) {
360 (*respAddr)->postal_code = (gchar *)g_malloc(strlen((char *)postalCode) + 1);
361 strcpy((*respAddr)->postal_code, (char *) postalCode);
363 MAP_DEBUG("postal_code is NULL");
364 (*respAddr)->postal_code = NULL;
371 static void __parse_revgeocode_response(char *response, int size, int *status, mapquest_address_resp_s **respAddr)
373 if (!response || !status || !respAddr) return;
381 GError *error = NULL;
384 parser = json_parser_new();
386 strncpy(data, response, size);
389 if (!json_parser_load_from_data(parser, data, -1, &error)) {
390 MAP_DEBUG("Error in file parsing JSON..");
392 g_object_unref(parser);
396 root = json_parser_get_root(parser);
398 object = json_node_get_object(root);
400 node = json_object_get_member(object, "info");
401 JsonObject *infoObj = json_node_get_object(node);
403 JsonNode *statusNode = json_object_get_member(infoObj, "statuscode");
406 *status = json_node_get_int(statusNode);
407 MAP_DEBUG("status :: >>> %d", *status);
411 if (*status != 0) { /* SUCCESS */
416 node = json_object_get_member(object, "results");
417 JsonArray *resultArray = json_node_get_array(node);
419 int length = json_array_get_length(resultArray);
422 for (index = 0; index < length; index++) {
424 JsonObject *obj = json_array_get_object_element(resultArray, index);
427 JsonNode *locNode = json_object_get_member(obj, "locations");
430 __parse_revgeocode_address(locNode, respAddr);
434 g_object_unref(parser);
437 /**************** PLACE SEARCH ********************/
439 static void __place_address_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
441 if (!object || !member_name || !member_node || !user_data) return;
443 mapquest_address_resp_s **respAddr = (mapquest_address_resp_s **) user_data;
446 JsonNode *tmp = json_object_get_member(object, member_name);
448 if (!strcmp(member_name, "road"))
449 (*respAddr)->street_add = (char *) json_node_dup_string(tmp);
450 else if (!strcmp(member_name, "neighbourhood"))
451 (*respAddr)->neighbourhood = (char *) json_node_dup_string(tmp);
452 else if (!strcmp(member_name, "house_number"))
453 (*respAddr)->building_number = (char *) json_node_dup_string(tmp);
454 else if (!strcmp(member_name, "city"))
455 (*respAddr)->city = (char *) json_node_dup_string(tmp);
456 else if (!strcmp(member_name, "county"))
457 (*respAddr)->county = (char *) json_node_dup_string(tmp);
458 else if (!strcmp(member_name, "state"))
459 (*respAddr)->state = (char *) json_node_dup_string(tmp);
460 else if (!strcmp(member_name, "country"))
461 (*respAddr)->country = (char *) json_node_dup_string(tmp);
462 else if (!strcmp(member_name, "country_code"))
463 (*respAddr)->country_code = (char *) json_node_dup_string(tmp);
464 else if (!strcmp(member_name, "postcode"))
465 (*respAddr)->postal_code = (char *) json_node_dup_string(tmp);
471 static void __place_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
473 if (!object || !member_name || !member_node || !user_data) return;
475 mapquest_place_resp_s **respPlaces = (mapquest_place_resp_s **) user_data;
477 JsonNode *tmp = json_object_get_member(object, member_name);
480 if (!strcmp(member_name, "place_id")) {
481 (*respPlaces)->place_id = (char *) json_node_get_string(tmp);
482 } else if (!strcmp(member_name, "lat")) {
483 str = (char *) json_node_get_string(tmp);
484 ((*respPlaces)->coordinates).latitude = (str ? atof(str) : 0);
485 } else if (!strcmp(member_name, "lon")) {
486 str = (char *) json_node_get_string(tmp);
487 ((*respPlaces)->coordinates).longitude = (str ? atof(str) : 0);
488 } else if (!strcmp(member_name, "class")) {
489 (*respPlaces)->category = (char *) json_node_dup_string(tmp);
490 } else if (!strcmp(member_name, "type")) {
491 (*respPlaces)->subcategory = (char *) json_node_dup_string(tmp);
492 } else if (!strcmp(member_name, "display_name")) {
493 (*respPlaces)->display_name = (char *) json_node_dup_string(tmp);
494 } else if (!strcmp(member_name, "address")) {
495 JsonObject *obj = json_node_get_object(member_node);
497 (*respPlaces)->address = (mapquest_address_resp_s *)g_malloc(sizeof(mapquest_address_resp_s));
498 if ((*respPlaces)->address) {
499 (*respPlaces)->address->street_add = NULL;
500 (*respPlaces)->address->neighbourhood = NULL;
501 (*respPlaces)->address->building_number = NULL;
502 (*respPlaces)->address->city = NULL;
503 (*respPlaces)->address->county = NULL;
504 (*respPlaces)->address->state = NULL;
505 (*respPlaces)->address->country = NULL;
506 (*respPlaces)->address->country_code = NULL;
507 (*respPlaces)->address->postal_code = NULL;
510 json_object_foreach_member(obj, __place_address_foreach, &((*respPlaces)->address));
511 } else if (!strcmp(member_name, "icon")) {
512 (*respPlaces)->icon_url = (char *) json_node_get_string(tmp);
516 static void __parse_place_response(char *response, int size, GList **placeList)
518 if (!response || !placeList) return;
524 GError *error = NULL;
527 parser = json_parser_new();
530 strncpy(data, response, size);
533 if (!json_parser_load_from_data(parser, data, -1, &error)) {
534 MAP_DEBUG("Error in file parsing JSON..");
536 g_object_unref(parser);
540 root = json_parser_get_root(parser);
542 JsonArray *placeArray = json_node_get_array(root);
544 int length = json_array_get_length(placeArray);
545 MAP_DEBUG("Places result count :: %d", length);
548 for (index = 0; index < length; index++) {
550 JsonObject *obj = json_array_get_object_element(placeArray, index);
553 mapquest_place_resp_s *respPlaces = (mapquest_place_resp_s *)g_malloc(sizeof(mapquest_place_resp_s));
556 respPlaces->place_id = NULL;
557 respPlaces->category = NULL;
558 respPlaces->subcategory = NULL;
559 respPlaces->display_name = NULL;
560 respPlaces->address = NULL;
561 respPlaces->icon_url = NULL;
563 json_object_foreach_member(obj, __place_foreach, &respPlaces);
565 if (*placeList == NULL)
566 *placeList = g_list_append(*placeList, respPlaces);
568 *placeList = g_list_insert_before(*placeList, NULL, respPlaces);
573 g_object_unref(parser);
576 /********************* ROUTE RESPONSE ***********************/
578 static double __convert_distance_unit(double distance)
581 switch (__route_unit) {
583 val = ROUTE_UNIT_CONVERSION_MILE_TO_M(distance);
586 val = ROUTE_UNIT_CONVERSION_MILE_TO_KM(distance);
589 val = ROUTE_UNIT_CONVERSION_MILE_TO_FT(distance);
592 val = ROUTE_UNIT_CONVERSION_MILE_TO_YD(distance);
599 static void __maneuver_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
601 if (!object || !member_name || !member_node || !user_data) return;
603 mapquest_route_maneuver **maneuver = (mapquest_route_maneuver **) user_data;
605 JsonNode *tmp = json_object_get_member(object, member_name);
607 if (!strcmp(member_name, "startPoint")) {
608 JsonObject *coordsObj = json_node_get_object(tmp);
611 double latitude = 0.0;
612 double longitude = 0.0;
613 JsonNode *latNode = json_object_get_member(coordsObj, "lat");
616 latitude = json_node_get_double(latNode);
618 JsonNode *lngNode = json_object_get_member(coordsObj, "lng");
621 longitude = json_node_get_double(lngNode);
623 coords_s start_point;
624 start_point.latitude = latitude;
625 start_point.longitude = longitude;
627 (*maneuver)->start_point = start_point;
629 } else if (!strcmp(member_name, "narrative")) {
630 (*maneuver)->instruction = (char *) json_node_dup_string(tmp);
631 } else if (!strcmp(member_name, "distance")) {
632 double dist = json_node_get_double(tmp);
633 (*maneuver)->distance = __convert_distance_unit(dist);
634 } else if (!strcmp(member_name, "time")) {
635 (*maneuver)->time = json_node_get_int(tmp);
636 } else if (!strcmp(member_name, "formattedTime")) {
637 (*maneuver)->formatted_time = (char *) json_node_dup_string(tmp);
638 } else if (!strcmp(member_name, "attributes")) {
639 (*maneuver)->attribute = json_node_get_int(tmp);
640 } else if (!strcmp(member_name, "turnType")) {
641 (*maneuver)->turn_type = json_node_get_int(tmp);
642 } else if (!strcmp(member_name, "direction")) {
643 (*maneuver)->direction = json_node_get_int(tmp);
644 } else if (!strcmp(member_name, "directionName")) {
645 (*maneuver)->direction_name = (char *) json_node_dup_string(tmp);
646 } else if (!strcmp(member_name, "index")) {
647 (*maneuver)->index = json_node_get_int(tmp);
648 } else if (!strcmp(member_name, "streets")) {
649 JsonArray *streetsArray = json_node_get_array(tmp);
651 int length = json_array_get_length(streetsArray);
653 char street_name[512];
654 strcpy(street_name, "");
656 for (index = 0; index < length; index++) {
657 char *name = (char *) json_array_get_string_element(streetsArray, index);
660 strncpy(street_name, name, sizeof(street_name)-1);
662 strcat(street_name, "/");
663 strncat(street_name, name, sizeof(street_name)-strlen(street_name)-1);
668 if (strlen(street_name) > 0) {
669 (*maneuver)->street_name = (gchar *)g_malloc0((strlen((char *)street_name)) + 1);
670 if ((*maneuver)->street_name)
671 strcpy((*maneuver)->street_name, (char *) street_name);
673 (*maneuver)->street_name = NULL;
678 static void __parse_maneuvers(JsonNode *node, mapquest_route_resp_s **routeResp)
680 if (!node || !routeResp) return;
682 JsonArray *resultArray = json_node_get_array(node);
684 int length = json_array_get_length(resultArray);
687 for (index = 0; index < length; index++) {
689 JsonObject *obj = json_array_get_object_element(resultArray, index);
692 mapquest_route_maneuver *maneuver = (mapquest_route_maneuver *)g_malloc(sizeof(mapquest_route_maneuver));
695 json_object_foreach_member(obj, __maneuver_foreach, &maneuver);
697 if (__maneuver_index != 0) {
698 if (maneuver->distance == 0.0 && maneuver->time == 0) {
699 maneuver->start_point = __destination_point;
700 maneuver->end_point = __destination_point;
706 list = g_list_last((*routeResp)->maneuvers);
708 mapquest_route_maneuver *tmp = (mapquest_route_maneuver *)list->data;
709 tmp->end_point = maneuver->start_point;
713 if ((*routeResp)->maneuvers == NULL)
714 (*routeResp)->maneuvers = g_list_append((*routeResp)->maneuvers, (gpointer)maneuver);
716 (*routeResp)->maneuvers = g_list_insert_before((*routeResp)->maneuvers, NULL, (gpointer)maneuver);
723 static void __shape_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
725 if (!object || !member_name || !member_node || !user_data) return;
727 mapquest_route_resp_s **routeResp = (mapquest_route_resp_s **) user_data;
729 JsonNode *tmp = json_object_get_member(object, member_name);
731 if (!strcmp(member_name, "shapePoints")) {
732 JsonArray *shapePointsArray = json_node_get_array(tmp);
734 int length = json_array_get_length(shapePointsArray);
738 coords_s *coords = NULL;
739 for (index = 0; index < length; index++) {
741 val = (double) json_array_get_double_element(shapePointsArray, index);
743 if ((index % 2) == 0) {
745 coords = (coords_s *)g_malloc0(sizeof(coords_s));
747 coords->latitude = val;
751 coords->longitude = val;
752 if ((*routeResp)->shapePoints == NULL)
753 (*routeResp)->shapePoints = g_list_append((*routeResp)->shapePoints, (gpointer)coords);
755 (*routeResp)->shapePoints = g_list_insert_before((*routeResp)->shapePoints, NULL, (gpointer)coords);
763 static void __bbox_foreach(JsonObject *object, const gchar *member_name, JsonNode *member_node, gpointer user_data)
765 if (!object || !member_name || !member_node || !user_data) return;
767 mapquest_route_resp_s **routeResp = (mapquest_route_resp_s **) user_data;
769 JsonNode *tmp = json_object_get_member(object, member_name);
771 JsonObject *coordsObj = json_node_get_object(tmp);
772 double latitude = 0.0;
773 double longitude = 0.0;
776 JsonNode *latNode = json_object_get_member(coordsObj, "lat");
779 latitude = json_node_get_double(latNode);
781 JsonNode *lngNode = json_object_get_member(coordsObj, "lng");
784 longitude = json_node_get_double(lngNode);
787 if (!strcmp(member_name, "ul")) {
788 ((*routeResp)->bounding_box).top_left.latitude = latitude;
789 ((*routeResp)->bounding_box).top_left.longitude = longitude;
790 } else if (!strcmp(member_name, "lr")) {
791 ((*routeResp)->bounding_box).bottom_right.latitude = latitude;
792 ((*routeResp)->bounding_box).bottom_right.longitude = longitude;
796 static void __parse_route_response(char *response, int size, int *status, mapquest_route_resp_s **routeResp)
798 if (!response || !status || !routeResp) return;
806 GError *error = NULL;
809 parser = json_parser_new();
811 strncpy(data, response, size);
814 if (!json_parser_load_from_data(parser, data, -1, &error)) {
815 MAP_DEBUG("Error in file parsing JSON..");
817 g_object_unref(parser);
821 root = json_parser_get_root(parser);
823 object = json_node_get_object(root);
825 node = json_object_get_member(object, "info");
826 JsonObject *infoObj = json_node_get_object(node);
828 JsonNode *statusNode = json_object_get_member(infoObj, "statuscode");
831 *status = json_node_get_int(statusNode);
832 MAP_DEBUG("status :: >>> %d", *status);
836 if (*status != 0) { /* SUCCESS */
841 *routeResp = (mapquest_route_resp_s *)g_malloc(sizeof(mapquest_route_resp_s));
846 (*routeResp)->maneuvers = NULL;
847 (*routeResp)->shapePoints = NULL;
849 node = json_object_get_member(object, "route");
854 JsonObject *routeObject = json_node_get_object(node);
856 JsonNode *tmp = json_object_get_member(routeObject, "distance");
859 double dist = json_node_get_double(tmp);
860 (*routeResp)->distance = __convert_distance_unit(dist);
861 (*routeResp)->distance_unit = __route_unit;
864 tmp = json_object_get_member(routeObject, "boundingBox");
867 JsonObject *bbox = json_node_get_object(tmp);
869 json_object_foreach_member(bbox, __bbox_foreach, routeResp);
872 tmp = json_object_get_member(routeObject, "formattedTime");
875 (*routeResp)->formatted_time = (char *) json_node_dup_string(tmp);
877 tmp = json_object_get_member(routeObject, "routeType");
879 (*routeResp)->type = ROUTE_TYPE_BICYCLE;
881 char *type = (char *) json_node_get_string(tmp);
883 if (!strcmp(type, "FASTEST"))
884 (*routeResp)->type = ROUTE_TYPE_FASTEST;
885 else if (!strcmp(type, "SHORTEST"))
886 (*routeResp)->type = ROUTE_TYPE_SHORTEST;
887 else if (!strcmp(type, "PEDESTRIAN"))
888 (*routeResp)->type = ROUTE_TYPE_PEDESTRIAN;
889 else if (!strcmp(type, "MULTIMODAL"))
890 (*routeResp)->type = ROUTE_TYPE_MULTIMODAL;
894 tmp = json_object_get_member(routeObject, "time");
897 int time = json_node_get_int(tmp);
898 (*routeResp)->time = time;
901 tmp = json_object_get_member(routeObject, "legs");
904 JsonArray *legsArray = json_node_get_array(tmp);
906 int length = json_array_get_length(legsArray);
909 for (index = 0; index < length; index++) {
911 JsonObject *obj = json_array_get_object_element(legsArray, index);
914 JsonNode *maneuversNode = json_object_get_member(obj, "maneuvers");
917 __parse_maneuvers(maneuversNode, routeResp);
922 tmp = json_object_get_member(routeObject, "shape");
925 JsonObject *shape = json_node_get_object(tmp);
927 json_object_foreach_member(shape, __shape_foreach, routeResp);
930 g_object_unref(parser);
933 void post_curl_response(char *response, int size, mapquest_resp_type type, void *user_data)
935 if (!response) return;
938 MAP_DEBUG("Response data is NULL");
942 MAP_DEBUG("Response received from Curl. [Size=%d]", size);
944 case RESP_TYPE_GEOCODE:
946 MAP_DEBUG("Inside Geocode JSON Parsing..");
948 MapquestGeocodeQueryData *queryData = (MapquestGeocodeQueryData *)user_data;
949 MapquestGeocodeResponseData *responseData = (MapquestGeocodeResponseData *)g_malloc(sizeof(MapquestGeocodeResponseData));
952 responseData->requestId = queryData->requestId;
953 responseData->geocode_cb = queryData->geocode_cb;
954 responseData->user_data = queryData->user_data;
956 if (response && (size > 0)) {
957 GList *coordsList = NULL;
958 __parse_geocode_response(response, size, &status, &coordsList);
960 if (coordsList != NULL) {
961 /* Put the response in queue */
962 responseData->error = __convert_status(status);
963 responseData->coords = coordsList;
965 /* Response parsing failure */
966 responseData->error = __convert_status(status);
967 responseData->coords = NULL;
970 responseData->error = __convert_status(status);
971 responseData->coords = NULL;
974 mapquest_push_to_queue(type, (gpointer)responseData);
983 case RESP_TYPE_REVGEOCODE:
985 MAP_DEBUG("Inside Rev Geocode JSON Parsing..");
987 MapquestRevGeocodeQueryData *queryData = (MapquestRevGeocodeQueryData *)user_data;
988 MapquestRevGeocodeResponseData *responseData = (MapquestRevGeocodeResponseData *)g_malloc(sizeof(MapquestRevGeocodeResponseData));
991 responseData->requestId = queryData->requestId;
992 responseData->reverse_geocode_cb = queryData->reverse_geocode_cb;
993 responseData->user_data = queryData->user_data;
995 if (response && (size > 0)) {
996 /* Coords Result GList */
997 mapquest_address_resp_s *addrResponse = NULL;
999 MAP_DEBUG("Rev Geocode :- Parsing json Response");
1000 __parse_revgeocode_response(response, size, &status, &addrResponse);
1002 if (addrResponse != NULL) {
1003 /* Put the response in queue */
1004 responseData->error = __convert_status(status);
1005 responseData->addressDetails = addrResponse;
1007 /* REPSONSE PARSING FAILURE */
1008 MAP_DEBUG("addr Response is NULL");
1009 responseData->error = __convert_status(status);
1010 responseData->addressDetails = NULL;
1013 MAP_DEBUG("JSON Response is NULL..");
1014 responseData->error = __convert_status(status);
1015 responseData->addressDetails = NULL;
1018 mapquest_push_to_queue(type, (gpointer)responseData);
1027 case RESP_TYPE_PLACES:
1029 MAP_DEBUG("Inside Places JSON Parsing..");
1030 MapquestPlaceQueryData *queryData = (MapquestPlaceQueryData *)user_data;
1031 MapquestPlaceResponseData *responseData = (MapquestPlaceResponseData *)g_malloc(sizeof(MapquestPlaceResponseData));
1034 responseData->requestId = queryData->requestId;
1035 responseData->place_search_cb = queryData->place_search_cb;
1036 responseData->user_data = queryData->user_data;
1038 if (response && (size > 0)) {
1039 /* Coords Result GList */
1040 GList *placeList = NULL;
1042 MAP_DEBUG("Search Places :- Parsing Json Response");
1043 __parse_place_response(response, size, &placeList);
1045 if (placeList != NULL) {
1046 /* Put the response in queue */
1047 responseData->error = MAPQUEST_ERROR_NONE;
1048 responseData->places = placeList;
1050 /* REPSONSE PARSING FAILURE */
1051 MAP_DEBUG("addr Response is NULL");
1052 responseData->error = MAPQUEST_ERROR_UNKNOWN;
1053 responseData->places = NULL;
1056 responseData->error = MAPQUEST_ERROR_UNKNOWN;
1057 responseData->places = NULL;
1060 mapquest_push_to_queue(type, (gpointer)responseData);
1070 case RESP_TYPE_ROUTE:
1072 MAP_DEBUG("Inside Route JSON Parsing..");
1074 MapquestRouteQueryData *queryData = (MapquestRouteQueryData *)user_data;
1075 __route_unit = queryData->unit;
1076 __maneuver_index = 0;
1077 __destination_point = queryData->destination;
1079 MapquestRouteResponseData *responseData = (MapquestRouteResponseData *)g_malloc(sizeof(MapquestRouteResponseData));
1082 responseData->requestId = queryData->requestId;
1083 responseData->route_cb = queryData->route_cb;
1084 responseData->user_data = queryData->user_data;
1086 if (response && (size > 0)) {
1087 /* Coords Result GList */
1088 mapquest_route_resp_s *routeResponse = NULL;
1090 MAP_DEBUG("Route :- Parsing Response");
1091 __parse_route_response(response, size, &status, &routeResponse);
1093 if (routeResponse != NULL) {
1094 /* Put the response in queue */
1095 responseData->error = __convert_status(status);
1096 responseData->routeResponse = routeResponse;
1098 /* REPSONSE PARSING FAILURE */
1099 MAP_DEBUG("route Response is NULL");
1100 responseData->error = __convert_status(status);
1101 responseData->routeResponse = NULL;
1104 responseData->error = __convert_status(status);
1105 responseData->routeResponse = NULL;
1108 mapquest_push_to_queue(type, (gpointer)responseData);
1120 MAP_DEBUG("Inside default JSON Parsing..");