• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
  • cloudsync
RouteSyncManager.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2013 Utku Aydın <utkuaydin34@gmail.com>
9 //
10 
11 #include "RouteSyncManager.h"
12 
13 #include "GeoDataParser.h"
14 #include "MarbleDirs.h"
15 #include "MarbleDebug.h"
16 #include "GeoDataFolder.h"
17 #include "GeoDataDocument.h"
18 #include "GeoDataPlacemark.h"
19 #include "CloudRoutesDialog.h"
20 #include "CloudSyncManager.h"
21 #include "OwncloudSyncBackend.h"
22 #include "RoutingManager.h"
23 
24 #include <QDir>
25 #include <QUrl>
26 #include <QFile>
27 #include <QTimer>
28 #include <QPointer>
29 #include <QScriptValue>
30 #include <QScriptEngine>
31 #include <QNetworkReply>
32 #include <QTemporaryFile>
33 #include <QNetworkRequest>
34 #include <QNetworkAccessManager>
35 
36 namespace Marble
37 {
38 
42 class RouteSyncManager::Private {
43 public:
44  Private( CloudSyncManager *cloudSyncManager );
45 
46  bool m_routeSyncEnabled;
47  CloudSyncManager *m_cloudSyncManager;
48  RoutingManager *m_routingManager;
49  CloudRouteModel *m_model;
50 
51  QDir m_cacheDir;
52  OwncloudSyncBackend m_owncloudBackend;
53  QVector<RouteItem> m_routeList;
54 };
55 
56 RouteSyncManager::Private::Private( CloudSyncManager *cloudSyncManager ) :
57  m_routeSyncEnabled( false ),
58  m_cloudSyncManager( cloudSyncManager ),
59  m_routingManager( 0 ),
60  m_model( new CloudRouteModel() ),
61  m_owncloudBackend( cloudSyncManager )
62 {
63  m_cacheDir = QDir( MarbleDirs::localPath() + "/cloudsync/cache/routes/" );
64 }
65 
66 RouteSyncManager::RouteSyncManager(CloudSyncManager *cloudSyncManager) :
67  d( new Private( cloudSyncManager ) )
68 {
69  connect( &d->m_owncloudBackend, SIGNAL(routeUploadProgress(qint64,qint64)), this, SLOT(updateUploadProgressbar(qint64,qint64)) );
70  connect( &d->m_owncloudBackend, SIGNAL(routeListDownloaded(QVector<RouteItem>)), this, SLOT(setRouteModelItems(QVector<RouteItem>)) );
71  connect( &d->m_owncloudBackend, SIGNAL(routeListDownloadProgress(qint64,qint64)), this, SIGNAL(routeListDownloadProgress(qint64,qint64)) );
72  connect( &d->m_owncloudBackend, SIGNAL(routeDownloadProgress(qint64,qint64)), d->m_model, SLOT(updateProgress(qint64,qint64)) );
73  connect( &d->m_owncloudBackend, SIGNAL(routeDownloaded()), this, SLOT(prepareRouteList()) );
74  connect( &d->m_owncloudBackend, SIGNAL(routeDeleted()), this, SLOT(prepareRouteList()) );
75  connect( &d->m_owncloudBackend, SIGNAL(removedFromCache( QString )), this, SLOT(prepareRouteList()) );
76 }
77 
78 RouteSyncManager::~RouteSyncManager()
79 {
80  delete d;
81 }
82 
83 void RouteSyncManager::setRoutingManager(RoutingManager *routingManager)
84 {
85  d->m_routingManager = routingManager;
86 }
87 
88 bool RouteSyncManager::isRouteSyncEnabled() const
89 {
90  return d->m_routeSyncEnabled && d->m_cloudSyncManager && d->m_cloudSyncManager->isSyncEnabled();
91 }
92 
93 void RouteSyncManager::setRouteSyncEnabled( bool enabled )
94 {
95  if ( d->m_routeSyncEnabled != enabled ) {
96  d->m_routeSyncEnabled = enabled;
97  emit routeSyncEnabledChanged( d->m_routeSyncEnabled );
98  }
99 }
100 
101 CloudRouteModel* RouteSyncManager::model()
102 {
103  return d->m_model;
104 }
105 
106 QString RouteSyncManager::generateTimestamp() const
107 {
108  qint64 timestamp = QDateTime::currentMSecsSinceEpoch();
109  return QString::number( timestamp );
110 }
111 
112 QString RouteSyncManager::saveDisplayedToCache() const
113 {
114  if ( !d->m_routingManager ) {
115  qWarning() << "RoutingManager instance not set in RouteSyncManager. Cannot save current route.";
116  return QString();
117  }
118 
119  d->m_cacheDir.mkpath( d->m_cacheDir.absolutePath() );
120 
121  const QString timestamp = generateTimestamp();
122  const QString filename = d->m_cacheDir.absolutePath() + '/' + timestamp + ".kml";
123  d->m_routingManager->saveRoute( filename );
124  return timestamp;
125 }
126 
127 void RouteSyncManager::uploadRoute()
128 {
129  if( !d->m_cloudSyncManager->workOffline() ) {
130  d->m_owncloudBackend.uploadRoute( saveDisplayedToCache() );
131  }
132 }
133 
134 QVector<RouteItem> RouteSyncManager::cachedRouteList() const
135 {
136  QVector<RouteItem> routeList;
137  QStringList cachedRoutes = d->m_cacheDir.entryList( QStringList() << "*.kml", QDir::Files );
138  foreach ( const QString &routeFilename, cachedRoutes ) {
139  QFile file( d->m_cacheDir.absolutePath() + '/' + routeFilename );
140  file.open( QFile::ReadOnly );
141 
142  GeoDataParser parser( GeoData_KML );
143  if( !parser.read( &file ) ) {
144  mDebug() << "Could not read " + routeFilename;
145  }
146 
147  file.close();
148 
149  QString routeName;
150  GeoDocument *geoDoc = parser.releaseDocument();
151  GeoDataDocument *container = dynamic_cast<GeoDataDocument*>( geoDoc );
152  if ( container && container->size() > 0 ) {
153  GeoDataFolder *folder = container->folderList().at( 0 );
154  foreach ( GeoDataPlacemark *placemark, folder->placemarkList() ) {
155  routeName.append( placemark->name() );
156  routeName.append( " - " );
157  }
158  }
159 
160  routeName = routeName.left( routeName.length() - 3 );
161  QString timestamp = routeFilename.left( routeFilename.length() - 4 );
162  QString distance = QString('0');
163  QString duration = QString('0');
164 
165  QString previewPath = QString( "%0/preview/%1.jpg" ).arg( d->m_cacheDir.absolutePath(), timestamp );
166  QIcon preview;
167 
168  if( QFile( previewPath ).exists() ) {
169  preview = QIcon( previewPath );
170  }
171 
172  // Would that work on Windows?
173  QUrl previewUrl( QString( "file://%0" ).arg( previewPath ) );
174 
175  RouteItem item;
176  item.setIdentifier( timestamp );
177  item.setName( routeName );
178  item.setDistance( distance );
179  item.setDistance( duration );
180  item.setPreview( preview );
181  item.setPreviewUrl( previewUrl );
182  item.setOnCloud( false );
183  routeList.append( item );
184  }
185 
186  return routeList;
187 }
188 
189 void RouteSyncManager::uploadRoute( const QString &timestamp )
190 {
191  if( !d->m_cloudSyncManager->workOffline() ) {
192  d->m_owncloudBackend.uploadRoute( timestamp );
193  }
194 }
195 
196 void RouteSyncManager::prepareRouteList()
197 {
198  d->m_routeList.clear();
199 
200  QVector<RouteItem> cachedRoutes = cachedRouteList();
201  foreach( const RouteItem &item, cachedRoutes ) {
202  d->m_routeList.append( item );
203  }
204 
205  if( !d->m_cloudSyncManager->workOffline() ) {
206  d->m_owncloudBackend.downloadRouteList();
207  } else {
208  // If not offline, setRouteModelItems() does this after
209  // appending downloaded items to the list.
210  d->m_model->setItems( d->m_routeList );
211  }
212 }
213 
214 void RouteSyncManager::downloadRoute( const QString &timestamp )
215 {
216  d->m_owncloudBackend.downloadRoute( timestamp );
217 }
218 
219 void RouteSyncManager::openRoute(const QString &timestamp )
220 {
221  if ( !d->m_routingManager ) {
222  qWarning() << "RoutingManager instance not set in RouteSyncManager. Cannot open route " << timestamp;
223  return;
224  }
225 
226  d->m_routingManager->loadRoute( QString( "%0/%1.kml" )
227  .arg( d->m_cacheDir.absolutePath() )
228  .arg( timestamp ) );
229 }
230 
231 void RouteSyncManager::deleteRoute(const QString &timestamp )
232 {
233  d->m_owncloudBackend.deleteRoute( timestamp );
234 }
235 
236 void RouteSyncManager::removeRouteFromCache( const QString &timestamp )
237 {
238  d->m_owncloudBackend.removeFromCache( d->m_cacheDir, timestamp );
239 }
240 
241 void RouteSyncManager::updateUploadProgressbar( qint64 sent, qint64 total )
242 {
243  emit routeUploadProgress( sent, total );
244  if( sent == total ) {
245  prepareRouteList();
246  }
247 }
248 
249 void RouteSyncManager::setRouteModelItems( const QVector<RouteItem> &routeList )
250 {
251  if( d->m_routeList.count() > 0 ) {
252  QStringList cloudRoutes;
253  foreach( const RouteItem &item, routeList ) {
254  cloudRoutes.append( item.identifier() );
255  }
256 
257  for( int position = 0; position < d->m_routeList.count(); position++ ) {
258  if( cloudRoutes.contains( d->m_routeList.at( position ).identifier() ) ) {
259  d->m_routeList[ position ].setOnCloud( true );
260  }
261  }
262 
263  QStringList cachedRoutes;
264  foreach( const RouteItem &item, d->m_routeList ) {
265  cachedRoutes.append( item.identifier() );
266  }
267 
268  foreach( const RouteItem &item, routeList ) {
269  if( !cachedRoutes.contains( item.identifier() ) ) {
270  d->m_routeList.append( item );
271  }
272  }
273  } else {
274  foreach( const RouteItem &item, routeList ) {
275  d->m_routeList.append( item );
276  }
277  }
278 
279  d->m_model->setItems( d->m_routeList );
280 }
281 
282 }
283 
284 #include "RouteSyncManager.moc"
Marble::RouteSyncManager::model
CloudRouteModel * model()
Returns CloudRouteModel associated with RouteSyncManager instance.
Definition: RouteSyncManager.cpp:101
Marble::RouteSyncManager::saveDisplayedToCache
QString saveDisplayedToCache() const
Saves the route displayed in Marble's routing widget to local cache directory.
Definition: RouteSyncManager.cpp:112
GeoDataDocument.h
QString::append
QString & append(QChar ch)
Marble::CloudRouteModel
Definition: CloudRouteModel.h:25
Marble::GeoDataDocument
A container for Features, Styles and in the future Schemas.
Definition: GeoDataDocument.h:65
Marble::GeoDataParser
Definition: GeoDataParser.h:40
Marble::RouteSyncManager::uploadRoute
void uploadRoute()
Uploads currently displayed route to cloud.
Definition: RouteSyncManager.cpp:127
Marble::RouteSyncManager::removeRouteFromCache
void removeRouteFromCache(const QString &timestamp)
Removes route from cache.
Definition: RouteSyncManager.cpp:236
QVector::append
void append(const T &value)
CloudRoutesDialog.h
Marble::RouteSyncManager::updateUploadProgressbar
void updateUploadProgressbar(qint64 sent, qint64 total)
Updates upload progressbar.
Definition: RouteSyncManager.cpp:241
Marble::RouteItem::setPreview
void setPreview(const QIcon &preview)
Definition: RouteItem.cpp:76
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
Marble::RouteItem::setPreviewUrl
void setPreviewUrl(const QUrl &previewUrl)
Definition: RouteItem.cpp:86
Marble::RouteItem::setIdentifier
void setIdentifier(const QString &identifier)
Definition: RouteItem.cpp:56
GeoDataParser.h
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:223
Marble::RouteItem
Definition: RouteItem.h:20
QFile::exists
bool exists() const
Marble::RouteSyncManager::setRoutingManager
void setRoutingManager(RoutingManager *routingManager)
Definition: RouteSyncManager.cpp:83
MarbleDebug.h
Marble::RouteSyncManager::openRoute
void openRoute(const QString &timestamp)
Opens route.
Definition: RouteSyncManager.cpp:219
QFile
Marble::RouteSyncManager::routeUploadProgress
void routeUploadProgress(qint64 sent, qint64 total)
Marble::RouteItem::identifier
QString identifier() const
Definition: RouteItem.cpp:51
Marble::GeoData_KML
Definition: GeoDataParser.h:36
Marble::RouteSyncManager::setRouteSyncEnabled
void setRouteSyncEnabled(bool enabled)
Setter for enabling/disabling route synchronization.
Definition: RouteSyncManager.cpp:93
QDateTime::currentMSecsSinceEpoch
qint64 currentMSecsSinceEpoch()
QString::number
QString number(int n, int base)
RoutingManager.h
QList::append
void append(const T &value)
Marble::GeoParser::read
bool read(QIODevice *)
Main API for reading the XML document.
Definition: GeoParser.cpp:74
Marble::RouteSyncManager::isRouteSyncEnabled
bool isRouteSyncEnabled() const
Checks if the user enabled route synchronization.
Definition: RouteSyncManager.cpp:88
Marble::RouteSyncManager::generateTimestamp
QString generateTimestamp() const
Generates a timestamp which will be used as an unique identifier.
Definition: RouteSyncManager.cpp:106
MarbleDirs.h
Marble::GeoDataContainer::folderList
QVector< GeoDataFolder * > folderList() const
A convenience function that returns all folders in this container.
Definition: GeoDataContainer.cpp:197
RouteSyncManager.h
Marble::GeoDataContainer::size
int size() const
size of the container
Definition: GeoDataContainer.cpp:286
QString
Marble::RouteItem::setName
void setName(const QString &name)
Definition: RouteItem.cpp:66
Marble::GeoDataFolder
Definition: GeoDataFolder.h:50
GeoDataPlacemark.h
QFile::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
QStringList
Marble::RoutingManager
Delegates data retrieval and model updates to the appropriate routing provider.
Definition: RoutingManager.h:37
QUrl
Marble::RouteSyncManager::~RouteSyncManager
~RouteSyncManager()
Definition: RouteSyncManager.cpp:78
Marble::RouteSyncManager::routeListDownloadProgress
void routeListDownloadProgress(qint64 received, qint64 total)
OwncloudSyncBackend.h
QDir
GeoDataFolder.h
QVector
Marble::RouteSyncManager::deleteRoute
void deleteRoute(const QString &timestamp)
Deletes route from cloud.
Definition: RouteSyncManager.cpp:231
Marble::GeoDocument
A shared base class between GeoDataDocument/GeoSourceDocument.
Definition: GeoDocument.h:42
Marble::GeoDataFeature::name
QString name() const
The name of the feature.
Definition: GeoDataFeature.cpp:544
Marble::RouteItem::setOnCloud
void setOnCloud(const bool onCloud)
Definition: RouteItem.cpp:116
Marble::RouteSyncManager::routeSyncEnabledChanged
void routeSyncEnabledChanged(bool enabled)
QString::length
int length() const
Marble::RouteSyncManager::prepareRouteList
void prepareRouteList()
Starts preparing a route list by downloading a list of the routes on the cloud and adding the ones on...
Definition: RouteSyncManager.cpp:196
QString::left
QString left(int n) const
Marble::RouteSyncManager::downloadRoute
void downloadRoute(const QString &timestamp)
Starts the download of specified route.
Definition: RouteSyncManager.cpp:214
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Marble::RouteSyncManager::cachedRouteList
QVector< RouteItem > cachedRouteList() const
Gathers data from local cache directory and returns a route list.
Definition: RouteSyncManager.cpp:134
Marble::CloudSyncManager
Definition: CloudSyncManager.h:24
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Marble::GeoDataPlacemark
a class representing a point of interest on the map
Definition: GeoDataPlacemark.h:54
CloudSyncManager.h
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
Marble::RouteSyncManager::RouteSyncManager
RouteSyncManager(CloudSyncManager *cloudSyncManager)
Definition: RouteSyncManager.cpp:66
Marble::RouteItem::setDistance
void setDistance(const QString &distance)
Definition: RouteItem.cpp:96
QIcon
Marble::GeoParser::releaseDocument
GeoDocument * releaseDocument()
retrieve the parsed document and reset the parser If parsing was successful, retrieve the resulting d...
Definition: GeoParser.cpp:205
Marble::GeoDataContainer::placemarkList
QVector< GeoDataPlacemark * > placemarkList() const
A convenience function that returns all placemarks in this container.
Definition: GeoDataContainer.cpp:214
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal