Advertisement
Guest User

cascades

a guest
Jun 16th, 2013
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.70 KB | None | 0 0
  1. //MemoryCache.h
  2. class MemoryCache
  3. {
  4. public:
  5.     MemoryCache();
  6.     ~MemoryCache();
  7.  
  8.     bool contains(const QUrl &url) const
  9.         {
  10.            return m_cache.contains(url);
  11.         }
  12.     QByteArray get(const QUrl &url) const
  13.         {
  14.            return m_cache[url];
  15.         }
  16.     void put(const QUrl &url, const QByteArray &data)
  17.         {
  18.            return m_cache[url] = data;
  19.         }
  20.     void clear()
  21.         {
  22.            return m_cache.clear();
  23.         }
  24.  
  25. private:
  26.     QHash<QUrl, QByteArray> m_cache;
  27.  
  28. };
  29.  
  30.  
  31. //WebImageView.h
  32. class WebImageView : public bb::cascades::ImageView {
  33.     Q_OBJECT
  34.     Q_PROPERTY(QUrl url READ getUrl WRITE setUrl NOTIFY urlChanged)
  35.     Q_PROPERTY(double progress READ getProgress NOTIFY progressChanged)
  36.     Q_PROPERTY(bool loading READ getLoading NOTIFY loadingChanged)
  37. public:
  38.     WebImageView(bb::cascades::Container * parent = 0);
  39.     virtual ~WebImageView();
  40.  
  41.     static MemoryCache * cache();
  42.     QUrl getUrl() const;
  43.     void setUrl(const QUrl& url);
  44.     double getProgress() const;
  45.     bool getLoading() const;  
  46.  
  47. signals:
  48.         void urlChanged();
  49.         void imageLoaded();
  50.         void imageFailed();
  51.         void loadingChanged();
  52.         void progressChanged();
  53.         void downloadFailed(QString error);
  54.  
  55. private slots:
  56.     void onReplyFinished();
  57.     void onDownloadProgress(qint64 bytes, qint64 total);
  58.     void onProcessorFinished(const QImage &image);
  59.     void onStateChanged(bb::cascades::ResourceState::Type);
  60.  
  61.  
  62. private:
  63.         static QScopedPointer<QNetworkAccessManager> m_network;
  64.         static QScopedPointer<MemoryCache> m_cache;
  65.  
  66.         void setProgress(double progress);
  67.         void setLoading(bool loading);
  68.  
  69.         QUrl m_url;
  70.         ImageTracker *m_imageTracker;
  71.         double m_progress;
  72.         bool m_loading;
  73. };
  74.  
  75. //WebImageView.cpp
  76.  
  77. QScopedPointer<MemoryCache> WebImageView::m_cache(new MemoryCache);
  78. QScopedPointer<QNetworkAccessManager> WebImageView::m_network(new QNetworkAccessManager);
  79.  
  80. WebImageView::WebImageView(bb::cascades::Container * parent)
  81. : bb::cascades::ImageView(parent),
  82.   m_progress(0),
  83.   m_loading(false),
  84.   m_imageTracker(new ImageTracker(this))
  85. {
  86.     bool ret = connect(m_imageTracker,
  87.                SIGNAL(stateChanged(bb::cascades::ResourceState::Type)),
  88.                this,
  89.                SLOT(onStateChanged(bb::cascades::ResourceState::Type)));
  90.  
  91.     Q_ASSERT(ret); Q_UNUSED(ret);
  92.     this->setLoadEffect(bb::cascades::ImageViewLoadEffect::None);
  93. }
  94.  
  95. WebImageView::~WebImageView() {
  96. }
  97.  
  98. MemoryCache* WebImageView::cache()
  99. {
  100.     return m_cache.data();
  101. }
  102.  
  103. QUrl WebImageView::getUrl() const
  104. {
  105.     return m_url;
  106. }
  107.  
  108. double WebImageView::getProgress() const
  109. {
  110.     return m_progress;
  111. }
  112.  
  113. bool WebImageView::getLoading() const
  114. {
  115.     return m_loading;
  116. }
  117.  
  118. void WebImageView::setUrl(const QUrl &url)
  119. {
  120.     if (m_url != url) {
  121.         m_url = url;
  122.         emit urlChanged();
  123.         m_progress = 0;
  124.  
  125.         this->resetImage();
  126.         this->resetImageSource();
  127.  
  128.         if (m_cache->contains(url))
  129.         {
  130.             QByteArray data = m_cache->get(url);
  131.             m_imageTracker->setImage(bb::cascades::Image(data));
  132.             return;
  133.         }
  134.  
  135.         setLoading(true);
  136.  
  137.         QNetworkRequest request;
  138.         request.setUrl(m_url);
  139.  
  140.         QNetworkReply * reply = m_network->get(request);
  141.         connect(reply, SIGNAL(finished()), this, SLOT(onReplyFinished()));
  142.         connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(onDownloadProgress(qint64,qint64)));
  143.  
  144.     }
  145. }
  146.  
  147. void WebImageView::onReplyFinished() {
  148.     QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
  149.     if (reply->error() == QNetworkReply::NoError)
  150.     {
  151.         qint64 bytesAvailable = reply->bytesAvailable();
  152.         if (bytesAvailable > 0)
  153.         {
  154.             QByteArray data = reply->readAll();
  155.             if (!m_cache->contains(m_url))
  156.             {
  157.                 m_cache->put(m_url, data);
  158.             }
  159.                 m_imageTracker->setImage(bb::cascades::Image(data));
  160.         }
  161.         else
  162.         {
  163.             emit downloadFailed(reply->errorString());
  164.             m_progress = 0;
  165.             setLoading(false);
  166.         }
  167.     }
  168.     else
  169.     {
  170.         emit downloadFailed(reply->errorString());
  171.         m_progress = 0;
  172.         setLoading(false);
  173.     }
  174.  
  175.     reply->deleteLater();
  176. }
  177.  
  178. void WebImageView::onStateChanged(bb::cascades::ResourceState::Type state)
  179. {
  180.     if(state == ResourceState::Loaded)
  181.     {
  182.         this->setImage(m_imageTracker->image());
  183.         setLoading(false);
  184.         emit imageLoaded();
  185.     }
  186.     else if (state == ResourceState::ErrorInvalidFormat || state == ResourceState::ErrorMemory)
  187.     {
  188.      setLoading(false);
  189.      emit imageFailed();
  190.    }
  191. }
  192.  
  193. void WebImageView::onDownloadProgress(qint64 bytes, qint64 total)
  194. {
  195.     setProgress((double)bytes/(double)total);
  196. }
  197.  
  198. void WebImageView::setProgress(double progress)
  199. {
  200.     if (m_progress != progress)
  201.     {
  202.         m_progress = progress;
  203.         emit progressChanged();
  204.     }
  205. }
  206.  
  207. void WebImageView::setLoading(bool loading)
  208. {
  209.     if (m_loading != loading)
  210.     {
  211.         m_loading = loading;
  212.         emit loadingChanged();
  213.     }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement