1
0

fb2temp.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "fb2temp.hpp"
  2. #include <QCryptographicHash>
  3. #include <QUrl>
  4. #include <QtDebug>
  5. #include "fb2view.hpp"
  6. //---------------------------------------------------------------------------
  7. // Fb2TemporaryFile
  8. //---------------------------------------------------------------------------
  9. Fb2TemporaryFile::Fb2TemporaryFile(const QString &name, const QString &hash)
  10. : QTemporaryFile()
  11. , m_name(name)
  12. , m_hash(hash)
  13. {
  14. }
  15. qint64 Fb2TemporaryFile::write(const QByteArray &data)
  16. {
  17. open();
  18. if (m_hash.isEmpty()) m_hash = md5(data);
  19. qint64 size = QTemporaryFile::write(data);
  20. close();
  21. return size;
  22. }
  23. QString Fb2TemporaryFile::md5(const QByteArray &data)
  24. {
  25. return QCryptographicHash::hash(data, QCryptographicHash::Md5).toBase64();
  26. }
  27. QByteArray Fb2TemporaryFile::data()
  28. {
  29. open();
  30. QByteArray data = readAll();
  31. close();
  32. return data;
  33. }
  34. //---------------------------------------------------------------------------
  35. // Fb2TemporaryList
  36. //---------------------------------------------------------------------------
  37. Fb2TemporaryList::Fb2TemporaryList()
  38. {
  39. }
  40. Fb2TemporaryList::~Fb2TemporaryList()
  41. {
  42. Fb2TemporaryIterator it(*this);
  43. while (it.hasNext()) delete it.next();
  44. }
  45. Fb2TemporaryFile & Fb2TemporaryList::get(const QString &name, const QString &hash)
  46. {
  47. Fb2TemporaryIterator it(*this);
  48. while (it.hasNext()) {
  49. Fb2TemporaryFile *file = it.next();
  50. if (file->name() == name) return *file;
  51. }
  52. Fb2TemporaryFile * file = new Fb2TemporaryFile(name, hash);
  53. append(file);
  54. return *file;
  55. }
  56. QByteArray Fb2TemporaryList::data(const QString &name) const
  57. {
  58. Fb2TemporaryIterator it(*this);
  59. while (it.hasNext()) {
  60. Fb2TemporaryFile *file = it.next();
  61. if (file->name() == name) return file->data();
  62. }
  63. return QByteArray();
  64. }
  65. QString Fb2TemporaryList::set(const QString &name, const QByteArray &data, const QString &hash)
  66. {
  67. Fb2TemporaryFile & file = get(name, hash);
  68. file.write(data);
  69. return file.hash();
  70. }
  71. QString Fb2TemporaryList::name(const QString &hash) const
  72. {
  73. Fb2TemporaryIterator it(*this);
  74. while (it.hasNext()) {
  75. Fb2TemporaryFile *file = it.next();
  76. if (file->hash() == hash) return file->name();
  77. }
  78. return QString();
  79. }
  80. bool Fb2TemporaryList::exists(const QString &name) const
  81. {
  82. Fb2TemporaryIterator it(*this);
  83. while (it.hasNext()) {
  84. Fb2TemporaryFile *file = it.next();
  85. if (file->name() == name) return true;
  86. }
  87. return false;
  88. }
  89. #if 0
  90. //---------------------------------------------------------------------------
  91. // Fb2NetworkDiskCache
  92. //---------------------------------------------------------------------------
  93. QNetworkCacheMetaData Fb2NetworkDiskCache::metaData(const QUrl &url)
  94. {
  95. qCritical() << url.toString();
  96. return QNetworkDiskCache::metaData(url);
  97. }
  98. QIODevice * Fb2NetworkDiskCache::data(const QUrl &url)
  99. {
  100. qCritical() << url.toString();
  101. return QNetworkDiskCache::data(url);
  102. }
  103. #endif
  104. //---------------------------------------------------------------------------
  105. // Fb2ImageReply
  106. //---------------------------------------------------------------------------
  107. Fb2ImageReply::Fb2ImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data)
  108. : QNetworkReply()
  109. , content(data)
  110. , offset(0)
  111. {
  112. setOperation(op);
  113. setRequest(request);
  114. setUrl(request.url());
  115. open(ReadOnly | Unbuffered);
  116. setHeader(QNetworkRequest::ContentLengthHeader, QVariant(content.size()));
  117. setAttribute(QNetworkRequest::CacheSaveControlAttribute, QVariant(false));
  118. QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
  119. QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
  120. }
  121. qint64 Fb2ImageReply::readData(char *data, qint64 maxSize)
  122. {
  123. if (offset >= content.size()) return -1;
  124. QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
  125. qint64 number = qMin(maxSize, content.size() - offset);
  126. memcpy(data, content.constData() + offset, number);
  127. offset += number;
  128. return number;
  129. }
  130. //---------------------------------------------------------------------------
  131. // Fb2NetworkAccessManager
  132. //
  133. // http://doc.trolltech.com/qq/32/qq32-webkit-protocols.html
  134. //---------------------------------------------------------------------------
  135. Fb2NetworkAccessManager::Fb2NetworkAccessManager(Fb2WebView &view)
  136. : QNetworkAccessManager(&view)
  137. , m_view(view)
  138. {
  139. }
  140. QNetworkReply * Fb2NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
  141. {
  142. if (request.url().scheme() == "fb2") return imageRequest(op, request);
  143. return QNetworkAccessManager::createRequest(op, request, outgoingData);
  144. }
  145. QNetworkReply * Fb2NetworkAccessManager::imageRequest(Operation op, const QNetworkRequest &request)
  146. {
  147. QString name = request.url().path();
  148. QByteArray data = m_view.files().data(name);
  149. return new Fb2ImageReply(op, request, data);
  150. }