fb2temp.hpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #ifndef FB2TEMP_H
  2. #define FB2TEMP_H
  3. #include <QByteArray>
  4. #include <QLabel>
  5. #include <QList>
  6. #include <QNetworkAccessManager>
  7. #include <QNetworkReply>
  8. #include <QString>
  9. #include <QTemporaryFile>
  10. #include <QToolBar>
  11. #include <QListView>
  12. class FbTextEdit;
  13. class FbTemporaryFile : public QTemporaryFile
  14. {
  15. Q_OBJECT
  16. public:
  17. static QString md5(const QByteArray &data);
  18. public:
  19. explicit FbTemporaryFile(const QString &name);
  20. inline qint64 write(const QByteArray &data);
  21. void setHash(const QString &hash) { m_hash = hash; }
  22. const QString & hash() const { return m_hash; }
  23. const QString & name() const { return m_name; }
  24. QByteArray data();
  25. private:
  26. const QString m_name;
  27. QString m_hash;
  28. };
  29. class FbTemporaryList : public QList<FbTemporaryFile*>
  30. {
  31. public:
  32. explicit FbTemporaryList();
  33. virtual ~FbTemporaryList();
  34. QString add(const QString &path, const QByteArray &data);
  35. bool exists(const QString &name) const;
  36. FbTemporaryFile * get(const QString &name) const;
  37. const QString & set(const QString &name, const QByteArray &data, const QString &hash = QString());
  38. QString name(const QString &hash) const;
  39. QByteArray data(const QString &name) const;
  40. private:
  41. QString newName(const QString &path);
  42. };
  43. typedef QListIterator<FbTemporaryFile*> FbTemporaryIterator;
  44. #if 0
  45. class FbNetworkDiskCache : public QNetworkDiskCache
  46. {
  47. public:
  48. explicit FbNetworkDiskCache(QObject *parent = 0) : QNetworkDiskCache(parent) {}
  49. QNetworkCacheMetaData metaData(const QUrl &url);
  50. QIODevice *data(const QUrl &url);
  51. };
  52. #endif
  53. class FbImageReply : public QNetworkReply
  54. {
  55. Q_OBJECT
  56. public:
  57. explicit FbImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data);
  58. qint64 bytesAvailable() const { return content.size(); }
  59. bool isSequential() const { return true; }
  60. void abort() { close(); }
  61. protected:
  62. qint64 readData(char *data, qint64 maxSize);
  63. private:
  64. QByteArray content;
  65. qint64 offset;
  66. };
  67. class FbNetworkAccessManager : public QNetworkAccessManager
  68. {
  69. Q_OBJECT
  70. public:
  71. explicit FbNetworkAccessManager(QObject *parent = 0);
  72. FbTemporaryList & files() { return m_files; }
  73. void setPath(const QString &path) { m_path = path; }
  74. public slots:
  75. void data(QString name, QByteArray data);
  76. public:
  77. QString add(const QString &path, const QByteArray &data) { return m_files.add(path, data); }
  78. bool exists(const QString &name) const { return m_files.exists(name); }
  79. FbTemporaryFile * get(const QString &name) const { return m_files.get(name); }
  80. int count() const { return m_files.count(); }
  81. QByteArray data(int index) const;
  82. QString name(int index) const;
  83. protected:
  84. virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
  85. private:
  86. QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
  87. private:
  88. FbTemporaryList m_files;
  89. QString m_path;
  90. };
  91. class FbListModel : public QAbstractListModel
  92. {
  93. Q_OBJECT
  94. public:
  95. explicit FbListModel(FbNetworkAccessManager &files, QObject *parent = 0);
  96. int rowCount(const QModelIndex &parent = QModelIndex()) const;
  97. QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  98. private:
  99. FbNetworkAccessManager &m_files;
  100. };
  101. class FbListView : public QListView
  102. {
  103. Q_OBJECT
  104. public:
  105. explicit FbListView(FbNetworkAccessManager &files, QWidget *parent = 0);
  106. QLabel *label() { return m_label; }
  107. protected:
  108. void currentChanged(const QModelIndex &current, const QModelIndex &previous);
  109. private:
  110. FbNetworkAccessManager &m_files;
  111. QLabel *m_label;
  112. };
  113. class FbListWidget : public QWidget
  114. {
  115. Q_OBJECT
  116. public:
  117. explicit FbListWidget(FbTextEdit &view, QWidget* parent = 0);
  118. private slots:
  119. void loadFinished(bool ok);
  120. private:
  121. FbTextEdit &m_view;
  122. FbListView *m_list;
  123. QToolBar *m_tool;
  124. };
  125. #endif // FB2TEMP_H