if (!HereManager::GetHandler())
return HERE_ERROR_INVALID_OPERATION;
- here_error_e error = HereManager::GetHandler()->SetCredentials(szKey);
-
- return error;
+ return HereManager::GetHandler()->SetCredentials(szKey);
}
int HerePluginGetProviderKey(char** szKey)
if (!HereManager::GetHandler())
return HERE_ERROR_INVALID_OPERATION;
- here_error_e error = HereManager::GetHandler()->GetCredentials(szKey);
-
- return error;
+ return HereManager::GetHandler()->GetCredentials(szKey);
}
int HerePluginSetPreference(maps_preference_h hPref)
if (!HereManager::GetHandler())
return HERE_ERROR_INVALID_OPERATION;
- here_error_e error = HereManager::GetHandler()->SetPreference(hPref);
-
- return error;
+ return HereManager::GetHandler()->SetPreference(hPref);
}
int HerePluginGetPreference(maps_preference_h *hPref)
if (!HereManager::GetHandler())
return HERE_ERROR_INVALID_OPERATION;
- here_error_e error = HereManager::GetHandler()->GetPreference(hPref);
-
- return error;
+ return HereManager::GetHandler()->GetPreference(hPref);
}
int HerePluginGeocode(const char* szAddr,
error = pPlace->PrepareDiscoveryFilter(hFilter);
if (error != HERE_ERROR_NONE) break;
- error = pPlace->StartDiscoveryPlaceByArea(hArea);
+ error = pPlace->StartDiscoveryPlace(hArea);
} while(0);
/* finishing task */
error = pPlace->PrepareDiscoveryFilter(hFilter);
if (error != HERE_ERROR_NONE) break;
- error = pPlace->StartDiscoveryPlaceByAddress(szAddr, hArea);
+ error = pPlace->StartDiscoveryPlace(hArea, szAddr);
+ } while(0);
+
+ /* finishing task */
+ if(error != HERE_ERROR_NONE)
+ pPlace->TerminateService();
+
+ return error;
+}
+
+int HerePluginSearchPlaceList(maps_area_h hArea, maps_item_hashtable_h hPref,
+ maps_place_filter_h hFilter, maps_service_search_place_list_cb pCbFunc, void *pUserData, int *nReqId)
+{
+ /* checking parmaters */
+ if (!hFilter || !pCbFunc || !nReqId)
+ return HERE_ERROR_INVALID_PARAMETER;
+
+ if (!hArea || !HereUtils::IsValid(*(maps_area_s*)hArea))
+ return HERE_ERROR_INVALID_PARAMETER;
+
+ if (!HereManager::GetHandler())
+ return HERE_ERROR_INVALID_OPERATION;
+
+ /* creating instance */
+ HerePlace *pPlace =
+ (HerePlace*)(HereManager::GetHandler()->CreateInstance(HereManager::HERE_SVC_PLACE,
+ (void*)pCbFunc, pUserData, nReqId));
+
+ if(!pPlace)
+ return HERE_ERROR_SERVICE_NOT_AVAILABLE;
+
+ /* sending request */
+ here_error_e error = HERE_ERROR_NONE;
+
+ do {
+ error = pPlace->PrepareDiscoveryQuery();
+ if (error != HERE_ERROR_NONE) break;
+
+ error = pPlace->PrepareDiscoveryPreference(hPref);
+ if (error != HERE_ERROR_NONE) break;
+
+ error = pPlace->PrepareDiscoveryFilter(hFilter);
+ if (error != HERE_ERROR_NONE) break;
+
+ error = pPlace->StartDiscoveryPlaceList(hArea);
} while(0);
/* finishing task */
}
int HerePluginSearchPlaceDetails(const char* szUrl,
- maps_item_hashtable_h hPref, maps_service_search_place_cb pCbFunc,
- void *pUserData, int *nReqId)
+ maps_service_get_place_details_cb pCbFunc, void *pUserData, int *nReqId)
{
/* checking parmaters */
if (!szUrl || (szUrl && *szUrl == '\0') || !pCbFunc || !nReqId)
error = pPlace->PreparePlaceDetailsQuery();
if (error != HERE_ERROR_NONE) break;
- error = pPlace->PreparePlaceDetailsPreference(hPref);
- if (error != HERE_ERROR_NONE) break;
-
error = pPlace->StartPlaceDetails(szUrl);
} while(0);
m_nReplyIdx = 0;
m_bReplyFlushed = false;
m_szSortBy = NULL;
+ m_bPlaceDetails = false;
m_bPlaceDetailsInternal = false;
+ m_bReplyWithList = false;
+ m_eDistanceUnit = MAPS_DISTANCE_UNIT_M;
}
HerePlace::~HerePlace()
if (ret == MAPS_ERROR_NONE)
m_pDiscoveryQuery->SetMaxResults((size_t)nMaxResults);
+ maps_distance_unit_e eUnit;
+ ret = maps_preference_get_distance_unit(hPref, &eUnit);
+ if (ret == MAPS_ERROR_NONE)
+ m_eDistanceUnit = eUnit;
+
char *szSortBy;
ret = maps_preference_get(hPref, MAPS_PLACE_FILTER_SORT_BY, &szSortBy);
if (ret == MAPS_ERROR_NONE)
ret = maps_place_category_get_id(mapsCate, &szId);
if (ret == MAPS_ERROR_NONE && szId && *szId)
- {
hereCate.SetCategoryId(CategoryId(szId));
- hereCateList.push_back(hereCate);
- m_pDiscoveryQuery->SetCategoriesFilter(hereCateList);
+ else if (hereCate.GetTitle().size() > 0)
+ {
+ hereCate.SetCategoryId(CategoryId(hereCate.GetTitle()));
+ hereCate.SetTitle("");
}
g_free(szId);
+ hereCateList.push_back(hereCate);
+ m_pDiscoveryQuery->SetCategoriesFilter(hereCateList);
maps_place_category_destroy(mapsCate);
}
m_pDiscoveryQuery->SetSearchText(szName);
g_free(szName);
+ char *szKeyword = NULL;
+ ret = maps_place_filter_get_keyword(hFilter, &szKeyword);
+ if (ret == MAPS_ERROR_NONE && szKeyword && *szKeyword)
+ {
+ String szSearchText = m_pDiscoveryQuery->GetSearchText();
+ if (szSearchText.size() > 0) szSearchText += " ";
+ szSearchText += szKeyword;
+ m_pDiscoveryQuery->SetSearchText(szSearchText);
+ }
+ g_free(szKeyword);
+
+ char *szAddress = NULL;
+ ret = maps_place_filter_get_place_address(hFilter, &szAddress);
+ if (ret == MAPS_ERROR_NONE && szAddress && *szAddress)
+ {
+ String szSearchText = szAddress;
+ if (m_pDiscoveryQuery->GetSearchText().size() > 0)
+ {
+ szSearchText += " " + m_pDiscoveryQuery->GetSearchText();
+ }
+ m_pDiscoveryQuery->SetSearchText(szSearchText);
+ }
+ g_free(szAddress);
+
return HERE_ERROR_NONE;
}
here_error_e HerePlace::StartDiscoveryPlace(maps_coordinates_h hCoord, int nDistance)
{
- if (!m_pDiscoveryQuery)
- return HERE_ERROR_OUT_OF_MEMORY;
+ if (!hCoord || nDistance < 0)
+ return HERE_ERROR_INVALID_PARAMETER;
+
+ maps_area_h area = NULL;
+ maps_area_create_circle(hCoord, nDistance, &area);
+ here_error_e error = StartDiscoveryPlace(area);
+ maps_area_destroy(area);
+ return error;
+}
- if (!hCoord)
+here_error_e HerePlace::StartDiscoveryPlace(maps_area_h hArea, const char *szAddr)
+{
+ if (!hArea)
return HERE_ERROR_INVALID_PARAMETER;
+ if (!m_pDiscoveryQuery)
+ return HERE_ERROR_OUT_OF_MEMORY;
- if (m_pDiscoveryQuery->GetSearchText().empty())
- {
- m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_EXPLORE);
- double dLat, dLon;
- maps_coordinates_get_latitude(hCoord, &dLat);
- maps_coordinates_get_longitude(hCoord, &dLon);
- GeoCoordinates geoCoord(dLat, dLon);
- if (nDistance > 0)
- {
- GeoBoundingCircle geoCircle(geoCoord, nDistance);
- m_pDiscoveryQuery->SetArea(geoCircle);
- }
- else if (nDistance == 0)
- {
- m_pDiscoveryQuery->SetProximity(geoCoord);
- }
- else
- return HERE_ERROR_INVALID_PARAMETER;
+ typedef enum {
+ PLACE_CMD_TEXT,
+ PLACE_CMD_CENTER,
+ PLACE_CMD_AREA,
+ } PlaceCmdType;
+
+ PlaceCmdType cmdType;
+ maps_area_s *pArea = (maps_area_s*)hArea;
+ GeoCoordinates geoCoord;
+ GeoBoundingArea *geoArea = NULL;
+ GeoBoundingBox geoBox;
+ GeoBoundingCircle geoCircle;
+
+ /* Merge search text with other search text being in preference */
+ String szSearchText = (szAddr ? szAddr : "");
+ if (m_pDiscoveryQuery->GetSearchText().size() > 0)
+ {
+ if (szSearchText.size() > 0) szSearchText += " ";
+ szSearchText += m_pDiscoveryQuery->GetSearchText();
+ }
+ m_pDiscoveryQuery->SetSearchText(szSearchText);
- m_nRestReqId = m_pDiscoveryQuery->Execute(*this, NULL);
- return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION);
+ /* Decide command type */
+ if (!szSearchText.empty())
+ {
+ cmdType = PLACE_CMD_TEXT;
+ }
+ else if (pArea->type == MAPS_AREA_CIRCLE && pArea->circle.radius == 0)
+ {
+ cmdType = PLACE_CMD_CENTER;
}
else
{
- here_error_e error;
- maps_area_h hArea = NULL;
- maps_area_create_circle(hCoord, nDistance, &hArea);
- error = StartDiscoveryPlaceByAddress(m_pDiscoveryQuery->GetSearchText().data(), hArea);
- maps_area_destroy(hArea);
- return error;
+ cmdType = PLACE_CMD_AREA;
}
-}
-
-here_error_e HerePlace::StartDiscoveryPlaceByArea(maps_area_h hArea)
-{
- if (!m_pDiscoveryQuery)
- return HERE_ERROR_OUT_OF_MEMORY;
- if (!hArea)
- return HERE_ERROR_INVALID_PARAMETER;
-
- if (m_pDiscoveryQuery->GetSearchText().empty())
+ /* Get proximity with area */
+ if (cmdType == PLACE_CMD_TEXT || cmdType == PLACE_CMD_CENTER)
{
- m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_EXPLORE);
-
- maps_area_s *pArea = (maps_area_s*)hArea;
if (pArea->type == MAPS_AREA_RECTANGLE)
{
- GeoBoundingBox box(pArea->rect.top_left.longitude, pArea->rect.bottom_right.longitude,
- pArea->rect.bottom_right.latitude, pArea->rect.top_left.latitude);
- m_pDiscoveryQuery->SetArea(box);
+ double dLat1 = pArea->rect.top_left.latitude;
+ double dLng1 = pArea->rect.top_left.longitude;
+ double dLat2 = pArea->rect.bottom_right.latitude;
+ double dLng2 = pArea->rect.bottom_right.longitude;
+ double dLat = (dLat1 + dLat2) / 2;
+ double dLng = (dLng1 + dLng2) / 2;
+
+ geoCoord.SetLatitude(dLat);
+ geoCoord.SetLongitude(dLng);
}
- else if (pArea->type == MAPS_AREA_CIRCLE)
+ else if(pArea->type == MAPS_AREA_CIRCLE)
{
- GeoCoordinates coord(pArea->circle.center.latitude, pArea->circle.center.longitude);
- GeoBoundingCircle circle(coord, pArea->circle.radius);
- m_pDiscoveryQuery->SetArea(circle);
+ double dLat = pArea->circle.center.latitude;
+ double dLng = pArea->circle.center.longitude;
+
+ geoCoord.SetLatitude(dLat);
+ geoCoord.SetLongitude(dLng);
}
else
return HERE_ERROR_INVALID_PARAMETER;
-
-
- m_nRestReqId = m_pDiscoveryQuery->Execute(*this, NULL);
-
- return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION);
}
- else
+ else if (cmdType == PLACE_CMD_AREA)
{
- return StartDiscoveryPlaceByAddress(m_pDiscoveryQuery->GetSearchText().data(), hArea);
+ if (pArea->type == MAPS_AREA_RECTANGLE)
+ {
+ HereUtils::Convert(hArea, geoBox);
+ geoArea = &geoBox;
+ }
+ else if (pArea->type == MAPS_AREA_CIRCLE)
+ {
+ HereUtils::Convert(hArea, geoCircle);
+ geoArea = &geoCircle;
+ }
+ else
+ return HERE_ERROR_INVALID_PARAMETER;
}
-}
-
-here_error_e HerePlace::StartDiscoveryPlaceByAddress(const char *szAddr, maps_area_h hArea)
-{
- if (!m_pDiscoveryQuery)
- return HERE_ERROR_OUT_OF_MEMORY;
- if (!szAddr || (szAddr && strlen(szAddr) <= 0) || !hArea)
- return HERE_ERROR_INVALID_PARAMETER;
-
- m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_SEARCH);
-
- String szSearchText = szAddr;
- if (m_pDiscoveryQuery->GetSearchText().size() > 0 &&
- szSearchText != m_pDiscoveryQuery->GetSearchText())
+ /* Set properties */
+ if (cmdType == PLACE_CMD_TEXT)
{
- szSearchText += " " + m_pDiscoveryQuery->GetSearchText();
+ m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_SEARCH);
+ m_pDiscoveryQuery->SetProximity(geoCoord);
}
- m_pDiscoveryQuery->SetSearchText(szSearchText);
-
- maps_area_s *pArea = (maps_area_s*)hArea;
- if (pArea->type == MAPS_AREA_RECTANGLE)
+ else if (cmdType == PLACE_CMD_CENTER)
{
- double dLat1 = pArea->rect.top_left.latitude;
- double dLng1 = pArea->rect.top_left.longitude;
- double dLat2 = pArea->rect.bottom_right.latitude;
- double dLng2 = pArea->rect.bottom_right.longitude;
- double dLat = (dLat1 + dLat2) / 2;
- double dLng = (dLng1 + dLng2) / 2;
-
- GeoCoordinates geoCoord(dLat, dLng);
+ m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_EXPLORE);
m_pDiscoveryQuery->SetProximity(geoCoord);
}
- else if(pArea->type == MAPS_AREA_CIRCLE)
+ else
{
- double dLat = pArea->circle.center.latitude;
- double dLng = pArea->circle.center.longitude;
- GeoCoordinates geoCoord(dLat, dLng);
- m_pDiscoveryQuery->SetProximity(geoCoord);
+ m_pDiscoveryQuery->SetType(DiscoveryQuery::QT_EXPLORE);
+ if (geoArea)
+ m_pDiscoveryQuery->SetArea(*geoArea);
}
-
+ /* Execute query */
m_nRestReqId = m_pDiscoveryQuery->Execute(*this, NULL);
return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION);
}
+here_error_e HerePlace::StartDiscoveryPlaceList(maps_area_h hArea)
+{
+ m_bReplyWithList = true;
+ return StartDiscoveryPlace(hArea);
+}
+
here_error_e HerePlace::PreparePlaceDetailsQuery()
{
if (m_pPlaceDetailsQuery)
m_pPlaceDetailsQuery->SetLanguage(szLanguage);
g_free(szLanguage);
+ maps_distance_unit_e eUnit;
+ ret = maps_preference_get_distance_unit(hPref, &eUnit);
+ if (ret == MAPS_ERROR_NONE)
+ m_eDistanceUnit = eUnit;
+
return HERE_ERROR_NONE;
}
-here_error_e HerePlace::StartPlaceDetails(const char *szPlaceId)
+here_error_e HerePlace::StartPlaceDetails(const char *szUrl)
{
if (!m_pPlaceDetailsQuery)
return HERE_ERROR_OUT_OF_MEMORY;
- if (!szPlaceId || (szPlaceId && strlen(szPlaceId) <= 0))
+ if (!szUrl || (szUrl && strlen(szUrl) <= 0))
return HERE_ERROR_INVALID_PARAMETER;
+ m_bPlaceDetails = true;
- m_pPlaceDetailsQuery->SetPlaceId(szPlaceId);
-
-
- m_nRestReqId = m_pPlaceDetailsQuery->Execute(*this, NULL);
+ m_nRestReqId = m_pPlaceDetailsQuery->Execute(*this, NULL, szUrl);
return (m_nRestReqId > 0 ? HERE_ERROR_NONE : HERE_ERROR_INVALID_OPERATION);
}
if (!szUrl || (szUrl && strlen(szUrl) <= 0))
return HERE_ERROR_INVALID_PARAMETER;
-
std::unique_ptr<PlaceDetailsQuery> pPlaceDetailsQuery (new (std::nothrow)PlaceDetailsQuery());
m_bPlaceDetailsInternal = true;
}
/* distance */
- maps_place_set_distance(mapsPlace, (int)herePlaceIt->GetDistance());
+ maps_place_set_distance(mapsPlace, HereUtils::ConvertDistance((int)herePlaceIt->GetDistance(), m_eDistanceUnit));
/* sponser */
/* herePlaceList.GetIsSponsored() */
/* vicinity */
/* If needed PlaceDetails information, postpone to send a reply */
- if(__sending_place_details_query_automatically)
+ if(__sending_place_details_query_automatically && !m_bReplyWithList)
{
hereLinkObj = herePlaceIt->GetLinkObject();
if (!hereLinkObj.GetHref().empty() && !hereLinkObj.GetId().empty())
}
void HerePlace::ProcessPlaceImage(PlaceDetails herePlace, maps_place_h mapsPlace)
-{
+{
ImageContentList hereImageList = herePlace.GetImageContent();
ImageContentList::iterator hereImage;
maps_item_list_h mapsImageList;
void HerePlace::__flushReplies(int error)
{
maps_place_h mapsPlace;
- bool bCallbackCanceled = false;
- int nReplyIdx = 0;
-
- if (m_bReplyFlushed || m_bCanceled || !m_pCbFunc) return;
- m_bReplyFlushed = true;
+ maps_item_list_h place_list;
+ m_nReplyIdx = 0;
__sortList(m_PlaceList);
- while ((nReplyIdx < m_nReplyCnt) ||
- (error != MAPS_ERROR_NONE && nReplyIdx == 0 && m_nReplyCnt == 0) /* reply with only error */
- )
+ if (m_bPlaceDetails)
{
- mapsPlace = NULL;
- if (!m_PlaceList.empty())
+ if (error != MAPS_ERROR_NONE)
{
+ ((maps_service_get_place_details_cb)m_pCbFunc)((maps_error_e)error, m_nReqId, NULL, m_pUserData);
+ return;
+ }
+
mapsPlace = m_PlaceList.front();
m_PlaceList.pop_front();
+
+ ((maps_service_get_place_details_cb)m_pCbFunc)((maps_error_e)error, m_nReqId, mapsPlace, m_pUserData);
+ }
+ else if (m_bReplyWithList)
+ {
+ int error = maps_item_list_create(&place_list);
+ if (error != MAPS_ERROR_NONE)
+ {
+ ((maps_service_search_place_list_cb)m_pCbFunc)((maps_error_e)error, m_nReqId, NULL, m_pUserData);
+ return;
}
- if (m_bCanceled || bCallbackCanceled)
+ while (m_nReplyIdx < m_nReplyCnt && !m_bCanceled && !m_PlaceList.empty())
{
- maps_place_destroy(mapsPlace);
+ mapsPlace = m_PlaceList.front();
+ m_PlaceList.pop_front();
+
+ maps_item_list_append(place_list, mapsPlace, maps_place_clone);
}
- else if (((maps_service_search_place_cb)m_pCbFunc)((maps_error_e)error, m_nReqId,
- nReplyIdx, m_nReplyCnt, mapsPlace, m_pUserData) == FALSE)
+
+ ((maps_service_search_place_list_cb)m_pCbFunc)((maps_error_e)error, m_nReqId, place_list, m_pUserData);
+ }
+ else
+ {
+ while (m_nReplyIdx < m_nReplyCnt && !m_bCanceled && !m_PlaceList.empty())
{
- bCallbackCanceled = true;
+ mapsPlace = m_PlaceList.front();
+ m_PlaceList.pop_front();
+
+ /* callback function */
+ if (((maps_service_search_place_cb)m_pCbFunc)((maps_error_e)error, m_nReqId,
+ m_nReplyIdx++, m_nReplyCnt, mapsPlace, m_pUserData) == FALSE)
+ {
+ break;
+ }
}
- nReplyIdx++;
}
}