Release Tizen2.0 beta
[framework/api/geocoder.git] / src / geocoder.c
index 6d37b5f..8e448b2 100644 (file)
 * Internal Implementation
 */
 
-int _convert_error_code(int code, char* func_name)
+typedef struct {
+       void *data;
+       geocoder_get_address_cb callback;
+}__addr_callback_data;
+
+typedef struct {
+       void *data;
+       geocoder_get_position_cb callback;
+}__pos_callback_data;
+
+static int __convert_error_code(int code, char* func_name)
 {
        int ret;
        char* msg = "GEOCODER_ERROR_NONE";
@@ -50,6 +60,7 @@ int _convert_error_code(int code, char* func_name)
                        msg = "GEOCODER_ERROR_NONE";
                        break;
                case LOCATION_ERROR_NETWORK_FAILED:
+               case LOCATION_ERROR_NETWORK_NOT_CONNECTED:
                        ret = GEOCODER_ERROR_NETWORK_FAILED;
                        msg = "GEOCODER_ERROR_NETWORK_FAILED";
                        break;
@@ -57,6 +68,10 @@ int _convert_error_code(int code, char* func_name)
                        ret = GEOCODER_ERROR_INVALID_PARAMETER;
                        msg = "GEOCODER_ERROR_INVALID_PARAMETER";
                        break;
+               case LOCATION_ERROR_NOT_FOUND:
+                       ret = GEOCODER_ERROR_NOT_FOUND;
+                       msg = "GEOCODER_ERROR_NOT_FOUND";
+                       break;
                case LOCATION_ERROR_NOT_ALLOWED:
                case LOCATION_ERROR_NOT_AVAILABLE:
                case LOCATION_ERROR_CONFIGURATION:
@@ -69,56 +84,54 @@ int _convert_error_code(int code, char* func_name)
        return ret;     
 }
 
-static void cb_address_from_position (LocationError error, LocationAddress *addr, LocationAccuracy *acc, gpointer userdata)
+static void __cb_address_from_position (LocationError error, LocationAddress *addr, LocationAccuracy *acc, gpointer userdata)
 {
-       geocoder_s * handle = (geocoder_s*)userdata;
-       if(handle->user_cb[_GEOCODER_CB_ADDRESS_FROM_POSITION])
+       __addr_callback_data * callback = (__addr_callback_data*)userdata;
+       if( callback == NULL || callback->callback == NULL)
        {
-               if(error != LOCATION_ERROR_NONE || addr == NULL)
-               {
-                       _convert_error_code(error,(char*)__FUNCTION__);
-                       ((geocoder_get_address_cb)handle->user_cb[_GEOCODER_CB_ADDRESS_FROM_POSITION])(NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL, handle->user_data[_GEOCODER_CB_ADDRESS_FROM_POSITION]);                  
-               }
-               else
-               {
-                        LOGI("[%s] Address - building number: %s, postal code: %s, street: %s, city: %s, district:  %s, state: %s, country code: %s", __FUNCTION__ , addr->building_number, addr->postal_code, addr->street, addr->city, addr->district, addr->state, addr->country_code);
-                       ((geocoder_get_address_cb)handle->user_cb[_GEOCODER_CB_ADDRESS_FROM_POSITION])(addr->building_number, addr->postal_code, addr->street, addr->city, addr->district, addr->state, addr->country_code, handle->user_data[_GEOCODER_CB_ADDRESS_FROM_POSITION]);
-               }
+               LOGI("[%s] callback is NULL )",__FUNCTION__);
+               return ;
+       }
+
+       if(error != LOCATION_ERROR_NONE || addr == NULL)
+       {
+               callback->callback(__convert_error_code(error,(char*)__FUNCTION__), NULL,  NULL,  NULL,  NULL,  NULL,  NULL,  NULL, callback->data);
        }
        else
        {
-               LOGI("[%s] callback is NULL )",__FUNCTION__);
+               LOGI("[%s] Address - building number: %s, postal code: %s, street: %s, city: %s, district:  %s, state: %s, country code: %s", __FUNCTION__ , addr->building_number, addr->postal_code, addr->street, addr->city, addr->district, addr->state, addr->country_code);
+               callback->callback(GEOCODER_ERROR_NONE, addr->building_number, addr->postal_code, addr->street, addr->city, addr->district, addr->state, addr->country_code, callback->data);
        }
+       free(callback);
 }
 
