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

marble

  • sources
  • kde-4.12
  • 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 
23 #include <QDir>
24 #include <QUrl>
25 #include <QFile>
26 #include <QTimer>
27 #include <QPointer>
28 #include <QScriptValue>
29 #include <QScriptEngine>
30 #include <QNetworkReply>
31 #include <QTemporaryFile>
32 #include <QNetworkRequest>
33 #include <QNetworkAccessManager>
34 
35 namespace Marble
36 {
37 
41 class RouteSyncManager::Private {
42 public:
43  Private( CloudSyncManager *cloudSyncManager );
44 
45  bool m_routeSyncEnabled;
46  CloudSyncManager *m_cloudSyncManager;
47  RoutingManager *m_routingManager;
48  CloudRouteModel *m_model;
49 
50  QDir m_cacheDir;
51  OwncloudSyncBackend m_owncloudBackend;
52  QVector<RouteItem> m_routeList;
53 };
54 
55 RouteSyncManager::Private::Private( CloudSyncManager *cloudSyncManager ) :
56  m_routeSyncEnabled( false ),
57  m_cloudSyncManager( cloudSyncManager ),
58  m_routingManager( 0 ),
59  m_model( new CloudRouteModel() ),
60  m_owncloudBackend( cloudSyncManager )
61 {
62  m_cacheDir = QDir( MarbleDirs::localPath() + "/cloudsync/cache/routes/" );
63  m_owncloudBackend.setApiUrl( m_cloudSyncManager->apiUrl() );
64 }
65 
66 RouteSyncManager::RouteSyncManager(CloudSyncManager *cloudSyncManager) :
67  d( new Private( cloudSyncManager ) )
68 {
69  connect( d->m_cloudSyncManager, SIGNAL(apiUrlChanged(QUrl)), &d->m_owncloudBackend, SLOT(setApiUrl(QUrl)) );
70  connect( &d->m_owncloudBackend, SIGNAL(routeUploadProgress(qint64,qint64)), this, SLOT(updateUploadProgressbar(qint64,qint64)) );
71  connect( &d->m_owncloudBackend, SIGNAL(routeListDownloaded(QVector<RouteItem>)), this, SLOT(setRouteModelItems(QVector<RouteItem>)) );
72  connect( &d->m_owncloudBackend, SIGNAL(routeListDownloadProgress(qint64,qint64)), this, SIGNAL(routeListDownloadProgress(qint64,qint64)) );
73  connect( &d->m_owncloudBackend, SIGNAL(routeDownloadProgress(qint64,qint64)), d->m_model, SLOT(updateProgress(qint64,qint64)) );
74  connect( &d->m_owncloudBackend, SIGNAL(routeDownloaded()), this, SLOT(prepareRouteList()) );
75  connect( &d->m_owncloudBackend, SIGNAL(routeDeleted()), this, SLOT(prepareRouteList()) );
76  connect( &d->m_owncloudBackend, SIGNAL(removedFromCache( QString )), this, SLOT(prepareRouteList()) );
77 }
78 
79 RouteSyncManager::~RouteSyncManager()
80 {
81  delete d;
82 }
83 
84 void RouteSyncManager::setRoutingManager(RoutingManager *routingManager)
85 {
86  d->m_routingManager = routingManager;
87 }
88 
89 bool RouteSyncManager::isRouteSyncEnabled() const
90 {
91  return d->m_routeSyncEnabled && d->m_cloudSyncManager && d->m_cloudSyncManager->isSyncEnabled();
92 }
93 
94 void RouteSyncManager::setRouteSyncEnabled( bool enabled )
95 {
96  if ( d->m_routeSyncEnabled != enabled ) {
97  d->m_routeSyncEnabled = enabled;
98  emit routeSyncEnabledChanged( d->m_routeSyncEnabled );
99  }
100 }
101 
102 CloudRouteModel* RouteSyncManager::model()
103 {
104  return d->m_model;
105 }
106 
107 QString RouteSyncManager::generateTimestamp() const
108 {
109  qint64 timestamp = QDateTime::currentMSecsSinceEpoch();
110  return QString::number( timestamp );
111 }
112 
113 QString RouteSyncManager::saveDisplayedToCache() const
114 {
115  if ( !d->m_routingManager ) {
116  qWarning() << "RoutingManager instance not set in RouteSyncManager. Cannot save current route.";
117  return QString();
118  }
119 
120  d->m_cacheDir.mkpath( d->m_cacheDir.absolutePath() );
121 
122  const QString timestamp = generateTimestamp();
123  const QString filename = d->m_cacheDir.absolutePath() + "/" + timestamp + ".kml";
124  d->m_routingManager->saveRoute( filename );
125  return timestamp;
126 }
127 
128 void RouteSyncManager::uploadRoute()
129 {
130  if( !d->m_cloudSyncManager->workOffline() ) {
131  d->m_owncloudBackend.uploadRoute( saveDisplayedToCache() );
132  }
133 }
134 
135 QVector<RouteItem> RouteSyncManager::cachedRouteList() const
136 {
137  QVector<RouteItem> routeList;
138  QStringList cachedRoutes = d->m_cacheDir.entryList( QStringList() << "*.kml", QDir::Files );
139  foreach ( const QString &routeFilename, cachedRoutes ) {
140  QFile file( d->m_cacheDir.absolutePath() + "/" + routeFilename );
141  file.open( QFile::ReadOnly );
142 
143  GeoDataParser parser( GeoData_KML );
144  if( !parser.read( &file ) ) {
145  mDebug() << "Could not read " + routeFilename;
146  }
147 
148  file.close();
149 
150  QString routeName;
151  GeoDocument *geoDoc = parser.releaseDocument();
152  GeoDataDocument *container = dynamic_cast<GeoDataDocument*>( geoDoc );
153  if ( container && container->size() > 0 ) {
154  GeoDataFolder *folder = container->folderList().at( 0 );
155  foreach ( GeoDataPlacemark *placemark, folder->placemarkList() ) {
156  routeName.append( placemark->name() );
157  routeName.append( " - " );
158  }
159  }
160 
161  routeName = routeName.left( routeName.length() - 3 );
162  QString timestamp = routeFilename.left( routeFilename.length() - 4 );
163  QString distance = "0";
164  QString duration = "0";
165 
166  QString previewPath = QString( "%0/preview/%1.jpg" ).arg( d->m_cacheDir.absolutePath(), timestamp );
167  QIcon preview;
168 
169  if( QFile( previewPath ).exists() ) {
170  preview = QIcon( previewPath );
171  }
172 
173  // Would that work on Windows?
174  QUrl previewUrl( QString( "file://%0" ).arg( previewPath ) );
175 
176  RouteItem item;
177  item.setIdentifier( timestamp );
178  item.setName( routeName );
179  item.setDistance( distance );
180  item.setDistance( duration );
181  item.setPreview( preview );
182  item.setPreviewUrl( previewUrl );
183  item.setOnCloud( false );
184  routeList.append( item );
185  }
186 
187  return routeList;
188 }
189 
190 void RouteSyncManager::uploadRoute( const QString &timestamp )
191 {
192  if( !d->m_cloudSyncManager->workOffline() ) {
193  d->m_owncloudBackend.uploadRoute( timestamp );
194  }
195 }
196 
197 void RouteSyncManager::prepareRouteList()
198 {
199  d->m_routeList.clear();
200 
201  QVector<RouteItem> cachedRoutes = cachedRouteList();
202  foreach( const RouteItem &item, cachedRoutes ) {
203  d->m_routeList.append( item );
204  }
205 
206  if( !d->m_cloudSyncManager->workOffline() ) {
207  d->m_owncloudBackend.downloadRouteList();
208  } else {
209  // If not offline, setRouteModelItems() does this after
210  // appending downloaded items to the list.
211  d->m_model->setItems( d->m_routeList );
212  }
213 }
214 
215 void RouteSyncManager::downloadRoute( const QString &timestamp )
216 {
217  d->m_owncloudBackend.downloadRoute( timestamp );
218 }
219 
220 void RouteSyncManager::openRoute(const QString &timestamp )
221 {
222  if ( !d->m_routingManager ) {
223  qWarning() << "RoutingManager instance not set in RouteSyncManager. Cannot open route " << timestamp;
224  return;
225  }
226 
227  d->m_routingManager->loadRoute( QString( "%0/%1.kml" )
228  .arg( d->m_cacheDir.absolutePath() )
229  .arg( timestamp ) );
230 }
231 
232 void RouteSyncManager::deleteRoute(const QString &timestamp )
233 {
234  d->m_owncloudBackend.deleteRoute( timestamp );
235 }
236 
237 void RouteSyncManager::removeRouteFromCache( const QString &timestamp )
238 {
239  d->m_owncloudBackend.removeFromCache( d->m_cacheDir, timestamp );
240 }
241 
242 void RouteSyncManager::updateUploadProgressbar( qint64 sent, qint64 total )
243 {
244  emit routeUploadProgress( sent, total );
245  if( sent == total ) {
246  prepareRouteList();
247  }
248 }
249 
250 void RouteSyncManager::setRouteModelItems( const QVector<RouteItem> &routeList )
251 {
252  if( d->m_routeList.count() > 0 ) {
253  QStringList cloudRoutes;
254  foreach( const RouteItem &item, routeList ) {
255  cloudRoutes.append( item.identifier() );
256  }
257 
258  for( int position = 0; position < d->m_routeList.count(); position++ ) {
259  if( cloudRoutes.contains( d->m_routeList.at( position ).identifier() ) ) {
260  d->m_routeList[ position ].setOnCloud( true );
261  }
262  }
263 
264  QStringList cachedRoutes;
265  foreach( const RouteItem &item, d->m_routeList ) {
266  cachedRoutes.append( item.identifier() );
267  }
268 
269  foreach( const RouteItem &item, routeList ) {
270  if( !cachedRoutes.contains( item.identifier() ) ) {
271  d->m_routeList.append( item );
272  }
273  }
274  } else {
275  foreach( const RouteItem &item, routeList ) {
276  d->m_routeList.append( item );
277  }
278  }
279 
280  d->m_model->setItems( d->m_routeList );
281 }
282 
283 }
284 
285 #include "RouteSyncManager.moc"
Marble::RouteSyncManager::model
CloudRouteModel * model()
Returns CloudRouteModel associated with RouteSyncManager instance.
Definition: RouteSyncManager.cpp:102
Marble::RouteSyncManager::saveDisplayedToCache
QString saveDisplayedToCache() const
Saves the route displayed in Marble's routing widget to local cache directory.
Definition: RouteSyncManager.cpp:113
GeoDataDocument.h
Marble::CloudRouteModel
Definition: CloudRouteModel.h:25
Marble::GeoDataDocument
A container for Features, Styles and in the future Schemas.
Definition: GeoDataDocument.h:64
Marble::GeoDataParser
Definition: GeoDataParser.h:40
Marble::RouteSyncManager::uploadRoute
void uploadRoute()
Uploads currently displayed route to cloud.
Definition: RouteSyncManager.cpp:128
Marble::RouteSyncManager::removeRouteFromCache
void removeRouteFromCache(const QString &timestamp)
Removes route from cache.
Definition: RouteSyncManager.cpp:237
CloudRoutesDialog.h
Marble::RouteSyncManager::updateUploadProgressbar
void updateUploadProgressbar(qint64 sent, qint64 total)
Updates upload progressbar.
Definition: RouteSyncManager.cpp:242
Marble::RouteItem::setPreview
void setPreview(const QIcon &preview)
Definition: RouteItem.cpp:76
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:217
Marble::RouteItem
Definition: RouteItem.h:20
Marble::RouteSyncManager::setRoutingManager
void setRoutingManager(RoutingManager *routingManager)
Definition: RouteSyncManager.cpp:84
MarbleDebug.h
Marble::RouteSyncManager::openRoute
void openRoute(const QString &timestamp)
Opens route.
Definition: RouteSyncManager.cpp:220
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:94
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:89
Marble::RouteSyncManager::generateTimestamp
QString generateTimestamp() const
Generates a timestamp which will be used as an unique identifier.
Definition: RouteSyncManager.cpp:107
MarbleDirs.h
Marble::GeoDataContainer::folderList
QVector< GeoDataFolder * > folderList() const
A convenience function that returns all folders in this container.
Definition: GeoDataContainer.cpp:90
RouteSyncManager.h
Marble::GeoDataContainer::size
int size() const
size of the container
Definition: GeoDataContainer.cpp:179
Marble::RouteItem::setName
void setName(const QString &name)
Definition: RouteItem.cpp:66
Marble::GeoDataFolder
Definition: GeoDataFolder.h:50
GeoDataPlacemark.h
Marble::RoutingManager
Delegates data retrieval and model updates to the appropriate routing provider.
Definition: RoutingManager.h:37
Marble::RouteSyncManager::~RouteSyncManager
~RouteSyncManager()
Definition: RouteSyncManager.cpp:79
Marble::RouteSyncManager::routeListDownloadProgress
void routeListDownloadProgress(qint64 received, qint64 total)
OwncloudSyncBackend.h
GeoDataFolder.h
Marble::RouteSyncManager::deleteRoute
void deleteRoute(const QString &timestamp)
Deletes route from cloud.
Definition: RouteSyncManager.cpp:232
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:480
Marble::RouteItem::setOnCloud
void setOnCloud(const bool onCloud)
Definition: RouteItem.cpp:116
Marble::RouteSyncManager::routeSyncEnabledChanged
void routeSyncEnabledChanged(bool enabled)
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:197
Marble::RouteSyncManager::downloadRoute
void downloadRoute(const QString &timestamp)
Starts the download of specified route.
Definition: RouteSyncManager.cpp:215
Marble::RouteSyncManager::cachedRouteList
QVector< RouteItem > cachedRouteList() const
Gathers data from local cache directory and returns a route list.
Definition: RouteSyncManager.cpp:135
Marble::CloudSyncManager
Definition: CloudSyncManager.h:25
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:31
Marble::RouteSyncManager::RouteSyncManager
RouteSyncManager(CloudSyncManager *cloudSyncManager)
Definition: RouteSyncManager.cpp:66
Marble::RouteItem::setDistance
void setDistance(const QString &distance)
Definition: RouteItem.cpp:96
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:107
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:52 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
  • kstars
  • libkdeedu
  •   keduvocdocument
  • 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