6#include "RouteSyncManager.h"
8#include "GeoDataParser.h"
10#include "MarbleDebug.h"
11#include "GeoDataFolder.h"
12#include "GeoDataDocument.h"
13#include "GeoDataPlacemark.h"
14#include "CloudRouteModel.h"
15#include "CloudRoutesDialog.h"
16#include "CloudSyncManager.h"
17#include "OwncloudSyncBackend.h"
19#include "RoutingManager.h"
33class Q_DECL_HIDDEN RouteSyncManager::Private {
35 Private( CloudSyncManager *cloudSyncManager );
38 bool m_routeSyncEnabled;
39 CloudSyncManager *m_cloudSyncManager;
40 RoutingManager *m_routingManager;
41 CloudRouteModel *m_model;
44 OwncloudSyncBackend m_owncloudBackend;
48RouteSyncManager::Private::Private( CloudSyncManager *cloudSyncManager ) :
49 m_routeSyncEnabled( false ),
50 m_cloudSyncManager( cloudSyncManager ),
51 m_routingManager( nullptr ),
52 m_model( new CloudRouteModel() ),
53 m_owncloudBackend( cloudSyncManager )
55 m_cacheDir =
QDir(MarbleDirs::localPath() +
QLatin1String(
"/cloudsync/cache/routes/"));
58RouteSyncManager::Private::~Private()
63RouteSyncManager::RouteSyncManager(CloudSyncManager *cloudSyncManager) :
64 d( new Private( cloudSyncManager ) )
66 connect( &d->m_owncloudBackend, SIGNAL(routeUploadProgress(qint64,qint64)),
this, SLOT(updateUploadProgressbar(qint64,qint64)) );
68 connect( &d->m_owncloudBackend, SIGNAL(routeListDownloadProgress(qint64,qint64)),
this, SIGNAL(routeListDownloadProgress(qint64,qint64)) );
69 connect( &d->m_owncloudBackend, SIGNAL(routeDownloadProgress(qint64,qint64)), d->m_model, SLOT(updateProgress(qint64,qint64)) );
70 connect( &d->m_owncloudBackend, SIGNAL(routeDownloaded()),
this, SLOT(prepareRouteList()) );
71 connect( &d->m_owncloudBackend, SIGNAL(routeDeleted()),
this, SLOT(prepareRouteList()) );
72 connect( &d->m_owncloudBackend, SIGNAL(removedFromCache(
QString)),
this, SLOT(prepareRouteList()) );
75RouteSyncManager::~RouteSyncManager()
80void RouteSyncManager::setRoutingManager(RoutingManager *routingManager)
82 d->m_routingManager = routingManager;
85bool RouteSyncManager::isRouteSyncEnabled()
const
87 return d->m_routeSyncEnabled && d->m_cloudSyncManager && d->m_cloudSyncManager->isSyncEnabled();
90void RouteSyncManager::setRouteSyncEnabled(
bool enabled )
92 if ( d->m_routeSyncEnabled != enabled ) {
93 d->m_routeSyncEnabled = enabled;
94 emit routeSyncEnabledChanged( d->m_routeSyncEnabled );
98CloudRouteModel* RouteSyncManager::model()
103QString RouteSyncManager::generateTimestamp()
const
109QString RouteSyncManager::saveDisplayedToCache()
const
111 if ( !d->m_routingManager ) {
112 qWarning() <<
"RoutingManager instance not set in RouteSyncManager. Cannot save current route.";
116 d->m_cacheDir.mkpath( d->m_cacheDir.absolutePath() );
118 const QString timestamp = generateTimestamp();
120 d->m_routingManager->saveRoute( filename );
124void RouteSyncManager::uploadRoute()
126 if( !d->m_cloudSyncManager->workOffline() ) {
127 d->m_owncloudBackend.uploadRoute( saveDisplayedToCache() );
135 for (
const QString &routeFilename: cachedRoutes ) {
136 QFile file(d->m_cacheDir.absolutePath() +
QLatin1Char(
'/') + routeFilename);
139 GeoDataParser parser( GeoData_KML );
140 if( !parser.read( &file ) ) {
141 mDebug() <<
QLatin1String(
"Could not read ") + routeFilename;
147 GeoDocument *geoDoc = parser.releaseDocument();
148 GeoDataDocument *container =
dynamic_cast<GeoDataDocument*
>( geoDoc );
149 if ( container && container->size() > 0 ) {
150 GeoDataFolder *folder = container->folderList().
at( 0 );
151 for ( GeoDataPlacemark *placemark: folder->placemarkList() ) {
156 routeName = routeName.
left( routeName.
length() - 3 );
157 QString timestamp = routeFilename.
left( routeFilename.length() - 4 );
161 QString previewPath =
QString(
"%0/preview/%1.jpg" ).
arg( d->m_cacheDir.absolutePath(), timestamp );
164 if(
QFile( previewPath ).exists() ) {
165 preview =
QIcon( previewPath );
169 QUrl previewUrl(
QString(
"file://%0" ).arg( previewPath ) );
172 item.setIdentifier( timestamp );
173 item.setName( routeName );
174 item.setDistance( distance );
175 item.setDistance( duration );
176 item.setPreview( preview );
177 item.setPreviewUrl( previewUrl );
178 item.setOnCloud(
false );
185void RouteSyncManager::uploadRoute(
const QString ×tamp )
187 if( !d->m_cloudSyncManager->workOffline() ) {
188 d->m_owncloudBackend.uploadRoute( timestamp );
192void RouteSyncManager::prepareRouteList()
194 d->m_routeList.
clear();
197 for(
const RouteItem &item: cachedRoutes ) {
198 d->m_routeList.append( item );
201 if( !d->m_cloudSyncManager->workOffline() ) {
202 d->m_owncloudBackend.downloadRouteList();
206 d->m_model->setItems( d->m_routeList );
210void RouteSyncManager::downloadRoute(
const QString ×tamp )
212 d->m_owncloudBackend.downloadRoute( timestamp );
215void RouteSyncManager::openRoute(
const QString ×tamp )
217 if ( !d->m_routingManager ) {
218 qWarning() <<
"RoutingManager instance not set in RouteSyncManager. Cannot open route " << timestamp;
222 d->m_routingManager->loadRoute(
QString(
"%0/%1.kml" )
223 .arg( d->m_cacheDir.absolutePath() )
227void RouteSyncManager::deleteRoute(
const QString ×tamp )
229 d->m_owncloudBackend.deleteRoute( timestamp );
232void RouteSyncManager::removeRouteFromCache(
const QString ×tamp )
234 d->m_owncloudBackend.removeFromCache( d->m_cacheDir, timestamp );
237void RouteSyncManager::updateUploadProgressbar( qint64 sent, qint64 total )
239 emit routeUploadProgress( sent, total );
240 if( sent == total ) {
247 if( d->m_routeList.count() > 0 ) {
249 for(
const RouteItem &item: routeList ) {
250 cloudRoutes.
append( item.identifier() );
253 for(
int position = 0; position < d->m_routeList.count(); position++ ) {
254 if( cloudRoutes.
contains( d->m_routeList.at( position ).identifier() ) ) {
255 d->m_routeList[ position ].setOnCloud(
true );
260 for(
const RouteItem &item: d->m_routeList ) {
261 cachedRoutes.
append( item.identifier() );
264 for(
const RouteItem &item: routeList ) {
265 if( !cachedRoutes.
contains( item.identifier() ) ) {
266 d->m_routeList.append( item );
270 for(
const RouteItem &item: routeList ) {
271 d->m_routeList.append( item );
275 d->m_model->setItems( d->m_routeList );
280#include "moc_RouteSyncManager.cpp"
Binds a QML item to a specific geodetic location in screen coordinates.
KOSM_EXPORT double distance(const std::vector< const OSM::Node * > &path, Coordinate coord)
qint64 currentMSecsSinceEpoch()
void append(QList< T > &&value)
QString arg(Args &&... args) const const
const QChar at(qsizetype position) const const
QString left(qsizetype n) const const
qsizetype length() const const
QString number(double n, char format, int precision)
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)