-static void cb_position_from_address (LocationError error, LocationPosition *pos, LocationAccuracy *acc, gpointer userdata)
+static void __cb_position_from_address (LocationError error, GList *position_list, GList *accuracy_list, gpointer userdata)
 {
-       geocoder_s * handle = (geocoder_s*)userdata;
-       if(handle->user_cb[_GEOCODER_CB_POSITION_FROM_ADDRESS])
+       __pos_callback_data * callback = (__pos_callback_data*)userdata;
+       if( callback == NULL || callback->callback == NULL)
        {
-               if(error != LOCATION_ERROR_NONE || pos == NULL)
-               {
-                       _convert_error_code(error,(char*)__FUNCTION__);
-               }
-               else
+               LOGI("[%s] callback is NULL )",__FUNCTION__);
+               return ;
+       }
+
+       if(error != LOCATION_ERROR_NONE || position_list == NULL || position_list->data ==NULL || accuracy_list==NULL )
+       {
+               callback->callback(__convert_error_code(error,(char*)__FUNCTION__), 0, 0, callback->data);
+       }
+       else
+       {
+               while(position_list)
                {
-                       int i;
-                       int temp_max = 1;
-                       for( i=0 ; i < temp_max ; i++)
+                       LocationPosition *pos = position_list->data;
+                       if ( callback->callback(GEOCODER_ERROR_NONE, pos->latitude, pos->longitude, callback->data) != TRUE )
                        {
-                                LOGI("[%s] Position[%d] - time: %d, lat: %f, long: %f, alt: %f, status: %d", __FUNCTION__, (i+1), pos->timestamp, pos->latitude, pos->longitude, pos->altitude, pos->status);
-                               if ( ((geocoder_get_position_cb)handle->user_cb[_GEOCODER_CB_POSITION_FROM_ADDRESS])(pos->latitude, pos->longitude, handle->user_data[_GEOCODER_CB_POSITION_FROM_ADDRESS]) != TRUE )
-                               {
-                                        LOGI("[%s] User quit the loop [count : %d]",  __FUNCTION__, (i+1));
-                                       break;
-                               }
+                               LOGI("[%s] User quit the loop ",  __FUNCTION__);
+                               break;
                        }
+                       position_list = g_list_next(position_list);
                }
        }
-       else
-       {
-               LOGI("[%s] callback is NULL )",__FUNCTION__);
-       }
+       free(callback);
 }
 
 /*
@@ -142,11 +155,11 @@ int       geocoder_create(geocoder_h* geocoder)
 
        memset(handle, 0 , sizeof(geocoder_s));
        
-       handle->object = location_new(LOCATION_METHOD_HYBRID);
+       handle->object = location_map_new(NULL);
        if(handle->object  == NULL)
        {
                free(handle);
-               LOGE("[%s] GEOCODER_ERROR_SERVICE_NOT_AVAILABLE(0x%08x) : fail to location_new", __FUNCTION__, GEOCODER_ERROR_SERVICE_NOT_AVAILABLE);
+               LOGE("[%s] GEOCODER_ERROR_SERVICE_NOT_AVAILABLE(0x%08x) : fail to location_map_new", __FUNCTION__, GEOCODER_ERROR_SERVICE_NOT_AVAILABLE);
                return GEOCODER_ERROR_SERVICE_NOT_AVAILABLE;
        }
 
@@ -159,10 +172,10 @@ int       geocoder_destroy(geocoder_h geocoder)
        GEOCODER_NULL_ARG_CHECK(geocoder);
        geocoder_s *handle = (geocoder_s*)geocoder;
 
-       int ret = location_free(handle->object);
+       int ret = location_map_free(handle->object);
        if(ret!=GEOCODER_ERROR_NONE)
        {
-               return _convert_error_code(ret,(char*)__FUNCTION__);
+               return __convert_error_code(ret,(char*)__FUNCTION__);
        }
        free(handle);
        return GEOCODER_ERROR_NONE;
@@ -180,94 +193,25 @@ int       geocoder_get_address_from_position(geocoder_h geocoder, double latitude, dou
        LocationPosition *pos = NULL;
        pos = location_position_new (0, latitude, longitude, 0, LOCATION_STATUS_2D_FIX);
 
-       handle->user_cb[_GEOCODER_CB_ADDRESS_FROM_POSITION] = callback;
-       handle->user_data[_GEOCODER_CB_ADDRESS_FROM_POSITION] = user_data;
-       
-       ret = location_get_address_from_position_async(handle->object, pos, cb_address_from_position, handle);
-       if( ret != LOCATION_ERROR_NONE)
+       __addr_callback_data * calldata = (__addr_callback_data *)malloc(sizeof(__addr_callback_data));
+       if( calldata == NULL)
        {
-               return _convert_error_code(ret,(char*)__FUNCTION__);
+               LOGE("[%s] GEOCODER_ERROR_OUT_OF_MEMORY(0x%08x) : fail to create callback data", __FUNCTION__, GEOCODER_ERROR_OUT_OF_MEMORY);
+               return GEOCODER_ERROR_OUT_OF_MEMORY;
        }
-       location_position_free(pos);
-       return GEOCODER_ERROR_NONE;
-}
-
-int geocoder_get_address_from_position_sync(geocoder_h geocoder, double latitude, double longitude, char **building_number, char **postal_code, char **street, char **city, char **district, char **state, char **country_code)
-{
-       GEOCODER_NULL_ARG_CHECK(geocoder);
-       GEOCODER_CHECK_CONDITION(latitude>=-90 && latitude<=90 ,GEOCODER_ERROR_INVALID_PARAMETER,"GEOCODER_ERROR_INVALID_PARAMETER");
-       GEOCODER_CHECK_CONDITION(longitude>=-180 && longitude<=180,GEOCODER_ERROR_INVALID_PARAMETER,"GEOCODER_ERROR_INVALID_PARAMETER");
+       calldata->callback = callback;
+       calldata->data = user_data;
        
-       geocoder_s *handle = (geocoder_s*)geocoder;
-       int ret;
-       LocationAddress *addr = NULL;
-       LocationPosition *pos = NULL;
-       LocationAccuracy *acc = NULL;
-
-       pos = location_position_new (0, latitude, longitude, 0, LOCATION_STATUS_2D_FIX);
-       ret = location_get_address_from_position(handle->object, pos, &addr, &acc);
+       ret = location_map_get_address_from_position_async(handle->object, pos, __cb_address_from_position, calldata);
+       location_position_free(pos);
        if( ret != LOCATION_ERROR_NONE)
        {
-               return _convert_error_code(ret,(char*)__FUNCTION__);
-       }
-
-       if(building_number)
-       {
-               *building_number = NULL;
-               if(addr->building_number)
-                       *building_number = strdup(addr->building_number);
+               free(calldata);
+               return __convert_error_code(ret,(char*)__FUNCTION__);
        }
-
-       if(postal_code)
-       {
-               *postal_code = NULL;
-               if(addr->postal_code)
-                       *postal_code = strdup(addr->postal_code);
-       }
-
-       if(street)
-       {
-               *street = NULL;
-               if(addr->street)
-                       *street = strdup(addr->street);
-       }
-
-       if(city)
-       {
-               *city = NULL;
-               if(addr->city)
-                       *city = strdup(addr->city);
-       }
-
-       if(state)
-       {
-               *state = NULL;
-               if(addr->state)
-                       *state = strdup(addr->state);
-       }
-
-       if(district)
-       {
-               *district = NULL;
-               if(addr->district)
-                       *district = strdup(addr->district);
-       }
-
-       if(country_code)
-       {
-               *country_code = NULL;
-               if(addr->country_code)
-                       *country_code = strdup(addr->country_code);
-       }
-       
-       location_address_free(addr);
-       location_position_free(pos);
-       location_accuracy_free(acc);
        return GEOCODER_ERROR_NONE;
 }
 
-
-
 int     geocoder_foreach_positions_from_address(geocoder_h geocoder,const char* address, geocoder_get_position_cb callback, void *user_data)
 {
        GEOCODER_NULL_ARG_CHECK(geocoder);
@@ -276,50 +220,22 @@ int        geocoder_foreach_positions_from_address(geocoder_h geocoder,const char* add
        geocoder_s *handle = (geocoder_s*)geocoder;
 
        char* addr_str = g_strdup(address);
-       handle->user_cb[_GEOCODER_CB_POSITION_FROM_ADDRESS] = callback;
-       handle->user_data[_GEOCODER_CB_POSITION_FROM_ADDRESS] = user_data;
 
-       int ret;        
-       ret = location_get_position_from_freeformed_address_async(handle->object, addr_str,cb_position_from_address, handle);
-       if( ret != LOCATION_ERROR_NONE)
+       __pos_callback_data * calldata = (__pos_callback_data *)malloc(sizeof(__pos_callback_data));
+       if( calldata == NULL)
        {
-               g_free(addr_str);       
-               return _convert_error_code(ret,(char*)__FUNCTION__);
+               LOGE("[%s] GEOCODER_ERROR_OUT_OF_MEMORY(0x%08x) : fail to create callback data", __FUNCTION__, GEOCODER_ERROR_OUT_OF_MEMORY);
+               return GEOCODER_ERROR_OUT_OF_MEMORY;
        }
-       return GEOCODER_ERROR_NONE;
-}
+       calldata->callback = callback;
+       calldata->data = user_data;
 
-int     geocoder_foreach_positions_from_address_sync(geocoder_h geocoder,const char* address, geocoder_get_position_cb callback, void *user_data)
-{
-       GEOCODER_NULL_ARG_CHECK(geocoder);
-       GEOCODER_NULL_ARG_CHECK(address);
-       GEOCODER_NULL_ARG_CHECK(callback);
-       geocoder_s *handle = (geocoder_s*)geocoder;
-
-       int ret;
-       LocationPosition *pos = NULL;
-       LocationAccuracy *acc = NULL;
-       char* addr_str = g_strdup(address);
-                        
-       ret = location_get_position_from_freeformed_address(handle->object, addr_str, &pos, &acc);
+       int ret;        
+       ret = location_map_get_position_from_freeformed_address_async(handle->object, addr_str,__cb_position_from_address, calldata);
+       g_free(addr_str);
        if( ret != LOCATION_ERROR_NONE)
        {
-               g_free(addr_str);       
-               return _convert_error_code(ret,(char*)__FUNCTION__);
+               return __convert_error_code(ret,(char*)__FUNCTION__);
        }
-                
-       int i;
-       int temp_max = 1;
-       for( i=0 ; i < temp_max ; i++)
-       {
-               if ( callback(pos->latitude, pos->longitude, user_data) != TRUE )
-               {
-                        LOGI("[%s] User quit the loop [count : %d]",  __FUNCTION__, (i+1));
-                       break;
-               }
-       }
-       g_free(addr_str);
-       location_position_free(pos);
-       location_accuracy_free(acc);
        return GEOCODER_ERROR_NONE;
 }