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.
19 #include "mapzen_queue.h"
20 #include "mapzen_geocode.h"
21 #include "mapzen_revgeocode.h"
22 #include "mapzen_route.hpp"
23 #include "mapzen_place.h"
24 #include "mapzen_restcurl.h"
25 #include "mapzen_util.h"
26 #include "mapzen_debug.h"
28 pthread_mutex_t __requestLock;
29 static GAsyncQueue *responseQueue = NULL;
30 int __ResponseQueueLen = 0;
31 bool __response_timer_running = false;
34 GList *requestList = NULL;
36 /* Request Cancel List */
37 GList *reqCancelList = NULL;
39 static void __free_geocode_response(void *ptr);
40 static void __free_revgeocode_response(void *ptr);
41 static void __free_place_response(void *ptr);
42 static void __free_place_details_response(void *ptr);
43 static void __free_place_list_response(void *ptr);
44 static void __free_route_response(void *ptr);
46 int add_to_geocode_list(mapzen_geocode_req_s *req_details, mapzen_geocode_cb callback, int request_id, void *user_data)
48 mapzen_request_s *req = (mapzen_request_s *)g_malloc0(sizeof(mapzen_request_s));
52 req->type = REQ_TYPE_GEOCODE;
54 mapzen_geocode_req *data = (mapzen_geocode_req *)g_malloc0(sizeof(mapzen_geocode_req));
57 data->req_details = req_details;
58 data->requestId = request_id;
59 data->geocode_cb = callback;
60 data->user_data = user_data;
64 MAP_DEBUG("Added GEOCODE REQUEST to geocode List");
66 pthread_mutex_lock(&__requestLock);
67 if (requestList == NULL)
68 requestList = g_list_append(requestList, (gpointer)req);
70 requestList = g_list_insert_before(requestList, NULL, (gpointer)req);
71 pthread_mutex_unlock(&__requestLock);
75 return MAPZEN_ERROR_NONE;
78 int add_to_revgeocode_list(mapzen_revgeocode_req_s *req_details, mapzen_reverse_geocode_cb callback, int request_id, void *user_data)
80 mapzen_request_s *req = (mapzen_request_s *)g_malloc0(sizeof(mapzen_request_s));
84 req->type = REQ_TYPE_REVGEOCODE;
86 mapzen_revgeocode_req *data = (mapzen_revgeocode_req *)g_malloc0(sizeof(mapzen_revgeocode_req));
89 data->req_details = req_details;
90 data->requestId = request_id;
91 data->revgeocode_cb = callback;
92 data->user_data = user_data;
96 MAP_DEBUG("Added REVERSE GEOCODE request to geocode List");
98 pthread_mutex_lock(&__requestLock);
99 if (requestList == NULL)
100 requestList = g_list_append(requestList, (gpointer)req);
102 requestList = g_list_insert_before(requestList, NULL, (gpointer)req);
103 pthread_mutex_unlock(&__requestLock);
107 return MAPZEN_ERROR_NONE;
110 int add_to_place_list(mapzen_search_req_s *req_details, mapzen_place_search_cb callback, int request_id, void *user_data)
112 mapzen_request_s *req = (mapzen_request_s *)g_malloc0(sizeof(mapzen_request_s));
116 req->type = REQ_TYPE_PLACES;
118 mapzen_search_place_req *data = (mapzen_search_place_req *)g_malloc0(sizeof(mapzen_search_place_req));
121 data->req_details = req_details;
122 data->requestId = request_id;
123 data->search_place_cb = callback;
124 data->user_data = user_data;
128 MAP_DEBUG("Added PLACE request to places List");
130 pthread_mutex_lock(&__requestLock);
131 if (requestList == NULL)
132 requestList = g_list_append(requestList, (gpointer)req);
134 requestList = g_list_insert_before(requestList, NULL, (gpointer)req);
135 pthread_mutex_unlock(&__requestLock);
139 return MAPZEN_ERROR_NONE;
142 int add_to_place_details_list(mapzen_get_details_req_s *req_details, mapzen_get_place_details_cb callback, int request_id, void *user_data)
144 mapzen_request_s *req = (mapzen_request_s *)g_malloc0(sizeof(mapzen_request_s));
148 req->type = REQ_TYPE_PLACES_DETAILS;
150 mapzen_get_place_details_req *data = (mapzen_get_place_details_req *)g_malloc0(sizeof(mapzen_get_place_details_req));
153 data->req_details = req_details;
154 data->requestId = request_id;
155 data->get_place_details_cb = callback;
156 data->user_data = user_data;
160 MAP_DEBUG("Added PLACE Details request to places List");
162 pthread_mutex_lock(&__requestLock);
163 if (requestList == NULL)
164 requestList = g_list_append(requestList, (gpointer)req);
166 requestList = g_list_insert_before(requestList, NULL, (gpointer)req);
167 pthread_mutex_unlock(&__requestLock);
171 return MAPZEN_ERROR_NONE;
174 int add_to_places_list(mapzen_search_req_s *req_details, mapzen_place_list_search_cb callback, int request_id, void *user_data)
177 MAP_DEBUG("add_to_place_list");
180 mapzen_request_s *req = (mapzen_request_s *)g_malloc0(sizeof(mapzen_request_s));
184 req->type = REQ_TYPE_PLACES_LIST;
186 mapzen_search_place_list_req *data = (mapzen_search_place_list_req *)g_malloc0(sizeof(mapzen_search_place_list_req));
189 data->req_details = req_details;
190 data->requestId = request_id;
191 data->search_place_list_cb = callback;
192 data->user_data = user_data;
196 MAP_DEBUG("Added PLACE request to places List");
198 pthread_mutex_lock(&__requestLock);
199 if (requestList == NULL)
200 requestList = g_list_append(requestList, (gpointer)req);
202 requestList = g_list_insert_before(requestList, NULL, (gpointer)req);
203 pthread_mutex_unlock(&__requestLock);
207 return MAPZEN_ERROR_NONE;
210 int add_to_route_list(mapzen_route_req_s *req_details, mapzen_route_cb callback, int request_id, void *user_data)
213 MAP_DEBUG("add_to_place_list");
216 mapzen_request_s *req = (mapzen_request_s *)g_malloc0(sizeof(mapzen_request_s));
220 req->type = REQ_TYPE_ROUTE;
222 mapzen_route_req *data = (mapzen_route_req *)g_malloc0(sizeof(mapzen_route_req));
225 data->req_details = req_details;
226 data->requestId = request_id;
227 data->route_cb = callback;
228 data->user_data = user_data;
232 MAP_DEBUG("Added request to route List");
234 pthread_mutex_lock(&__requestLock);
235 if (requestList == NULL)
236 requestList = g_list_append(requestList, (gpointer)req);
238 requestList = g_list_insert_before(requestList, NULL, (gpointer)req);
239 pthread_mutex_unlock(&__requestLock);
244 return MAPZEN_ERROR_NONE;
247 static int __add_to_cancel_list(int request_id)
249 if (reqCancelList == NULL)
250 reqCancelList = g_list_append(reqCancelList, (gpointer) GINT_TO_POINTER(request_id));
252 reqCancelList = g_list_insert_before(reqCancelList, NULL, (gpointer) GINT_TO_POINTER(request_id));
254 return MAPZEN_ERROR_NONE;
257 static int __remove_from_cancel_list(int request_id)
259 if (g_list_length(reqCancelList) != 0)
260 reqCancelList = g_list_remove(reqCancelList, (gpointer) GINT_TO_POINTER(request_id));
262 return MAPZEN_ERROR_NONE;
265 int remove_from_request_list(int request_id)
267 bool is_request_cancelled = false;
269 pthread_mutex_lock(&__requestLock);
270 list = g_list_first(requestList);
271 pthread_mutex_unlock(&__requestLock);
272 mapzen_request_s *req = NULL;
274 while (list != NULL) {
275 req = (mapzen_request_s *) list->data;
278 if (req->type == REQ_TYPE_GEOCODE) {
279 mapzen_geocode_req *geocode_req = (mapzen_geocode_req *) req->request;
281 if (geocode_req->requestId == request_id) {
282 /* Means the request is pending in queue. Not started yet */
283 /* Deleting the request from the request queue */
284 pthread_mutex_lock(&__requestLock);
285 requestList = g_list_remove(requestList, (gpointer)req);
286 pthread_mutex_unlock(&__requestLock);
287 mapzen_geocode_req_s *geocode_req_details = (mapzen_geocode_req_s *)geocode_req->req_details;
289 if (geocode_req_details)
290 g_free(geocode_req_details);
291 geocode_req_details = NULL;
299 __remove_from_cancel_list(request_id);
301 is_request_cancelled = true;
304 } else if (req->type == REQ_TYPE_REVGEOCODE) {
305 mapzen_revgeocode_req *revgeocode_req = (mapzen_revgeocode_req *)req->request;
307 if (revgeocode_req->requestId == request_id) {
308 /* Means the request is pending in queue. Not started yet */
309 /* Deleting the request from the request queue */
310 pthread_mutex_lock(&__requestLock);
311 requestList = g_list_remove(requestList, (gpointer)req);
312 pthread_mutex_unlock(&__requestLock);
313 mapzen_revgeocode_req_s *reverse_geocode_req_details = (mapzen_revgeocode_req_s *)revgeocode_req->req_details;
315 if (reverse_geocode_req_details)
316 g_free(reverse_geocode_req_details);
317 reverse_geocode_req_details = NULL;
319 g_free(revgeocode_req);
320 revgeocode_req = NULL;
325 __remove_from_cancel_list(request_id);
327 is_request_cancelled = true;
330 } else if (req->type == REQ_TYPE_ROUTE) {
331 mapzen_route_req *route_req = (mapzen_route_req *) req->request;
333 if (route_req->requestId == request_id) {
334 /* Means the request is pending in queue. Not started yet */
335 /* Deleting the request from the request queue */
336 pthread_mutex_lock(&__requestLock);
337 requestList = g_list_remove(requestList, (gpointer)req);
338 pthread_mutex_unlock(&__requestLock);
339 mapzen_route_req_s *route_req_details = (mapzen_route_req_s *)route_req->req_details;
341 if (route_req_details)
342 g_free(route_req_details);
343 route_req_details = NULL;
351 __remove_from_cancel_list(request_id);
353 is_request_cancelled = true;
356 } else if (req->type == REQ_TYPE_PLACES) {
357 mapzen_search_place_req *places_req = (mapzen_search_place_req *) req->request;
359 if (places_req->requestId == request_id) {
360 /* Means the request is pending in queue. Not started yet */
361 /* Deleting the request from the request queue */
362 pthread_mutex_lock(&__requestLock);
363 requestList = g_list_remove(requestList, (gpointer)req);
364 pthread_mutex_unlock(&__requestLock);
365 mapzen_search_req_s *place_req_details = (mapzen_search_req_s *)places_req->req_details;
367 if (place_req_details)
368 g_free(place_req_details);
369 place_req_details = NULL;
377 __remove_from_cancel_list(request_id);
379 is_request_cancelled = true;
382 } else if (req->type == REQ_TYPE_PLACES_DETAILS) {
383 mapzen_get_place_details_req *places_req = (mapzen_get_place_details_req *) req->request;
385 if (places_req->requestId == request_id) {
386 /* Means the request is pending in queue. Not started yet */
387 /* Deleting the request from the request queue */
388 pthread_mutex_lock(&__requestLock);
389 requestList = g_list_remove(requestList, (gpointer)req);
390 pthread_mutex_unlock(&__requestLock);
391 mapzen_get_details_req_s *place_req_details = (mapzen_get_details_req_s *)places_req->req_details;
393 if (place_req_details)
394 g_free(place_req_details);
395 place_req_details = NULL;
403 __remove_from_cancel_list(request_id);
405 is_request_cancelled = true;
408 } else if (req->type == REQ_TYPE_PLACES_LIST) {
409 mapzen_search_place_list_req *places_req = (mapzen_search_place_list_req *) req->request;
411 if (places_req->requestId == request_id) {
412 /* Means the request is pending in queue. Not started yet */
413 /* Deleting the request from the request queue */
414 pthread_mutex_lock(&__requestLock);
415 requestList = g_list_remove(requestList, (gpointer)req);
416 pthread_mutex_unlock(&__requestLock);
417 mapzen_search_req_s *place_req_details = (mapzen_search_req_s *)places_req->req_details;
419 if (place_req_details)
420 g_free(place_req_details);
421 place_req_details = NULL;
429 __remove_from_cancel_list(request_id);
431 is_request_cancelled = true;
437 list = g_list_next(list);
440 if (!is_request_cancelled) {
441 /* Means it is currently running. */
442 /* Cancel the request */
443 cancel_request(request_id);
444 /* add to cancel list */
445 __add_to_cancel_list(request_id);
448 return MAPZEN_ERROR_NONE;
451 static bool __is_request_in_cancel_list(int requestId)
453 bool match_id = false;
456 list = g_list_first(reqCancelList);
458 while (list != NULL) {
460 int id = (int) GPOINTER_TO_INT(list->data);
462 if (id == requestId) {
467 list = g_list_next(list);
473 mapzen_request_s *get_next_request()
475 if (g_list_length(requestList) > 0) {
476 pthread_mutex_lock(&__requestLock);
477 GList *list = g_list_first(requestList);
478 pthread_mutex_unlock(&__requestLock);
481 mapzen_request_s *req = (mapzen_request_s *) list->data;
491 static gboolean __timeout_cb(gpointer data)
493 MAP_DEBUG("timeout_cb");
494 __response_timer_running = true;
495 g_async_queue_ref(responseQueue);
497 __ResponseQueueLen = g_async_queue_length(responseQueue);
498 MAP_DEBUG("Queue Len :: [%d]", __ResponseQueueLen);
499 while (__ResponseQueueLen > 0) {
500 gpointer data = g_async_queue_try_pop(responseQueue);
504 MapzenQueueData *response = (MapzenQueueData *) data;
506 switch (response->type) {
507 case RESP_TYPE_GEOCODE:
509 MAP_DEBUG("Got geocode response..");
510 MapzenGeocodeResponseData *geocodeData = (MapzenGeocodeResponseData *) (response->data);
512 if (__is_request_in_cancel_list(geocodeData->requestId) == false) {
513 /* Deliver results to consumer */
514 geocodeData->geocode_cb(geocodeData->error, geocodeData->requestId, geocodeData->coords, geocodeData->user_data);
516 /* If present in cancel list, dont trigger the response. */
517 /* Remove the requestId from cancel list. */
518 __remove_from_cancel_list(geocodeData->requestId);
520 __free_geocode_response(geocodeData);
526 /* Start the Next valid request */
527 if (get_num_running_requests() < CURL_MAX_CONNECTS) {
528 MAP_DEBUG("Fetching the next request from the request list....");
529 mapzen_request_s *req = get_next_request();
531 pthread_mutex_lock(&__requestLock);
532 requestList = g_list_remove(requestList, (gpointer)req);
533 pthread_mutex_unlock(&__requestLock);
535 if (req->type == REQ_TYPE_GEOCODE) {
536 mapzen_geocode_req *geocode_req = (mapzen_geocode_req *) req->request;
537 if (geocode_req != NULL) {
538 start_geocode_service(geocode_req->req_details, geocode_req->geocode_cb, geocode_req->requestId, geocode_req->user_data);
543 } else if (req->type == REQ_TYPE_REVGEOCODE) {
544 mapzen_revgeocode_req *revgeocode_req = (mapzen_revgeocode_req *) req->request;
545 if (revgeocode_req != NULL) {
546 start_reversegeocode_service(revgeocode_req->req_details, revgeocode_req->revgeocode_cb, revgeocode_req->requestId, revgeocode_req->user_data);
548 g_free(revgeocode_req);
549 revgeocode_req = NULL;
551 } else if (req->type == REQ_TYPE_PLACES) {
552 mapzen_search_place_req *places_req = (mapzen_search_place_req *) req->request;
554 start_place_service(places_req->req_details, places_req->search_place_cb, places_req->requestId, places_req->user_data);
559 } else if (req->type == REQ_TYPE_PLACES_DETAILS) {
560 mapzen_get_place_details_req *places_req = (mapzen_get_place_details_req *) req->request;
562 start_place_details_service(places_req->req_details, places_req->get_place_details_cb, places_req->requestId, places_req->user_data);
567 } else if (req->type == REQ_TYPE_PLACES_LIST) {
568 mapzen_search_place_list_req *places_req = (mapzen_search_place_list_req *) req->request;
570 start_places_list_service(places_req->req_details, places_req->search_place_list_cb, places_req->requestId, places_req->user_data);
575 } else if (req->type == REQ_TYPE_ROUTE) {
576 mapzen_route_req *route_req = (mapzen_route_req *) req->request;
578 start_route_service(route_req->req_details, route_req->route_cb, route_req->requestId, route_req->user_data);
588 MAP_DEBUG("No request in queue or request type is wrong");
591 MAP_DEBUG("Libcurl request queue is FULL..");
596 case RESP_TYPE_REVGEOCODE:
598 MapzenRevGeocodeResponseData *revGeocodeData = (MapzenRevGeocodeResponseData *) (response->data);
599 if (revGeocodeData) {
600 if (__is_request_in_cancel_list(revGeocodeData->requestId) == false) {
601 /* Deliver results to consumer */
602 revGeocodeData->reverse_geocode_cb(revGeocodeData->error, revGeocodeData->requestId, revGeocodeData->addressDetails, revGeocodeData->user_data);
604 /* If present in cancel list, dont trigger the response. */
605 /* Remove the requestId from cancel list. */
606 __remove_from_cancel_list(revGeocodeData->requestId);
608 __free_revgeocode_response(revGeocodeData);
610 g_free(revGeocodeData);
611 revGeocodeData = NULL;
614 /* Start the Next valid request */
615 MAP_DEBUG(">> Condition Check <<");
616 if (get_num_running_requests() < CURL_MAX_CONNECTS) {
617 MAP_DEBUG("Fetching the next request from the request list....");
618 mapzen_request_s *req = get_next_request();
620 pthread_mutex_lock(&__requestLock);
621 requestList = g_list_remove(requestList, (gpointer)req);
622 pthread_mutex_unlock(&__requestLock);
624 if (req->type == REQ_TYPE_GEOCODE) {
625 mapzen_geocode_req *geocode_req = (mapzen_geocode_req *) req->request;
626 if (geocode_req != NULL) {
627 start_geocode_service(geocode_req->req_details, geocode_req->geocode_cb, geocode_req->requestId, geocode_req->user_data);
632 } else if (req->type == REQ_TYPE_REVGEOCODE) {
633 mapzen_revgeocode_req *revgeocode_req = (mapzen_revgeocode_req *) req->request;
634 if (revgeocode_req != NULL) {
635 start_reversegeocode_service(revgeocode_req->req_details, revgeocode_req->revgeocode_cb, revgeocode_req->requestId, revgeocode_req->user_data);
637 g_free(revgeocode_req);
638 revgeocode_req = NULL;
640 } else if (req->type == REQ_TYPE_PLACES) {
641 mapzen_search_place_req *places_req = (mapzen_search_place_req *) req->request;
643 start_place_service(places_req->req_details, places_req->search_place_cb, places_req->requestId, places_req->user_data);
648 } else if (req->type == REQ_TYPE_PLACES_DETAILS) {
649 mapzen_get_place_details_req *places_req = (mapzen_get_place_details_req *) req->request;
651 start_place_details_service(places_req->req_details, places_req->get_place_details_cb, places_req->requestId, places_req->user_data);
656 } else if (req->type == REQ_TYPE_PLACES_LIST) {
657 mapzen_search_place_list_req *places_req = (mapzen_search_place_list_req *) req->request;
659 start_places_list_service(places_req->req_details, places_req->search_place_list_cb, places_req->requestId, places_req->user_data);
664 } else if (req->type == REQ_TYPE_ROUTE) {
665 mapzen_route_req *route_req = (mapzen_route_req *) req->request;
667 start_route_service(route_req->req_details, route_req->route_cb, route_req->requestId, route_req->user_data);
677 MAP_DEBUG("No request in queue or request type is wrong");
680 MAP_DEBUG("Libcurl request queue is FULL..");
685 case RESP_TYPE_ROUTE:
687 MapzenRouteResponseData *routeData = (MapzenRouteResponseData *) (response->data);
688 if (routeData != NULL) {
689 if (__is_request_in_cancel_list(routeData->requestId) == false) {
690 /* Deliver results to consumer */
691 routeData->route_cb(routeData->error, routeData->requestId, routeData->routeResponse, routeData->user_data);
693 /* If present in cancel list, dont trigger the response. */
694 /* Remove the requestId from cancel list. */
695 __remove_from_cancel_list(routeData->requestId);
697 __free_route_response(routeData);
703 /* Start the Next valid request */
704 if (get_num_running_requests() < CURL_MAX_CONNECTS) {
705 MAP_DEBUG("Fetching the next request from the request list....");
706 mapzen_request_s *req = get_next_request();
708 pthread_mutex_lock(&__requestLock);
709 requestList = g_list_remove(requestList, (gpointer)req);
710 pthread_mutex_unlock(&__requestLock);
712 if (req->type == REQ_TYPE_GEOCODE) {
713 mapzen_geocode_req *geocode_req = (mapzen_geocode_req *) req->request;
714 if (geocode_req != NULL) {
715 start_geocode_service(geocode_req->req_details, geocode_req->geocode_cb, geocode_req->requestId, geocode_req->user_data);
720 } else if (req->type == REQ_TYPE_REVGEOCODE) {
721 mapzen_revgeocode_req *revgeocode_req = (mapzen_revgeocode_req *) req->request;
722 if (revgeocode_req != NULL) {
723 start_reversegeocode_service(revgeocode_req->req_details, revgeocode_req->revgeocode_cb, revgeocode_req->requestId, revgeocode_req->user_data);
725 g_free(revgeocode_req);
726 revgeocode_req = NULL;
728 } else if (req->type == REQ_TYPE_PLACES) {
729 mapzen_search_place_req *places_req = (mapzen_search_place_req *) req->request;
731 start_place_service(places_req->req_details, places_req->search_place_cb, places_req->requestId, places_req->user_data);
736 } else if (req->type == REQ_TYPE_PLACES_DETAILS) {
737 mapzen_get_place_details_req *places_req = (mapzen_get_place_details_req *) req->request;
739 start_place_details_service(places_req->req_details, places_req->get_place_details_cb, places_req->requestId, places_req->user_data);
744 } else if (req->type == REQ_TYPE_PLACES_LIST) {
745 mapzen_search_place_list_req *places_req = (mapzen_search_place_list_req *) req->request;
747 start_places_list_service(places_req->req_details, places_req->search_place_list_cb, places_req->requestId, places_req->user_data);
752 } else if (req->type == REQ_TYPE_ROUTE) {
753 mapzen_route_req *route_req = (mapzen_route_req *) req->request;
755 start_route_service(route_req->req_details, route_req->route_cb, route_req->requestId, route_req->user_data);
765 MAP_DEBUG("No request in queue or request type is wrong");
768 MAP_DEBUG("Libcurl request queue is FULL..");
773 case RESP_TYPE_PLACES:
775 MapzenPlaceResponseData *placesData = (MapzenPlaceResponseData *) (response->data);
776 if (placesData != NULL) {
777 MAP_DEBUG("Sending places result.");
778 if (__is_request_in_cancel_list(placesData->requestId) == false) {
779 /* Deliver results to consumer */
780 placesData->place_search_cb(placesData->error, placesData->requestId, placesData->places, placesData->user_data);
782 /* If present in cancel list, dont trigger the response. */
783 /* Remove the requestId from cancel list. */
784 __remove_from_cancel_list(placesData->requestId);
786 __free_place_response(placesData);
792 /* Start the Next valid request */
793 if (get_num_running_requests() < CURL_MAX_CONNECTS) {
794 MAP_DEBUG("Fetching the next request from the request list....");
795 mapzen_request_s *req = get_next_request();
797 pthread_mutex_lock(&__requestLock);
798 requestList = g_list_remove(requestList, (gpointer)req);
799 pthread_mutex_unlock(&__requestLock);
801 if (req->type == REQ_TYPE_GEOCODE) {
802 mapzen_geocode_req *geocode_req = (mapzen_geocode_req *) req->request;
803 if (geocode_req != NULL) {
804 start_geocode_service(geocode_req->req_details, geocode_req->geocode_cb, geocode_req->requestId, geocode_req->user_data);
809 } else if (req->type == REQ_TYPE_REVGEOCODE) {
810 mapzen_revgeocode_req *revgeocode_req = (mapzen_revgeocode_req *) req->request;
811 if (revgeocode_req != NULL) {
812 start_reversegeocode_service(revgeocode_req->req_details, revgeocode_req->revgeocode_cb, revgeocode_req->requestId, revgeocode_req->user_data);
814 g_free(revgeocode_req);
815 revgeocode_req = NULL;
817 } else if (req->type == REQ_TYPE_PLACES) {
818 mapzen_search_place_req *places_req = (mapzen_search_place_req *) req->request;
820 start_place_service(places_req->req_details, places_req->search_place_cb, places_req->requestId, places_req->user_data);
825 } else if (req->type == REQ_TYPE_PLACES_DETAILS) {
826 mapzen_get_place_details_req *places_req = (mapzen_get_place_details_req *) req->request;
828 start_place_details_service(places_req->req_details, places_req->get_place_details_cb, places_req->requestId, places_req->user_data);
833 } else if (req->type == REQ_TYPE_PLACES_LIST) {
834 mapzen_search_place_list_req *places_req = (mapzen_search_place_list_req *) req->request;
836 start_places_list_service(places_req->req_details, places_req->search_place_list_cb, places_req->requestId, places_req->user_data);
841 } else if (req->type == REQ_TYPE_ROUTE) {
842 mapzen_route_req *route_req = (mapzen_route_req *) req->request;
844 start_route_service(route_req->req_details, route_req->route_cb, route_req->requestId, route_req->user_data);
854 MAP_DEBUG("No request in queue or request type is wrong");
857 MAP_DEBUG("Libcurl request queue is FULL..");
861 case RESP_TYPE_PLACES_DETAILS:
863 MapzenPlaceDetailsResponseData *placesData = (MapzenPlaceDetailsResponseData *) (response->data);
864 if (placesData != NULL) {
865 MAP_DEBUG("Sending places details result.");
866 if (__is_request_in_cancel_list(placesData->requestId) == false) {
867 /* Deliver results to consumer */
868 placesData->get_place_details_cb(placesData->error, placesData->requestId, placesData->places, placesData->user_data);
870 /* If present in cancel list, dont trigger the response. */
871 /* Remove the requestId from cancel list. */
872 __remove_from_cancel_list(placesData->requestId);
874 __free_place_details_response(placesData);
880 /* Start the Next valid request */
881 if (get_num_running_requests() < CURL_MAX_CONNECTS) {
882 MAP_DEBUG("Fetching the next request from the request list....");
883 mapzen_request_s *req = get_next_request();
885 pthread_mutex_lock(&__requestLock);
886 requestList = g_list_remove(requestList, (gpointer)req);
887 pthread_mutex_unlock(&__requestLock);
889 if (req->type == REQ_TYPE_GEOCODE) {
890 mapzen_geocode_req *geocode_req = (mapzen_geocode_req *) req->request;
891 if (geocode_req != NULL) {
892 start_geocode_service(geocode_req->req_details, geocode_req->geocode_cb, geocode_req->requestId, geocode_req->user_data);
897 } else if (req->type == REQ_TYPE_REVGEOCODE) {
898 mapzen_revgeocode_req *revgeocode_req = (mapzen_revgeocode_req *) req->request;
899 if (revgeocode_req != NULL) {
900 start_reversegeocode_service(revgeocode_req->req_details, revgeocode_req->revgeocode_cb, revgeocode_req->requestId, revgeocode_req->user_data);
902 g_free(revgeocode_req);
903 revgeocode_req = NULL;
905 } else if (req->type == REQ_TYPE_PLACES) {
906 mapzen_search_place_req *places_req = (mapzen_search_place_req *) req->request;
908 start_place_service(places_req->req_details, places_req->search_place_cb, places_req->requestId, places_req->user_data);
913 } else if (req->type == REQ_TYPE_PLACES_DETAILS) {
914 mapzen_get_place_details_req *places_req = (mapzen_get_place_details_req *) req->request;
916 start_place_details_service(places_req->req_details, places_req->get_place_details_cb, places_req->requestId, places_req->user_data);
921 } else if (req->type == REQ_TYPE_PLACES_LIST) {
922 mapzen_search_place_list_req *places_req = (mapzen_search_place_list_req *) req->request;
924 start_places_list_service(places_req->req_details, places_req->search_place_list_cb, places_req->requestId, places_req->user_data);
929 } else if (req->type == REQ_TYPE_ROUTE) {
930 mapzen_route_req *route_req = (mapzen_route_req *) req->request;
932 start_route_service(route_req->req_details, route_req->route_cb, route_req->requestId, route_req->user_data);
942 MAP_DEBUG("No request in queue or request type is wrong");
945 MAP_DEBUG("Libcurl request queue is FULL..");
949 case RESP_TYPE_PLACES_LIST:
951 MapzenPlaceListResponseData *placesData = (MapzenPlaceListResponseData *) (response->data);
952 if (placesData != NULL) {
953 MAP_DEBUG("Sending places list result.");
954 if (__is_request_in_cancel_list(placesData->requestId) == false) {
955 /* Deliver results to consumer */
956 placesData->place_list_search_cb(placesData->error, placesData->requestId, placesData->places, placesData->user_data);
958 /* If present in cancel list, dont trigger the response. */
959 /* Remove the requestId from cancel list. */
960 __remove_from_cancel_list(placesData->requestId);
962 __free_place_list_response(placesData);
968 /* Start the Next valid request */
969 if (get_num_running_requests() < CURL_MAX_CONNECTS) {
970 MAP_DEBUG("Fetching the next request from the request list....");
971 mapzen_request_s *req = get_next_request();
973 pthread_mutex_lock(&__requestLock);
974 requestList = g_list_remove(requestList, (gpointer)req);
975 pthread_mutex_unlock(&__requestLock);
977 if (req->type == REQ_TYPE_GEOCODE) {
978 mapzen_geocode_req *geocode_req = (mapzen_geocode_req *) req->request;
979 if (geocode_req != NULL) {
980 start_geocode_service(geocode_req->req_details, geocode_req->geocode_cb, geocode_req->requestId, geocode_req->user_data);
985 } else if (req->type == REQ_TYPE_REVGEOCODE) {
986 mapzen_revgeocode_req *revgeocode_req = (mapzen_revgeocode_req *) req->request;
987 if (revgeocode_req != NULL) {
988 start_reversegeocode_service(revgeocode_req->req_details, revgeocode_req->revgeocode_cb, revgeocode_req->requestId, revgeocode_req->user_data);
990 g_free(revgeocode_req);
991 revgeocode_req = NULL;
993 } else if (req->type == REQ_TYPE_PLACES) {
994 mapzen_search_place_req *places_req = (mapzen_search_place_req *) req->request;
996 start_place_service(places_req->req_details, places_req->search_place_cb, places_req->requestId, places_req->user_data);
1001 } else if (req->type == REQ_TYPE_PLACES_DETAILS) {
1002 mapzen_get_place_details_req *places_req = (mapzen_get_place_details_req *) req->request;
1004 start_place_details_service(places_req->req_details, places_req->get_place_details_cb, places_req->requestId, places_req->user_data);
1009 } else if (req->type == REQ_TYPE_PLACES_LIST) {
1010 mapzen_search_place_list_req *places_req = (mapzen_search_place_list_req *) req->request;
1012 start_places_list_service(places_req->req_details, places_req->search_place_list_cb, places_req->requestId, places_req->user_data);
1017 } else if (req->type == REQ_TYPE_ROUTE) {
1018 mapzen_route_req *route_req = (mapzen_route_req *) req->request;
1020 start_route_service(route_req->req_details, route_req->route_cb, route_req->requestId, route_req->user_data);
1030 MAP_DEBUG("No request in queue or request type is wrong");
1033 MAP_DEBUG("Libcurl request queue is FULL..");
1038 MAP_DEBUG("UNKNOWN RESPONSE TYPE");
1042 __ResponseQueueLen = g_async_queue_length(responseQueue);
1050 g_async_queue_unref(responseQueue);
1052 __response_timer_running = false;
1057 static void __free_geocode_response(void *ptr)
1059 MapzenGeocodeResponseData *geocodeData = (MapzenGeocodeResponseData *) (ptr);
1062 GList *coords = NULL;
1063 coords = g_list_first(geocodeData->coords);
1066 coords_s *data = (coords_s *) coords->data;
1069 geocodeData->coords = g_list_remove(geocodeData->coords, (gpointer)data);
1074 coords = g_list_first(geocodeData->coords);
1077 g_list_free(geocodeData->coords);
1078 geocodeData->coords = NULL;
1080 if (geocodeData->user_data) {
1081 g_free(geocodeData->user_data);
1082 geocodeData->user_data = NULL;
1087 static void __free_revgeocode_response(void *ptr)
1089 MapzenRevGeocodeResponseData *revGeocodeData = (MapzenRevGeocodeResponseData *) (ptr);
1090 if (revGeocodeData) {
1091 if (revGeocodeData->addressDetails) {
1092 if (revGeocodeData->addressDetails->street) {
1093 g_free(revGeocodeData->addressDetails->street);
1094 revGeocodeData->addressDetails->street = NULL;
1096 if (revGeocodeData->addressDetails->neighbourhood) {
1097 g_free(revGeocodeData->addressDetails->neighbourhood);
1098 revGeocodeData->addressDetails->neighbourhood = NULL;
1100 if (revGeocodeData->addressDetails->localadmin) {
1101 g_free(revGeocodeData->addressDetails->localadmin);
1102 revGeocodeData->addressDetails->localadmin = NULL;
1104 if (revGeocodeData->addressDetails->county) {
1105 g_free(revGeocodeData->addressDetails->county);
1106 revGeocodeData->addressDetails->county = NULL;
1108 if (revGeocodeData->addressDetails->region) {
1109 g_free(revGeocodeData->addressDetails->region);
1110 revGeocodeData->addressDetails->region = NULL;
1112 if (revGeocodeData->addressDetails->country) {
1113 g_free(revGeocodeData->addressDetails->country);
1114 revGeocodeData->addressDetails->country = NULL;
1116 if (revGeocodeData->addressDetails->country_a) {
1117 g_free(revGeocodeData->addressDetails->country_a);
1118 revGeocodeData->addressDetails->country_a = NULL;
1120 if (revGeocodeData->addressDetails->postalcode) {
1121 g_free(revGeocodeData->addressDetails->postalcode);
1122 revGeocodeData->addressDetails->postalcode = NULL;
1125 g_free(revGeocodeData->addressDetails);
1126 revGeocodeData->addressDetails = NULL;
1129 if (revGeocodeData->user_data) {
1130 g_free(revGeocodeData->user_data);
1131 revGeocodeData->user_data = NULL;
1136 static void __free_place_response(void *ptr)
1138 MapzenPlaceResponseData *placeData = (MapzenPlaceResponseData *) (ptr);
1140 GList *place = NULL;
1141 place = g_list_first(placeData->places);
1144 mapzen_place_resp_s *mapzen_place = (mapzen_place_resp_s *) place->data;
1146 if (mapzen_place->address) {
1147 if (mapzen_place->address->street) {
1148 g_free(mapzen_place->address->street);
1149 mapzen_place->address->street = NULL;
1151 if (mapzen_place->address->neighbourhood) {
1152 g_free(mapzen_place->address->neighbourhood);
1153 mapzen_place->address->neighbourhood = NULL;
1155 if (mapzen_place->address->housenumber) {
1156 g_free(mapzen_place->address->housenumber);
1157 mapzen_place->address->housenumber = NULL;
1159 if (mapzen_place->address->localadmin) {
1160 g_free(mapzen_place->address->localadmin);
1161 mapzen_place->address->localadmin = NULL;
1163 if (mapzen_place->address->county) {
1164 g_free(mapzen_place->address->county);
1165 mapzen_place->address->county = NULL;
1167 if (mapzen_place->address->region) {
1168 g_free(mapzen_place->address->region);
1169 mapzen_place->address->region = NULL;
1171 if (mapzen_place->address->country) {
1172 g_free(mapzen_place->address->country);
1173 mapzen_place->address->country = NULL;
1175 if (mapzen_place->address->country_a) {
1176 g_free(mapzen_place->address->country_a);
1177 mapzen_place->address->country_a = NULL;
1179 if (mapzen_place->address->postalcode) {
1180 g_free(mapzen_place->address->postalcode);
1181 mapzen_place->address->postalcode = NULL;
1183 g_free(mapzen_place->address);
1184 mapzen_place->address = NULL;
1187 if (mapzen_place->categories) {
1188 if (g_list_length(mapzen_place->categories) > 0) {
1190 g_list_foreach(mapzen_place->categories, (GFunc)g_free, NULL);
1191 g_list_free(mapzen_place->categories);
1192 mapzen_place->categories = NULL;
1196 if (mapzen_place->place_id) {
1197 g_free(mapzen_place->place_id);
1198 mapzen_place->place_id = NULL;
1201 if (mapzen_place->display_name) {
1202 g_free(mapzen_place->display_name);
1203 mapzen_place->display_name = NULL;
1206 placeData->places = g_list_remove(placeData->places, (gpointer)mapzen_place);
1208 g_free(mapzen_place);
1209 mapzen_place = NULL;
1211 place = g_list_first(placeData->places);
1213 g_list_free(placeData->places);
1214 placeData->places = NULL;
1216 if (placeData->user_data) {
1217 g_free(placeData->user_data);
1218 placeData->user_data = NULL;
1223 static void __free_place_details_response(void *ptr)
1225 MapzenPlaceDetailsResponseData *placeData = (MapzenPlaceDetailsResponseData *) (ptr);
1227 GList *place = NULL;
1228 place = g_list_first(placeData->places);
1231 mapzen_place_resp_s *mapzen_place = (mapzen_place_resp_s *) place->data;
1233 if (mapzen_place->address) {
1234 if (mapzen_place->address->street) {
1235 g_free(mapzen_place->address->street);
1236 mapzen_place->address->street = NULL;
1238 if (mapzen_place->address->neighbourhood) {
1239 g_free(mapzen_place->address->neighbourhood);
1240 mapzen_place->address->neighbourhood = NULL;
1242 if (mapzen_place->address->housenumber) {
1243 g_free(mapzen_place->address->housenumber);
1244 mapzen_place->address->housenumber = NULL;
1246 if (mapzen_place->address->localadmin) {
1247 g_free(mapzen_place->address->localadmin);
1248 mapzen_place->address->localadmin = NULL;
1250 if (mapzen_place->address->county) {
1251 g_free(mapzen_place->address->county);
1252 mapzen_place->address->county = NULL;
1254 if (mapzen_place->address->region) {
1255 g_free(mapzen_place->address->region);
1256 mapzen_place->address->region = NULL;
1258 if (mapzen_place->address->country) {
1259 g_free(mapzen_place->address->country);
1260 mapzen_place->address->country = NULL;
1262 if (mapzen_place->address->country_a) {
1263 g_free(mapzen_place->address->country_a);
1264 mapzen_place->address->country_a = NULL;
1266 if (mapzen_place->address->postalcode) {
1267 g_free(mapzen_place->address->postalcode);
1268 mapzen_place->address->postalcode = NULL;
1270 g_free(mapzen_place->address);
1271 mapzen_place->address = NULL;
1274 if (mapzen_place->categories) {
1275 if (g_list_length(mapzen_place->categories) > 0) {
1277 g_list_foreach(mapzen_place->categories, (GFunc)g_free, NULL);
1278 g_list_free(mapzen_place->categories);
1279 mapzen_place->categories = NULL;
1283 if (mapzen_place->place_id) {
1284 g_free(mapzen_place->place_id);
1285 mapzen_place->place_id = NULL;
1288 if (mapzen_place->display_name) {
1289 g_free(mapzen_place->display_name);
1290 mapzen_place->display_name = NULL;
1293 placeData->places = g_list_remove(placeData->places, (gpointer)mapzen_place);
1295 g_free(mapzen_place);
1296 mapzen_place = NULL;
1298 place = g_list_first(placeData->places);
1300 g_list_free(placeData->places);
1301 placeData->places = NULL;
1303 if (placeData->user_data) {
1304 g_free(placeData->user_data);
1305 placeData->user_data = NULL;
1310 static void __free_place_list_response(void *ptr)
1312 MapzenPlaceListResponseData *placeData = (MapzenPlaceListResponseData *) (ptr);
1314 GList *place = NULL;
1315 place = g_list_first(placeData->places);
1318 mapzen_place_resp_s *mapzen_place = (mapzen_place_resp_s *) place->data;
1320 if (mapzen_place->address) {
1321 if (mapzen_place->address->street) {
1322 g_free(mapzen_place->address->street);
1323 mapzen_place->address->street = NULL;
1325 if (mapzen_place->address->neighbourhood) {
1326 g_free(mapzen_place->address->neighbourhood);
1327 mapzen_place->address->neighbourhood = NULL;
1329 if (mapzen_place->address->housenumber) {
1330 g_free(mapzen_place->address->housenumber);
1331 mapzen_place->address->housenumber = NULL;
1333 if (mapzen_place->address->localadmin) {
1334 g_free(mapzen_place->address->localadmin);
1335 mapzen_place->address->localadmin = NULL;
1337 if (mapzen_place->address->county) {
1338 g_free(mapzen_place->address->county);
1339 mapzen_place->address->county = NULL;
1341 if (mapzen_place->address->region) {
1342 g_free(mapzen_place->address->region);
1343 mapzen_place->address->region = NULL;
1345 if (mapzen_place->address->country) {
1346 g_free(mapzen_place->address->country);
1347 mapzen_place->address->country = NULL;
1349 if (mapzen_place->address->country_a) {
1350 g_free(mapzen_place->address->country_a);
1351 mapzen_place->address->country_a = NULL;
1353 if (mapzen_place->address->postalcode) {
1354 g_free(mapzen_place->address->postalcode);
1355 mapzen_place->address->postalcode = NULL;
1357 g_free(mapzen_place->address);
1358 mapzen_place->address = NULL;
1361 if (mapzen_place->categories) {
1362 if (g_list_length(mapzen_place->categories) > 0) {
1364 g_list_foreach(mapzen_place->categories, (GFunc)g_free, NULL);
1365 g_list_free(mapzen_place->categories);
1366 mapzen_place->categories = NULL;
1370 if (mapzen_place->place_id) {
1371 g_free(mapzen_place->place_id);
1372 mapzen_place->place_id = NULL;
1375 if (mapzen_place->display_name) {
1376 g_free(mapzen_place->display_name);
1377 mapzen_place->display_name = NULL;
1380 placeData->places = g_list_remove(placeData->places, (gpointer)mapzen_place);
1382 g_free(mapzen_place);
1383 mapzen_place = NULL;
1385 place = g_list_first(placeData->places);
1387 g_list_free(placeData->places);
1388 placeData->places = NULL;
1390 if (placeData->user_data) {
1391 g_free(placeData->user_data);
1392 placeData->user_data = NULL;
1397 static void __free_route_response(void *ptr)
1399 MAP_DEBUG(">>>>> START __free_route_response");
1401 MapzenRouteResponseData *routeData = (MapzenRouteResponseData *) (ptr);
1403 MAP_DEBUG(">>>>> __free_route_response PROCESS: routeData");
1404 mapzen_route_resp_s *route_info = routeData->routeResponse;
1406 MAP_DEBUG(">>>>> __free_route_response PROCESS: route_info");
1408 GList *segment_data = NULL;
1409 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE segment_data");
1410 segment_data = g_list_first(route_info->segments);
1411 while (segment_data) {
1412 mapzen_route_segment *segment = (mapzen_route_segment *) segment_data->data;
1414 GList *maneuver_data = NULL;
1415 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE maneuver_data");
1416 maneuver_data = g_list_first(segment->maneuvers);
1417 while (maneuver_data) {
1418 MAP_DEBUG(">>>>> __free_route_response PROCESS: maneuver_data");
1419 mapzen_route_maneuver *maneuver = (mapzen_route_maneuver *) maneuver_data->data;
1421 if (maneuver->instruction) {
1422 MAP_DEBUG(">>>>> __free_route_response PROCESS: instruction");
1423 g_free(maneuver->instruction);
1424 maneuver->instruction = NULL;
1427 if (maneuver->street_name) {
1428 MAP_DEBUG(">>>>> __free_route_response PROCESS: street_name");
1429 g_free(maneuver->street_name);
1430 maneuver->street_name = NULL;
1433 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE segments->maneuvers g_list_remove");
1434 segment->maneuvers = g_list_remove(segment->maneuvers, (gpointer)maneuver);
1435 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST segments->maneuvers g_list_remove");
1440 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE segment->maneuvers g_list_first");
1441 /* Fetching the next item from Maneuver/Segment list */
1442 maneuver_data = g_list_first(segment->maneuvers);
1443 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST segment->maneuvers g_list_first");
1444 } /* Loop over maneuvers */
1446 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST while (maneuver_data)");
1447 g_list_free(segment->maneuvers);
1448 segment->maneuvers = NULL;
1450 GList *segmentShapePoints = NULL;
1451 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE segmentShapePoints");
1452 segmentShapePoints = g_list_first(segment->shapePoints);
1453 while (segmentShapePoints) {
1454 MAP_DEBUG(">>>>> __free_route_response PROCESS: segmentShapePoints");
1455 coords_s *data = (coords_s *) segmentShapePoints->data;
1457 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE g_list_remove");
1458 segment->shapePoints = g_list_remove(segment->shapePoints, (gpointer)data);
1459 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST g_list_remove");
1464 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE g_list_first");
1465 segmentShapePoints = g_list_first(segment->shapePoints);
1466 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST g_list_first");
1469 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST while (segmentShapePoints)");
1470 g_list_free(segment->shapePoints);
1471 segment->shapePoints = NULL;
1473 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE route_info->segments g_list_remove");
1474 route_info->segments = g_list_remove(route_info->segments, (gpointer)segment);
1475 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST route_info->segments g_list_remove");
1480 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE route_info->segments g_list_first");
1481 /* Fetching the next item from Maneuver/Segment list */
1482 segment_data = g_list_first(route_info->segments);
1483 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST route_info->segments g_list_first");
1485 } /* Loop over segments */
1487 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST while (segment_data)");
1488 g_list_free(route_info->segments);
1489 route_info->segments = NULL;
1491 GList *shapePoints = NULL;
1492 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE shapePoints");
1493 shapePoints = g_list_first(route_info->shapePoints);
1494 while (shapePoints) {
1495 MAP_DEBUG(">>>>> __free_route_response PROCESS: shapePoints");
1496 coords_s *data = (coords_s *) shapePoints->data;
1498 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE g_list_remove");
1499 route_info->shapePoints = g_list_remove(route_info->shapePoints, (gpointer)data);
1500 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST g_list_remove");
1505 MAP_DEBUG(">>>>> __free_route_response PROCESS: PRE g_list_first");
1506 shapePoints = g_list_first(route_info->shapePoints);
1507 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST g_list_first");
1509 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST while (shapePoints)");
1510 g_list_free(route_info->shapePoints);
1511 route_info->shapePoints = NULL;
1513 if (route_info->language) {
1514 MAP_DEBUG(">>>>> __free_route_response PROCESS: language");
1515 g_free(route_info->language);
1516 route_info->language = NULL;
1519 MAP_DEBUG(">>>>> __free_route_response PROCESS: g_free(route_info)");
1523 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST route_info");
1525 if (routeData->user_data) {
1526 MAP_DEBUG(">>>>> __free_route_response PROCESS: user_data");
1527 g_free(routeData->user_data);
1528 routeData->user_data = NULL;
1529 MAP_DEBUG(">>>>> __free_route_response PROCESS: POST user_data");
1532 MAP_DEBUG(">>>>> END __free_route_response");
1535 int mapzen_init_queue()
1537 pthread_mutex_init(&__requestLock, NULL);
1539 /* Queue initialize */
1540 responseQueue = g_async_queue_new();
1542 /* Initialise Curl Service */
1543 int ret = init_curl();
1545 if (ret != MAPZEN_ERROR_NONE)
1546 return MAPZEN_ERROR_UNKNOWN;
1548 pthread_mutex_lock(&__requestLock);
1550 pthread_mutex_unlock(&__requestLock);
1551 reqCancelList = NULL;
1552 __ResponseQueueLen = 0;
1553 __response_timer_running = false;
1555 return MAPZEN_ERROR_NONE;
1558 int mapzen_deinit_queue()
1562 g_list_free(reqCancelList);
1563 reqCancelList = NULL;
1565 pthread_mutex_destroy(&__requestLock);
1567 /* Free the queue */
1568 if (responseQueue) {
1569 g_async_queue_ref(responseQueue);
1570 __ResponseQueueLen = g_async_queue_length(responseQueue);
1571 MAP_DEBUG("Queue len : %d", __ResponseQueueLen);
1573 while (__ResponseQueueLen > 0) {
1574 gpointer data = g_async_queue_try_pop(responseQueue);
1576 __ResponseQueueLen = g_async_queue_length(responseQueue);
1580 MapzenQueueData *response = (MapzenQueueData *) data;
1582 switch (response->type) {
1583 case RESP_TYPE_GEOCODE:
1585 MapzenGeocodeResponseData *geocodeData = (MapzenGeocodeResponseData *) (response->data);
1587 __free_geocode_response(geocodeData);
1589 g_free(geocodeData);
1594 case RESP_TYPE_REVGEOCODE:
1596 MapzenRevGeocodeResponseData *revGeocodeData = (MapzenRevGeocodeResponseData *) (response->data);
1597 if (revGeocodeData) {
1598 __free_revgeocode_response(revGeocodeData);
1600 g_free(revGeocodeData);
1601 revGeocodeData = NULL;
1605 case RESP_TYPE_PLACES:
1607 MapzenPlaceResponseData *placeData = (MapzenPlaceResponseData *) (response->data);
1608 if (placeData != NULL) {
1609 __free_place_response(placeData);
1616 case RESP_TYPE_PLACES_DETAILS:
1618 MapzenPlaceDetailsResponseData *placeData = (MapzenPlaceDetailsResponseData *) (response->data);
1619 if (placeData != NULL) {
1620 __free_place_details_response(placeData);
1627 case RESP_TYPE_PLACES_LIST:
1629 MapzenPlaceListResponseData *placeData = (MapzenPlaceListResponseData *) (response->data);
1630 if (placeData != NULL) {
1631 __free_place_list_response(placeData);
1638 case RESP_TYPE_ROUTE:
1640 MapzenRouteResponseData *routeData = (MapzenRouteResponseData *) (response->data);
1641 if (routeData != NULL) {
1642 __free_route_response(routeData);
1653 __ResponseQueueLen = g_async_queue_length(responseQueue);
1660 g_async_queue_unref(responseQueue);
1661 responseQueue = NULL;
1664 return MAPZEN_ERROR_NONE;
1667 int mapzen_push_to_queue(mapzen_resp_type type, gpointer data)
1669 MAP_DEBUG("Pushing to Queue....");
1671 MapzenQueueData *queueData = (MapzenQueueData *)g_malloc0(sizeof(MapzenQueueData));
1672 if (!queueData) return MAPZEN_ERROR_OUT_OF_MEMORY;
1674 queueData->type = type;
1675 queueData->data = data;
1677 g_async_queue_ref(responseQueue);
1678 g_async_queue_push(responseQueue, (gpointer)queueData);
1679 g_async_queue_unref(responseQueue);
1681 if (!__response_timer_running) {
1682 MAP_DEBUG(">>>>>>>>>>>>>>>>>>>>>>> TRIGGER RESPONSE TIMER <<<<<<<<<<<<<<<<<<<<<<<<<");
1683 g_timeout_add_seconds(1, __timeout_cb, NULL); /* timeout : 1 sec */
1685 __ResponseQueueLen = g_async_queue_length(responseQueue);
1686 MAP_DEBUG(">>>>>>>>>>>>>>>>>> Timer already running. Response Queue Len [%d] <<<<<<<<<<<<<<<<<", __ResponseQueueLen);
1689 return MAPZEN_ERROR_NONE;
1692 int start_geocode_service(mapzen_geocode_req_s *req_details, mapzen_geocode_cb callback, int request_id, void *user_data)
1694 int num_running_req = get_num_running_requests();
1696 if (num_running_req >= CURL_MAX_CONNECTS) {
1697 /* Add the request to queue */
1698 add_to_geocode_list(req_details, callback, request_id, user_data);
1700 MapzenGeocodeQueryData *queryData = (MapzenGeocodeQueryData *)g_malloc0(sizeof(MapzenGeocodeQueryData));
1702 if (queryData != NULL) {
1703 queryData->requestId = request_id;
1704 queryData->geocode_cb = callback;
1705 queryData->user_data = user_data;
1707 if (req_details->boundary != NULL) {
1708 if (req_details->boundary->type == MAPZEN_BOUNDARY_RECT) {
1709 MAP_DEBUG("TOP LEFT >>><<< LATITUDE : %f, LONGITUDE : %f", req_details->boundary->rect.top_left.latitude, req_details->boundary->rect.top_left.longitude);
1710 MAP_DEBUG("BOTTOM RIGHT >>><<< LATITUDE : %f, LONGITUDE : %f", req_details->boundary->rect.bottom_right.latitude, req_details->boundary->rect.bottom_right.longitude);
1712 query_geocode_within_bounding_box(req_details->maps_key, req_details->address, req_details->boundary->rect.top_left, req_details->boundary->rect.bottom_right, req_details->num_res, queryData);
1714 } else if (req_details->boundary->type == MAPZEN_BOUNDARY_CIRCLE) {
1716 coords_s circle = req_details->boundary->circle.center;
1717 MAP_DEBUG("User input LATITUDE : %f, LONGITUDE : %f", circle.latitude, circle.longitude);
1718 query_geocode_within_circle(req_details->maps_key, req_details->address, circle, req_details->boundary->circle.radius, req_details->num_res, queryData);
1721 query_geocode(req_details->maps_key, req_details->address, req_details->num_res, queryData);
1725 MAP_DEBUG("BOUNDARY is NULL.. NORMAL GEOCODE QUERY WITHOUT BOUNDS");
1727 query_geocode(req_details->maps_key, req_details->address, req_details->num_res, queryData);
1732 if (req_details->address) {
1733 g_free(req_details->address);
1734 req_details->address = NULL;
1736 if (req_details->maps_key) {
1737 g_free(req_details->maps_key);
1738 req_details->maps_key = NULL;
1740 if (req_details->boundary) {
1741 g_free(req_details->boundary);
1742 req_details->boundary = NULL;
1744 g_free(req_details);
1749 return MAPZEN_ERROR_NONE;
1752 int start_reversegeocode_service(mapzen_revgeocode_req_s *req_details, mapzen_reverse_geocode_cb callback, int request_id, void *user_data)
1754 int num_running_req = get_num_running_requests();
1756 if (num_running_req >= CURL_MAX_CONNECTS) {
1757 /* Add the request to queue */
1758 add_to_revgeocode_list(req_details, callback, request_id, user_data);
1760 MapzenRevGeocodeQueryData *queryData = (MapzenRevGeocodeQueryData *)g_malloc0(sizeof(MapzenRevGeocodeQueryData));
1762 if (queryData != NULL) {
1763 queryData->requestId = request_id;
1764 queryData->reverse_geocode_cb = callback;
1765 queryData->user_data = user_data;
1767 coords_s coords = req_details->coordinates;
1769 query_revgeocode(req_details->maps_key, coords.latitude, coords.longitude, queryData);
1773 if (req_details->maps_key) {
1774 g_free(req_details->maps_key);
1775 req_details->maps_key = NULL;
1777 g_free(req_details);
1782 return MAPZEN_ERROR_NONE;
1785 int start_route_service(mapzen_route_req_s *req_details, mapzen_route_cb callback, int request_id, void *user_data)
1787 int num_running_req = get_num_running_requests();
1789 if (num_running_req >= CURL_MAX_CONNECTS) {
1790 /* Add the request to queue */
1791 add_to_route_list(req_details, callback, request_id, user_data);
1793 MapzenRouteQueryData *queryData = (MapzenRouteQueryData *)g_malloc0(sizeof(MapzenRouteQueryData));
1795 if (queryData != NULL) {
1796 queryData->requestId = request_id;
1797 queryData->route_cb = callback;
1798 queryData->origin = req_details->from;
1799 queryData->destination = req_details->to;
1800 queryData->unit = req_details->unit;
1801 queryData->user_data = user_data;
1803 query_route(req_details->maps_key, req_details->from, req_details->to, req_details->type, req_details->avoids, req_details->driving_style, req_details->way_points, queryData);
1807 if (req_details->maps_key) {
1808 g_free(req_details->maps_key);
1809 req_details->maps_key = NULL;
1811 if (req_details->way_points) {
1812 if (g_list_length(req_details->way_points) > 0) {
1814 list = g_list_first(req_details->way_points);
1816 coords_s *data = (coords_s *)list->data;
1818 req_details->way_points = g_list_remove(req_details->way_points, (gpointer)data);
1823 list = g_list_first(req_details->way_points);
1826 g_list_free(req_details->way_points);
1827 req_details->way_points = NULL;
1829 g_free(req_details);
1834 return MAPZEN_ERROR_NONE;
1837 int start_place_service(mapzen_search_req_s *req_details, mapzen_place_search_cb callback, int request_id, void *user_data)
1839 MAP_DEBUG("Inside start_place_service.");
1841 int num_running_req = get_num_running_requests();
1843 if (num_running_req >= CURL_MAX_CONNECTS) {
1844 /* Add the request to queue */
1845 add_to_place_list(req_details, callback, request_id, user_data);
1847 MapzenPlaceQueryData *queryData = (MapzenPlaceQueryData *)g_malloc0(sizeof(MapzenPlaceQueryData));
1849 if (queryData != NULL) {
1850 queryData->requestId = request_id;
1851 queryData->place_search_cb = callback;
1852 queryData->user_data = user_data;
1854 query_places(req_details->maps_key, req_details->search_string, req_details->categories, req_details->boundary, req_details->num_res, queryData, REQ_TYPE_PLACES);
1858 if (req_details->maps_key) {
1859 g_free(req_details->maps_key);
1860 req_details->maps_key = NULL;
1862 if (req_details->boundary) {
1863 g_free(req_details->boundary);
1864 req_details->boundary = NULL;
1866 if (req_details->search_string) {
1867 g_free(req_details->search_string);
1868 req_details->search_string = NULL;
1870 if (req_details->categories) {
1871 g_free(req_details->categories);
1872 req_details->categories = NULL;
1874 g_free(req_details);
1879 return MAPZEN_ERROR_NONE;
1882 int start_place_details_service(mapzen_get_details_req_s *req_details, mapzen_get_place_details_cb callback, int request_id, void *user_data)
1884 MAP_DEBUG("Inside start_place_service.");
1886 int num_running_req = get_num_running_requests();
1888 if (num_running_req >= CURL_MAX_CONNECTS) {
1889 /* Add the request to queue */
1890 add_to_place_details_list(req_details, callback, request_id, user_data);
1892 MapzenPlaceDetailsQueryData *queryData = (MapzenPlaceDetailsQueryData *)g_malloc0(sizeof(MapzenPlaceDetailsQueryData));
1894 if (queryData != NULL) {
1895 queryData->requestId = request_id;
1896 queryData->get_place_details_cb = callback;
1897 queryData->user_data = user_data;
1899 query_place_details(req_details->maps_key, req_details->uri, queryData);
1903 if (req_details->maps_key) {
1904 g_free(req_details->maps_key);
1905 req_details->maps_key = NULL;
1907 if (req_details->uri) {
1908 g_free(req_details->uri);
1909 req_details->uri = NULL;
1911 g_free(req_details);
1916 return MAPZEN_ERROR_NONE;
1919 int start_places_list_service(mapzen_search_req_s *req_details, mapzen_place_list_search_cb callback, int request_id, void *user_data)
1921 MAP_DEBUG("Inside start_places_list_service.");
1923 int num_running_req = get_num_running_requests();
1925 if (num_running_req >= CURL_MAX_CONNECTS) {
1926 /* Add the request to queue */
1927 add_to_places_list(req_details, callback, request_id, user_data);
1929 MapzenPlaceListQueryData *queryData = (MapzenPlaceListQueryData *)g_malloc0(sizeof(MapzenPlaceListQueryData));
1931 if (queryData != NULL) {
1932 queryData->requestId = request_id;
1933 queryData->place_list_search_cb = callback;
1934 queryData->user_data = user_data;
1936 query_places(req_details->maps_key, req_details->search_string, req_details->categories, req_details->boundary, req_details->num_res, queryData, REQ_TYPE_PLACES_LIST);
1940 if (req_details->maps_key) {
1941 g_free(req_details->maps_key);
1942 req_details->maps_key = NULL;
1944 if (req_details->boundary) {
1945 g_free(req_details->boundary);
1946 req_details->boundary = NULL;
1948 if (req_details->search_string) {
1949 g_free(req_details->search_string);
1950 req_details->search_string = NULL;
1952 if (req_details->categories) {
1953 g_free(req_details->categories);
1954 req_details->categories = NULL;
1956 g_free(req_details);
1961 return MAPZEN_ERROR_NONE;