FileSource.h
Go to the documentation of this file.
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4  Sonic Visualiser
5  An audio file viewer and annotation editor.
6  Centre for Digital Music, Queen Mary, University of London.
7  This file copyright 2007 QMUL.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2 of the
12  License, or (at your option) any later version. See the file
13  COPYING included with this distribution for more information.
14 */
15 
16 #ifndef SV_FILE_SOURCE_H
17 #define SV_FILE_SOURCE_H
18 
19 #include <QUrl>
20 #include <QMutex>
21 #include <QString>
22 #include <QTimer>
23 #include <QNetworkReply>
24 
25 #include <map>
26 
27 #include "base/Debug.h"
28 
29 class QFile;
30 class ProgressReporter;
31 
59 class FileSource : public QObject
60 {
61  Q_OBJECT
62 
63 public:
73  FileSource(QString fileOrUrl,
74  ProgressReporter *reporter = 0,
75  QString preferredContentType = "");
76 
85  FileSource(QUrl url, ProgressReporter *reporter = 0);
86 
87  FileSource(const FileSource &);
88 
89  virtual ~FileSource();
90 
95  void waitForStatus();
96 
101  void waitForData();
102 
109  bool isOK() const;
110 
116  bool isAvailable();
117 
122  bool isDone() const;
123 
130  bool wasCancelled() const;
131 
135  bool isResource() const;
136 
140  bool isRemote() const;
141 
146  QString getLocation() const;
147 
156  QString getLocalFilename() const;
157 
162  QString getBasename() const;
163 
167  QString getContentType() const;
168 
173  QString getExtension() const;
174 
178  QString getErrorString() const;
179 
185  void setLeaveLocalFile(bool leave);
186 
191  static bool isRemote(QString fileOrUrl);
192 
197  static bool canHandleScheme(QUrl url);
198 
204  static void debugReport();
205 
206 signals:
211  void progress(int percent);
212 
218  void statusAvailable();
219 
224  void ready();
225 
226 protected slots:
227  void metaDataChanged();
228  void readyRead();
229  void replyFailed(QNetworkReply::NetworkError);
230  void replyFinished();
231  void downloadProgress(qint64 done, qint64 total);
232  void cancelled();
233 
234 protected:
235  FileSource &operator=(const FileSource &); // not provided
236 
237  QString m_rawFileOrUrl;
238  QUrl m_url;
239  QFile *m_localFile;
240  QNetworkReply *m_reply;
242  QString m_errorString;
243  QString m_contentType;
245  bool m_ok;
249  bool m_remote;
250  bool m_done;
253 
254  typedef std::map<QUrl, int> RemoteRefCountMap;
255  typedef std::map<QUrl, QString> RemoteLocalMap;
256  static RemoteRefCountMap m_refCountMap;
257  static RemoteLocalMap m_remoteLocalMap;
258  static QMutex m_mapMutex;
260 
261  void init();
262  void initRemote();
263 
264  void cleanup();
265 
266  // Create a local file for m_url. If it already existed, return true.
267  // The local filename is stored in m_localFilename.
268  bool createCacheFile();
269  void deleteCacheFile();
270 
271  static QMutex m_fileCreationMutex;
272  static int m_count;
273 };
274 
275 #endif
int m_lastStatus
Definition: FileSource.h:247
QString m_contentType
Definition: FileSource.h:243
void setLeaveLocalFile(bool leave)
Specify whether any local, cached file should remain on disc after this FileSource has been destroyed...
Definition: FileSource.cpp:580
static int m_count
Definition: FileSource.h:272
QString getLocation() const
Return the location filename or URL as passed to the constructor.
Definition: FileSource.cpp:616
void metaDataChanged()
Definition: FileSource.cpp:662
void downloadProgress(qint64 done, qint64 total)
Definition: FileSource.cpp:730
bool isRemote() const
Return true if this FileSource is referring to a remote URL.
Definition: FileSource.cpp:610
FileSource(QString fileOrUrl, ProgressReporter *reporter=0, QString preferredContentType="")
Construct a FileSource using the given local file path or URL.
Definition: FileSource.cpp:90
QFile * m_localFile
Definition: FileSource.h:239
QString getLocalFilename() const
Return the name of the local file this FileSource refers to.
Definition: FileSource.cpp:622
void statusAvailable()
Emitted when the file&#39;s existence has been tested and/or response header received.
bool m_done
Definition: FileSource.h:250
static QMutex m_fileCreationMutex
Definition: FileSource.h:271
QString m_preferredContentType
Definition: FileSource.h:244
void cleanup()
Definition: FileSource.cpp:501
QString getBasename() const
Return the base name, i.e.
Definition: FileSource.cpp:628
void cancelled()
Definition: FileSource.cpp:737
static RemoteLocalMap m_remoteLocalMap
Definition: FileSource.h:257
void waitForData()
Block on a sub-event-loop until the whole of the data has been retrieved (if it is remote)...
Definition: FileSource.cpp:570
QNetworkReply * m_reply
Definition: FileSource.h:240
void progress(int percent)
Emitted during URL retrieval, when the retrieval progress notches up to a new percentage.
QString getErrorString() const
Return an error message, if isOK() is false.
Definition: FileSource.cpp:650
void init()
Definition: FileSource.cpp:286
void waitForStatus()
Block on a sub-event-loop until the availability of the file or remote URL is known.
Definition: FileSource.cpp:561
void replyFinished()
Definition: FileSource.cpp:748
static void debugReport()
Print some stats, if FileSource was compiled with debugging.
Definition: FileSource.cpp:85
virtual ~FileSource()
Definition: FileSource.cpp:273
bool m_refCounted
Definition: FileSource.h:259
bool wasCancelled() const
Return true if the operation was cancelled by the user through the ProgressReporter interface...
Definition: FileSource.cpp:598
bool m_leaveLocalFile
Definition: FileSource.h:251
void initRemote()
Definition: FileSource.cpp:459
std::map< QUrl, QString > RemoteLocalMap
Definition: FileSource.h:255
bool m_remote
Definition: FileSource.h:249
void replyFailed(QNetworkReply::NetworkError)
Definition: FileSource.cpp:794
bool isDone() const
Return true if the entire file has been retrieved and is available.
Definition: FileSource.cpp:592
ProgressReporter * m_reporter
Definition: FileSource.h:252
FileSource & operator=(const FileSource &)
FileSource is a class used to refer to the contents of a file that may be either local or at a remote...
Definition: FileSource.h:59
QString m_errorString
Definition: FileSource.h:242
std::map< QUrl, int > RemoteRefCountMap
Definition: FileSource.h:254
QString getContentType() const
Return the MIME content type of this file, if known.
Definition: FileSource.cpp:634
static QMutex m_mapMutex
Definition: FileSource.h:258
bool isResource() const
Return true if this FileSource is referring to a QRC resource.
Definition: FileSource.cpp:604
static RemoteRefCountMap m_refCountMap
Definition: FileSource.h:256
QUrl m_url
Definition: FileSource.h:238
void readyRead()
Definition: FileSource.cpp:656
bool m_resource
Definition: FileSource.h:248
void ready()
Emitted when the entire file data has been retrieved and the local file is complete (if no error has ...
QString m_localFilename
Definition: FileSource.h:241
static bool canHandleScheme(QUrl url)
Return true if FileSource can handle the retrieval scheme for the given URL (or if the URL is for a l...
Definition: FileSource.cpp:534
bool m_cancelled
Definition: FileSource.h:246
QString getExtension() const
Return the file extension for this file, if any.
Definition: FileSource.cpp:640
QString m_rawFileOrUrl
Definition: FileSource.h:237
bool createCacheFile()
Definition: FileSource.cpp:864
void deleteCacheFile()
Definition: FileSource.cpp:809
bool isOK() const
Return true if the FileSource object is valid and neither error nor cancellation occurred while retri...
Definition: FileSource.cpp:586
bool isAvailable()
Return true if the file or remote URL exists.
Definition: FileSource.cpp:544