fb2view.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "fb2view.h"
  2. #include "fb2read.h"
  3. #include <QtDebug>
  4. #include <QNetworkReply>
  5. #include <QNetworkRequest>
  6. #include <QWebSecurityOrigin>
  7. //---------------------------------------------------------------------------
  8. // Fb2ImageReply
  9. //---------------------------------------------------------------------------
  10. Fb2ImageReply::Fb2ImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data)
  11. : QNetworkReply()
  12. , content(data)
  13. , offset(0)
  14. {
  15. /*
  16. QString path = "/home/user/tmp" + request.url().path();
  17. qCritical() << path;
  18. QFile file(path);
  19. file.open(QFile::WriteOnly);
  20. file.write(content);
  21. file.close();
  22. */
  23. qCritical() << tr("Image: %1 - %2").arg(request.url().toString()).arg(content.size());
  24. setRequest(request);
  25. setUrl(request.url());
  26. setOperation(op);
  27. open(ReadOnly | Unbuffered);
  28. setHeader(QNetworkRequest::ContentLengthHeader, QVariant(content.size()));
  29. QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
  30. QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
  31. }
  32. void Fb2ImageReply::abort()
  33. {
  34. close();
  35. }
  36. qint64 Fb2ImageReply::bytesAvailable() const
  37. {
  38. return content.size() - offset;
  39. }
  40. bool Fb2ImageReply::isSequential() const
  41. {
  42. return true;
  43. }
  44. qint64 Fb2ImageReply::readData(char *data, qint64 maxSize)
  45. {
  46. if (offset < content.size()) {
  47. qint64 number = qMin(maxSize, content.size() - offset);
  48. memcpy(data, content.constData() + offset, number);
  49. offset += number;
  50. return number;
  51. } else {
  52. return -1;
  53. }
  54. }
  55. //---------------------------------------------------------------------------
  56. // Fb2NetworkAccessManager
  57. //
  58. // http://doc.trolltech.com/qq/32/qq32-webkit-protocols.html
  59. //---------------------------------------------------------------------------
  60. Fb2NetworkAccessManager::Fb2NetworkAccessManager(QObject *parent)
  61. : QNetworkAccessManager(parent)
  62. {
  63. }
  64. QNetworkReply * Fb2NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
  65. {
  66. if (request.url().scheme() == "fb2") return imageRequest(op, request);
  67. return QNetworkAccessManager::createRequest(op, request, outgoingData);
  68. }
  69. QNetworkReply * Fb2NetworkAccessManager::imageRequest(Operation op, const QNetworkRequest &request)
  70. {
  71. QString file = request.url().path();
  72. while (file.left(1) == "/") file.remove(0, 1);
  73. ImageMap::const_iterator i = m_images.find(file);
  74. if (i == m_images.end()) {
  75. qCritical() << "Not found: " << file;
  76. return 0;
  77. } else {
  78. return new Fb2ImageReply(op, request, i.value());
  79. }
  80. }
  81. void Fb2NetworkAccessManager::insert(const QString &file, const QByteArray &data)
  82. {
  83. m_images.insert(file, data);
  84. }
  85. //---------------------------------------------------------------------------
  86. // Fb2WebView
  87. //---------------------------------------------------------------------------
  88. Fb2WebView::Fb2WebView(QWidget *parent)
  89. : Fb2BaseWebView(parent)
  90. , m_thread(0)
  91. {
  92. page()->setContentEditable(true);
  93. QWebSettings *settings = page()->settings();
  94. settings->setAttribute(QWebSettings::AutoLoadImages, true);
  95. settings->setAttribute(QWebSettings::JavaEnabled, false);
  96. settings->setAttribute(QWebSettings::JavascriptEnabled, true);
  97. settings->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);
  98. settings->setAttribute(QWebSettings::PluginsEnabled, false);
  99. settings->setAttribute(QWebSettings::ZoomTextOnly, true);
  100. page()->setNetworkAccessManager(&m_network);
  101. }
  102. bool Fb2WebView::load(const QString &filename)
  103. {
  104. if (m_thread) return false;
  105. m_thread = new Fb2ReadThread(this, filename);
  106. connect(m_thread, SIGNAL(image(QString, QByteArray)), SLOT(image(QString, QByteArray)));
  107. connect(m_thread, SIGNAL(html(QString)), SLOT(html(QString)));
  108. m_thread->start();
  109. }
  110. void Fb2WebView::image(QString file, QByteArray data)
  111. {
  112. m_network.insert(file, data);
  113. qCritical() << file;
  114. }
  115. void Fb2WebView::html(QString html)
  116. {
  117. setHtml(html, QUrl("fb2://s/"));
  118. if (m_thread) m_thread->deleteLater();
  119. m_thread = 0;
  120. }
  121. void Fb2WebView::zoomIn()
  122. {
  123. qreal zoom = zoomFactor();
  124. setZoomFactor(zoom * 1.1);
  125. }
  126. void Fb2WebView::zoomOut()
  127. {
  128. qreal zoom = zoomFactor();
  129. setZoomFactor(zoom * 0.9);
  130. }
  131. void Fb2WebView::zoomOrig()
  132. {
  133. setZoomFactor(1);
  134. }