diff --git a/interfaces/feedstorage.h b/interfaces/feedstorage.h index 253ed9cb..3d22df46 100644 --- a/interfaces/feedstorage.h +++ b/interfaces/feedstorage.h @@ -1,149 +1,110 @@ /* This file is part of Akregator. Copyright (C) 2005 Frank Osterfeld This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #ifndef AKREGATOR_BACKEND_FEEDSTORAGE_H #define AKREGATOR_BACKEND_FEEDSTORAGE_H #include #include class QString; class QStringList; namespace Akregator { namespace Backend { -/** a convenience class to handle categories in the backend */ -class Category -{ -public: - - QString term; - QString scheme; - QString name; - - /** two categories are equal when scheme and term are equal, name is ignored */ - - bool operator==(const Category &other) const - { - return term == other.term && scheme == other.scheme; - } - - bool operator!=(const Category &other) const - { - return !operator==(other); - } - - /** we need this for QMaps */ - bool operator<(const Category &other) const - { - return other.scheme < other.scheme || (other.scheme == other.scheme && term < other.term); - } -}; class Storage; class FeedStorage : public QObject //krazy:exclude=qobject { public: virtual int unread() const = 0; virtual void setUnread(int unread) = 0; virtual int totalCount() const = 0; virtual int lastFetch() const = 0; virtual void setLastFetch(int lastFetch) = 0; - /** returns the guids of all articles in this storage. If a tagID is given, only articles with this tag are returned */ - virtual QStringList articles(const QString &tagID = QString()) const = 0; - - /** returns the guid of the articles in a given category */ - virtual QStringList articles(const Category &cat) const = 0; + /** returns the guids of all articles in this storage. */ + virtual QStringList articles() const = 0; /** Appends all articles from another storage. If there is already an article in this feed with the same guid, it is replaced by the article from the source @param source the archive which articles should be appended */ virtual void add(FeedStorage *source) = 0; /** reads an article from another storage and adds it to this storage */ virtual void copyArticle(const QString &guid, FeedStorage *source) = 0; /** deletes all articles from the archive */ virtual void clear() = 0; virtual bool contains(const QString &guid) const = 0; virtual void addEntry(const QString &guid) = 0; virtual void deleteArticle(const QString &guid) = 0; virtual int comments(const QString &guid) const = 0; virtual QString commentsLink(const QString &guid) const = 0; virtual void setCommentsLink(const QString &guid, const QString &commentsLink) = 0; virtual void setComments(const QString &guid, int comments) = 0; virtual bool guidIsHash(const QString &guid) const = 0; virtual void setGuidIsHash(const QString &guid, bool isHash) = 0; virtual bool guidIsPermaLink(const QString &guid) const = 0; virtual void setGuidIsPermaLink(const QString &guid, bool isPermaLink) = 0; virtual uint hash(const QString &guid) const = 0; virtual void setHash(const QString &guid, uint hash) = 0; virtual void setDeleted(const QString &guid) = 0; virtual QString link(const QString &guid) const = 0; virtual void setLink(const QString &guid, const QString &link) = 0; virtual uint pubDate(const QString &guid) const = 0; virtual void setPubDate(const QString &guid, uint pubdate) = 0; virtual int status(const QString &guid) const = 0; virtual void setStatus(const QString &guid, int status) = 0; virtual QString title(const QString &guid) const = 0; virtual void setTitle(const QString &guid, const QString &title) = 0; virtual QString description(const QString &guid) const = 0; virtual void setDescription(const QString &guid, const QString &description) = 0; virtual QString content(const QString &guid) const = 0; virtual void setContent(const QString &guid, const QString &content) = 0; - virtual void addTag(const QString &guid, const QString &tag) = 0; - virtual void removeTag(const QString &guid, const QString &tag) = 0; - - /** returns the tags of a given article. If @c guid is null, it returns all tags used in this feed */ - virtual QStringList tags(const QString &guid = QString()) const = 0; - - virtual void addCategory(const QString &guid, const Category &category) = 0; - virtual QList categories(const QString &guid = QString()) const = 0; - virtual void setEnclosure(const QString &guid, const QString &url, const QString &type, int length) = 0; virtual void removeEnclosure(const QString &guid) = 0; virtual void setAuthorName(const QString & /*guid*/, const QString &name) = 0; virtual void setAuthorUri(const QString & /*guid*/, const QString &uri) = 0; virtual void setAuthorEMail(const QString & /*guid*/, const QString &email) = 0; virtual QString authorName(const QString &guid) const = 0; virtual QString authorUri(const QString &guid) const = 0; virtual QString authorEMail(const QString &guid) const = 0; virtual void enclosure(const QString &guid, bool &hasEnclosure, QString &url, QString &type, int &length) const = 0; virtual void close() = 0; virtual void commit() = 0; virtual void rollback() = 0; virtual void convertOldArchive() = 0; }; } // namespace Backend } // namespace Akregator #endif // AKREGATOR_BACKEND_FEEDSTORAGE_H diff --git a/plugins/mk4storage/feedstoragemk4impl.cpp b/plugins/mk4storage/feedstoragemk4impl.cpp index 82127ede..eed87420 100644 --- a/plugins/mk4storage/feedstoragemk4impl.cpp +++ b/plugins/mk4storage/feedstoragemk4impl.cpp @@ -1,912 +1,647 @@ /* This file is part of Akregator. Copyright (C) 2005 Frank Osterfeld This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #include "feedstoragemk4impl.h" #include "storagemk4impl.h" #include #include #include #include #include #include #include #include #include namespace { static uint calcHash(const QString &str) { if (str.isNull()) { // handle null string as "", prevents crash return calcHash(QLatin1String("")); } const char *s = str.toLatin1(); uint hash = 5381; int c; while ((c = *s++)) { hash = ((hash << 5) + hash) + c; // hash*33 + c } return hash; } } namespace Akregator { namespace Backend { class FeedStorageMK4Impl::FeedStorageMK4ImplPrivate { public: FeedStorageMK4ImplPrivate() : modified(false) , pguid("guid") , ptitle("title") , pdescription("description") , pcontent("content") , plink("link") , pcommentsLink("commentsLink") , ptag("tag") , pEnclosureType("enclosureType") , pEnclosureUrl("enclosureUrl") , pcatTerm("catTerm") , pcatScheme("catScheme") , pcatName("catName") , pauthorName("authorName") , pauthorUri("authorUri") , pauthorEMail("authorEMail") , phash("hash") , pguidIsHash("guidIsHash") , pguidIsPermaLink("guidIsPermaLink") , pcomments("comments") , pstatus("status") , ppubDate("pubDate") , pHasEnclosure("hasEnclosure") , pEnclosureLength("enclosureLength") - , ptags("tags") - , ptaggedArticles("taggedArticles") - , pcategorizedArticles("categorizedArticles") - , pcategories("categories") { } QString url; c4_Storage *storage; StorageMK4Impl *mainStorage; c4_View archiveView; bool autoCommit; bool modified; bool convert; QString oldArchivePath; c4_StringProp pguid, ptitle, pdescription, pcontent, plink, pcommentsLink, ptag, pEnclosureType, pEnclosureUrl, pcatTerm, pcatScheme, pcatName, pauthorName, pauthorUri, pauthorEMail; c4_IntProp phash, pguidIsHash, pguidIsPermaLink, pcomments, pstatus, ppubDate, pHasEnclosure, pEnclosureLength; - c4_ViewProp ptags, ptaggedArticles, pcategorizedArticles, pcategories; }; void FeedStorageMK4Impl::convertOldArchive() { if (!d->convert) { return; } d->convert = false; QFile file(d->oldArchivePath); if (!file.open(QIODevice::ReadOnly)) { return; } Syndication::DocumentSource src(file.readAll(), QStringLiteral("http://foo")); file.close(); Syndication::FeedPtr feed = Syndication::parse(src); if (feed) { //QList items = feed->items(); //QList::ConstIterator it = items.constBegin(); //QList::ConstIterator en = items.constEnd(); markDirty(); commit(); } } FeedStorageMK4Impl::FeedStorageMK4Impl(const QString &url, StorageMK4Impl *main) { d = new FeedStorageMK4ImplPrivate; d->autoCommit = main->autoCommit(); d->url = url; d->mainStorage = main; QString url2 = url; if (url.length() > 255) { url2 = url.left(200) + QString::number(::calcHash(url), 16); } qDebug() << url2; QString t = url2; QString t2 = url2; QString filePath = main->archivePath() + QLatin1Char('/') + t.replace(QLatin1Char('/'), QLatin1Char('_')).replace(QLatin1Char(':'), QLatin1Char('_')); d->oldArchivePath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/akregator/Archive/") + t2.replace(QLatin1Char('/'), QLatin1Char('_')).replace(QLatin1Char( ':'), QLatin1Char( '_')) + QLatin1String(".xml"); d->convert = !QFile::exists(filePath + QLatin1String(".mk4")) && QFile::exists(d->oldArchivePath); d->storage = new c4_Storage(QString(filePath + QLatin1String(".mk4")).toLocal8Bit(), true); d->archiveView = d->storage->GetAs( "articles[guid:S,title:S,hash:I,guidIsHash:I,guidIsPermaLink:I,description:S,link:S,comments:I,commentsLink:S,status:I,pubDate:I,tags[tag:S],hasEnclosure:I,enclosureUrl:S,enclosureType:S,enclosureLength:I,categories[catTerm:S,catScheme:S,catName:S],authorName:S,content:S,authorUri:S,authorEMail:S]"); c4_View hash = d->storage->GetAs("archiveHash[_H:I,_R:I]"); d->archiveView = d->archiveView.Hash(hash, 1); // hash on guid } FeedStorageMK4Impl::~FeedStorageMK4Impl() { delete d->storage; delete d; d = 0; } void FeedStorageMK4Impl::markDirty() { if (!d->modified) { d->modified = true; // Tell this to mainStorage d->mainStorage->markDirty(); } } void FeedStorageMK4Impl::commit() { if (d->modified) { d->storage->Commit(); } d->modified = false; } void FeedStorageMK4Impl::rollback() { d->storage->Rollback(); } void FeedStorageMK4Impl::close() { if (d->autoCommit) { commit(); } } int FeedStorageMK4Impl::unread() const { return d->mainStorage->unreadFor(d->url); } void FeedStorageMK4Impl::setUnread(int unread) { d->mainStorage->setUnreadFor(d->url, unread); } int FeedStorageMK4Impl::totalCount() const { return d->mainStorage->totalCountFor(d->url); } void FeedStorageMK4Impl::setTotalCount(int total) { d->mainStorage->setTotalCountFor(d->url, total); } int FeedStorageMK4Impl::lastFetch() const { return d->mainStorage->lastFetchFor(d->url); } void FeedStorageMK4Impl::setLastFetch(int lastFetch) { d->mainStorage->setLastFetchFor(d->url, lastFetch); } -QStringList FeedStorageMK4Impl::articles(const QString &tag) const +QStringList FeedStorageMK4Impl::articles() const { QStringList list; -#if 0 //category and tag support disabled - if (tag.isNull()) { // return all articles -#endif int size = d->archiveView.GetSize(); + list.reserve(size); for (int i = 0; i < size; ++i) { // fill with guids list += QString::fromLatin1(d->pguid(d->archiveView.GetAt(i))); } -#if 0 //category and tag support disabled -} else { - c4_Row tagrow; - d->ptag(tagrow) = tag.toUtf8().data(); - int tagidx = d->tagView.Find(tagrow); - if (tagidx != -1) { - tagrow = d->tagView.GetAt(tagidx); - c4_View tagView = d->ptaggedArticles(tagrow); - int size = tagView.GetSize(); - for (int i = 0; i < size; ++i) { - list += QString(d->pguid(tagView.GetAt(i))); - } - } -} -#endif - return list; -} - -QStringList FeedStorageMK4Impl::articles(const Category &cat) const -{ - QStringList list; -#if 0 //category and tag support disabled - c4_Row catrow; - d->pcatTerm(catrow) = cat.term.toUtf8().data(); - d->pcatScheme(catrow) = cat.scheme.toUtf8().data(); - - int catidx = d->catView.Find(catrow); - if (catidx != -1) { - catrow = d->catView.GetAt(catidx); - c4_View catView = d->pcategorizedArticles(catrow); - int size = catView.GetSize(); - for (int i = 0; i < size; ++i) { - list += QString(d->pguid(catView.GetAt(i))); - } - } -#endif return list; } void FeedStorageMK4Impl::addEntry(const QString &guid) { c4_Row row; d->pguid(row) = guid.toLatin1(); if (!contains(guid)) { d->archiveView.Add(row); markDirty(); setTotalCount(totalCount() + 1); } } bool FeedStorageMK4Impl::contains(const QString &guid) const { return findArticle(guid) != -1; } int FeedStorageMK4Impl::findArticle(const QString &guid) const { c4_Row findrow; d->pguid(findrow) = guid.toLatin1(); return d->archiveView.Find(findrow); } void FeedStorageMK4Impl::deleteArticle(const QString &guid) { int findidx = findArticle(guid); if (findidx != -1) { - QStringList list = tags(guid); - for (QStringList::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it) { - removeTag(guid, *it); - } setTotalCount(totalCount() - 1); d->archiveView.RemoveAt(findidx); markDirty(); } } int FeedStorageMK4Impl::comments(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? d->pcomments(d->archiveView.GetAt(findidx)) : 0; } QString FeedStorageMK4Impl::commentsLink(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromLatin1(d->pcommentsLink(d->archiveView.GetAt(findidx))) : QLatin1String(""); } bool FeedStorageMK4Impl::guidIsHash(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? d->pguidIsHash(d->archiveView.GetAt(findidx)) : false; } bool FeedStorageMK4Impl::guidIsPermaLink(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? d->pguidIsPermaLink(d->archiveView.GetAt(findidx)) : false; } uint FeedStorageMK4Impl::hash(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? d->phash(d->archiveView.GetAt(findidx)) : 0; } void FeedStorageMK4Impl::setDeleted(const QString &guid) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); - QStringList list = tags(guid); - for (QStringList::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it) { - removeTag(guid, *it); - } d->pdescription(row) = ""; d->pcontent(row) = ""; d->ptitle(row) = ""; d->plink(row) = ""; d->pauthorName(row) = ""; d->pauthorUri(row) = ""; d->pauthorEMail(row) = ""; d->pcommentsLink(row) = ""; d->archiveView.SetAt(findidx, row); markDirty(); } QString FeedStorageMK4Impl::link(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromLatin1(d->plink(d->archiveView.GetAt(findidx))) : QLatin1String(""); } uint FeedStorageMK4Impl::pubDate(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? d->ppubDate(d->archiveView.GetAt(findidx)) : 0; } int FeedStorageMK4Impl::status(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? d->pstatus(d->archiveView.GetAt(findidx)) : 0; } void FeedStorageMK4Impl::setStatus(const QString &guid, int status) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pstatus(row) = status; d->archiveView.SetAt(findidx, row); markDirty(); } QString FeedStorageMK4Impl::title(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromUtf8(d->ptitle(d->archiveView.GetAt(findidx))) : QLatin1String(""); } QString FeedStorageMK4Impl::description(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromUtf8(d->pdescription(d->archiveView.GetAt(findidx))) : QLatin1String(""); } QString FeedStorageMK4Impl::content(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromUtf8(d->pcontent(d->archiveView.GetAt(findidx))) : QLatin1String(""); } void FeedStorageMK4Impl::setPubDate(const QString &guid, uint pubdate) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->ppubDate(row) = pubdate; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setGuidIsHash(const QString &guid, bool isHash) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pguidIsHash(row) = isHash; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setLink(const QString &guid, const QString &link) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->plink(row) = !link.isEmpty() ? link.toLatin1() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setHash(const QString &guid, uint hash) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->phash(row) = hash; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setTitle(const QString &guid, const QString &title) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->ptitle(row) = !title.isEmpty() ? title.toUtf8().data() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setDescription(const QString &guid, const QString &description) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pdescription(row) = !description.isEmpty() ? description.toUtf8().data() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setContent(const QString &guid, const QString &content) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pcontent(row) = !content.isEmpty() ? content.toUtf8().data() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setAuthorName(const QString &guid, const QString &author) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pauthorName(row) = !author.isEmpty() ? author.toUtf8().data() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setAuthorUri(const QString &guid, const QString &author) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pauthorUri(row) = !author.isEmpty() ? author.toUtf8().data() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setAuthorEMail(const QString &guid, const QString &author) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pauthorEMail(row) = !author.isEmpty() ? author.toUtf8().data() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } QString FeedStorageMK4Impl::authorName(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromUtf8(d->pauthorName(d->archiveView.GetAt(findidx))) : QString(); } QString FeedStorageMK4Impl::authorUri(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromUtf8(d->pauthorUri(d->archiveView.GetAt(findidx))) : QString(); } QString FeedStorageMK4Impl::authorEMail(const QString &guid) const { int findidx = findArticle(guid); return findidx != -1 ? QString::fromUtf8(d->pauthorEMail(d->archiveView.GetAt(findidx))) : QString(); } void FeedStorageMK4Impl::setCommentsLink(const QString &guid, const QString &commentsLink) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pcommentsLink(row) = !commentsLink.isEmpty() ? commentsLink.toUtf8().data() : ""; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setComments(const QString &guid, int comments) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pcomments(row) = comments; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::setGuidIsPermaLink(const QString &guid, bool isPermaLink) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pguidIsPermaLink(row) = isPermaLink; d->archiveView.SetAt(findidx, row); markDirty(); } -void FeedStorageMK4Impl::addCategory(const QString &guid, const Category &cat) -{ - int findidx = findArticle(guid); - if (findidx == -1) { - return; - } - - c4_Row row; - row = d->archiveView.GetAt(findidx); - c4_View catView = d->pcategories(row); - c4_Row findrow; - - d->pcatTerm(findrow) = cat.term.toUtf8().data(); - d->pcatScheme(findrow) = cat.scheme.toUtf8().data(); - - int catidx = catView.Find(findrow); - if (catidx == -1) { - d->pcatName(findrow) = cat.name.toUtf8().data(); - catidx = catView.Add(findrow); - d->pcategories(row) = catView; - d->archiveView.SetAt(findidx, row); - - // add to category->articles index - c4_Row catrow; - d->pcatTerm(catrow) = cat.term.toUtf8().data(); - d->pcatScheme(catrow) = cat.scheme.toUtf8().data(); - d->pcatName(catrow) = cat.name.toUtf8().data(); -#if 0 //category and tag support disabled - int catidx2 = d->catView.Find(catrow); - - if (catidx2 == -1) { - catidx2 = d->catView.Add(catrow); - } - - c4_Row catrow2 = d->catView.GetAt(catidx2); - c4_View catView2 = d->pcategorizedArticles(catrow2); - - c4_Row row3; - d->pguid(row3) = guid.toLatin1(); - int guididx = catView2.Find(row3); - if (guididx == -1) { - guididx = catView2.Add(row3); - catView2.SetAt(guididx, row3); - d->pcategorizedArticles(catrow2) = catView2; - d->catView.SetAt(catidx2, catrow2); - } -#endif - markDirty(); - } -} - -QList FeedStorageMK4Impl::categories(const QString &guid) const -{ - QList list; - - if (!guid.isNull()) { // return categories for an article - int findidx = findArticle(guid); - if (findidx == -1) { - return list; - } - - c4_Row row; - row = d->archiveView.GetAt(findidx); - c4_View catView = d->pcategories(row); - int size = catView.GetSize(); - - for (int i = 0; i < size; ++i) { - Category cat; - - cat.term = QString::fromUtf8(d->pcatTerm(catView.GetAt(i))); - cat.scheme = QString::fromUtf8(d->pcatScheme(catView.GetAt(i))); - cat.name = QString::fromUtf8(d->pcatName(catView.GetAt(i))); - - list += cat; - } - } else { // return all categories in the feed -#if 0 //category and tag support disabled - int size = d->catView.GetSize(); - for (int i = 0; i < size; ++i) { - c4_Row row = d->catView.GetAt(i); - - Category cat; - cat.term = QString(d->pcatTerm(row)); - cat.scheme = QString(d->pcatScheme(row)); - cat.name = QString(d->pcatName(row)); - - list += cat; - } -#endif - } - - return list; -} - -void FeedStorageMK4Impl::addTag(const QString &guid, const QString &tag) -{ -#if 0 //category and tag support disabled - int findidx = findArticle(guid); - if (findidx == -1) { - return; - } - - c4_Row row; - row = d->archiveView.GetAt(findidx); - c4_View tagView = d->ptags(row); - c4_Row findrow; - d->ptag(findrow) = tag.toUtf8().data(); - int tagidx = tagView.Find(findrow); - if (tagidx == -1) { - tagidx = tagView.Add(findrow); - d->ptags(row) = tagView; - d->archiveView.SetAt(findidx, row); - - // add to tag->articles index - c4_Row tagrow; - d->ptag(tagrow) = tag.toUtf8().data(); - int tagidx2 = d->tagView.Find(tagrow); - if (tagidx2 == -1) { - tagidx2 = d->tagView.Add(tagrow); - } - tagrow = d->tagView.GetAt(tagidx2); - c4_View tagView2 = d->ptaggedArticles(tagrow); - - c4_Row row3; - d->pguid(row3) = guid.toLatin1(); - int guididx = tagView2.Find(row3); - if (guididx == -1) { - guididx = tagView2.Add(row3); - tagView2.SetAt(guididx, row3); - d->ptaggedArticles(tagrow) = tagView2; - d->tagView.SetAt(tagidx2, tagrow); - } - markDirty(); - } -#endif -} - -void FeedStorageMK4Impl::removeTag(const QString &guid, const QString &tag) -{ -#if 0 //category and tag support disabled - int findidx = findArticle(guid); - if (findidx == -1) { - return; - } - - c4_Row row; - row = d->archiveView.GetAt(findidx); - c4_View tagView = d->ptags(row); - c4_Row findrow; - d->ptag(findrow) = tag.toUtf8().data(); - int tagidx = tagView.Find(findrow); - if (tagidx != -1) { - tagView.RemoveAt(tagidx); - d->ptags(row) = tagView; - d->archiveView.SetAt(findidx, row); - - // remove from tag->articles index - c4_Row tagrow; - d->ptag(tagrow) = tag.toUtf8().data(); - int tagidx2 = d->tagView.Find(tagrow); - if (tagidx2 != -1) { - tagrow = d->tagView.GetAt(tagidx2); - c4_View tagView2 = d->ptaggedArticles(tagrow); - - c4_Row row3; - d->pguid(row3) = guid.toLatin1(); - int guididx = tagView2.Find(row3); - if (guididx != -1) { - tagView2.RemoveAt(guididx); - d->ptaggedArticles(tagrow) = tagView2; - d->tagView.SetAt(tagidx2, tagrow); - } - } - - markDirty(); - } -#endif -} - -QStringList FeedStorageMK4Impl::tags(const QString &guid) const -{ - Q_UNUSED(guid); -//TODO what is the need of the unused parameter(s)? - QStringList list; -#if 0 //category and tag support disabled - if (!guid.isNull()) { // return tags for an articles - int findidx = findArticle(guid); - if (findidx == -1) { - return list; - } - - c4_Row row; - row = d->archiveView.GetAt(findidx); - c4_View tagView = d->ptags(row); - int size = tagView.GetSize(); - - for (int i = 0; i < size; ++i) { - list += QString::fromUtf8(d->ptag(tagView.GetAt(i))); - } - } else { // return all tags in the feed - int size = d->tagView.GetSize(); - for (int i = 0; i < size; ++i) { - list += QString(d->ptag(d->tagView.GetAt(i))); - } - } -#endif - return list; -} - void FeedStorageMK4Impl::add(FeedStorage *source) { QStringList articles = source->articles(); for (QStringList::ConstIterator it = articles.constBegin(); it != articles.constEnd(); ++it) { copyArticle(*it, source); } setUnread(source->unread()); setLastFetch(source->lastFetch()); setTotalCount(source->totalCount()); } void FeedStorageMK4Impl::copyArticle(const QString &guid, FeedStorage *source) { if (!contains(guid)) { addEntry(guid); } setComments(guid, source->comments(guid)); setCommentsLink(guid, source->commentsLink(guid)); setDescription(guid, source->description(guid)); setGuidIsHash(guid, source->guidIsHash(guid)); setGuidIsPermaLink(guid, source->guidIsPermaLink(guid)); setHash(guid, source->hash(guid)); setLink(guid, source->link(guid)); setPubDate(guid, source->pubDate(guid)); setStatus(guid, source->status(guid)); setTitle(guid, source->title(guid)); setAuthorName(guid, source->authorName(guid)); setAuthorUri(guid, source->authorUri(guid)); setAuthorEMail(guid, source->authorEMail(guid)); - - QStringList tags = source->tags(guid); - for (QStringList::ConstIterator it = tags.constBegin(); it != tags.constEnd(); ++it) { - addTag(guid, *it); - } } void FeedStorageMK4Impl::setEnclosure(const QString &guid, const QString &url, const QString &type, int length) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pHasEnclosure(row) = true; d->pEnclosureUrl(row) = !url.isEmpty() ? url.toUtf8().data() : ""; d->pEnclosureType(row) = !type.isEmpty() ? type.toUtf8().data() : ""; d->pEnclosureLength(row) = length; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::removeEnclosure(const QString &guid) { int findidx = findArticle(guid); if (findidx == -1) { return; } c4_Row row; row = d->archiveView.GetAt(findidx); d->pHasEnclosure(row) = false; d->pEnclosureUrl(row) = ""; d->pEnclosureType(row) = ""; d->pEnclosureLength(row) = -1; d->archiveView.SetAt(findidx, row); markDirty(); } void FeedStorageMK4Impl::enclosure(const QString &guid, bool &hasEnclosure, QString &url, QString &type, int &length) const { int findidx = findArticle(guid); if (findidx == -1) { hasEnclosure = false; url.clear(); type.clear(); length = -1; return; } c4_Row row = d->archiveView.GetAt(findidx); hasEnclosure = d->pHasEnclosure(row); url = QLatin1String(d->pEnclosureUrl(row)); type = QLatin1String(d->pEnclosureType(row)); length = d->pEnclosureLength(row); } void FeedStorageMK4Impl::clear() { d->storage->RemoveAll(); setUnread(0); markDirty(); } } // namespace Backend } // namespace Akregator diff --git a/plugins/mk4storage/feedstoragemk4impl.h b/plugins/mk4storage/feedstoragemk4impl.h index 9c0a93ea..408894f8 100644 --- a/plugins/mk4storage/feedstoragemk4impl.h +++ b/plugins/mk4storage/feedstoragemk4impl.h @@ -1,113 +1,104 @@ /* This file is part of Akregator. Copyright (C) 2005 Frank Osterfeld This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #ifndef AKREGATOR_BACKEND_FEEDSTORAGEMK4IMPL_H #define AKREGATOR_BACKEND_FEEDSTORAGEMK4IMPL_H #include "feedstorage.h" namespace Akregator { namespace Backend { class StorageMK4Impl; class FeedStorageMK4Impl : public FeedStorage { public: FeedStorageMK4Impl(const QString &url, StorageMK4Impl *main); ~FeedStorageMK4Impl(); void add(FeedStorage *source) override; void copyArticle(const QString &guid, FeedStorage *source) override; void clear() override; int unread() const override; void setUnread(int unread) override; int totalCount() const override; int lastFetch() const override; void setLastFetch(int lastFetch) override; - QStringList articles(const QString &tag = QString()) const override; - - QStringList articles(const Category &cat) const override; + QStringList articles() const override; bool contains(const QString &guid) const override; void addEntry(const QString &guid) override; void deleteArticle(const QString &guid) override; int comments(const QString &guid) const override; QString commentsLink(const QString &guid) const override; void setCommentsLink(const QString &guid, const QString &commentsLink) override; void setComments(const QString &guid, int comments) override; bool guidIsHash(const QString &guid) const override; void setGuidIsHash(const QString &guid, bool isHash) override; bool guidIsPermaLink(const QString &guid) const override; void setGuidIsPermaLink(const QString &guid, bool isPermaLink) override; uint hash(const QString &guid) const override; void setHash(const QString &guid, uint hash) override; void setDeleted(const QString &guid) override; QString link(const QString &guid) const override; void setLink(const QString &guid, const QString &link) override; uint pubDate(const QString &guid) const override; void setPubDate(const QString &guid, uint pubdate) override; int status(const QString &guid) const override; void setStatus(const QString &guid, int status) override; QString title(const QString &guid) const override; void setTitle(const QString &guid, const QString &title) override; QString description(const QString &guid) const override; void setDescription(const QString &guid, const QString &description) override; QString content(const QString &guid) const override; void setContent(const QString &guid, const QString &content) override; void setEnclosure(const QString &guid, const QString &url, const QString &type, int length) override; void removeEnclosure(const QString &guid) override; void enclosure(const QString &guid, bool &hasEnclosure, QString &url, QString &type, int &length) const override; - void addTag(const QString &guid, const QString &tag) override; - void removeTag(const QString &guid, const QString &tag) override; - QStringList tags(const QString &guid = QString()) const override; - - void addCategory(const QString &guid, const Category &category) override; - QList categories(const QString &guid = QString()) const override; - void setAuthorName(const QString &guid, const QString &name) override; void setAuthorUri(const QString &guid, const QString &uri) override; void setAuthorEMail(const QString &guid, const QString &email) override; QString authorName(const QString &guid) const override; QString authorUri(const QString &guid) const override; QString authorEMail(const QString &guid) const override; void close() override; void commit() override; void rollback() override; void convertOldArchive() override; private: void markDirty(); /** finds article by guid, returns -1 if not in archive **/ int findArticle(const QString &guid) const; void setTotalCount(int total); class FeedStorageMK4ImplPrivate; FeedStorageMK4ImplPrivate *d; }; } // namespace Backend } // namespace Akregator #endif // AKREGATOR_BACKEND_FEEDSTORAGEMK4IMPL_H diff --git a/src/dummystorage/feedstoragedummyimpl.cpp b/src/dummystorage/feedstoragedummyimpl.cpp index 98341ef4..f3631312 100644 --- a/src/dummystorage/feedstoragedummyimpl.cpp +++ b/src/dummystorage/feedstoragedummyimpl.cpp @@ -1,524 +1,425 @@ /* This file is part of Akregator. Copyright (C) 2005 Frank Osterfeld This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #include "feedstoragedummyimpl.h" #include "storagedummyimpl.h" #include #include #include #include #include #include namespace Akregator { namespace Backend { class FeedStorageDummyImpl::FeedStorageDummyImplPrivate { public: class Entry { public: Entry() : status(0) , pubDate(0) , hash(0) , guidIsHash(false) , guidIsPermaLink(false) { } StorageDummyImpl *mainStorage = nullptr; - QList categories; - QStringList tags; QString enclosureUrl; QString enclosureType; QString title; QString description; QString content; QString link; QString authorName; QString authorUri; QString authorEMail; QString commentsLink; int comments; int status; int enclosureLength; uint pubDate; uint hash; bool guidIsHash = false; bool guidIsPermaLink = false; bool hasEnclosure = false; }; QHash entries; - // all tags occurring in the feed - QStringList tags; - - // tag -> articles index - QHash taggedArticles; - - QList categories; - QMap categorizedArticles; - Storage *mainStorage; QString url; }; void FeedStorageDummyImpl::convertOldArchive() { } FeedStorageDummyImpl::FeedStorageDummyImpl(const QString &url, StorageDummyImpl *main) : d(new FeedStorageDummyImplPrivate) { d->url = url; d->mainStorage = main; } FeedStorageDummyImpl::~FeedStorageDummyImpl() { delete d; d = nullptr; } void FeedStorageDummyImpl::commit() { } void FeedStorageDummyImpl::rollback() { } void FeedStorageDummyImpl::close() { } int FeedStorageDummyImpl::unread() const { return d->mainStorage->unreadFor(d->url); } void FeedStorageDummyImpl::setUnread(int unread) { d->mainStorage->setUnreadFor(d->url, unread); } int FeedStorageDummyImpl::totalCount() const { return d->mainStorage->totalCountFor(d->url); } void FeedStorageDummyImpl::setTotalCount(int total) { d->mainStorage->setTotalCountFor(d->url, total); } int FeedStorageDummyImpl::lastFetch() const { return d->mainStorage->lastFetchFor(d->url); } void FeedStorageDummyImpl::setLastFetch(int lastFetch) { d->mainStorage->setLastFetchFor(d->url, lastFetch); } -QStringList FeedStorageDummyImpl::articles(const QString &tag) const -{ - return tag.isNull() ? QStringList(d->entries.keys()) : d->taggedArticles.value(tag); -} - -QStringList FeedStorageDummyImpl::articles(const Category &cat) const +QStringList FeedStorageDummyImpl::articles() const { - return d->categorizedArticles.value(cat); + return QStringList(d->entries.keys()); } void FeedStorageDummyImpl::addEntry(const QString &guid) { if (!d->entries.contains(guid)) { d->entries[guid] = FeedStorageDummyImplPrivate::Entry(); setTotalCount(totalCount() + 1); } } bool FeedStorageDummyImpl::contains(const QString &guid) const { return d->entries.contains(guid); } void FeedStorageDummyImpl::deleteArticle(const QString &guid) { if (!d->entries.contains(guid)) { return; } setDeleted(guid); d->entries.remove(guid); } int FeedStorageDummyImpl::comments(const QString &guid) const { return contains(guid) ? d->entries[guid].comments : 0; } QString FeedStorageDummyImpl::commentsLink(const QString &guid) const { return contains(guid) ? d->entries[guid].commentsLink : QString(); } bool FeedStorageDummyImpl::guidIsHash(const QString &guid) const { return contains(guid) ? d->entries[guid].guidIsHash : false; } bool FeedStorageDummyImpl::guidIsPermaLink(const QString &guid) const { return contains(guid) ? d->entries[guid].guidIsPermaLink : false; } uint FeedStorageDummyImpl::hash(const QString &guid) const { return contains(guid) ? d->entries[guid].hash : 0; } void FeedStorageDummyImpl::setDeleted(const QString &guid) { if (!contains(guid)) { return; } FeedStorageDummyImplPrivate::Entry entry = d->entries[guid]; - // remove article from tag->article index - QStringList::ConstIterator it = entry.tags.constBegin(); - QStringList::ConstIterator end = entry.tags.constEnd(); - - for (; it != end; ++it) { - d->taggedArticles[*it].removeAll(guid); - if (d->taggedArticles[*it].isEmpty()) { - d->tags.removeAll(*it); - } - } - - // remove article from tag->category index - QList::ConstIterator it2 = entry.categories.constBegin(); - QList::ConstIterator end2 = entry.categories.constEnd(); - - for (; it2 != end2; ++it2) { - d->categorizedArticles[*it2].removeAll(guid); - if (d->categorizedArticles[*it2].isEmpty()) { - d->categories.removeAll(*it2); - } - } - entry.description.clear(); entry.content.clear(); entry.title.clear(); entry.link.clear(); entry.commentsLink.clear(); } QString FeedStorageDummyImpl::link(const QString &guid) const { return contains(guid) ? d->entries[guid].link : QString(); } uint FeedStorageDummyImpl::pubDate(const QString &guid) const { return contains(guid) ? d->entries[guid].pubDate : 0; } int FeedStorageDummyImpl::status(const QString &guid) const { return contains(guid) ? d->entries[guid].status : 0; } void FeedStorageDummyImpl::setStatus(const QString &guid, int status) { if (contains(guid)) { d->entries[guid].status = status; } } QString FeedStorageDummyImpl::title(const QString &guid) const { return contains(guid) ? d->entries[guid].title : QString(); } QString FeedStorageDummyImpl::description(const QString &guid) const { return contains(guid) ? d->entries[guid].description : QString(); } QString FeedStorageDummyImpl::content(const QString &guid) const { return contains(guid) ? d->entries[guid].content : QString(); } QString FeedStorageDummyImpl::authorName(const QString &guid) const { return contains(guid) ? d->entries[guid].authorName : QString(); } QString FeedStorageDummyImpl::authorUri(const QString &guid) const { return contains(guid) ? d->entries[guid].authorUri : QString(); } QString FeedStorageDummyImpl::authorEMail(const QString &guid) const { return contains(guid) ? d->entries[guid].authorEMail : QString(); } void FeedStorageDummyImpl::setPubDate(const QString &guid, uint pubdate) { if (contains(guid)) { d->entries[guid].pubDate = pubdate; } } void FeedStorageDummyImpl::setGuidIsHash(const QString &guid, bool isHash) { if (contains(guid)) { d->entries[guid].guidIsHash = isHash; } } void FeedStorageDummyImpl::setLink(const QString &guid, const QString &link) { if (contains(guid)) { d->entries[guid].link = link; } } void FeedStorageDummyImpl::setHash(const QString &guid, uint hash) { if (contains(guid)) { d->entries[guid].hash = hash; } } void FeedStorageDummyImpl::setTitle(const QString &guid, const QString &title) { if (contains(guid)) { d->entries[guid].title = title; } } void FeedStorageDummyImpl::setDescription(const QString &guid, const QString &description) { if (contains(guid)) { d->entries[guid].description = description; } } void FeedStorageDummyImpl::setCommentsLink(const QString &guid, const QString &commentsLink) { if (contains(guid)) { d->entries[guid].commentsLink = commentsLink; } } void FeedStorageDummyImpl::setContent(const QString &guid, const QString &content) { if (contains(guid)) { d->entries[guid].content = content; } } void FeedStorageDummyImpl::setAuthorName(const QString &guid, const QString &author) { if (contains(guid)) { d->entries[guid].authorName = author; } } void FeedStorageDummyImpl::setAuthorUri(const QString &guid, const QString &author) { if (contains(guid)) { d->entries[guid].authorUri = author; } } void FeedStorageDummyImpl::setAuthorEMail(const QString &guid, const QString &author) { if (contains(guid)) { d->entries[guid].authorEMail = author; } } void FeedStorageDummyImpl::setComments(const QString &guid, int comments) { if (contains(guid)) { d->entries[guid].comments = comments; } } void FeedStorageDummyImpl::setGuidIsPermaLink(const QString &guid, bool isPermaLink) { if (contains(guid)) { d->entries[guid].guidIsPermaLink = isPermaLink; } } -void FeedStorageDummyImpl::addTag(const QString &guid, const QString &tag) -{ - if (contains(guid)) { - d->entries[guid].tags.append(tag); - if (!d->taggedArticles[tag].contains(guid)) { - d->taggedArticles[tag].append(guid); - } - if (!d->tags.contains(tag)) { - d->tags.append(tag); - } - } -} - -void FeedStorageDummyImpl::addCategory(const QString &guid, const Category &cat) -{ - if (!contains(guid)) { - return; - } - - d->entries[guid].categories.append(cat); - - if (d->categorizedArticles[cat].isEmpty()) { - d->categories.append(cat); - } - d->categorizedArticles[cat].append(guid); -} - -QList FeedStorageDummyImpl::categories(const QString &guid) const -{ - if (!guid.isNull()) { - return contains(guid) ? d->entries[guid].categories : QList(); - } else { - return d->categories; - } -} - -void FeedStorageDummyImpl::removeTag(const QString &guid, const QString &tag) -{ - if (contains(guid)) { - d->entries[guid].tags.removeAll(tag); - d->taggedArticles[tag].removeAll(guid); - if (d->taggedArticles[tag].isEmpty()) { - d->tags.removeAll(tag); - } - } -} - -QStringList FeedStorageDummyImpl::tags(const QString &guid) const -{ - if (!guid.isNull()) { - return contains(guid) ? d->entries[guid].tags : QStringList(); - } else { - return d->tags; - } -} - void FeedStorageDummyImpl::add(FeedStorage *source) { QStringList articles = source->articles(); for (QStringList::ConstIterator it = articles.constBegin(); it != articles.constEnd(); ++it) { copyArticle(*it, source); } setUnread(source->unread()); setLastFetch(source->lastFetch()); setTotalCount(source->totalCount()); } void FeedStorageDummyImpl::copyArticle(const QString &guid, FeedStorage *source) { if (!contains(guid)) { addEntry(guid); } setComments(guid, source->comments(guid)); setCommentsLink(guid, source->commentsLink(guid)); setDescription(guid, source->description(guid)); setContent(guid, source->content(guid)); setGuidIsHash(guid, source->guidIsHash(guid)); setGuidIsPermaLink(guid, source->guidIsPermaLink(guid)); setHash(guid, source->hash(guid)); setLink(guid, source->link(guid)); setPubDate(guid, source->pubDate(guid)); setStatus(guid, source->status(guid)); setTitle(guid, source->title(guid)); - QStringList tags = source->tags(guid); - - for (QStringList::ConstIterator it = tags.constBegin(); it != tags.constEnd(); ++it) { - addTag(guid, *it); - } } void FeedStorageDummyImpl::clear() { d->entries.clear(); setUnread(0); setTotalCount(0); } void FeedStorageDummyImpl::setEnclosure(const QString &guid, const QString &url, const QString &type, int length) { if (contains(guid)) { FeedStorageDummyImplPrivate::Entry entry = d->entries[guid]; entry.hasEnclosure = true; entry.enclosureUrl = url; entry.enclosureType = type; entry.enclosureLength = length; } } void FeedStorageDummyImpl::removeEnclosure(const QString &guid) { if (contains(guid)) { FeedStorageDummyImplPrivate::Entry entry = d->entries[guid]; entry.hasEnclosure = false; entry.enclosureUrl.clear(); entry.enclosureType.clear(); entry.enclosureLength = -1; } } void FeedStorageDummyImpl::enclosure(const QString &guid, bool &hasEnclosure, QString &url, QString &type, int &length) const { if (contains(guid)) { FeedStorageDummyImplPrivate::Entry entry = d->entries[guid]; hasEnclosure = entry.hasEnclosure; url = entry.enclosureUrl; type = entry.enclosureType; length = entry.enclosureLength; } else { hasEnclosure = false; url.clear(); type.clear(); length = -1; } } } // namespace Backend } // namespace Akregator diff --git a/src/dummystorage/feedstoragedummyimpl.h b/src/dummystorage/feedstoragedummyimpl.h index a843cea8..b53c3ac0 100644 --- a/src/dummystorage/feedstoragedummyimpl.h +++ b/src/dummystorage/feedstoragedummyimpl.h @@ -1,112 +1,104 @@ /* This file is part of Akregator. Copyright (C) 2005 Frank Osterfeld This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #ifndef AKREGATOR_BACKEND_FEEDSTORAGEDUMMYIMPL_H #define AKREGATOR_BACKEND_FEEDSTORAGEDUMMYIMPL_H #include "feedstorage.h" #include namespace Akregator { namespace Backend { class StorageDummyImpl; class FeedStorageDummyImpl : public FeedStorage { public: FeedStorageDummyImpl(const QString &url, StorageDummyImpl *main); ~FeedStorageDummyImpl() override; void add(FeedStorage *source) override; void copyArticle(const QString &guid, FeedStorage *source) override; void clear() override; int unread() const override; void setUnread(int unread) override; int totalCount() const override; int lastFetch() const override; void setLastFetch(int lastFetch) override; - QStringList articles(const QString &tag = QString()) const override; - - QStringList articles(const Category &cat) const override; + QStringList articles() const override; bool contains(const QString &guid) const override; void addEntry(const QString &guid) override; void deleteArticle(const QString &guid) override; int comments(const QString &guid) const override; QString commentsLink(const QString &guid) const override; void setCommentsLink(const QString &guid, const QString &commentsLink) override; void setComments(const QString &guid, int comments) override; bool guidIsHash(const QString &guid) const override; void setGuidIsHash(const QString &guid, bool isHash) override; bool guidIsPermaLink(const QString &guid) const override; void setGuidIsPermaLink(const QString &guid, bool isPermaLink) override; uint hash(const QString &guid) const override; void setHash(const QString &guid, uint hash) override; void setDeleted(const QString &guid) override; QString link(const QString &guid) const override; void setLink(const QString &guid, const QString &link) override; uint pubDate(const QString &guid) const override; void setPubDate(const QString &guid, uint pubdate) override; int status(const QString &guid) const override; void setStatus(const QString &guid, int status) override; QString title(const QString &guid) const override; void setTitle(const QString &guid, const QString &title) override; QString description(const QString &guid) const override; void setDescription(const QString &guid, const QString &description) override; QString content(const QString &guid) const override; void setContent(const QString &guid, const QString &content) override; - void addTag(const QString &guid, const QString &tag) override; - void removeTag(const QString &guid, const QString &tag) override; - QStringList tags(const QString &guid = QString()) const override; void setEnclosure(const QString &guid, const QString &url, const QString &type, int length) override; void removeEnclosure(const QString &guid) override; void enclosure(const QString &guid, bool &hasEnclosure, QString &url, QString &type, int &length) const override; - void addCategory(const QString &guid, const Category &category) override; - QList categories(const QString &guid = QString()) const override; - void setAuthorName(const QString &guid, const QString &authorName) override; void setAuthorUri(const QString &guid, const QString &authorUri) override; void setAuthorEMail(const QString &guid, const QString &authorEMail) override; QString authorName(const QString &guid) const override; QString authorUri(const QString &guid) const override; QString authorEMail(const QString &guid) const override; void close() override; void commit() override; void rollback() override; void convertOldArchive() override; private: /** finds article by guid, returns -1 if not in archive **/ int findArticle(const QString &guid) const; void setTotalCount(int total); class FeedStorageDummyImplPrivate; FeedStorageDummyImplPrivate *d; }; } // namespace Backend } // namespace Akregator #endif // AKREGATOR_FEEDSTORAGEDUMMYIMPL_H