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.
17 #include "here_multirevgeocode.h"
19 HERE_PLUGIN_BEGIN_NAMESPACE
21 HereMultiRevGeocode::HereMultiRevGeocode(void* pCbFunc, void* pUserData, int nReqId)
26 m_pUserData = pUserData;
30 HereMultiRevGeocode::~HereMultiRevGeocode()
39 here_error_e HereMultiRevGeocode::PrepareQuery()
42 return HERE_ERROR_PERMISSION_DENIED;
44 m_pQuery = new (std::nothrow) MultiReverseQuery();
47 return HERE_ERROR_OUT_OF_MEMORY;
49 return HERE_ERROR_NONE;
52 static bool geocoder_coordinates_cb(int index, maps_coordinates_h coordinates, void *user_data)
54 double dLatitude = 0.0;
55 double dLongitude = 0.0;
56 GeoCoordinates hereCoord;
57 maps_coordinates_get_latitude(coordinates, &dLatitude);
58 maps_coordinates_get_longitude(coordinates, &dLongitude);
59 hereCoord = GeoCoordinates(dLatitude, dLongitude);
61 if (!HereUtils::IsValid(hereCoord))
62 return HERE_ERROR_INVALID_PARAMETER;
64 GeoCoordinateList *pList =(GeoCoordinateList *) user_data;
65 pList->push_back(hereCoord);
70 here_error_e HereMultiRevGeocode::PreparePositionList(const maps_coordinates_list_h hGeocodeList)
73 return HERE_ERROR_OUT_OF_MEMORY;
76 return HERE_ERROR_INVALID_PARAMETER;
78 GeoCoordinateList hereCoordList;
79 maps_coordinates_list_foreach(hGeocodeList, geocoder_coordinates_cb, &hereCoordList);
81 m_pQuery->SetMode(MultiReverseQuery::RM_RetrieveAddresses);
82 m_pQuery->SetGeocodeList(hereCoordList);
83 m_pQuery->SetMaxResults(1);
84 m_pQuery->SetGenParameter(8);
86 return HERE_ERROR_NONE;
89 here_error_e HereMultiRevGeocode::StartMultiReverse(maps_item_hashtable_h hPref)
92 return HERE_ERROR_OUT_OF_MEMORY;
94 m_nRestReqId = m_pQuery->Execute(*this, NULL);
96 return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_CANCELED);
99 void HereMultiRevGeocode::OnMultiReverseReply(const MultiReverseReply& Reply)
101 if (m_bCanceled || !m_pCbFunc) // ignore call back
107 int nResults = Reply.GetNumResults();
110 maps_address_list_h address_list;
111 maps_address_list_create(&address_list);
112 maps_address_h pAddr = NULL;
113 String *additionalDataValue = NULL;
115 for (size_t i = 0; i < (size_t)nResults; i++)
117 maps_error_e error = (maps_error_e)maps_address_create(&pAddr);
119 if(error == MAPS_ERROR_NONE)
121 pResult = (Result*)Reply.GetResult(i);
125 Address tmpAddr = (pResult->GetLocation()).GetAddress();
127 if(!tmpAddr.GetHouseNumber().empty())
128 maps_address_set_building_number(pAddr, tmpAddr.GetHouseNumber().c_str());
130 if(!tmpAddr.GetStreet().empty())
131 maps_address_set_street(pAddr, tmpAddr.GetStreet().c_str());
133 if(!tmpAddr.GetDistrict().empty())
134 maps_address_set_district(pAddr, tmpAddr.GetDistrict().c_str());
136 if(!tmpAddr.GetCity().empty())
137 maps_address_set_city(pAddr, tmpAddr.GetCity().c_str());
139 additionalDataValue = (String*)tmpAddr.GetAdditionalDataValue("CountyName");
140 if (additionalDataValue && !additionalDataValue->empty())
141 maps_address_set_county(pAddr, additionalDataValue->c_str());
142 else if (!tmpAddr.GetCounty().empty())
143 maps_address_set_county(pAddr, tmpAddr.GetCounty().c_str());
145 additionalDataValue = (String*)tmpAddr.GetAdditionalDataValue("StateName");
146 if (additionalDataValue && !additionalDataValue->empty())
147 maps_address_set_state(pAddr, additionalDataValue->c_str());
148 else if (!tmpAddr.GetState().empty())
149 maps_address_set_state(pAddr, tmpAddr.GetState().c_str());
151 additionalDataValue = (String*)tmpAddr.GetAdditionalDataValue("CountryName");
152 if (additionalDataValue && !additionalDataValue->empty())
153 maps_address_set_country(pAddr, additionalDataValue->c_str());
154 else if (!tmpAddr.GetCountry().empty())
155 maps_address_set_country(pAddr, tmpAddr.GetCountry().c_str());
157 if(!tmpAddr.GetCountry().empty())
158 maps_address_set_country_code(pAddr, tmpAddr.GetCountry().c_str());
160 if(!tmpAddr.GetPostalCode().empty())
161 maps_address_set_postal_code(pAddr, tmpAddr.GetPostalCode().c_str());
163 if(!tmpAddr.GetLabel().empty())
164 maps_address_set_freetext(pAddr, tmpAddr.GetLabel().c_str());
167 maps_address_list_append(address_list, pAddr);
170 if (m_bCanceled || !m_pCbFunc)
172 maps_address_list_destroy(address_list);
174 else if (nResults <= 0)
176 ((maps_service_multi_reverse_geocode_cb)m_pCbFunc)(MAPS_ERROR_NOT_FOUND, m_nReqId, 0, NULL, m_pUserData);
180 ((maps_service_multi_reverse_geocode_cb)m_pCbFunc)(MAPS_ERROR_NONE, m_nReqId, nResults, address_list, m_pUserData);
186 void HereMultiRevGeocode::OnMultiReverseFailure(const MultiReverseReply& Reply)
188 if (!m_bCanceled && m_pCbFunc)
189 ((maps_service_multi_reverse_geocode_cb)m_pCbFunc)((maps_error_e)GetErrorCode(Reply), m_nReqId, 0, NULL, m_pUserData);
193 HERE_PLUGIN_END_NAMESPACE