aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core
diff options
context:
space:
mode:
authorKen Moore <ken@ixsystems.com>2018-03-21 13:41:13 -0400
committerKen Moore <ken@ixsystems.com>2018-03-21 13:43:54 -0400
commitcbdeaec5c259da65d54b90f64770421467871f8f (patch)
tree5dd6f6657c2e4edbcbd66eea923809784da8dc57 /src-qt5/core
parentFix up some of lumina-config. (diff)
downloadlumina-cbdeaec5c259da65d54b90f64770421467871f8f.tar.gz
lumina-cbdeaec5c259da65d54b90f64770421467871f8f.tar.bz2
lumina-cbdeaec5c259da65d54b90f64770421467871f8f.zip
Fix up the RSS reader.
Make sure we check for redirect URLs even if the reply has data in it (was not catching the redirect from http:// to https:// on the Lumina/TrueOS feeds)
Diffstat (limited to 'src-qt5/core')
-rw-r--r--src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp2
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSFeedPlugin.cpp14
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSObjects.cpp55
3 files changed, 35 insertions, 36 deletions
diff --git a/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp b/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp
index 1ee8fb8a..9804fbae 100644
--- a/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp
+++ b/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp
@@ -30,7 +30,7 @@ QString LOS::AppStoreShortcut(){ return "/usr/local/share/applications/appcafe.d
QStringList LOS::RSSFeeds(){
QStringList feeds;
feeds << "FreeBSD News Feed::::https://www.freebsd.org/news/rss.xml";
- feeds << "TrueOS News Feed::::http://www.trueos.org/feed/";
+ feeds << "TrueOS News Feed::::https://www.trueos.org/feed/";
return feeds;
}
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSFeedPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSFeedPlugin.cpp
index e8e5adb4..f3852d07 100644
--- a/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSFeedPlugin.cpp
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSFeedPlugin.cpp
@@ -17,7 +17,7 @@
RSSFeedPlugin::RSSFeedPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID), ui(new Ui::RSSFeedPlugin()){
ui->setupUi(this);
- //Load the global settings
+ //Load the global settings
setprefix = "rssreader/"; //this structure/prefix should be used for *all* plugins of this type
RSS = new RSSReader(this, setprefix);
ui->text_feed->setContextMenuPolicy(Qt::NoContextMenu);
@@ -49,7 +49,7 @@ RSSFeedPlugin::RSSFeedPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID)
//First-time run of the plugin - automatically load the default feeds
feeds = LOS::RSSFeeds();
for(int i=0; i<feeds.length(); i++){ feeds[i] = feeds[i].section("::::",1,-1); } //just need url right now
- feeds << "http://lumina-desktop.org/?feed=rss2"; //Lumina Desktop blog feed
+ feeds << "https://lumina-desktop.org/?feed=rss2"; //Lumina Desktop blog feed
LSession::handle()->DesktopPluginSettings()->setValue(setprefix+"currentfeeds", feeds);
}else{
feeds = LSession::handle()->DesktopPluginSettings()->value(setprefix+"currentfeeds",QStringList()).toStringList();
@@ -77,7 +77,7 @@ void RSSFeedPlugin::updateOptionsMenu(){
QStringList feeds = LOS::RSSFeeds();
feeds << tr("Lumina Desktop RSS")+"::::http://lumina-desktop.org/?feed=rss2";
feeds.sort();
- for(int i=0; i<feeds.length(); i++){
+ for(int i=0; i<feeds.length(); i++){
QAction *tmp = presetMenu->addAction(feeds[i].section("::::",0,0) );
tmp->setWhatsThis( feeds[i].section("::::",1,-1) );
}
@@ -114,7 +114,7 @@ void RSSFeedPlugin::updateFeed(QString ID){
if(!data.items[i].pubdate.isNull() || !data.items[i].author.isEmpty()){
html.append("<i>(");
if(!data.items[i].pubdate.isNull()){ html.append(data.items[i].pubdate.toString(Qt::DefaultLocaleShortDate)); }
- if(!data.items[i].author.isEmpty()){
+ if(!data.items[i].author.isEmpty()){
if(!html.endsWith("(")){ html.append(", "); } //spacing between date/author
if(!data.items[i].author_email.isEmpty()){ html.append("<a href=\"mailto:"+data.items[i].author_email+"\" style=\"color: "+color+";\">"+data.items[i].author+"</a>"); }
else{ html.append(data.items[i].author); }
@@ -179,7 +179,6 @@ void RSSFeedPlugin::openFeedInfo(){
if(ID.isEmpty()){ return; }
updateFeedInfo(ID);
ui->stackedWidget->setCurrentWidget(ui->page_feed_info);
-
}
void RSSFeedPlugin::openFeedNew(){
@@ -279,14 +278,13 @@ void RSSFeedPlugin::saveSettings(){
if(ui->combo_sync_units->currentIndex()==1){ DI = DI*60; } //convert from hours to minutes
set->setValue(setprefix+"default_interval_minutes", DI);
set->sync();
-
+
//Now go back to the feeds
backToFeeds();
}
//Feed Object interactions
void RSSFeedPlugin::UpdateFeedList(){
-
QString activate = ui->combo_feed->whatsThis();
if(!activate.isEmpty()){ ui->combo_feed->setWhatsThis(""); }
if(activate.isEmpty()){ activate = ui->combo_feed->currentData().toString(); } // keep current item selected
@@ -329,7 +327,7 @@ void RSSFeedPlugin::RSSItemChanged(QString ID){
for(int i=0; i<ui->combo_feed->count(); i++){
if(ui->combo_feed->itemData(i).toString()!=ID){ continue; }
RSSchannel info = RSS->dataForID(ID);
- if(info.title.isEmpty()){
+ if(info.title.isEmpty()){
ui->combo_feed->setItemText(i, ID);
ui->combo_feed->setItemIcon(i, LXDG::findIcon("dialog-cancel","") );
}else{
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSObjects.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSObjects.cpp
index 5f62f99f..9dd73b76 100644
--- a/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSObjects.cpp
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/rssreader/RSSObjects.cpp
@@ -91,7 +91,7 @@ void RSSReader::syncNow(){
//=================
// PRIVATE
//=================
-QString RSSReader::keyForUrl(QString url){
+QString RSSReader::keyForUrl(QString url){
//get current hash key for this URL
QStringList keys = hash.keys();
if(keys.contains(url)){ return url; } //this is already a valid key
@@ -131,12 +131,12 @@ RSSchannel RSSReader::readRSS(QByteArray bytes){
rssinfo.rss = false;
while(xml.readNextStartElement()){
if(DEBUG) qDebug() << " - ATOM Element (channel):" << xml.name();
- if(xml.name()=="entry") {
+ if(xml.name()=="entry") {
rssinfo.items << readRSSItemAtom(&xml);
}else if(xml.name()=="title"){
rssinfo.title = xml.readElementText();
if(DEBUG) qDebug() << "title" << rssinfo.link;
- }else if(xml.name()=="link"){
+ }else if(xml.name()=="link"){
QXmlStreamAttributes att = xml.attributes();
for(int i = 0; i < att.size(); i++) {
if(att[i].name() == "href") {
@@ -149,7 +149,7 @@ RSSchannel RSSReader::readRSS(QByteArray bytes){
rssinfo.description = xml.readElementText();
}else if(xml.name()=="updated"){
rssinfo.lastBuildDate = ATOMDateTime(xml.readElementText());
- }else if(xml.name()=="icon"){
+ }else if(xml.name()=="icon"){
rssinfo.icon_url = xml.readElementText();
if(DEBUG) qDebug() << "icon" << rssinfo.icon_url;
requestRSS(rssinfo.icon_url);
@@ -170,9 +170,9 @@ RSSchannel RSSReader::readRSSChannel(QXmlStreamReader *rss){
//qDebug() << " - RSS Element (channel):" <<rss->name();
if(rss->name()=="item"){ info.items << readRSSItem(rss); }
else if(rss->name()=="title"){ info.title = rss->readElementText(); }
- else if(rss->name()=="link"){
- QString txt = rss->readElementText();
- if(!txt.isEmpty()){ info.link = txt; }
+ else if(rss->name()=="link"){
+ QString txt = rss->readElementText();
+ if(!txt.isEmpty()){ info.link = txt; }
}
else if(rss->name()=="description"){ info.description = rss->readElementText(); }
else if(rss->name()=="lastBuildDate"){ info.lastBuildDate = RSSDateTime(rss->readElementText()); }
@@ -189,10 +189,10 @@ RSSchannel RSSReader::readRSSChannel(QXmlStreamReader *rss){
RSSitem RSSReader::readRSSItemAtom(QXmlStreamReader *rss){
RSSitem item;
while(rss->readNextStartElement()){
- if(rss->name()=="title"){
+ if(rss->name()=="title"){
item.title = rss->readElementText();
if(DEBUG) qDebug() << rss->name() << item.title;
- }else if(rss->name()=="link"){
+ }else if(rss->name()=="link"){
QXmlStreamAttributes att = rss->attributes();
for(int i = 0; i < att.size(); i++) {
if(att[i].name() == "href") {
@@ -201,13 +201,13 @@ RSSitem RSSReader::readRSSItemAtom(QXmlStreamReader *rss){
}
rss->readElementText();
if(DEBUG) qDebug() << rss->name() << item.link;
- }else if(rss->name()=="summary"){
+ }else if(rss->name()=="summary"){
item.description = rss->readElementText();
if(DEBUG) qDebug() << rss->name() << item.description;
- } else if(rss->name()=="comments"){
+ } else if(rss->name()=="comments"){
item.comments_url = rss->readElementText();
if(DEBUG) qDebug() << rss->name() << item.comments_url;
- } else if(rss->name()=="author"){
+ } else if(rss->name()=="author"){
rss->readNextStartElement();
item.author = rss->readElementText();
if(DEBUG) qDebug() << "author" << item.author;
@@ -228,11 +228,11 @@ RSSitem RSSReader::readRSSItem(QXmlStreamReader *rss){
else if(rss->name()=="link"){ item.link = rss->readElementText(); }
else if(rss->name()=="description"){ item.description = rss->readElementText(); }
else if(rss->name()=="comments"){ item.comments_url = rss->readElementText(); }
- else if(rss->name()=="author"){
+ else if(rss->name()=="author"){
//Special handling - this field can contain both email and name
- QString raw = rss->readElementText();
- if(raw.contains("@")){
- item.author_email = raw.split(" ").filter("@").first();
+ QString raw = rss->readElementText();
+ if(raw.contains("@")){
+ item.author_email = raw.split(" ").filter("@").first();
item.author = raw.remove(item.author_email).remove("(").remove(")").simplified(); //the name is often put within parentheses after the email
}else{ item.author = raw; }
}
@@ -270,12 +270,11 @@ QDateTime RSSReader::ATOMDateTime(QString datetime){
//=================
void RSSReader::replyFinished(QNetworkReply *reply){
QString url = reply->request().url().toString();
- qDebug() << "Got Reply:" << url;
+ //qDebug() << "Got RSS Reply:" << url;
QString key = keyForUrl(url); //current hash key for this URL
QByteArray data = reply->readAll();
outstandingURLS.removeAll(url);
- if(data.isEmpty()){
- qDebug() << "No data returned:" << url;
+ //if(data.isEmpty()){
//see if the URL can be adjusted for known issues
bool handled = false;
QUrl redirecturl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
@@ -288,27 +287,29 @@ void RSSReader::replyFinished(QNetworkReply *reply){
requestRSS(newurl);
emit newChannelsAvailable();
handled = true;
- }
+ }
}
- if(!handled && hash.contains(key) ){
+ if(!handled && hash.contains(key) ){
emit rssChanged(hash[key].originalURL);
}
+ if(data.isEmpty() || handled){
+ //qDebug() << "No data returned:" << url;
return;
}
- if(!hash.contains(key)){
+ if(!hash.contains(key)){
//qDebug() << " - hash does not contain URL:" << url;
//URL removed from list while a request was outstanding?
//Could also be an icon fetch response
QStringList keys = hash.keys();
for(int i=0; i<keys.length(); i++){
- qDebug() << " - Check for icon URL:" << hash[keys[i]].icon_url;
+ //qDebug() << " - Check for icon URL:" << hash[keys[i]].icon_url;
if(hash[keys[i]].icon_url.toLower() == url.toLower()){ //needs to be case-insensitive
//Icon fetch response
RSSchannel info = hash[keys[i]];
QImage img = QImage::fromData(data);
info.icon = QIcon( QPixmap::fromImage(img) );
- qDebug() << "Got Icon response:" << url << info.icon;
+ //qDebug() << "Got Icon response:" << url << info.icon;
hash.insert(keys[i], info); //insert back into the hash
emit rssChanged( hash[keys[i]].originalURL );
break;
@@ -320,15 +321,15 @@ void RSSReader::replyFinished(QNetworkReply *reply){
RSSchannel info = readRSS(data); //QNetworkReply can be used as QIODevice
reply->deleteLater(); //clean up
//Validate the info and announce any changes (4/21/17 - make the description optional even if RSS format requires it - Ken Moore)
- if(info.title.isEmpty() || info.link.isEmpty() ){
+ if(info.title.isEmpty() || info.link.isEmpty() ){
qDebug() << "Missing XML Information:" << url << info.title << info.link;
- return;
+ return;
} //bad info/read
//Update the bookkeeping elements of the info
if(info.timetolive<=0){ info.timetolive = LSession::handle()->DesktopPluginSettings()->value(setprefix+"default_interval_minutes", 60).toInt(); }
if(info.timetolive <=0){ info.timetolive = 60; } //error in integer conversion from settings?
- info.lastsync = QDateTime::currentDateTime(); info.nextsync = info.lastsync.addSecs(info.timetolive * 60);
+ info.lastsync = QDateTime::currentDateTime(); info.nextsync = info.lastsync.addSecs(info.timetolive * 60);
//Now see if anything changed and save the info into the hash
bool changed = (hash[key].lastBuildDate.isNull() || (hash[key].lastBuildDate < info.lastBuildDate) );
bool newinfo = false;
bgstack15