Revision control

++ // Copyright (C) 2017 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ #include <QDebug>
++ #include <QGeoCircle>
++ #include <QGeoServiceProvider>
++ #include <QPlaceDetailsReply>
++ #include <QPlaceIdReply>
++ #include <QPlaceManager>
++ #include <QPlaceSearchReply>
++ #include <QPlaceResult>
++ #include <QPlaceImage>
++ #include <QtCore/QMetaObject>
++
++ class RequestHandler : public QObject
++ {
++ public:
++ void initializeManager() {
++ //! [Initialize Manager]
++ //The "provider name" is used to select a particular provider
++ QGeoServiceProvider *provider = new QGeoServiceProvider("provider name");
++ QPlaceManager *manager = provider->placeManager();
++ //! [Initialize Manager]
++ Q_UNUSED(provider);
++ Q_UNUSED(manager);
++ }
++
++ void simpleSearch()
++ {
++ //! [Simple search]
++ //1) Make an appropriate request
++ QPlaceSearchRequest searchRequest;
++ searchRequest.setSearchTerm("ice cream");
++ searchRequest.setSearchArea(QGeoCircle(QGeoCoordinate(12.34, 56.78)));
++
++ //2) Use the manager to initiate a request and retrieve a reply object
++ QPlaceSearchReply * searchReply = manager->search(searchRequest);
++
++ //3) Connect the reply object to a slot which is invoked upon operation completion
++ connect(searchReply, &QPlaceSearchReply::finished,
++ this, &RequestHandler::processSearchReply);
++ //! [Simple search]
++ }
++
++ void search()
++ {
++ //! [Search for places cpp]
++
++ //instantiate request and set parameters
++ QPlaceSearchRequest searchRequest;
++ searchRequest.setSearchTerm("ice cream");
++ searchRequest.setSearchArea(QGeoCircle(QGeoCoordinate(12.34, 56.78)));
++
++ //send off a search request
++ /*QPlaceSearchReply * */ searchReply = manager->search(searchRequest);
++
++ //connect a slot to handle the reply
++ connect(searchReply, &QPlaceSearchReply::finished, this, &RequestHandler::handleSearchReply);
++
++ //! [Search for places cpp]
++ }
++
++ void searchPaging()
++ {
++ //! [Search paging]
++ QPlaceSearchRequest searchRequest;
++ searchRequest.setLimit(15); //specify how many results are to be retrieved.
++ //! [Search paging]
++ }
++
++ void details()
++ {
++ QPlace place;
++ //! [Details check]
++ if (!place.detailsFetched()) {
++ /*QPlaceDetailsReply * */ detailsReply = manager->getPlaceDetails(place.placeId());
++ connect(detailsReply, &QPlaceDetailsReply::finished, this, &RequestHandler::handleDetailsReply);
++ }
++ //! [Details check]
++ }
++
++ void images()
++ {
++ QPlace place;
++
++ //! [Image request]
++ QPlaceContentRequest request;
++ request.setContentType(QPlaceContent::ImageType);
++ request.setPlaceId(place.placeId());
++ request.setLimit(5);
++ /*QPlaceContentReply * */ contentReply = manager->getPlaceContent(request);
++ connect(contentReply, &QPlaceContentReply::finished, this, &RequestHandler::handleImagesReply);
++ //! [Image request]
++ }
++
++
++ void suggestion()
++ {
++ //! [Suggestion request]
++ QPlaceSearchRequest request;
++ request.setSearchTerm("piz");
++ request.setSearchArea(QGeoCircle(QGeoCoordinate(12.34, 56.78)));
++ /* QPlaceSearchSuggestion * */suggestionReply = manager->searchSuggestions(request);
++ connect(suggestionReply, &QPlaceSearchSuggestion::finished, this, &RequestHandler::handleSuggestionReply);
++ //! [Suggestion request]
++ }
++
++ void savePlace()
++ {
++ //! [Save place pt1]
++ QPlace place;
++ place.setName( "Fred's Ice Cream Parlor" );
++
++ QGeoLocation location;
++ location.setCoordinate(QGeoCoordinate(12.34, 56.78));
++
++ QGeoAddress address;
++ address.setStreet("111 Nother Street");
++ //! [Save place pt1]
++
++ //! [Save place pt2]
++ location.setAddress(address);
++ place.setLocation(location);
++
++ /* QPlaceIdReply * */savePlaceReply = manager->savePlace(place);
++ connect(savePlaceReply, &QPlaceIdReply::finished, this, &RequestHandler::handleSavePlaceReply);
++ //! [Save place pt2]
++ }
++
++ void removePlace()
++ {
++ QPlace place;
++ //! [Remove place]
++ /* QPlaceIdReply * */removePlaceReply = manager->removePlace(place.placeId());
++ connect(removePlaceReply, &QPlaceIdReply::finished, this, &RequestHandler::handleRemovePlaceReply);
++ //! [Remove place]
++ }
++
++ void initializeCategories()
++ {
++ //! [Initialize categories]
++ /* QPlaceReply * */initCatReply = manager->initializeCategories();
++ connect(initCatReply, &QPlaceReply::finished, this, &RequestHandler::handleInitCatReply);
++ //! [Initialize categories]
++ }
++
++ void saveCategory()
++ {
++ //! [Save category]
++ QPlaceCategory fastFood;
++
++ QPlaceCategory category;
++ category.setName("pizza");
++ /*QPlaceIdReply */ saveCategoryReply = manager->saveCategory(category);
++ connect(saveCategoryReply, &QPlaceIdReply::finished, this, &RequestHandler::handleSaveCategoryReply);
++
++ //we could have saved a category as a child by supplying a parent identifier.
++ saveCategoryReply = manager->saveCategory(category, fastFood.categoryId());
++ //! [Save category]
++ }
++
++ void removeCategory()
++ {
++ QPlaceCategory category;
++ //! [Remove category]
++ /* QPlaceIdReply * */removeCategoryReply = manager->removeCategory(place.placeId());
++ connect(removeCategoryReply, &QPlaceIdReply::finished, this, &RequestHandler::handleRemoveCategoryReply);
++ //! [Remove category]
++ }
++
++ void searchRequest() {
++ QPlaceCategory diner;
++ QPlaceCategory restaurant;
++
++ //! [Search request]
++ QPlaceSearchRequest searchRequest;
++ searchRequest.setSearchTerm("Fast food"); //search term for what we are interested in
++
++ //set a search center
++ searchRequest.setSearchArea(QGeoCircle(QGeoCoordinate(2.3, 48.87)));
++
++ //set a distance hint as a relevancy hint.
++ //closer places have greater weighting in the ranking of results.
++ searchRequest.setRelevanceHint(QPlaceSearchRequest::DistanceHint);
++
++ //use limit to adjust pagination.
++ //this limits the number of place results to 5 per page.
++ searchRequest.setLimit(5);
++
++ //provide some categories to narrow down search
++ QList<QPlaceCategory> categories;
++ categories << diner << restaurant;
++ searchRequest.setCategories(categories);
++ //! [Search request]
++ }
++
++ void content() {
++ QPlace place;
++ //! [Content request]
++ QPlaceContentRequest request;
++ request.setContentType(QPlaceContent::ImageType);
++ request.setPlaceId(place.placeId());
++ request.setLimit(5);
++
++ QPlaceContentReply *contentReply = manager->getPlaceContent(request);
++ //..connect signals..//
++
++ //! [Content request]
++ Q_UNUSED(contentReply);
++ }
++
++ void contentConversion()
++ {
++ //! [Content conversion]
++ QPlaceImage image;
++ image.setUrl(QUrl("www.example.com"));
++
++ QPlaceContent content = image;
++
++ QPlaceImage image2;
++ image2 = content;
++ qDebug() << image2.url(); //image2.url() == "www.example.com"
++ //! [Content conversion]
++ }
++
++ void icon() {
++ QPlace place;
++ //! [icon]
++ QUrl iconSourceUrl = place.icon().url(QSize(32,32));
++
++ //A default icon may also be requested like so
++ iconSourceUrl = place.icon().url();
++ //! [icon]
++ }
++
++ void saveBetweenManagers() {
++ QPlaceResult result;
++ QPlaceIdReply *saveReply;
++ //! [ Save to different manager]
++ //result retrieved from a different manager)
++ QPlace place = manager->compatiblePlace(result.place());
++ saveReply = manager->savePlace(place);
++ //! [ Save to different manager]
++ saveReply->abort();//needed to avoid warnings
++ }
++
++ void ratings() {
++ //! [Ratings]
++ qDebug() << QString("This place rated ") + place.ratings().average()
++ + "out of " + place.ratings().maximum() + "stars";
++ //! [Ratings]
++ }
++
++ void matchPlaces() {
++ QList<QPlaceSearchResult> results;
++ //! [Match places]
++ QPlaceMatchRequest request;
++ request.setResults(results);
++ QVariantMap parameters;
++ parameters.insert(QPlaceMatchRequest::AlternativeId, "x_id_here");
++ request.setParameters(parameters);
++ matchReply = manager->matchingPlaces(request);
++ //! [Match places]
++ }
++
++ public slots:
++ // ![Simple search handler]
++ //4) Have the slot appropriately process the results of the operation
++ void processSearchReply() {
++ if (searchReply->error() == QPlaceReply::NoError) {
++ for (const QPlaceSearchResult &result : searchReply->results()) {
++ if (result.type() == QPlaceSearchResult::PlaceResult)
++ qDebug() << "Title:" << result.title();
++ }
++ }
++
++ //5) Discard the rely object when done.
++ searchReply->deleteLater();
++ searchReply = nullptr;
++ }
++ // ![Simple search handler]
++
++ //! [Search for places handler cpp]
++ void handleSearchReply() {
++ if (searchReply->error() == QPlaceReply::NoError) {
++ for (const QPlaceSearchResult &result : searchReply->results()) {
++ if (result.type() == QPlaceSearchResult::PlaceResult) {
++ QPlaceResult placeResult = result;
++ qDebug() << "Name: " << placeResult.place().name();
++ qDebug() << "Coordinate " << placeResult.place().location().coordinate().toString();
++ qDebug() << "Street: " << placeResult.place().location().address().street();
++ qDebug() << "Distance: " << placeResult.distance();
++ }
++ }
++ }
++ searchReply->deleteLater(); //discard reply
++ searchReply = nullptr;
++ }
++ //! [Search for places handler cpp]
++
++ //! [Details handler cpp]
++ void handleDetailsReply() {
++ QPlace place;
++ if (detailsReply->error() == QPlaceReply::NoError)
++ place = detailsReply->place();
++
++ detailsReply->deleteLater(); //discard reply
++ detailsReply = nullptr;
++ }
++ //! [Details handler cpp]
++
++ //! [Image handler]
++ void handleImagesReply() {
++ if (contentReply->error() == QPlaceReply::NoError) {
++ const auto content = contentReply->content();
++ for (auto iter = content.cbegin(), end = content.cend(); iter != end; ++iter) {
++ qDebug() << "Index: " << iter.key();
++ QPlaceImage image = iter.value();
++ qDebug() << image.url();
++ qDebug() << image.mimeType();
++ }
++
++ //alternatively if indexes are irrelevant
++ for (const QPlaceImage &image : contentReply->content()) {
++ qDebug() << image.url();
++ qDebug() << image.mimeType();
++ }
++
++ //we can assign content to the place that it belongs to.
++ //the place object serves as a container where we can retrieve
++ //content that has already been fetched
++ place.insertContent(contentReply->request().contentType(), contentReply->content());
++ place.setTotalContentCount(contentReply->request().contentType(), contentReply->totalCount());
++ }
++
++ contentReply->deleteLater();
++ contentReply = nullptr;
++ }
++ //! [Image handler]
++
++ //! [Suggestion handler]
++ void handleSuggestionReply() {
++ if (suggestionReply->error() == QPlaceReply::NoError) {
++ for (const QString &suggestion : suggestionReply->suggestions())
++ qDebug() << suggestion;
++ }
++
++ suggestionReply->deleteLater(); //discard reply
++ suggestionReply = nullptr;
++ }
++
++ //! [Suggestion handler]
++
++ //! [Save place handler]
++ void handleSavePlaceReply() {
++ if (savePlaceReply->error() == QPlaceReply::NoError)
++ qDebug() << savePlaceReply->id();
++
++ savePlaceReply->deleteLater(); //discard reply
++ savePlaceReply = nullptr;
++ }
++ //! [Save place handler]
++
++ //! [Remove place handler]
++ void handleRemovePlaceReply() {
++ if (removePlaceReply->error() == QPlaceReply::NoError)
++ qDebug() << "Removal of place identified by"
++ << removePlaceReply->id() << "was successful";
++
++ removePlaceReply->deleteLater(); //discard reply
++ removePlaceReply = nullptr;
++ }
++ //! [Remove place handler]
++
++ //! [Initialize categories reply]
++ void handleInitCatReply() {
++ if (initCatReply->error() == QPlaceReply::NoError)
++ qDebug() << "Categories initialized";
++ else
++ qDebug() << "Failed to initialize categories";
++
++ initCatReply->deleteLater();
++ initCatReply = nullptr;
++ }
++ //! [Initialize categories reply]
++
++ void categories() {
++ QPlaceCategory pizza;
++ //! [Top level categories]
++ const QList<QPlaceCategory> topLevelCategories = manager->childCategories();
++ for (const QPlaceCategory &category : topLevelCategories)
++ qDebug() << category.name();
++ //! [Top level categories]
++
++ //! [Child categories]
++ QList<QPlaceCategory> childCategories = manager->childCategories(pizza.categoryId());
++ //! [Child categories]
++ }
++
++ //! [Save category handler]
++ void handleSaveCategoryReply() {
++ if (saveCategoryReply->error() == QPlaceReply::NoError) {
++ qDebug() << "Saved category id =" << saveCategoryReply->id();
++ }
++
++ saveCategoryReply->deleteLater();
++ saveCategoryReply = nullptr;
++ }
++ //! [Save category handler]
++
++ //! [Remove category handler]
++ void handleRemoveCategoryReply() {
++ if (removeCategoryReply->error() == QPlaceReply::NoError)
++ qDebug() << "Removal of category identified by"
++ << removeCategoryReply->id() << "was successful";
++
++ removeCategoryReply->deleteLater(); //discard reply
++ removeCategoryReply = nullptr;
++ }
++ //! [Remove category handler]
++
++ //! [Content handler]
++ void contentHandler() {
++ if (contentReply->error() == QPlaceReply::NoError) {
++ place.insertContent(contentReply->request().contentType(),
++ contentReply->content());
++ }
++ }
++ //! [Content handler]
++
++ void phoneNumbers() {
++ //! [Phone numbers]
++ if (place.contactTypes().contains(QPlaceContactDetail::Phone)) {
++ for (const QPlaceContactDetail &number : place.contactDetails(QPlaceContactDetail::Phone))
++ qDebug() << number.label() << ":" << number.value();
++ }
++ //! [Phone numbers]
++ }
++
++
++ void openingHours() {
++ //! [Opening hours]
++ if (place.extendedAttributeTypes().contains(QPlaceAttribute::OpeningHours))
++ qDebug() << place.extendedAttribute(QPlaceAttribute::OpeningHours).text();
++ //! [Opening hours]
++ }
++
++ //! [Match places handler]
++ void matchHandler() {
++ if (matchReply->error() == QPlaceReply::NoError) {
++ const auto places = matchReply->places();
++ for (const QPlace &place : places) {
++ if (place != QPlace())
++ qDebug() << "Place is a favorite with name" << place.name();
++ else
++ qDebug() << "Place is not a favorite";
++ }
++ }
++
++ matchReply->deleteLater();
++ matchReply = nullptr;
++ }
++ //! [Match places handler]
++
++ void convertSearchResult() {
++ QPlaceSearchResult result;
++ //! [Convert search result]
++ if (result.type() == QPlaceSearchResult::PlaceResult) {
++ QPlaceResult placeResult = result;
++ qDebug() << placeResult.place().name();
++ qDebug() << placeResult.place().location().coordinate();
++ qDebug() << placeResult.distance();
++ }
++ //! [Convert search result]
++ }
++
++ QPlaceSearchReply *searchReply;
++ QPlaceManager *manager;
++ QPlaceDetailsReply *detailsReply;
++ QPlaceContentReply *contentReply;
++ QPlaceSearchSuggestionReply *suggestionReply;
++ QPlaceIdReply *savePlaceReply;
++ QPlaceIdReply *removePlaceReply;
++ QPlaceIdReply *saveCategoryReply;
++ QPlaceIdReply *removeCategoryReply;
++ QPlaceReply *initCatReply;
++ QPlaceMatchReply *matchReply;
++ QPlace place;
++ };
++
++ class ManagerEngine : public QObject
++ {
++ };
++
++ //! [Implement reply pt1]
++ class SearchReply : public QPlaceSearchReply
++ {
++ public:
++ explicit SearchReply(ManagerEngine *engine)
++ : QPlaceSearchReply(engine), m_engine(engine){}
++
++ ~SearchReply();
++ void setResults(const QList<QPlaceSearchResult> &results);
++ void setRequest(const QPlaceSearchRequest &request);
++ //! [Implement reply pt1]
++
++ //! [Implement reply pt2]
++ void triggerDone(QPlaceReply::Error error = QPlaceReply::NoError,
++ const QString &errorString = QString());
++
++ ManagerEngine *m_engine;
++ };
++ //! [Implement reply pt2]
++
++ class SearchSuggestionReply : public QPlaceSearchSuggestionReply
++ {
++ public:
++ void triggerDone(QPlaceReply::Error error = QPlaceReply::NoError,
++ const QString &errorString = QString());
++
++ ManagerEngine *m_engine;
++
++ };
++
++ //! [Trigger done]
++ void SearchSuggestionReply::triggerDone(QPlaceReply::Error error,
++ const QString &errorString)
++ {
++ if (error != QPlaceReply::NoError) {
++ this->setError(error,errorString);
++ QMetaObject::invokeMethod(m_engine, "errorOccurred", Qt::QueuedConnection,
++ Q_ARG(QPlaceReply *,this),
++ Q_ARG(QPlaceReply::Error, error),
++ Q_ARG(QString, errorString));
++ QMetaObject::invokeMethod(this, "errorOccurred", Qt::QueuedConnection,
++ Q_ARG(QPlaceReply::Error, error),
++ Q_ARG(QString, errorString));
++ }
++
++ this->setFinished(true);
++ QMetaObject::invokeMethod(m_engine, "finished", Qt::QueuedConnection,
++ Q_ARG(QPlaceReply *,this));
++ QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
++ }
++ //! [Trigger done]