summaryrefslogtreecommitdiff
path: root/src/imports/location/declarativeplaces/qdeclarativeplace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/imports/location/declarativeplaces/qdeclarativeplace.cpp')
-rw-r--r--src/imports/location/declarativeplaces/qdeclarativeplace.cpp1227
1 files changed, 0 insertions, 1227 deletions
diff --git a/src/imports/location/declarativeplaces/qdeclarativeplace.cpp b/src/imports/location/declarativeplaces/qdeclarativeplace.cpp
deleted file mode 100644
index 834737ff..00000000
--- a/src/imports/location/declarativeplaces/qdeclarativeplace.cpp
+++ /dev/null
@@ -1,1227 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtLocation module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later as published by the Free
-** Software Foundation and appearing in the file LICENSE.GPL included in
-** the packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qdeclarativeplace_p.h"
-#include "qdeclarativecontactdetail_p.h"
-#include "qdeclarativegeoserviceprovider_p.h"
-#include "qdeclarativeplaceattribute_p.h"
-#include "qdeclarativeplaceicon_p.h"
-#include "error_messages.h"
-
-#include <QtCore/QCoreApplication>
-#include <QtCore/QMetaObject>
-#include <QtQml/QQmlEngine>
-#include <QtQml/QQmlInfo>
-#include <QtLocation/QGeoServiceProvider>
-#include <QtLocation/QPlaceManager>
-#include <QtLocation/QPlaceDetailsReply>
-#include <QtLocation/QPlaceReply>
-#include <QtLocation/QPlaceIdReply>
-#include <QtLocation/QPlaceContactDetail>
-
-QT_USE_NAMESPACE
-
-/*!
- \qmltype Place
- \instantiates QDeclarativePlace
- \inqmlmodule QtLocation
- \ingroup qml-QtLocation5-places
- \ingroup qml-QtLocation5-places-data
- \since Qt Location 5.5
-
- \brief The Place type represents a location that is a position of interest.
-
- The Place type represents a physical location with additional metadata describing that
- location. Contrasted with \l Location, \l Address, and
- \l {coordinate} type which are used to describe where a location is.
- The basic properties of a Place are its \l name and \l location.
-
- Place objects are typically obtained from a search model and will generally only have their
- basic properties set. The \l detailsFetched property can be used to test if further property
- values need to be fetched from the \l Plugin. This can be done by invoking the \l getDetails()
- method. Progress of the fetching operation can be monitored with the \l status property, which
- will be set to Place.Fetching when the details are being fetched.
-
- The Place type has many properties holding information about the location. Details on how to
- contact the place are available from the \l contactDetails property. Convenience properties
- for obtaining the primary \l {primaryPhone}{phone}, \l {primaryFax}{fax},
- \l {primaryEmail}{email} and \l {primaryWebsite}{website} are also available.
-
- Each place is assigned zero or more \l categories. Categories are typically used when
- searching for a particular kind of place, such as a restaurant or hotel. Some places have a
- \l ratings object, which gives an indication of the quality of the place.
-
- Place metadata is provided by a \l supplier who may require that an \l attribution message be
- displayed to the user when the place details are viewed.
-
- Places have an associated \l icon which can be used to represent a place on a map or to
- decorate a delegate in a view.
-
- Places may have additional rich content associated with them. The currently supported rich
- content include editorial descriptions, reviews and images. These are exposed as a set of
- models for retrieving the content. Editorial descriptions of the place are available from the
- \l editorialModel property. Reviews of the place are available from the \l reviewModel
- property. A gallery of pictures of the place can be accessed using the \l imageModel property.
-
- Places may have additional attributes which are not covered in the formal API. The
- \l extendedAttributes property provides access to these. The type of extended attributes
- available is specific to each \l Plugin.
-
- A Place is almost always tied to a \l plugin. The \l plugin property must be set before it is
- possible to call \l save(), \l remove() or \l getDetails(). The \l reviewModel, \l imageModel
- and \l editorialModel are only valid then the \l plugin property is set.
-
- \section2 Saving a Place
-
- If the \l Plugin supports it, the Place type can be used to save a place. First create a new
- Place and set its properties:
-
- \snippet declarative/places.qml Place savePlace def
-
- Then invoke the \l save() method:
-
- \snippet declarative/places.qml Place savePlace
-
- The \l status property will change to Place.Saving and then to Place.Ready if the save was
- successful or to Place.Error if an error occurs.
-
- If the \l placeId property is set, the backend will update an existing place otherwise it will
- create a new place. On success the \l placeId property will be updated with the identifier of the newly
- saved place.
-
- \section3 Caveats
- \input place-caveats.qdocinc
-
- \section3 Saving Between Plugins
- When saving places between plugins, there are a few things to be aware of.
- Some fields of a place such as the id, categories and icons are plugin specific entities. For example
- the categories in one manager may not be recognised in another.
- Therefore trying to save a place directly from one plugin to another is not possible.
-
- It is generally recommended that saving across plugins be handled as saving \l {Favorites}{favorites}
- as explained in the Favorites section. However there is another approach which is to create a new place,
- set its (destination) plugin and then use the \l copyFrom() method to copy the details of the original place.
- Using \l copyFrom() only copies data that is supported by the destination plugin,
- plugin specific data such as the place identifier is not copied over. Once the copy is done,
- the place is in a suitable state to be saved.
-
- The following snippet provides an example of saving a place to a different plugin
- using the \l copyFrom method:
-
- \snippet declarative/places.qml Place save to different plugin
-
- \section2 Removing a Place
-
- To remove a place, ensure that a Place object with a valid \l placeId property exists and call
- its \l remove() method. The \l status property will change to Place.Removing and then to
- Place.Ready if the save was successful or to Place.Error if an error occurs.
-
- \section2 Favorites
- The Places API supports the concept of favorites. Favorites are generally implemented
- by using two plugins, the first plugin is typically a read-only source of places (origin plugin) and a second
- read/write plugin (destination plugin) is used to store places from the origin as favorites.
-
- Each Place has a favorite property which is intended to contain the corresponding place
- from the destination plugin (the place itself is sourced from the origin plugin). Because both the original
- place and favorite instances are available, the developer can choose which
- properties to show to the user. For example the favorite may have a modified name which should
- be displayed rather than the original name.
-
- \snippet declarative/places.qml Place favorite
-
- The following demonstrates how to save a new favorite instance. A call is made
- to create/initialize the favorite instance and then the instance is saved.
-
- \snippet declarative/places.qml Place saveFavorite
-
- The following demonstrates favorite removal:
-
- \snippet declarative/places.qml Place removeFavorite 1
- \dots
- \snippet declarative/places.qml Place removeFavorite 2
-
- The PlaceSearchModel has a favoritesPlugin property. If the property is set, any places found
- during a search are checked against the favoritesPlugin to see if there is a corresponding
- favorite place. If so, the favorite property of the Place is set, otherwise the favorite
- property is remains null.
-
- \sa PlaceSearchModel
-*/
-
-QDeclarativePlace::QDeclarativePlace(QObject *parent)
-: QObject(parent), m_location(0), m_ratings(0), m_supplier(0), m_icon(0),
- m_reviewModel(0), m_imageModel(0), m_editorialModel(0),
- m_extendedAttributes(new QQmlPropertyMap(this)),
- m_contactDetails(new QDeclarativeContactDetails(this)), m_reply(0), m_plugin(0),
- m_complete(false), m_favorite(0), m_status(QDeclarativePlace::Ready)
-{
- connect(m_contactDetails, SIGNAL(valueChanged(QString,QVariant)),
- this, SLOT(contactsModified(QString,QVariant)));
-
- setPlace(QPlace());
-}
-
-QDeclarativePlace::QDeclarativePlace(const QPlace &src, QDeclarativeGeoServiceProvider *plugin, QObject *parent)
-: QObject(parent), m_location(0), m_ratings(0), m_supplier(0), m_icon(0),
- m_reviewModel(0), m_imageModel(0), m_editorialModel(0),
- m_extendedAttributes(new QQmlPropertyMap(this)),
- m_contactDetails(new QDeclarativeContactDetails(this)), m_reply(0), m_plugin(plugin),
- m_complete(false), m_favorite(0), m_status(QDeclarativePlace::Ready)
-{
- Q_ASSERT(plugin);
-
- connect(m_contactDetails, SIGNAL(valueChanged(QString,QVariant)),
- this, SLOT(contactsModified(QString,QVariant)));
-
- setPlace(src);
-}
-
-QDeclarativePlace::~QDeclarativePlace()
-{
-}
-
-// From QQmlParserStatus
-void QDeclarativePlace::componentComplete()
-{
- m_complete = true;
-}
-
-/*!
- \qmlproperty Plugin Place::plugin
-
- This property holds the \l Plugin that provided this place which can be used to retrieve more information about the service.
-*/
-void QDeclarativePlace::setPlugin(QDeclarativeGeoServiceProvider *plugin)
-{
- if (m_plugin == plugin)
- return;
-
- m_plugin = plugin;
- if (m_complete)
- emit pluginChanged();
-
- if (m_plugin->isAttached()) {
- pluginReady();
- } else {
- connect(m_plugin, SIGNAL(attached()),
- this, SLOT(pluginReady()));
- }
-}
-
-void QDeclarativePlace::pluginReady()
-{
- QGeoServiceProvider *serviceProvider = m_plugin->sharedGeoServiceProvider();
- QPlaceManager *placeManager = serviceProvider->placeManager();
- if (!placeManager || serviceProvider->error() != QGeoServiceProvider::NoError) {
- setStatus(Error, QCoreApplication::translate(CONTEXT_NAME, PLUGIN_ERROR)
- .arg(m_plugin->name()).arg(serviceProvider->errorString()));
- return;
- }
-}
-
-QDeclarativeGeoServiceProvider *QDeclarativePlace::plugin() const
-{
- return m_plugin;
-}
-
-/*!
- \qmlproperty ReviewModel Place::reviewModel
-
- This property holds a model which can be used to retrieve reviews about the place.
-*/
-QDeclarativeReviewModel *QDeclarativePlace::reviewModel()
-{
- if (!m_reviewModel) {
- m_reviewModel = new QDeclarativeReviewModel(this);
- m_reviewModel->setPlace(this);
- }
-
- return m_reviewModel;
-}
-
-/*!
- \qmlproperty ImageModel Place::imageModel
-
- This property holds a model which can be used to retrieve images of the place.
-*/
-QDeclarativePlaceImageModel *QDeclarativePlace::imageModel()
-{
- if (!m_imageModel) {
- m_imageModel = new QDeclarativePlaceImageModel(this);
- m_imageModel->setPlace(this);
- }
-
- return m_imageModel;
-}
-
-/*!
- \qmlproperty EditorialModel Place::editorialModel
-
- This property holds a model which can be used to retrieve editorial descriptions of the place.
-*/
-QDeclarativePlaceEditorialModel *QDeclarativePlace::editorialModel()
-{
- if (!m_editorialModel) {
- m_editorialModel = new QDeclarativePlaceEditorialModel(this);
- m_editorialModel->setPlace(this);
- }
-
- return m_editorialModel;
-}
-
-/*!
- \qmlproperty QPlace Place::place
-
- For details on how to use this property to interface between C++ and QML see
- "\l {Place - QPlace} {Interfaces between C++ and QML Code}".
-*/
-void QDeclarativePlace::setPlace(const QPlace &src)
-{
- QPlace previous = m_src;
- m_src = src;
-
- if (previous.categories() != m_src.categories()) {
- synchronizeCategories();
- emit categoriesChanged();
- }
-
- if (m_location && m_location->parent() == this) {
- m_location->setLocation(m_src.location());
- } else if (!m_location || m_location->parent() != this) {
- m_location = new QDeclarativeGeoLocation(m_src.location(), this);
- emit locationChanged();
- }
-
- if (m_ratings && m_ratings->parent() == this) {
- m_ratings->setRatings(m_src.ratings());
- } else if (!m_ratings || m_ratings->parent() != this) {
- m_ratings = new QDeclarativeRatings(m_src.ratings(), this);
- emit ratingsChanged();
- }
-
- if (m_supplier && m_supplier->parent() == this) {
- m_supplier->setSupplier(m_src.supplier(), m_plugin);
- } else if (!m_supplier || m_supplier->parent() != this) {
- m_supplier = new QDeclarativeSupplier(m_src.supplier(), m_plugin, this);
- emit supplierChanged();
- }
-
- if (m_icon && m_icon->parent() == this) {
- m_icon->setPlugin(m_plugin);
- m_icon->setIcon(m_src.icon());
- } else if (!m_icon || m_icon->parent() != this) {
- m_icon = new QDeclarativePlaceIcon(m_src.icon(), m_plugin, this);
- emit iconChanged();
- }
-
- if (previous.name() != m_src.name()) {
- emit nameChanged();
- }
- if (previous.placeId() != m_src.placeId()) {
- emit placeIdChanged();
- }
- if (previous.attribution() != m_src.attribution()) {
- emit attributionChanged();
- }
- if (previous.detailsFetched() != m_src.detailsFetched()) {
- emit detailsFetchedChanged();
- }
- if (previous.primaryPhone() != m_src.primaryPhone()) {
- emit primaryPhoneChanged();
- }
- if (previous.primaryFax() != m_src.primaryFax()) {
- emit primaryFaxChanged();
- }
- if (previous.primaryEmail() != m_src.primaryEmail()) {
- emit primaryEmailChanged();
- }
- if (previous.primaryWebsite() != m_src.primaryWebsite()) {
- emit primaryWebsiteChanged();
- }
-
- if (m_reviewModel && m_src.totalContentCount(QPlaceContent::ReviewType) >= 0) {
- m_reviewModel->initializeCollection(m_src.totalContentCount(QPlaceContent::ReviewType),
- m_src.content(QPlaceContent::ReviewType));
- }
- if (m_imageModel && m_src.totalContentCount(QPlaceContent::ImageType) >= 0) {
- m_imageModel->initializeCollection(m_src.totalContentCount(QPlaceContent::ImageType),
- m_src.content(QPlaceContent::ImageType));
- }
- if (m_editorialModel && m_src.totalContentCount(QPlaceContent::EditorialType) >= 0) {
- m_editorialModel->initializeCollection(m_src.totalContentCount(QPlaceContent::EditorialType),
- m_src.content(QPlaceContent::EditorialType));
- }
-
- synchronizeExtendedAttributes();
- synchronizeContacts();
-}
-
-QPlace QDeclarativePlace::place()
-{
- // The following properties are not stored in m_src but instead stored in QDeclarative* objects
-
- QPlace result = m_src;
-
- // Categories
- QList<QPlaceCategory> categories;
- foreach (QDeclarativeCategory *value, m_categories)
- categories.append(value->category());
-
- result.setCategories(categories);
-
- // Location
- result.setLocation(m_location ? m_location->location() : QGeoLocation());
-
- // Rating
- result.setRatings(m_ratings ? m_ratings->ratings() : QPlaceRatings());
-
- // Supplier
- result.setSupplier(m_supplier ? m_supplier->supplier() : QPlaceSupplier());
-
- // Icon
- result.setIcon(m_icon ? m_icon->icon() : QPlaceIcon());
-
- //contact details
- QList<QPlaceContactDetail> cppDetails;
- foreach (const QString &key, m_contactDetails->keys()) {
- cppDetails.clear();
- if (m_contactDetails->value(key).type() == QVariant::List) {
- QVariantList detailsVarList = m_contactDetails->value(key).toList();
- foreach (const QVariant &detailVar, detailsVarList) {
- QDeclarativeContactDetail *detail = qobject_cast<QDeclarativeContactDetail *>(detailVar.value<QObject *>());
- if (detail)
- cppDetails.append(detail->contactDetail());
- }
- } else {
- QDeclarativeContactDetail *detail = qobject_cast<QDeclarativeContactDetail *>(m_contactDetails->value(key).value<QObject *>());
- if (detail)
- cppDetails.append(detail->contactDetail());
- }
- result.setContactDetails(key, cppDetails);
- }
-
- return result;
-}
-
-/*!
- \qmlproperty QtPositioning::Location Place::location
-
- This property holds the location of the place which can be used to retrieve the coordinate,
- address and the bounding box.
-*/
-void QDeclarativePlace::setLocation(QDeclarativeGeoLocation *location)
-{
- if (m_location == location)
- return;
-
- if (m_location && m_location->parent() == this)
- delete m_location;
-
- m_location = location;
- emit locationChanged();
-}
-
-QDeclarativeGeoLocation *QDeclarativePlace::location()
-{
- return m_location;
-}
-
-/*!
- \qmlproperty Ratings Place::ratings
-
- This property holds ratings of the place. The ratings provide an indication of the quality of a
- place.
-*/
-void QDeclarativePlace::setRatings(QDeclarativeRatings *rating)
-{
- if (m_ratings == rating)
- return;
-
- if (m_ratings && m_ratings->parent() == this)
- delete m_ratings;
-
- m_ratings = rating;
- emit ratingsChanged();
-}
-
-QDeclarativeRatings *QDeclarativePlace::ratings()
-{
-
- return m_ratings;
-}
-
-/*!
- \qmlproperty Supplier Place::supplier
-
- This property holds the supplier of the place data.
- The supplier is typically a business or organization that collected the data about the place.
-*/
-void QDeclarativePlace::setSupplier(QDeclarativeSupplier *supplier)
-{
- if (m_supplier == supplier)
- return;
-
- if (m_supplier && m_supplier->parent() == this)
- delete m_supplier;
-
- m_supplier = supplier;
- emit supplierChanged();
-}
-
-QDeclarativeSupplier *QDeclarativePlace::supplier() const
-{
- return m_supplier;
-}
-
-/*!
- \qmlproperty Icon Place::icon
-
- This property holds a graphical icon which can be used to represent the place.
-*/
-QDeclarativePlaceIcon *QDeclarativePlace::icon() const
-{
- return m_icon;
-}
-
-void QDeclarativePlace::setIcon(QDeclarativePlaceIcon *icon)
-{
- if (m_icon == icon)
- return;
-
- if (m_icon && m_icon->parent() == this)
- delete m_icon;
-
- m_icon = icon;
- emit iconChanged();
-}
-
-/*!
- \qmlproperty string Place::name
-
- This property holds the name of the place which can be used to represent the place.
-*/
-void QDeclarativePlace::setName(const QString &name)
-{
- if (m_src.name() != name) {
- m_src.setName(name);
- emit nameChanged();
- }
-}
-
-QString QDeclarativePlace::name() const
-{
- return m_src.name();
-}
-
-/*!
- \qmlproperty string Place::placeId
-
- This property holds the unique identifier of the place. The place identifier is only meaningful to the
- \l Plugin that generated it and is not transferable between \l {Plugin}{Plugins}. The place id
- is not guaranteed to be universally unique, but unique within the \l Plugin that generated it.
-
- If only the place identifier is known, all other place data can fetched from the \l Plugin.
-
- \snippet declarative/places.qml Place placeId
-*/
-void QDeclarativePlace::setPlaceId(const QString &placeId)
-{
- if (m_src.placeId() != placeId) {
- m_src.setPlaceId(placeId);
- emit placeIdChanged();
- }
-}
-
-QString QDeclarativePlace::placeId() const
-{
- return m_src.placeId();
-}
-
-/*!
- \qmlproperty string Place::attribution
-
- This property holds a rich text attribution string for the place.
- Some providers may require that the attribution be shown to the user
- whenever a place is displayed. The contents of this property should
- be shown to the user if it is not empty.
-*/
-void QDeclarativePlace::setAttribution(const QString &attribution)
-{
- if (m_src.attribution() != attribution) {
- m_src.setAttribution(attribution);
- emit attributionChanged();
- }
-}
-
-QString QDeclarativePlace::attribution() const
-{
- return m_src.attribution();
-}
-
-/*!
- \qmlproperty bool Place::detailsFetched
-
- This property indicates whether the details of the place have been fetched. If this property
- is false, the place details have not yet been fetched. Fetching can be done by invoking the
- \l getDetails() method.
-
- \sa getDetails()
-*/
-bool QDeclarativePlace::detailsFetched() const
-{
- return m_src.detailsFetched();
-}
-
-/*!
- \qmlproperty enumeration Place::status
-
- This property holds the status of the place. It can be one of:
-
- \table
- \row
- \li Place.Ready
- \li No error occurred during the last operation, further operations may be performed on
- the place.
- \row
- \li Place.Saving
- \li The place is currently being saved, no other operation may be performed until
- complete.
- \row
- \li Place.Fetching
- \li The place details are currently being fetched, no other operations may be performed
- until complete.
- \row
- \li Place.Removing
- \li The place is currently being removed, no other operations can be performed until
- complete.
- \row
- \li Place.Error
- \li An error occurred during the last operation, further operations can still be
- performed on the place.
- \endtable
-
- The status of a place can be checked by connecting the status property
- to a handler function, and then have the handler function process the change
- in status.
-
- \snippet declarative/places.qml Place checkStatus
- \dots
- \snippet declarative/places.qml Place checkStatus handler
-
-*/
-void QDeclarativePlace::setStatus(Status status, const QString &errorString)
-{
- Status originalStatus = m_status;
- m_status = status;
- m_errorString = errorString;
-
- if (originalStatus != m_status)
- emit statusChanged();
-}
-
-QDeclarativePlace::Status QDeclarativePlace::status() const
-{
- return m_status;
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::finished()
-{
- if (!m_reply)
- return;
-
- if (m_reply->error() == QPlaceReply::NoError) {
- switch (m_reply->type()) {
- case (QPlaceReply::IdReply) : {
- QPlaceIdReply *idReply = qobject_cast<QPlaceIdReply *>(m_reply);
-
- switch (idReply->operationType()) {
- case QPlaceIdReply::SavePlace:
- setPlaceId(idReply->id());
- break;
- case QPlaceIdReply::RemovePlace:
- break;
- default:
- //Other operation types shouldn't ever be received.
- break;
- }
- break;
- }
- case (QPlaceReply::DetailsReply): {
- QPlaceDetailsReply *detailsReply = qobject_cast<QPlaceDetailsReply *>(m_reply);
- setPlace(detailsReply->place());
- break;
- }
- default:
- //other types of replies shouldn't ever be received.
- break;
- }
-
- m_errorString.clear();
-
- m_reply->deleteLater();
- m_reply = 0;
-
- setStatus(QDeclarativePlace::Ready);
- } else {
- QString errorString = m_reply->errorString();
-
- m_reply->deleteLater();
- m_reply = 0;
-
- setStatus(QDeclarativePlace::Error, errorString);
- }
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::contactsModified(const QString &key, const QVariant &)
-{
- primarySignalsEmission(key);
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::cleanupDeletedCategories()
-{
- foreach (QDeclarativeCategory * category, m_categoriesToBeDeleted) {
- if (category->parent() == this)
- delete category;
- }
- m_categoriesToBeDeleted.clear();
-}
-
-/*!
- \qmlmethod void Place::getDetails()
-
- This method starts fetching place details.
-
- The \l status property will change to Place.Fetching while the fetch is in progress. On
- success the object's properties will be updated, \l status will be set to Place.Ready and
- \l detailsFetched will be set to true. On error \l status will be set to Place.Error. The
- \l errorString() method can be used to get the details of the error.
-*/
-void QDeclarativePlace::getDetails()
-{
- QPlaceManager *placeManager = manager();
- if (!placeManager)
- return;
-
- m_reply = placeManager->getPlaceDetails(placeId());
- connect(m_reply, SIGNAL(finished()), this, SLOT(finished()));
- setStatus(QDeclarativePlace::Fetching);
-}
-
-/*!
- \qmlmethod void Place::save()
-
- This method performs a save operation on the place.
-
- The \l status property will change to Place.Saving while the save operation is in progress. On
- success the \l status will be set to Place.Ready. On error \l status will be set to Place.Error.
- The \l errorString() method can be used to get the details of the error.
-
- If the \l placeId property was previously empty, it will be assigned a valid value automatically
- during a successful save operation.
-
- Note that a \l PlaceSearchModel will call Place::getDetails on any place that it detects an update
- on. A consequence of this is that whenever a Place from a \l PlaceSearchModel is successfully saved,
- it will be followed by a fetch of place details, leading to a sequence of state changes
- of \c Saving, \c Ready, \c Fetching, \c Ready.
-
-*/
-void QDeclarativePlace::save()
-{
- QPlaceManager *placeManager = manager();
- if (!placeManager)
- return;
-
- m_reply = placeManager->savePlace(place());
- connect(m_reply, SIGNAL(finished()), this, SLOT(finished()));
- setStatus(QDeclarativePlace::Saving);
-}
-
-/*!
- \qmlmethod void Place::remove()
-
- This method performs a remove operation on the place.
-
- The \l status property will change to Place.Removing while the save operation is in progress.
- On success \l status will be set to Place.Ready. On error \l status will be set to
- Place.Error. The \l errorString() method can be used to get the details of the error.
-*/
-void QDeclarativePlace::remove()
-{
- QPlaceManager *placeManager = manager();
- if (!placeManager)
- return;
-
- m_reply = placeManager->removePlace(place().placeId());
- connect(m_reply, SIGNAL(finished()), this, SLOT(finished()));
- setStatus(QDeclarativePlace::Removing);
-}
-
-/*!
- \qmlmethod string Place::errorString()
-
- Returns a string description of the error of the last operation. If the last operation
- completed successfully then the string is empty.
-*/
-QString QDeclarativePlace::errorString() const
-{
- return m_errorString;
-}
-
-/*!
- \qmlproperty string Place::primaryPhone
-
- This property holds the primary phone number of the place. If no "phone" contact detail is
- defined for this place, this property will be an empty string. It is equivalent to:
-
-
- \snippet declarative/places.qml Place primaryPhone
-*/
-QString QDeclarativePlace::primaryPhone() const
-{
- return primaryValue(QPlaceContactDetail::Phone);
-}
-
-/*!
- \qmlproperty string Place::primaryFax
-
- This property holds the primary fax number of the place. If no "fax" contact detail is
- defined for this place this property will be an empty string. It is equivalent to
-
- \snippet declarative/places.qml Place primaryFax
-*/
-QString QDeclarativePlace::primaryFax() const
-{
- return primaryValue(QPlaceContactDetail::Fax);
-}
-
-/*!
- \qmlproperty string Place::primaryEmail
-
- This property holds the primary email address of the place. If no "email" contact detail is
- defined for this place this property will be an empty string. It is equivalent to
-
- \snippet declarative/places.qml Place primaryEmail
-*/
-QString QDeclarativePlace::primaryEmail() const
-{
- return primaryValue(QPlaceContactDetail::Email);
-}
-
-/*!
- \qmlproperty string Place::primaryWebsite
-
- This property holds the primary website url of the place. If no "website" contact detail is
- defined for this place this property will be an empty string. It is equivalent to
-
- \snippet declarative/places.qml Place primaryWebsite
-*/
-
-QUrl QDeclarativePlace::primaryWebsite() const
-{
- return QUrl(primaryValue(QPlaceContactDetail::Website));
-}
-
-/*!
- \qmlproperty ExtendedAttributes Place::extendedAttributes
-
- This property holds the extended attributes of a place. Extended attributes are additional
- information about a place not covered by the place's properties.
-*/
-QQmlPropertyMap *QDeclarativePlace::extendedAttributes() const
-{
- return m_extendedAttributes;
-}
-
-/*!
- \qmlproperty ContactDetails Place::contactDetails
-
- This property holds the contact information for this place, for example a phone number or
- a website URL. This property is a map of \l ContactDetail objects.
-*/
-QDeclarativeContactDetails *QDeclarativePlace::contactDetails() const
-{
- return m_contactDetails;
-}
-
-/*!
- \qmlproperty list<Category> Place::categories
-
- This property holds the list of categories this place is a member of. The categories that can
- be assigned to a place are specific to each \l plugin.
-*/
-QQmlListProperty<QDeclarativeCategory> QDeclarativePlace::categories()
-{
- return QQmlListProperty<QDeclarativeCategory>(this,
- 0, // opaque data parameter
- category_append,
- category_count,
- category_at,
- category_clear);
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::category_append(QQmlListProperty<QDeclarativeCategory> *prop,
- QDeclarativeCategory *value)
-{
- QDeclarativePlace *object = static_cast<QDeclarativePlace *>(prop->object);
-
- if (object->m_categoriesToBeDeleted.contains(value))
- object->m_categoriesToBeDeleted.removeAll(value);
-
- if (!object->m_categories.contains(value)) {
- object->m_categories.append(value);
- QList<QPlaceCategory> list = object->m_src.categories();
- list.append(value->category());
- object->m_src.setCategories(list);
-
- emit object->categoriesChanged();
- }
-}
-
-/*!
- \internal
-*/
-int QDeclarativePlace::category_count(QQmlListProperty<QDeclarativeCategory> *prop)
-{
- return static_cast<QDeclarativePlace *>(prop->object)->m_categories.count();
-}
-
-/*!
- \internal
-*/
-QDeclarativeCategory *QDeclarativePlace::category_at(QQmlListProperty<QDeclarativeCategory> *prop,
- int index)
-{
- QDeclarativePlace *object = static_cast<QDeclarativePlace *>(prop->object);
- QDeclarativeCategory *res = NULL;
- if (object->m_categories.count() > index && index > -1) {
- res = object->m_categories[index];
- }
- return res;
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::category_clear(QQmlListProperty<QDeclarativeCategory> *prop)
-{
- QDeclarativePlace *object = static_cast<QDeclarativePlace *>(prop->object);
- if (object->m_categories.isEmpty())
- return;
-
- for (int i = 0; i < object->m_categories.count(); ++i) {
- if (object->m_categories.at(i)->parent() == object)
- object->m_categoriesToBeDeleted.append(object->m_categories.at(i));
- }
-
- object->m_categories.clear();
- object->m_src.setCategories(QList<QPlaceCategory>());
- emit object->categoriesChanged();
- QMetaObject::invokeMethod(object, "cleanupDeletedCategories", Qt::QueuedConnection);
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::synchronizeCategories()
-{
- qDeleteAll(m_categories);
- m_categories.clear();
- foreach (const QPlaceCategory &value, m_src.categories()) {
- QDeclarativeCategory *declarativeValue = new QDeclarativeCategory(value, m_plugin, this);
- m_categories.append(declarativeValue);
- }
-}
-
-/*!
- \qmlproperty enumeration Place::visibility
-
- This property holds the visibility of the place. It can be one of:
-
- \table
- \row
- \li Place.UnspecifiedVisibility
- \li The visibility of the place is unspecified, the default visibility of the \l Plugin
- will be used.
- \row
- \li Place.DeviceVisibility
- \li The place is limited to the current device. The place will not be transferred off
- of the device.
- \row
- \li Place.PrivateVisibility
- \li The place is private to the current user. The place may be transferred to an online
- service but is only ever visible to the current user.
- \row
- \li Place.PublicVisibility
- \li The place is public.
- \endtable
-
- Note that visibility does not affect how the place is displayed
- in the user-interface of an application on the device. Instead,
- it defines the sharing semantics of the place.
-*/
-QDeclarativePlace::Visibility QDeclarativePlace::visibility() const
-{
- return static_cast<QDeclarativePlace::Visibility>(m_src.visibility());
-}
-
-void QDeclarativePlace::setVisibility(Visibility visibility)
-{
- if (static_cast<QDeclarativePlace::Visibility>(m_src.visibility()) == visibility)
- return;
-
- m_src.setVisibility(static_cast<QLocation::Visibility>(visibility));
- emit visibilityChanged();
-}
-
-/*!
- \qmlproperty Place Place::favorite
-
- This property holds the favorite instance of a place.
-*/
-QDeclarativePlace *QDeclarativePlace::favorite() const
-{
- return m_favorite;
-}
-
-void QDeclarativePlace::setFavorite(QDeclarativePlace *favorite)
-{
-
- if (m_favorite == favorite)
- return;
-
- if (m_favorite && m_favorite->parent() == this)
- delete m_favorite;
-
- m_favorite = favorite;
- emit favoriteChanged();
-}
-
-/*!
- \qmlmethod void Place::copyFrom(Place original)
-
- Copies data from an \a original place into this place. Only data that is supported by this
- place's plugin is copied over and plugin specific data such as place identifier is not copied over.
-*/
-void QDeclarativePlace::copyFrom(QDeclarativePlace *original)
-{
- QPlaceManager *placeManager = manager();
- if (!placeManager)
- return;
-
- setPlace(placeManager->compatiblePlace(original->place()));
-}
-
-/*!
- \qmlmethod void Place::initializeFavorite(Plugin destinationPlugin)
-
- Creates a favorite instance for the place which is to be saved into the
- \a destination plugin. This method does nothing if the favorite property is
- not null.
-*/
-void QDeclarativePlace::initializeFavorite(QDeclarativeGeoServiceProvider *plugin)
-{
- if (m_favorite == 0) {
- QDeclarativePlace *place = new QDeclarativePlace(this);
- place->setPlugin(plugin);
- place->copyFrom(this);
- setFavorite(place);
- }
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::synchronizeExtendedAttributes()
-{
- QStringList keys = m_extendedAttributes->keys();
- foreach (const QString &key, keys)
- m_extendedAttributes->clear(key);
-
- QStringList attributeTypes = m_src.extendedAttributeTypes();
- foreach (const QString &attributeType, attributeTypes) {
- m_extendedAttributes->insert(attributeType,
- qVariantFromValue(new QDeclarativePlaceAttribute(m_src.extendedAttribute(attributeType))));
- }
-
- emit extendedAttributesChanged();
-}
-
-/*!
- \internal
-*/
-void QDeclarativePlace::synchronizeContacts()
-{
- //clear out contact data
- foreach (const QString &contactType, m_contactDetails->keys()) {
- QList<QVariant> contacts = m_contactDetails->value(contactType).toList();
- foreach (const QVariant &var, contacts) {
- QObject *obj = var.value<QObject *>();
- if (obj->parent() == this)
- delete obj;
- }
- m_contactDetails->insert(contactType, QVariantList());
- }
-
- //insert new contact data from source place
- foreach (const QString &contactType, m_src.contactTypes()) {
- QList<QPlaceContactDetail> sourceContacts = m_src.contactDetails(contactType);
- QVariantList declContacts;
- foreach (const QPlaceContactDetail &sourceContact, sourceContacts) {
- QDeclarativeContactDetail *declContact = new QDeclarativeContactDetail(this);
- declContact->setContactDetail(sourceContact);
- declContacts.append(QVariant::fromValue(qobject_cast<QObject *>(declContact)));
- }
- m_contactDetails->insert(contactType, declContacts);
- }
- primarySignalsEmission();
-}
-
-/*!
- \internal
- Helper function to emit the signals for the primary___()
- fields. It is expected that the values of the primary___()
- functions have already been modified to new values.
-*/
-void QDeclarativePlace::primarySignalsEmission(const QString &type)
-{
- if (type.isEmpty() || type == QPlaceContactDetail::Phone) {
- if (m_prevPrimaryPhone != primaryPhone()) {
- m_prevPrimaryPhone = primaryPhone();
- emit primaryPhoneChanged();
- }
- if (!type.isEmpty())
- return;
- }
-
- if (type.isEmpty() || type == QPlaceContactDetail::Email) {
- if (m_prevPrimaryEmail != primaryEmail()) {
- m_prevPrimaryEmail = primaryEmail();
- emit primaryEmailChanged();
- }
- if (!type.isEmpty())
- return;
- }
-
- if (type.isEmpty() || type == QPlaceContactDetail::Website) {
- if (m_prevPrimaryWebsite != primaryWebsite()) {
- m_prevPrimaryWebsite = primaryWebsite();
- emit primaryWebsiteChanged();
- }
- if (!type.isEmpty())
- return;
- }
-
- if (type.isEmpty() || type == QPlaceContactDetail::Fax) {
- if (m_prevPrimaryFax != primaryFax()) {
- m_prevPrimaryFax = primaryFax();
- emit primaryFaxChanged();
- }
- }
-}
-
-/*!
- \internal
- Helper function to return the manager, this manager is intended to be used
- to perform the next operation. If a an operation is currently underway
- then return a null pointer.
-*/
-QPlaceManager *QDeclarativePlace::manager()
-{
- if (m_status != QDeclarativePlace::Ready && m_status != QDeclarativePlace::Error)
- return 0;
-
- if (m_reply) {
- m_reply->abort();
- m_reply->deleteLater();
- m_reply = 0;
- }
-
- if (!m_plugin) {
- qmlWarning(this) << QStringLiteral("Plugin is not assigned to place.");
- return 0;
- }
-
- QGeoServiceProvider *serviceProvider = m_plugin->sharedGeoServiceProvider();
- if (!serviceProvider)
- return 0;
-
- QPlaceManager *placeManager = serviceProvider->placeManager();
-
- if (!placeManager) {
- setStatus(Error, QCoreApplication::translate(CONTEXT_NAME, PLUGIN_ERROR)
- .arg(m_plugin->name()).arg(serviceProvider->errorString()));
- return 0;
- }
-
- return placeManager;
-}
-
-/*!
- \internal
-*/
-QString QDeclarativePlace::primaryValue(const QString &contactType) const
-{
- QVariant value = m_contactDetails->value(contactType);
- if (value.userType() == qMetaTypeId<QJSValue>())
- value = value.value<QJSValue>().toVariant();
-
- if (value.userType() == QVariant::List) {
- QVariantList detailList = m_contactDetails->value(contactType).toList();
- if (!detailList.isEmpty()) {
- QDeclarativeContactDetail *primaryDetail = qobject_cast<QDeclarativeContactDetail *>(detailList.at(0).value<QObject *>());
- if (primaryDetail)
- return primaryDetail->value();
- }
- } else if (value.userType() == QMetaType::QObjectStar) {
- QDeclarativeContactDetail *primaryDetail = qobject_cast<QDeclarativeContactDetail *>(m_contactDetails->value(contactType).value<QObject *>());
- if (primaryDetail)
- return primaryDetail->value();
- }
-
- return QString();
-}