diff --git a/ChangeLog b/ChangeLog index 10080c43..d1159778 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19942,3 +19942,5 @@ 2020-05-17 Fred Gleason * Updated interlocking logic in the 'Edit Feed' dialog in rdadmin(1) to handle image assignments correctly. +2020-05-18 Fred Gleason + * Added 'RDRssSchemas' class. diff --git a/lib/Makefile.am b/lib/Makefile.am index 3115628d..494c25f0 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -199,6 +199,7 @@ dist_librd_la_SOURCES = dbversion.h\ rdreport.cpp rdreport.h\ rdringbuffer.cpp rdringbuffer.h\ rdripc.cpp rdripc.h\ + rdrssschemas.cpp rdrssschemas.h\ rdschedcartlist.cpp rdschedcartlist.h\ rdschedcode.cpp rdschedcode.h\ rdschedcodes_dialog.cpp rdschedcodes_dialog.h\ diff --git a/lib/lib.pro b/lib/lib.pro index 9a01355d..a11486fa 100644 --- a/lib/lib.pro +++ b/lib/lib.pro @@ -141,6 +141,7 @@ SOURCES += rdrehash.cpp SOURCES += rdrenderer.cpp SOURCES += rdreport.cpp SOURCES += rdripc.cpp +SOURCES += rdrssschemas.cpp SOURCES += rdschedcode.cpp SOURCES += rdsegmeter.cpp SOURCES += rdsettings.cpp @@ -281,6 +282,7 @@ HEADERS += rdrehash.h HEADERS += rdrenderer.h HEADERS += rdreport.h HEADERS += rdripc.h +HEADERS += rdrssschemas.h HEADERS += rdschedcode.h HEADERS += rdsegmeter.h HEADERS += rdsettings.h diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index e249d0ee..03c36db1 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -79,6 +79,8 @@ RDFeed::RDFeed(const QString &keyname,RDConfig *config,QObject *parent) feed_keyname=keyname; feed_config=config; + feed_schemas=new RDRssSchemas(); + sql=QString("select ID from FEEDS where ")+ "KEY_NAME=\""+RDEscapeString(keyname)+"\""; q=new RDSqlQuery(sql); @@ -105,6 +107,8 @@ RDFeed::RDFeed(unsigned id,RDConfig *config,QObject *parent) feed_id=id; feed_config=config; + feed_schemas=new RDRssSchemas(); + sql=QString().sprintf("select KEY_NAME from FEEDS where ID=%u",id); q=new RDSqlQuery(sql); if(q->first()) { @@ -114,6 +118,12 @@ RDFeed::RDFeed(unsigned id,RDConfig *config,QObject *parent) } +RDFeed::~RDFeed() +{ + delete feed_schemas; +} + + bool RDFeed::exists() const { return RDDoesRowExist("FEEDS","KEY_NAME",feed_keyname); @@ -387,14 +397,14 @@ void RDFeed::setPurgePassword(const QString &str) const } -RDFeed::RssSchema RDFeed::rssSchema() const +RDRssSchemas::RssSchema RDFeed::rssSchema() const { - return (RDFeed::RssSchema)RDGetSqlValue("FEEDS","KEY_NAME",feed_keyname, - "RSS_SCHEMA").toUInt(); + return (RDRssSchemas::RssSchema)RDGetSqlValue("FEEDS","KEY_NAME",feed_keyname, + "RSS_SCHEMA").toUInt(); } -void RDFeed::setRssSchema(RDFeed::RssSchema schema) const +void RDFeed::setRssSchema(RDRssSchemas::RssSchema schema) const { SetRow("RSS_SCHEMA",(unsigned)schema); } @@ -1141,10 +1151,6 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) RDSqlQuery *q; RDSqlQuery *q1; - QString header_template; - QString channel_template; - QString item_template; - if(ok!=NULL) { *ok=false; } @@ -1186,21 +1192,16 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) return QString(); } - switch(rssSchema()) { - case RDFeed::CustomSchema: + // + // Load the XML Templates + // + QString header_template=rssSchemas()->headerTemplate(rssSchema()); + QString channel_template=rssSchemas()->channelTemplate(rssSchema()); + QString item_template=rssSchemas()->itemTemplate(rssSchema()); + if(rssSchema()==RDRssSchemas::CustomSchema) { header_template=q->value(10).toString(); channel_template=q->value(11).toString(); item_template=q->value(12).toString(); - break; - - case RDFeed::Rss202Schema: - header_template=RSS_2_0_2_HEADER_XML; - channel_template= RSS_2_0_2_CHANNEL_XML; - item_template=RSS_2_0_2_ITEM_XML; - break; - - case RDFeed::LastSchema: - break; } // @@ -1277,6 +1278,12 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) } +RDRssSchemas *RDFeed::rssSchemas() const +{ + return feed_schemas; +} + + unsigned RDFeed::create(const QString &keyname,bool enable_users, QString *err_msg,const QString &exemplar) { @@ -1306,9 +1313,9 @@ unsigned RDFeed::create(const QString &keyname,bool enable_users, sql=QString("insert into FEEDS set ")+ "KEY_NAME=\""+RDEscapeString(keyname)+"\","+ "ORIGIN_DATETIME=now(),"+ - "HEADER_XML=\""+RDEscapeString(RSS_2_0_2_HEADER_XML)+"\","+ - "CHANNEL_XML=\""+RDEscapeString(RSS_2_0_2_CHANNEL_XML)+"\","+ - "ITEM_XML=\""+RDEscapeString(RSS_2_0_2_ITEM_XML)+"\""; + "HEADER_XML=\"\","+ + "CHANNEL_XML=\"\","+ + "ITEM_XML=\"\""; q=new RDSqlQuery(sql); feed_id=q->lastInsertId().toUInt(); delete q; @@ -1474,81 +1481,6 @@ QString RDFeed::errorString(RDFeed::Error err) } -QString RDFeed::rssSchemaString(RDFeed::RssSchema schema) -{ - QString ret="Unknown"; - - switch(schema) { - case RDFeed::CustomSchema: - ret="[custom schema]"; - break; - - case RDFeed::Rss202Schema: - ret="RSS 2.0.2"; - break; - - case RDFeed::LastSchema: - break; - } - - return ret; -} - - -QString RDFeed::rssHeaderTemplate(RDFeed::RssSchema schema) -{ - QString ret; - - switch(schema) { - case RDFeed::Rss202Schema: - ret=RSS_2_0_2_HEADER_XML; - break; - - case RDFeed::CustomSchema: - case RDFeed::LastSchema: - break; - } - - return ret; -} - - -QString RDFeed::rssChannelTemplate(RDFeed::RssSchema schema) -{ - QString ret; - - switch(schema) { - case RDFeed::Rss202Schema: - ret=RSS_2_0_2_CHANNEL_XML; - break; - - case RDFeed::CustomSchema: - case RDFeed::LastSchema: - break; - } - - return ret; -} - - -QString RDFeed::rssItemTemplate(RDFeed::RssSchema schema) -{ - QString ret; - - switch(schema) { - case RDFeed::Rss202Schema: - ret=RSS_2_0_2_ITEM_XML; - break; - - case RDFeed::CustomSchema: - case RDFeed::LastSchema: - break; - } - - return ret; -} - - QString RDFeed::imageFilename(int feed_id,int img_id,const QString &ext) { return QString().sprintf("img%06d_%06d.",feed_id,img_id)+ext; diff --git a/lib/rdfeed.h b/lib/rdfeed.h index 6668489d..1e9cce9b 100644 --- a/lib/rdfeed.h +++ b/lib/rdfeed.h @@ -25,28 +25,12 @@ #include #include +#include #include #include #include #include -// -// RSS-2.0.2 Templates -// -#define RSS_2_0_2_NAME "RSS 2.0.2" - -#define RSS_2_0_2_IMAGE_MIN_SIZE QSize(88,31) -#define RSS_2_0_2_IMAGE_MAX_SIZE QSize(144,400) -#define RSS_2_0_2_IMAGE_IN_ITEM false - -#define RSS_2_0_2_HEADER_XML "\n" - -#define RSS_2_0_2_CHANNEL_XML "%TITLE%\n%DESCRIPTION%\n%CATEGORY%\n%LINK%\n%LANGUAGE%\n%COPYRIGHT%\n%BUILD_DATE%\n%PUBLISH_DATE%\n%EDITOR%\n%WEBMASTER%\n%GENERATOR%\n\n %IMAGE_URL%\n %TITLE%\n %LINK%\n %IMAGE_WIDTH%\n %IMAGE_HEIGHT%\n %IMAGE_DESCRIPTION%\n\n" - -#define RSS_2_0_2_ITEM_XML "%ITEM_TITLE%\n%ITEM_LINK%\n%ITEM_GUID%\n%ITEM_DESCRIPTION%\n%ITEM_AUTHOR%\n%ITEM_COMMENTS%\n%ITEM_SOURCE_TEXT%\n\n%ITEM_CATEGORY%\n%ITEM_PUBLISH_DATE%" - - - #define RDFEED_TOTAL_POST_STEPS 4 class RDFeed : public QObject @@ -56,9 +40,9 @@ class RDFeed : public QObject enum Error {ErrorOk=0,ErrorNoFile=1,ErrorCannotOpenFile=2, ErrorUnsupportedType=3,ErrorUploadFailed=4,ErrorGeneral=5}; enum MediaLinkMode {LinkNone=0,LinkDirect=1,LinkCounted=2}; - enum RssSchema {CustomSchema=0,Rss202Schema=1,LastSchema=2}; RDFeed(const QString &keyname,RDConfig *config,QObject *parent=0); RDFeed(unsigned id,RDConfig *config,QObject *parent=0); + ~RDFeed(); QString keyName() const; unsigned id() const; bool exists() const; @@ -98,8 +82,8 @@ class RDFeed : public QObject void setPurgeUsername(const QString &str) const; QString purgePassword() const; void setPurgePassword(const QString &str) const; - RssSchema rssSchema() const; - void setRssSchema(RssSchema schema) const; + RDRssSchemas::RssSchema rssSchema() const; + void setRssSchema(RDRssSchemas::RssSchema schema) const; QString headerXml() const; void setHeaderXml(const QString &str); QString channelXml() const; @@ -155,13 +139,10 @@ class RDFeed : public QObject bool log_debug,RDConfig *config); int totalPostSteps() const; QString rssXml(QString *err_msg,bool *ok=NULL); + RDRssSchemas *rssSchemas() const; static unsigned create(const QString &keyname,bool enable_users, QString *err_msg,const QString &exemplar=""); static QString errorString(RDFeed::Error err); - static QString rssSchemaString(RDFeed::RssSchema schema); - static QString rssHeaderTemplate(RssSchema schema); - static QString rssChannelTemplate(RssSchema schema); - static QString rssItemTemplate(RssSchema schema); static QString imageFilename(int feed_id,int img_id,const QString &ext); signals: @@ -173,6 +154,7 @@ class RDFeed : public QObject QString ResolveItemWildcards(const QString &tmplt,RDSqlQuery *item_q, RDSqlQuery *chan_q); QString GetTempFilename() const; + void LoadSchemas(); void SetRow(const QString ¶m,int value) const; void SetRow(const QString ¶m,const QString &value) const; void SetRow(const QString ¶m,const QDateTime &value, @@ -183,6 +165,7 @@ class RDFeed : public QObject RDConfig *feed_config; QByteArray feed_xml; int feed_xml_ptr; + RDRssSchemas *feed_schemas; friend size_t __RDFeed_Readfunction_Callback(char *buffer,size_t size, size_t nitems,void *userdata); }; diff --git a/lib/rdrssschemas.cpp b/lib/rdrssschemas.cpp new file mode 100644 index 00000000..b633c18c --- /dev/null +++ b/lib/rdrssschemas.cpp @@ -0,0 +1,110 @@ +// rdrssschemas.cpp +// +// RSS schema definitions for Rivendell +// +// (C) Copyright 2020 Fred Gleason +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public +// License along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include "rdrssschemas.h" + +RDRssSchemas::RDRssSchemas() +{ + // + // Names + // + c_names.push_back("Custom"); // CustomSchema + c_names.push_back("RSS 2.0.2"); // Rss202Schema + + + // + // Minimum Images Sizes + // + c_minimum_image_sizes.push_back(QSize(0,0)); // CustomSchema + c_minimum_image_sizes.push_back(QSize(88,31)); // Rss202Schema + + + // + // Maximum Image Sizes + // + c_maximum_image_sizes.push_back(QSize(0,0)); // CustomSchema + c_maximum_image_sizes.push_back(QSize(144,400)); // Rss202Schema + + + // + // Header Templates + // + // CustomSchema + c_header_templates.push_back(""); + + // Rss202Schema + c_header_templates.push_back("\n"); + + + // + // Channel Templates + // + // CustomSchema + c_channel_templates.push_back(""); + + // Rs202Schema + c_channel_templates.push_back("%TITLE%\n%DESCRIPTION%\n%CATEGORY%\n%LINK%\n%LANGUAGE%\n%COPYRIGHT%\n%BUILD_DATE%\n%PUBLISH_DATE%\n%EDITOR%\n%WEBMASTER%\n%GENERATOR%\n\n %IMAGE_URL%\n %TITLE%\n %LINK%\n %IMAGE_WIDTH%\n %IMAGE_HEIGHT%\n %IMAGE_DESCRIPTION%\n\n"); + + + // + // Item Templates + // + // CustomSchema + c_item_templates.push_back(""); + + // Rss202Schema + c_item_templates.push_back("%ITEM_TITLE%\n%ITEM_LINK%\n%ITEM_GUID%\n%ITEM_DESCRIPTION%\n%ITEM_AUTHOR%\n%ITEM_COMMENTS%\n%ITEM_SOURCE_TEXT%\n\n%ITEM_CATEGORY%\n%ITEM_PUBLISH_DATE%"); +} + + +QString RDRssSchemas::name(RssSchema schema) const +{ + return c_names.at(schema); +} + + +QSize RDRssSchemas::minimumImageSize(RssSchema schema) const +{ + return c_minimum_image_sizes.at(schema); +} + + +QSize RDRssSchemas::maximumImageSize(RssSchema schema) const +{ + return c_maximum_image_sizes.at(schema); +} + + +QString RDRssSchemas::headerTemplate(RssSchema schema) const +{ + return c_header_templates.at(schema); +} + + +QString RDRssSchemas::channelTemplate(RssSchema schema) const +{ + return c_channel_templates.at(schema); +} + + +QString RDRssSchemas::itemTemplate(RssSchema schema) const +{ + return c_item_templates.at(schema); +} diff --git a/lib/rdrssschemas.h b/lib/rdrssschemas.h new file mode 100644 index 00000000..8f6a925d --- /dev/null +++ b/lib/rdrssschemas.h @@ -0,0 +1,51 @@ +// rdrssschemas.h +// +// RSS schema definitions for Rivendell +// +// (C) Copyright 2020 Fred Gleason +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public +// License along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifndef RDRSSSCHEMAS_H +#define RDRSSSCHEMAS_H + +#include +#include +#include +#include + +class RDRssSchemas +{ + public: + enum RssSchema {CustomSchema=0,Rss202Schema=1,LastSchema=2}; + RDRssSchemas(); + QString name(RssSchema schema) const; + QSize minimumImageSize(RssSchema schema) const; + QSize maximumImageSize(RssSchema schema) const; + QString headerTemplate(RssSchema schema) const; + QString channelTemplate(RssSchema schema) const; + QString itemTemplate(RssSchema schema) const; + + private: + QStringList c_names; + QList c_minimum_image_sizes; + QList c_maximum_image_sizes; + QStringList c_header_templates; + QStringList c_channel_templates; + QStringList c_item_templates; +}; + + +#endif // RDRSSSCHEMAS_H diff --git a/rdadmin/edit_feed.cpp b/rdadmin/edit_feed.cpp index 679d793f..4e3d1e5b 100644 --- a/rdadmin/edit_feed.cpp +++ b/rdadmin/edit_feed.cpp @@ -382,10 +382,10 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent) // RSS Schema // feed_rss_schema_box=new QComboBox(this); - for(int i=0;i insertItem(feed_rss_schema_box->count(), - RDFeed::rssSchemaString((RDFeed::RssSchema)i),i); + feed_feed->rssSchemas()->name((RDRssSchemas::RssSchema)i),i); } connect(feed_rss_schema_box,SIGNAL(activated(int)), this,SLOT(comboboxActivatedData(int))); @@ -458,7 +458,7 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent) feed_purge_url_edit->setText(feed_feed->purgeUrl()); feed_purge_username_edit->setText(feed_feed->purgeUsername()); feed_purge_password_edit->setText(feed_feed->purgePassword()); - RDFeed::RssSchema schema=feed_feed->rssSchema(); + RDRssSchemas::RssSchema schema=feed_feed->rssSchema(); for(int i=0;icount();i++) { if(feed_rss_schema_box->itemData(i).toInt()==schema) { feed_rss_schema_box->setCurrentItem(i); @@ -625,7 +625,7 @@ void EditFeed::okData() feed_feed->setPurgeUsername(feed_purge_username_edit->text()); feed_feed->setPurgePassword(feed_purge_password_edit->text()); feed_feed-> - setRssSchema((RDFeed::RssSchema)feed_rss_schema_box-> + setRssSchema((RDRssSchemas::RssSchema)feed_rss_schema_box-> itemData(feed_rss_schema_box->currentIndex()).toUInt()); feed_feed->setHeaderXml(feed_header_xml_edit->text()); feed_feed->setChannelXml(feed_channel_xml_edit->text()); @@ -774,8 +774,8 @@ void EditFeed::UpdateControlState() bool redirected=feed_redirect_check->isChecked(); bool custom_schema= feed_rss_schema_box->itemData(feed_rss_schema_box->currentIndex()).toInt()== - RDFeed::CustomSchema; - bool item_image=feed_rss_schema_box->itemData(feed_rss_schema_box->currentIndex()).toInt()!=RDFeed::Rss202Schema; + RDRssSchemas::CustomSchema; + bool item_image=feed_rss_schema_box->itemData(feed_rss_schema_box->currentIndex()).toInt()!=RDRssSchemas::Rss202Schema; feed_is_superfeed_label->setDisabled(redirected); feed_is_superfeed_box->setDisabled(redirected); diff --git a/utils/rddbmgr/updateschema.cpp b/utils/rddbmgr/updateschema.cpp index 0ff58249..56e9a000 100644 --- a/utils/rddbmgr/updateschema.cpp +++ b/utils/rddbmgr/updateschema.cpp @@ -10008,30 +10008,6 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) return false; } - for(int i=0;i