fb2temp.hpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 <QTreeView>
  11. #include <QWebView>
  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(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. const QString & type() const { return m_type; }
  25. qint64 size() const { return m_size; }
  26. QByteArray data();
  27. private:
  28. const QString m_name;
  29. QString m_hash;
  30. QString m_type;
  31. qint64 m_size;
  32. };
  33. class FbTemporaryList : public QList<FbTemporaryFile*>
  34. {
  35. public:
  36. explicit FbTemporaryList();
  37. virtual ~FbTemporaryList();
  38. QString add(const QString &path, QByteArray &data);
  39. bool exists(const QString &name) const;
  40. FbTemporaryFile * get(const QString &name) const;
  41. const QString & set(const QString &name, QByteArray &data, const QString &hash = QString());
  42. QString name(const QString &hash) const;
  43. QByteArray data(const QString &name) const;
  44. private:
  45. QString newName(const QString &path);
  46. };
  47. typedef QListIterator<FbTemporaryFile*> FbTemporaryIterator;
  48. #if 0
  49. class FbNetworkDiskCache : public QNetworkDiskCache
  50. {
  51. public:
  52. explicit FbNetworkDiskCache(QObject *parent = 0) : QNetworkDiskCache(parent) {}
  53. QNetworkCacheMetaData metaData(const QUrl &url);
  54. QIODevice *data(const QUrl &url);
  55. };
  56. #endif
  57. class FbImageReply : public QNetworkReply
  58. {
  59. Q_OBJECT
  60. public:
  61. explicit FbImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data);
  62. qint64 bytesAvailable() const { return content.size(); }
  63. bool isSequential() const { return true; }
  64. void abort() { close(); }
  65. protected:
  66. qint64 readData(char *data, qint64 maxSize);
  67. private:
  68. QByteArray content;
  69. qint64 offset;
  70. };
  71. class FbNetworkAccessManager : public QNetworkAccessManager
  72. {
  73. Q_OBJECT
  74. public:
  75. explicit FbNetworkAccessManager(QObject *parent = 0);
  76. FbTemporaryList & files() { return m_files; }
  77. void setPath(const QString &path) { m_path = path; }
  78. public slots:
  79. void data(QString name, QByteArray data);
  80. public:
  81. QString add(const QString &path, QByteArray &data) { return m_files.add(path, data); }
  82. bool exists(const QString &name) const { return m_files.exists(name); }
  83. FbTemporaryFile * get(const QString &name) const { return m_files.get(name); }
  84. int count() const { return m_files.count(); }
  85. QByteArray data(int index) const;
  86. QVariant info(int row, int col) const;
  87. protected:
  88. virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
  89. private:
  90. QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
  91. private:
  92. FbTemporaryList m_files;
  93. QString m_path;
  94. };
  95. class FbListModel : public QAbstractListModel
  96. {
  97. Q_OBJECT
  98. public:
  99. explicit FbListModel(FbTextEdit *text, QObject *parent = 0);
  100. public:
  101. int rowCount(const QModelIndex &parent = QModelIndex()) const;
  102. int columnCount(const QModelIndex &parent = QModelIndex()) const;
  103. QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  104. QVariant headerData(int section, Qt::Orientation orientation, int role) const;
  105. private:
  106. FbNetworkAccessManager *files() const;
  107. private:
  108. FbTextEdit *m_text;
  109. };
  110. class FbListView : public QTreeView
  111. {
  112. Q_OBJECT
  113. public:
  114. explicit FbListView(FbNetworkAccessManager *files, QWidget *parent = 0);
  115. FbListModel *model() const;
  116. protected:
  117. void currentChanged(const QModelIndex &current, const QModelIndex &previous);
  118. signals:
  119. void showImage(const QString &name);
  120. private:
  121. FbNetworkAccessManager &m_files;
  122. };
  123. class FbListWidget : public QWidget
  124. {
  125. Q_OBJECT
  126. public:
  127. explicit FbListWidget(FbTextEdit *text, QWidget* parent = 0);
  128. QSize sizeHint() const { return QSize(200,200); }
  129. public slots:
  130. void showImage(const QString &name);
  131. private slots:
  132. void loadFinished();
  133. private:
  134. FbTextEdit *m_text;
  135. FbListView *m_list;
  136. QWebView *m_view;
  137. };
  138. #endif // FB2TEMP_H