PageRenderTime 27ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/LH_WebKit/WebKit_Plugin/LH_RSSFeed.cpp

https://code.google.com/p/lcdhost/
C++ | 280 lines | 246 code | 32 blank | 2 comment | 76 complexity | dee85b3db0bf31428e65b0c91f56abbc MD5 | raw file
Possible License(s): LGPL-2.1
  1. #include "LH_RSSFeed.h"
  2. #include <QDebug>
  3. #include <QPainter>
  4. #include <QDesktopServices>
  5. #include <QNetworkProxyQuery>
  6. #include <QNetworkReply>
  7. LH_RSSFeed::LH_RSSFeed(QString feedUrl, int refreshTime, int delayTime)
  8. {
  9. lastrefresh_ = QDateTime::currentDateTime();
  10. lastopen_.start();
  11. lastmove_.start();
  12. nam_ = new QNetworkAccessManager(this);
  13. url_ = QUrl::fromUserInput(feedUrl);
  14. refresh_ = refreshTime;
  15. delay_ = delayTime;
  16. QObject::connect(nam_, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
  17. if(feedUrl!="") fetch();
  18. notifyTimer_.start();
  19. }
  20. RSSItem LH_RSSFeed::item(int mod)
  21. {
  22. if( nowshowing_ >= 0 && nowshowing_ < items_.size() )
  23. {
  24. int index = nowshowing_ + mod;
  25. while( index >= items_.size() ) index -= items_.size();
  26. while( index < 0 ) index += items_.size();
  27. return items_.at(index);
  28. }
  29. else
  30. return (RSSItem){"", "", "", "", "", (RSSThumbnail){"",0,0}};
  31. }
  32. void LH_RSSFeed::openItem(int mod)
  33. {
  34. if( lastopen_.elapsed() > 200 )
  35. {
  36. if( nowshowing_ >= 0 && nowshowing_ < items_.size() )
  37. {
  38. int index = nowshowing_ + mod;
  39. if( index >= items_.size() ) index = 0;
  40. if( index < 0 ) index = items_.size()-1;
  41. lastopen_.restart();
  42. QDesktopServices::openUrl( QUrl::fromUserInput(items_.at(index).link) );
  43. }
  44. }
  45. }
  46. void LH_RSSFeed::moveNext()
  47. {
  48. if(lastmove_.elapsed()<=200) return;
  49. switchwait_ = 0;
  50. if( nowshowing_ >= 0 && nowshowing_ < items_.size() )
  51. {
  52. ++ nowshowing_;
  53. if( nowshowing_ >= items_.size() ) nowshowing_ = 0;
  54. lastmove_.restart();
  55. emit changed();
  56. }
  57. }
  58. void LH_RSSFeed::moveBack()
  59. {
  60. if(lastmove_.elapsed()<=200) return;
  61. switchwait_ = 0;
  62. if( nowshowing_ >= 0 && nowshowing_ < items_.size() )
  63. {
  64. -- nowshowing_;
  65. if( nowshowing_ < 0 ) nowshowing_ = items_.size()-1;
  66. lastmove_.restart();
  67. emit changed();
  68. }
  69. }
  70. int LH_RSSFeed::refresh()
  71. {
  72. return refresh_;
  73. }
  74. void LH_RSSFeed::setRefresh(int r)
  75. {
  76. if(refresh_ != r)
  77. {
  78. refresh_ = r;
  79. //requestPolling();
  80. emit refreshChanged();
  81. }
  82. }
  83. int LH_RSSFeed::delay()
  84. {
  85. return delay_;
  86. }
  87. void LH_RSSFeed::setDelay(int d)
  88. {
  89. if(delay_ != d)
  90. {
  91. delay_ = d;
  92. //requestPolling();
  93. emit delayChanged();
  94. }
  95. }
  96. QString LH_RSSFeed::url()
  97. {
  98. return url_.toString();
  99. }
  100. void LH_RSSFeed::setUrl(QString u)
  101. {
  102. if(url_.toString() != u)
  103. {
  104. url_.setUrl( u );
  105. emit urlChanged();
  106. fetch();
  107. }
  108. }
  109. void LH_RSSFeed::connect(QObject* intrfce)
  110. {
  111. if (!connections_.contains(intrfce))
  112. connections_.append(intrfce);
  113. }
  114. int LH_RSSFeed::connections()
  115. {
  116. return connections_.count();
  117. }
  118. bool LH_RSSFeed::release(QObject* intrfce)
  119. {
  120. if (connections_.contains(intrfce))
  121. {
  122. connections_.removeAt(connections_.indexOf(intrfce));
  123. return true;
  124. }
  125. else
  126. return false;
  127. }
  128. int LH_RSSFeed::notify(int code,void* param)
  129. {
  130. Q_UNUSED(param);
  131. if( code & LH_NOTE_SECOND && notifyTimer_.elapsed() >= 1000)
  132. {
  133. notifyTimer_.restart();
  134. if( lastrefresh_.addSecs(60*refresh_) < QDateTime::currentDateTime() )
  135. {
  136. lastrefresh_ = QDateTime::currentDateTime();
  137. fetch();
  138. }
  139. if( ++switchwait_ >= delay_ )
  140. {
  141. switchwait_ = 0;
  142. if( nowshowing_ >= 0 && nowshowing_ < items_.size() )
  143. {
  144. ++ nowshowing_;
  145. if( nowshowing_ >= items_.size() ) nowshowing_ = 0;
  146. emit changed();
  147. }
  148. }
  149. }
  150. return LH_NOTE_SECOND;
  151. }
  152. void LH_RSSFeed::fetch()
  153. {
  154. emit begin();
  155. lastrefresh_ = QDateTime::currentDateTime();
  156. nowshowing_ = -1;
  157. switchwait_ = 0;
  158. items_.clear();
  159. xml_.clear();
  160. QNetworkProxyQuery npq(url_);
  161. QList<QNetworkProxy> listOfProxies = QNetworkProxyFactory::systemProxyForQuery(npq);
  162. if(listOfProxies.count()!=0)
  163. if(listOfProxies.at(0).type() != QNetworkProxy::NoProxy)
  164. nam_->setProxy(listOfProxies.at(0));
  165. nam_->get( QNetworkRequest(url_) );
  166. }
  167. void LH_RSSFeed::finished( QNetworkReply* reply )
  168. {
  169. if( reply )
  170. {
  171. if( reply->error() == QNetworkReply::NoError )
  172. {
  173. if( reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 200 )
  174. {
  175. xml_.addData(reply->readAll());
  176. parseXml();
  177. }
  178. else if( reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 301 )
  179. {
  180. QString dest = reply->header(QNetworkRequest::LocationHeader).toString();
  181. qDebug() << "LH_RSSFeed: Changing URL, content permanently moved to" << dest;
  182. url_ = QUrl::fromUserInput( dest );
  183. emit urlChanged();
  184. fetch();
  185. }
  186. else
  187. {
  188. qWarning() << "LH_RSSFeed: HTTP code" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) << reply->errorString() << reply->url().toString();
  189. }
  190. }
  191. else
  192. {
  193. }
  194. reply->deleteLater();
  195. }
  196. if( items_.size() > 0 )
  197. {
  198. nowshowing_ = 0;
  199. switchwait_ = 0;
  200. emit changed();
  201. emit finished();
  202. }
  203. }
  204. void LH_RSSFeed::parseXml()
  205. {
  206. QString currentTag;
  207. RSSItem item;
  208. while (!xml_.atEnd())
  209. {
  210. xml_.readNext();
  211. if (xml_.isStartElement())
  212. {
  213. if( xml_.name() == "item" ) item.link = xml_.attributes().value("rss:about").toString();
  214. if( xml_.name() == "thumbnail" )
  215. {
  216. item.thumbnail.url = xml_.text().toString();
  217. if(xml_.attributes().hasAttribute("url"))
  218. item.thumbnail.url = xml_.attributes().value("url").toString();
  219. if(xml_.attributes().hasAttribute("width"))
  220. item.thumbnail.width = xml_.attributes().value("width").toString().toInt();
  221. if(xml_.attributes().hasAttribute("height"))
  222. item.thumbnail.height = xml_.attributes().value("height").toString().toInt();
  223. }
  224. currentTag = xml_.name().toString();
  225. }
  226. else if (xml_.isEndElement())
  227. {
  228. if (xml_.name() == "item")
  229. {
  230. items_ << item;
  231. item = (RSSItem){"", "", "", "", "", (RSSThumbnail){"",0,0}};
  232. }
  233. }
  234. else if (xml_.isCharacters() && !xml_.isWhitespace())
  235. {
  236. if( currentTag == "title" ) item.title = xml_.text().toString();
  237. else if( currentTag == "link" ) item.link = xml_.text().toString();
  238. else if( currentTag == "description" ) item.description = xml_.text().toString();
  239. else if( currentTag == "author" ) item.author = xml_.text().toString();
  240. else if( currentTag == "pubDate" ) item.pubDate = xml_.text().toString();
  241. }
  242. }
  243. if (xml_.error() && xml_.error() != QXmlStreamReader::PrematureEndOfDocumentError)
  244. {
  245. qWarning() << "XML ERROR:" << xml_.lineNumber() << ": " << xml_.errorString();
  246. }
  247. }
  248. QHash<QString, LH_RSSFeed* >* rssFeeds = NULL;