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 MapzenRouteResponseData *routeData = (MapzenRouteResponseData *) (ptr);
1401 mapzen_route_resp_s *route_info = routeData->routeResponse;
1403 GList *maneuver_data = NULL;
1404 maneuver_data = g_list_first(route_info->maneuvers);
1405 while (maneuver_data) {
1406 mapzen_route_maneuver *maneuver = (mapzen_route_maneuver *) maneuver_data->data;
1408 if (maneuver->instruction) {
1409 g_free(maneuver->instruction);
1410 maneuver->instruction = NULL;
1412 if (maneuver->formatted_time) {
1413 g_free(maneuver->formatted_time);
1414 maneuver->formatted_time = NULL;
1416 if (maneuver->direction_name) {
1417 g_free(maneuver->direction_name);
1418 maneuver->direction_name = NULL;
1420 if (maneuver->street_name) {
1421 g_free(maneuver->street_name);
1422 maneuver->street_name = NULL;
1425 route_info->maneuvers = g_list_remove(route_info->maneuvers, (gpointer)maneuver);
1430 /* Fetching the next item from Maneuver/Segment list */
1431 maneuver_data = g_list_first(route_info->maneuvers);
1433 g_list_free(route_info->maneuvers);
1434 route_info->maneuvers = NULL;
1436 GList *shapePoints = NULL;
1437 shapePoints = g_list_first(route_info->shapePoints);
1438 while (shapePoints) {
1439 coords_s *data = (coords_s *) shapePoints->data;
1441 route_info->shapePoints = g_list_remove(route_info->shapePoints, (gpointer)data);
1446 shapePoints = g_list_first(route_info->shapePoints);
1448 g_list_free(route_info->shapePoints);
1449 route_info->shapePoints = NULL;
1451 if (route_info->formatted_time) {
1452 g_free(route_info->formatted_time);
1453 route_info->formatted_time = NULL;
1458 if (routeData->user_data) {
1459 g_free(routeData->user_data);
1460 routeData->user_data = NULL;
1465 int mapzen_init_queue()
1467 pthread_mutex_init(&__requestLock, NULL);
1469 /* Queue initialize */
1470 responseQueue = g_async_queue_new();
1472 /* Initialise Curl Service */
1473 int ret = init_curl();
1475 if (ret != MAPZEN_ERROR_NONE)
1476 return MAPZEN_ERROR_UNKNOWN;
1478 pthread_mutex_lock(&__requestLock);
1480 pthread_mutex_unlock(&__requestLock);
1481 reqCancelList = NULL;
1482 __ResponseQueueLen = 0;
1483 __response_timer_running = false;
1485 return MAPZEN_ERROR_NONE;
1488 int mapzen_deinit_queue()
1492 g_list_free(reqCancelList);
1493 reqCancelList = NULL;
1495 pthread_mutex_destroy(&__requestLock);
1497 /* Free the queue */
1498 if (responseQueue) {
1499 g_async_queue_ref(responseQueue);
1500 __ResponseQueueLen = g_async_queue_length(responseQueue);
1501 MAP_DEBUG("Queue len : %d", __ResponseQueueLen);
1503 while (__ResponseQueueLen > 0) {
1504 gpointer data = g_async_queue_try_pop(responseQueue);
1506 __ResponseQueueLen = g_async_queue_length(responseQueue);
1510 MapzenQueueData *response = (MapzenQueueData *) data;
1512 switch (response->type) {
1513 case RESP_TYPE_GEOCODE:
1515 MapzenGeocodeResponseData *geocodeData = (MapzenGeocodeResponseData *) (response->data);
1517 __free_geocode_response(geocodeData);
1519 g_free(geocodeData);
1524 case RESP_TYPE_REVGEOCODE:
1526 MapzenRevGeocodeResponseData *revGeocodeData = (MapzenRevGeocodeResponseData *) (response->data);
1527 if (revGeocodeData) {
1528 __free_revgeocode_response(revGeocodeData);
1530 g_free(revGeocodeData);
1531 revGeocodeData = NULL;
1535 case RESP_TYPE_PLACES:
1537 MapzenPlaceResponseData *placeData = (MapzenPlaceResponseData *) (response->data);
1538 if (placeData != NULL) {
1539 __free_place_response(placeData);
1546 case RESP_TYPE_PLACES_DETAILS:
1548 MapzenPlaceDetailsResponseData *placeData = (MapzenPlaceDetailsResponseData *) (response->data);
1549 if (placeData != NULL) {
1550 __free_place_details_response(placeData);
1557 case RESP_TYPE_PLACES_LIST:
1559 MapzenPlaceListResponseData *placeData = (MapzenPlaceListResponseData *) (response->data);
1560 if (placeData != NULL) {
1561 __free_place_list_response(placeData);
1568 case RESP_TYPE_ROUTE:
1570 MapzenRouteResponseData *routeData = (MapzenRouteResponseData *) (response->data);
1571 if (routeData != NULL) {
1572 __free_route_response(routeData);
1583 __ResponseQueueLen = g_async_queue_length(responseQueue);
1590 g_async_queue_unref(responseQueue);
1591 responseQueue = NULL;
1594 return MAPZEN_ERROR_NONE;
1597 int mapzen_push_to_queue(mapzen_resp_type type, gpointer data)
1599 MAP_DEBUG("Pushing to Queue....");
1601 MapzenQueueData *queueData = (MapzenQueueData *)g_malloc0(sizeof(MapzenQueueData));
1602 if (!queueData) return MAPZEN_ERROR_OUT_OF_MEMORY;
1604 queueData->type = type;
1605 queueData->data = data;
1607 g_async_queue_ref(responseQueue);
1608 g_async_queue_push(responseQueue, (gpointer)queueData);
1609 g_async_queue_unref(responseQueue);
1611 if (!__response_timer_running) {
1612 MAP_DEBUG(">>>>>>>>>>>>>>>>>>>>>>> TRIGGER RESPONSE TIMER <<<<<<<<<<<<<<<<<<<<<<<<<");
1613 g_timeout_add_seconds(1, __timeout_cb, NULL); /* timeout : 1 sec */
1615 __ResponseQueueLen = g_async_queue_length(responseQueue);
1616 MAP_DEBUG(">>>>>>>>>>>>>>>>>> Timer already running. Response Queue Len [%d] <<<<<<<<<<<<<<<<<", __ResponseQueueLen);
1619 return MAPZEN_ERROR_NONE;
1622 int start_geocode_service(mapzen_geocode_req_s *req_details, mapzen_geocode_cb callback, int request_id, void *user_data)
1624 int num_running_req = get_num_running_requests();
1626 if (num_running_req >= CURL_MAX_CONNECTS) {
1627 /* Add the request to queue */
1628 add_to_geocode_list(req_details, callback, request_id, user_data);
1630 MapzenGeocodeQueryData *queryData = (MapzenGeocodeQueryData *)g_malloc0(sizeof(MapzenGeocodeQueryData));
1632 if (queryData != NULL) {
1633 queryData->requestId = request_id;
1634 queryData->geocode_cb = callback;
1635 queryData->user_data = user_data;
1637 if (req_details->boundary != NULL) {
1638 if (req_details->boundary->type == MAPZEN_BOUNDARY_RECT) {
1639 MAP_DEBUG("TOP LEFT >>><<< LATITUDE : %f, LONGITUDE : %f", req_details->boundary->rect.top_left.latitude, req_details->boundary->rect.top_left.longitude);
1640 MAP_DEBUG("BOTTOM RIGHT >>><<< LATITUDE : %f, LONGITUDE : %f", req_details->boundary->rect.bottom_right.latitude, req_details->boundary->rect.bottom_right.longitude);
1642 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);
1644 } else if (req_details->boundary->type == MAPZEN_BOUNDARY_CIRCLE) {
1646 coords_s circle = req_details->boundary->circle.center;
1647 MAP_DEBUG("User input LATITUDE : %f, LONGITUDE : %f", circle.latitude, circle.longitude);
1648 query_geocode_within_circle(req_details->maps_key, req_details->address, circle, req_details->boundary->circle.radius, req_details->num_res, queryData);
1651 query_geocode(req_details->maps_key, req_details->address, req_details->num_res, queryData);
1655 MAP_DEBUG("BOUNDARY is NULL.. NORMAL GEOCODE QUERY WITHOUT BOUNDS");
1657 query_geocode(req_details->maps_key, req_details->address, req_details->num_res, queryData);
1662 if (req_details->address) {
1663 g_free(req_details->address);
1664 req_details->address = NULL;
1666 if (req_details->maps_key) {
1667 g_free(req_details->maps_key);
1668 req_details->maps_key = NULL;
1670 if (req_details->boundary) {
1671 g_free(req_details->boundary);
1672 req_details->boundary = NULL;
1674 g_free(req_details);
1679 return MAPZEN_ERROR_NONE;
1682 int start_reversegeocode_service(mapzen_revgeocode_req_s *req_details, mapzen_reverse_geocode_cb callback, int request_id, void *user_data)
1684 int num_running_req = get_num_running_requests();
1686 if (num_running_req >= CURL_MAX_CONNECTS) {
1687 /* Add the request to queue */
1688 add_to_revgeocode_list(req_details, callback, request_id, user_data);
1690 MapzenRevGeocodeQueryData *queryData = (MapzenRevGeocodeQueryData *)g_malloc0(sizeof(MapzenRevGeocodeQueryData));
1692 if (queryData != NULL) {
1693 queryData->requestId = request_id;
1694 queryData->reverse_geocode_cb = callback;
1695 queryData->user_data = user_data;
1697 coords_s coords = req_details->coordinates;
1699 query_revgeocode(req_details->maps_key, coords.latitude, coords.longitude, queryData);
1703 if (req_details->maps_key) {
1704 g_free(req_details->maps_key);
1705 req_details->maps_key = NULL;
1707 g_free(req_details);
1712 return MAPZEN_ERROR_NONE;
1715 int start_route_service(mapzen_route_req_s *req_details, mapzen_route_cb callback, int request_id, void *user_data)
1717 int num_running_req = get_num_running_requests();
1719 if (num_running_req >= CURL_MAX_CONNECTS) {
1720 /* Add the request to queue */
1721 add_to_route_list(req_details, callback, request_id, user_data);
1723 MapzenRouteQueryData *queryData = (MapzenRouteQueryData *)g_malloc0(sizeof(MapzenRouteQueryData));
1725 if (queryData != NULL) {
1726 queryData->requestId = request_id;
1727 queryData->route_cb = callback;
1728 queryData->origin = req_details->from;
1729 queryData->destination = req_details->to;
1730 queryData->unit = req_details->unit;
1731 queryData->user_data = user_data;
1733 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);
1737 if (req_details->maps_key) {
1738 g_free(req_details->maps_key);
1739 req_details->maps_key = NULL;
1741 if (req_details->way_points) {
1742 if (g_list_length(req_details->way_points) > 0) {
1744 list = g_list_first(req_details->way_points);
1746 coords_s *data = (coords_s *)list->data;
1748 req_details->way_points = g_list_remove(req_details->way_points, (gpointer)data);
1753 list = g_list_first(req_details->way_points);
1756 g_list_free(req_details->way_points);
1757 req_details->way_points = NULL;
1759 g_free(req_details);
1764 return MAPZEN_ERROR_NONE;
1767 int start_place_service(mapzen_search_req_s *req_details, mapzen_place_search_cb callback, int request_id, void *user_data)
1769 MAP_DEBUG("Inside start_place_service.");
1771 int num_running_req = get_num_running_requests();
1773 if (num_running_req >= CURL_MAX_CONNECTS) {
1774 /* Add the request to queue */
1775 add_to_place_list(req_details, callback, request_id, user_data);
1777 MapzenPlaceQueryData *queryData = (MapzenPlaceQueryData *)g_malloc0(sizeof(MapzenPlaceQueryData));
1779 if (queryData != NULL) {
1780 queryData->requestId = request_id;
1781 queryData->place_search_cb = callback;
1782 queryData->user_data = user_data;
1784 query_places(req_details->maps_key, req_details->search_string, req_details->categories, req_details->boundary, req_details->num_res, queryData, REQ_TYPE_PLACES);
1788 if (req_details->maps_key) {
1789 g_free(req_details->maps_key);
1790 req_details->maps_key = NULL;
1792 if (req_details->boundary) {
1793 g_free(req_details->boundary);
1794 req_details->boundary = NULL;
1796 if (req_details->search_string) {
1797 g_free(req_details->search_string);
1798 req_details->search_string = NULL;
1800 if (req_details->categories) {
1801 g_free(req_details->categories);
1802 req_details->categories = NULL;
1804 g_free(req_details);
1809 return MAPZEN_ERROR_NONE;
1812 int start_place_details_service(mapzen_get_details_req_s *req_details, mapzen_get_place_details_cb callback, int request_id, void *user_data)
1814 MAP_DEBUG("Inside start_place_service.");
1816 int num_running_req = get_num_running_requests();
1818 if (num_running_req >= CURL_MAX_CONNECTS) {
1819 /* Add the request to queue */
1820 add_to_place_details_list(req_details, callback, request_id, user_data);
1822 MapzenPlaceDetailsQueryData *queryData = (MapzenPlaceDetailsQueryData *)g_malloc0(sizeof(MapzenPlaceDetailsQueryData));
1824 if (queryData != NULL) {
1825 queryData->requestId = request_id;
1826 queryData->get_place_details_cb = callback;
1827 queryData->user_data = user_data;
1829 query_place_details(req_details->maps_key, req_details->uri, queryData);
1833 if (req_details->maps_key) {
1834 g_free(req_details->maps_key);
1835 req_details->maps_key = NULL;
1837 if (req_details->uri) {
1838 g_free(req_details->uri);
1839 req_details->uri = NULL;
1841 g_free(req_details);
1846 return MAPZEN_ERROR_NONE;
1849 int start_places_list_service(mapzen_search_req_s *req_details, mapzen_place_list_search_cb callback, int request_id, void *user_data)
1851 MAP_DEBUG("Inside start_places_list_service.");
1853 int num_running_req = get_num_running_requests();
1855 if (num_running_req >= CURL_MAX_CONNECTS) {
1856 /* Add the request to queue */
1857 add_to_places_list(req_details, callback, request_id, user_data);
1859 MapzenPlaceListQueryData *queryData = (MapzenPlaceListQueryData *)g_malloc0(sizeof(MapzenPlaceListQueryData));
1861 if (queryData != NULL) {
1862 queryData->requestId = request_id;
1863 queryData->place_list_search_cb = callback;
1864 queryData->user_data = user_data;
1866 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);
1870 if (req_details->maps_key) {
1871 g_free(req_details->maps_key);
1872 req_details->maps_key = NULL;
1874 if (req_details->boundary) {
1875 g_free(req_details->boundary);
1876 req_details->boundary = NULL;
1878 if (req_details->search_string) {
1879 g_free(req_details->search_string);
1880 req_details->search_string = NULL;
1882 if (req_details->categories) {
1883 g_free(req_details->categories);
1884 req_details->categories = NULL;
1886 g_free(req_details);
1891 return MAPZEN_ERROR_NONE;