/**************************************************************** * RetroShare is distributed under the following license: * * Copyright (C) 2012 RetroShare Team * * 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. ****************************************************************/ #include #include #include #include "FeedReaderFeedNotify.h" #include "FeedReaderNotify.h" #include "FeedReaderFeedItem.h" #include "gui/settings/rsharesettings.h" #include "retroshare/rsiface.h" FeedReaderFeedNotify::FeedReaderFeedNotify(RsFeedReader *feedReader, FeedReaderNotify *notify, QObject *parent) : FeedNotify(parent), mFeedReader(feedReader), mNotify(notify) { mMutex = new QMutex(); connect(mNotify, SIGNAL(msgChanged(QString,QString,int)), this, SLOT(msgChanged(QString,QString,int)), Qt::QueuedConnection); } FeedReaderFeedNotify::~FeedReaderFeedNotify() { delete(mMutex); } bool FeedReaderFeedNotify::hasSetting(QString &name) { name = tr("Feed Reader"); return true; } bool FeedReaderFeedNotify::notifyEnabled() { return Settings->valueFromGroup("FeedReader", "FeedNotifyEnable", false).toBool(); } void FeedReaderFeedNotify::setNotifyEnabled(bool enabled) { Settings->setValueToGroup("FeedReader", "FeedNotifyEnable", enabled); if (!enabled) { /* remove pending feed items */ mMutex->lock(); mPendingNewsFeed.clear(); mMutex->unlock(); } } void FeedReaderFeedNotify::msgChanged(const QString &feedId, const QString &msgId, int type) { if (feedId.isEmpty() || msgId.isEmpty()) { return; } if (type != NOTIFY_TYPE_ADD) { return; } if (!notifyEnabled()) { return; } mMutex->lock(); FeedItemData feedItemData; feedItemData.mFeedId = feedId; feedItemData.mMsgId = msgId; mPendingNewsFeed.push_back(feedItemData); mMutex->unlock(); } FeedItem *FeedReaderFeedNotify::feedItem(FeedHolder *parent) { bool msgPending = false; FeedInfo feedInfo; FeedMsgInfo msgInfo; mMutex->lock(); while (!mPendingNewsFeed.empty()) { FeedItemData feedItemData = mPendingNewsFeed.front(); mPendingNewsFeed.pop_front(); if (mFeedReader->getFeedInfo(feedItemData.mFeedId.toStdString(), feedInfo) && mFeedReader->getMsgInfo(feedItemData.mFeedId.toStdString(), feedItemData.mMsgId.toStdString(), msgInfo)) { if (msgInfo.flag.isnew) { msgPending = true; break; } } } mMutex->unlock(); if (!msgPending) { return NULL; } return new FeedReaderFeedItem(mFeedReader, mNotify, parent, feedInfo, msgInfo); } FeedItem *FeedReaderFeedNotify::testFeedItem(FeedHolder *parent) { FeedInfo feedInfo; feedInfo.name = tr("Test").toUtf8().constData(); QByteArray faviconData; QBuffer buffer(&faviconData); buffer.open(QIODevice::WriteOnly); if (QPixmap(":/images/Feed.png").scaled(16, 16, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).save(&buffer, "ICO")) { feedInfo.icon = faviconData.toBase64().constData(); } buffer.close(); FeedMsgInfo msgInfo; msgInfo.title = tr("Test message").toUtf8().constData(); msgInfo.description = tr("This is a test message.").toUtf8().constData(); msgInfo.pubDate = QDateTime::currentDateTime().toTime_t(); return new FeedReaderFeedItem(mFeedReader, mNotify, parent, feedInfo, msgInfo); }