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()
38 here_error_e HereMultiRevGeocode::PrepareQuery()
41 return HERE_ERROR_PERMISSION_DENIED;
43 m_pQuery = new (std::nothrow) MultiReverseQuery();
46 return HERE_ERROR_OUT_OF_MEMORY;
48 return HERE_ERROR_NONE;
51 static bool geocoder_coordinates_cb(int index, maps_coordinates_h coordinates, void *user_data)
53 double dLatitude = 0.0;
54 double dLongitude = 0.0;
55 GeoCoordinates hereCoord;
56 maps_coordinates_get_latitude(coordinates, &dLatitude);
57 maps_coordinates_get_longitude(coordinates, &dLongitude);
58 hereCoord = GeoCoordinates(dLatitude, dLongitude);
60 if (!HereUtils::IsValid(hereCoord))
63 GeoCoordinateList *pList =(GeoCoordinateList *) user_data;
64 pList->push_back(hereCoord);
69 here_error_e HereMultiRevGeocode::PreparePositionList(const maps_coordinates_list_h hGeocodeList)
72 return HERE_ERROR_OUT_OF_MEMORY;
75 return HERE_ERROR_INVALID_PARAMETER;
77 GeoCoordinateList hereCoordList;
78 maps_coordinates_list_foreach(hGeocodeList, geocoder_coordinates_cb, &hereCoordList);
80 m_pQuery->SetMode(MultiReverseQuery::RM_RetrieveAddresses);
81 m_pQuery->SetGeocodeList(hereCoordList);
82 m_pQuery->SetMaxResults(1);
83 m_pQuery->SetGenParameter(8);
85 return HERE_ERROR_NONE;
88 here_error_e HereMultiRevGeocode::StartMultiReverse(maps_item_hashtable_h hPref)
91 return HERE_ERROR_OUT_OF_MEMORY;
93 m_nRestReqId = m_pQuery->Execute(*this, NULL);
95 return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_CANCELED);
98 void HereMultiRevGeocode::OnMultiReverseReply(const MultiReverseReply& Reply)
100 if (m_bCanceled || !m_pCbFunc) // ignore call back
106 int nResults = Reply.GetNumResults();
109 maps_address_list_h address_list = NULL;
110 maps_address_list_create(&address_list);
111 maps_address_h pAddr = NULL;
112 String *additionalDataValue = NULL;
114 for (size_t i = 0; i < (size_t)nResults; i++)
116 if ((pResult = (Result*)Reply.GetResult(i)) == NULL) continue;
117 if (maps_address_create(&pAddr) != MAPS_ERROR_NONE) continue;
120 Address tmpAddr = (pResult->GetLocation()).GetAddress();
122 if(!tmpAddr.GetHouseNumber().empty())
123 maps_address_set_building_number(pAddr, tmpAddr.GetHouseNumber().c_str());
125 if(!tmpAddr.GetStreet().empty())
126 maps_address_set_street(pAddr, tmpAddr.GetStreet().c_str());
128 if(!tmpAddr.GetDistrict().empty())
129 maps_address_set_district(pAddr, tmpAddr.GetDistrict().c_str());
131 if(!tmpAddr.GetCity().empty())
132 maps_address_set_city(pAddr, tmpAddr.GetCity().c_str());
134 additionalDataValue = (String*)tmpAddr.GetAdditionalDataValue("CountyName");
135 if (additionalDataValue && !additionalDataValue->empty())
136 maps_address_set_county(pAddr, additionalDataValue->c_str());
137 else if (!tmpAddr.GetCounty().empty())
138 maps_address_set_county(pAddr, tmpAddr.GetCounty().c_str());
140 additionalDataValue = (String*)tmpAddr.GetAdditionalDataValue("StateName");
141 if (additionalDataValue && !additionalDataValue->empty())
142 maps_address_set_state(pAddr, additionalDataValue->c_str());
143 else if (!tmpAddr.GetState().empty())
144 maps_address_set_state(pAddr, tmpAddr.GetState().c_str());
146 additionalDataValue = (String*)tmpAddr.GetAdditionalDataValue("CountryName");
147 if (additionalDataValue && !additionalDataValue->empty())
148 maps_address_set_country(pAddr, additionalDataValue->c_str());
149 else if (!tmpAddr.GetCountry().empty())
150 maps_address_set_country(pAddr, tmpAddr.GetCountry().c_str());
152 if(!tmpAddr.GetCountry().empty())
153 maps_address_set_country_code(pAddr, tmpAddr.GetCountry().c_str());
155 if(!tmpAddr.GetPostalCode().empty())
156 maps_address_set_postal_code(pAddr, tmpAddr.GetPostalCode().c_str());
158 if(!tmpAddr.GetLabel().empty())
159 maps_address_set_freetext(pAddr, tmpAddr.GetLabel().c_str());
161 if (maps_address_list_append(address_list, pAddr) != MAPS_ERROR_NONE)
162 maps_address_destroy(pAddr);
166 int address_list_length = 0;
167 maps_address_list_get_length(address_list, &address_list_length);
169 if (m_bCanceled || !m_pCbFunc) {
170 maps_address_list_destroy(address_list);
171 } else if (address_list_length <= 0) {
172 maps_address_list_destroy(address_list);
173 ((maps_service_multi_reverse_geocode_cb)m_pCbFunc)(MAPS_ERROR_NOT_FOUND, m_nReqId, 0, NULL, m_pUserData);
175 ((maps_service_multi_reverse_geocode_cb)m_pCbFunc)(MAPS_ERROR_NONE, m_nReqId, address_list_length, address_list, m_pUserData);
181 void HereMultiRevGeocode::OnMultiReverseFailure(const MultiReverseReply& Reply)
183 if (!m_bCanceled && m_pCbFunc)
184 ((maps_service_multi_reverse_geocode_cb)m_pCbFunc)((maps_error_e)GetErrorCode(Reply), m_nReqId, 0, NULL, m_pUserData);
188 HERE_PLUGIN_END_NAMESPACE