1
0

fb2temp.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "fb2temp.hpp"
  2. #include <QCryptographicHash>
  3. #include <QUrl>
  4. #include <QtDebug>
  5. //---------------------------------------------------------------------------
  6. // Fb2TemporaryFile
  7. //---------------------------------------------------------------------------
  8. Fb2TemporaryFile::Fb2TemporaryFile(const QString &name, const QString &hash)
  9. : QTemporaryFile()
  10. , m_name(name)
  11. , m_hash(hash)
  12. {
  13. open();
  14. }
  15. qint64 Fb2TemporaryFile::write(const QByteArray &data)
  16. {
  17. if (m_hash.isEmpty()) m_hash = md5(data);
  18. qint64 size = QTemporaryFile::write(data);
  19. close();
  20. open();
  21. return size;
  22. }
  23. QString Fb2TemporaryFile::md5(const QByteArray &data)
  24. {
  25. return QCryptographicHash::hash(data, QCryptographicHash::Md5).toBase64();
  26. }
  27. //---------------------------------------------------------------------------
  28. // Fb2TemporaryList
  29. //---------------------------------------------------------------------------
  30. Fb2TemporaryList::Fb2TemporaryList()
  31. {
  32. }
  33. Fb2TemporaryList::~Fb2TemporaryList()
  34. {
  35. Fb2TemporaryIterator it(*this);
  36. while (it.hasNext()) delete it.next();
  37. }
  38. Fb2TemporaryFile & Fb2TemporaryList::get(const QString &name, const QString &hash)
  39. {
  40. Fb2TemporaryIterator it(*this);
  41. while (it.hasNext()) {
  42. Fb2TemporaryFile *file = it.next();
  43. if (file->name() == name) return *file;
  44. }
  45. Fb2TemporaryFile * file = new Fb2TemporaryFile(name, hash);
  46. append(file);
  47. return *file;
  48. }
  49. QString Fb2TemporaryList::set(const QString &name, const QByteArray &data, const QString &hash)
  50. {
  51. Fb2TemporaryFile & file = get(name, hash);
  52. file.write(data);
  53. return file.hash();
  54. }
  55. QString Fb2TemporaryList::hash(const QString &path) const
  56. {
  57. Fb2TemporaryIterator it(*this);
  58. while (it.hasNext()) {
  59. Fb2TemporaryFile *file = it.next();
  60. if (file->fileName() == path) return file->hash();
  61. }
  62. return QString();
  63. }
  64. QString Fb2TemporaryList::name(const QString &hash) const
  65. {
  66. Fb2TemporaryIterator it(*this);
  67. while (it.hasNext()) {
  68. Fb2TemporaryFile *file = it.next();
  69. if (file->hash() == hash) return file->name();
  70. }
  71. return QString();
  72. }
  73. QString Fb2TemporaryList::data(const QString &name) const
  74. {
  75. Fb2TemporaryIterator it(*this);
  76. while (it.hasNext()) {
  77. Fb2TemporaryFile *file = it.next();
  78. if (file->name() == name) return file->readAll().toBase64();
  79. }
  80. return QString();
  81. }
  82. bool Fb2TemporaryList::exists(const QString &name) const
  83. {
  84. Fb2TemporaryIterator it(*this);
  85. while (it.hasNext()) {
  86. Fb2TemporaryFile *file = it.next();
  87. if (file->name() == name) return true;
  88. }
  89. return false;
  90. }
  91. //---------------------------------------------------------------------------
  92. // Fb2NetworkDiskCache
  93. //---------------------------------------------------------------------------
  94. QNetworkCacheMetaData Fb2NetworkDiskCache::metaData(const QUrl &url)
  95. {
  96. qCritical() << url.toString();
  97. return QNetworkDiskCache::metaData(url);
  98. }
  99. QIODevice * Fb2NetworkDiskCache::data(const QUrl &url)
  100. {
  101. qCritical() << url.toString();
  102. return QNetworkDiskCache::data(url);
  103. }
  104. #if 0
  105. //---------------------------------------------------------------------------
  106. // Fb2ImageReply
  107. //---------------------------------------------------------------------------
  108. Fb2ImageReply::Fb2ImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data)
  109. : QNetworkReply()
  110. , content(data)
  111. , offset(0)
  112. {
  113. /*
  114. QString path = "/home/user/tmp" + request.url().path();
  115. qCritical() << path;
  116. QFile file(path);
  117. file.open(QFile::WriteOnly);
  118. file.write(content);
  119. file.close();
  120. */
  121. qCritical() << tr("Image: %1 - %2").arg(request.url().toString()).arg(content.size());
  122. setRequest(request);
  123. setUrl(request.url());
  124. setOperation(op);
  125. open(ReadOnly | Unbuffered);
  126. setHeader(QNetworkRequest::ContentLengthHeader, QVariant(content.size()));
  127. QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
  128. QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
  129. }
  130. void Fb2ImageReply::abort()
  131. {
  132. close();
  133. }
  134. qint64 Fb2ImageReply::bytesAvailable() const
  135. {
  136. return content.size() - offset;
  137. }
  138. bool Fb2ImageReply::isSequential() const
  139. {
  140. return true;
  141. }
  142. qint64 Fb2ImageReply::readData(char *data, qint64 maxSize)
  143. {
  144. if (offset < content.size()) {
  145. qint64 number = qMin(maxSize, content.size() - offset);
  146. memcpy(data, content.constData() + offset, number);
  147. offset += number;
  148. return number;
  149. } else {
  150. return -1;
  151. }
  152. }
  153. //---------------------------------------------------------------------------
  154. // Fb2NetworkAccessManager
  155. //
  156. // http://doc.trolltech.com/qq/32/qq32-webkit-protocols.html
  157. //---------------------------------------------------------------------------
  158. Fb2NetworkAccessManager::Fb2NetworkAccessManager(QObject *parent)
  159. : QNetworkAccessManager(parent)
  160. {
  161. }
  162. QNetworkReply * Fb2NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
  163. {
  164. if (request.url().scheme() == "fb2") return imageRequest(op, request);
  165. return QNetworkAccessManager::createRequest(op, request, outgoingData);
  166. }
  167. QNetworkReply * Fb2NetworkAccessManager::imageRequest(Operation op, const QNetworkRequest &request)
  168. {
  169. QString file = request.url().path();
  170. while (file.left(1) == "/") file.remove(0, 1);
  171. ImageMap::const_iterator i = m_images.find(file);
  172. if (i == m_images.end()) {
  173. qCritical() << "Not found: " << file;
  174. return 0;
  175. } else {
  176. return new Fb2ImageReply(op, request, i.value());
  177. }
  178. }
  179. void Fb2NetworkAccessManager::insert(const QString &file, const QByteArray &data)
  180. {
  181. m_images.insert(file, data);
  182. }
  183. #endif