void SuggestionsSidebarBlock::QueryProvider(SuggestionsBackend& backend, CatalogItem *item, uint64_t queryId) { m_pendingQueries++; // we need something to talk to GUI thread through that is guaranteed // to exist, and the app object is a good choice: wxApp *app = wxTheApp; std::weak_ptr<SuggestionsSidebarBlock> weakSelf = std::dynamic_pointer_cast<SuggestionsSidebarBlock>(shared_from_this()); m_provider->SuggestTranslation ( backend, m_parent->GetCurrentLanguage(), item->GetString().ToStdWstring(), SUGGESTIONS_REQUEST_COUNT, // when receiving data [=](const SuggestionsList& hits){ app->CallAfter([weakSelf,queryId,hits]{ auto self = weakSelf.lock(); // maybe this call is already out of date: if (!self || self->m_latestQueryId != queryId) return; self->UpdateSuggestions(hits); if (--self->m_pendingQueries == 0) self->OnQueriesFinished(); }); }, // on error: [=](std::exception_ptr e){ app->CallAfter([weakSelf,queryId,e]{ auto self = weakSelf.lock(); // maybe this call is already out of date: if (!self || self->m_latestQueryId != queryId) return; self->SetMessage("SuggestionError", DescribeException(e)); if (--self->m_pendingQueries == 0) self->OnQueriesFinished(); }); } ); }
void SuggestionsSidebarBlock::QueryProvider(SuggestionsBackend& backend, const CatalogItemPtr& item, uint64_t queryId) { m_pendingQueries++; // we need something to talk to GUI thread through that is guaranteed // to exist, and the app object is a good choice: auto backendPtr = &backend; std::weak_ptr<SuggestionsSidebarBlock> weakSelf = std::dynamic_pointer_cast<SuggestionsSidebarBlock>(shared_from_this()); m_provider->SuggestTranslation ( backend, m_parent->GetCurrentSourceLanguage(), m_parent->GetCurrentLanguage(), item->GetString().ToStdWstring(), // when receiving data [=](const SuggestionsList& hits){ call_on_main_thread([weakSelf,queryId,hits]{ auto self = weakSelf.lock(); // maybe this call is already out of date: if (!self || self->m_latestQueryId != queryId) return; self->UpdateSuggestions(hits); if (--self->m_pendingQueries == 0) self->OnQueriesFinished(); }); }, // on error: [=](std::exception_ptr e){ call_on_main_thread([weakSelf,queryId,backendPtr,e]{ auto self = weakSelf.lock(); // maybe this call is already out of date: if (!self || self->m_latestQueryId != queryId) return; self->ReportError(backendPtr, e); if (--self->m_pendingQueries == 0) self->OnQueriesFinished(); }); } ); }
void SSuperSearchBox::Query_HttpRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded) { bool bResult = false; FString ResponseStr, ErrorStr; if (bSucceeded && HttpResponse.IsValid()) { ResponseStr = HttpResponse->GetContentAsString(); if (EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode())) { // Create the Json parser TSharedPtr<FJsonObject> JsonObject; TSharedRef<TJsonReader<> > JsonReader = TJsonReaderFactory<>::Create(ResponseStr); if (FJsonSerializer::Deserialize(JsonReader, JsonObject) && JsonObject.IsValid()) { if (FText * QueryText = RequestQueryMap.Find(HttpRequest)) { const TArray<TSharedPtr<FJsonValue> > * JsonItems = nullptr; if (JsonObject->TryGetArrayField(TEXT("items"), JsonItems)) { //add search result into cache FSearchResults & SearchResults = SearchResultsCache.FindOrAdd(QueryText->ToString()); FCategoryResults & OnlineResults = SearchResults.OnlineResults; OnlineResults.Empty(); //reset online results since we just got updated for (TSharedPtr<FJsonValue> JsonItem : *JsonItems) { const TSharedPtr<FJsonObject> & ItemObject = JsonItem->AsObject(); FSearchEntry SearchEntry; SearchEntry.Title = ItemObject->GetStringField("title"); SearchEntry.URL = ItemObject->GetStringField("link"); SearchEntry.bCategory = false; bool bValidLabel = false; TArray<TSharedPtr<FJsonValue> > Labels = ItemObject->GetArrayField(TEXT("labels")); for (TSharedPtr<FJsonValue> Label : Labels) { const TSharedPtr<FJsonObject> & LabelObject = Label->AsObject(); FString LabelString = LabelObject->GetStringField(TEXT("name")); TArray<FSearchEntry> & SuggestionCategory = OnlineResults.FindOrAdd(LabelString); SuggestionCategory.Add(SearchEntry); } } } bResult = true; } } } else { ErrorStr = FString::Printf(TEXT("Invalid response. code=%d error=%s"), HttpResponse->GetResponseCode(), *ResponseStr); } } if (bResult) { UpdateSuggestions(); } }