Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsnewsfeedparser.h 3 : : ------------------- 4 : : begin : July 2019 5 : : copyright : (C) 2019 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : #ifndef QGSNEWSFEEDPARSER_H 16 : : #define QGSNEWSFEEDPARSER_H 17 : : 18 : : #include "qgis_core.h" 19 : : #include "qgis_sip.h" 20 : : #include <QObject> 21 : : #include <QUrl> 22 : : #include <QPixmap> 23 : : #include <QDateTime> 24 : : 25 : : class QgsNetworkContentFetcher; 26 : : 27 : : /** 28 : : * \ingroup core 29 : : * \brief Parser for published QGIS news feeds. 30 : : * 31 : : * This class is designed to work with the specialized QGIS news feed API. See 32 : : * https://github.com/elpaso/qgis-feed. 33 : : * 34 : : * \since QGIS 3.10 35 : : */ 36 : : class CORE_EXPORT QgsNewsFeedParser : public QObject 37 : : { 38 : 0 : Q_OBJECT 39 : : public: 40 : : 41 : : /** 42 : : * \brief Represents a single entry from a news feed. 43 : : * \ingroup core 44 : : * \since QGIS 3.10 45 : : */ 46 : 0 : class Entry 47 : : { 48 : : public: 49 : : 50 : : //! Unique entry identifier 51 : 0 : int key = 0; 52 : : 53 : : //! Entry title 54 : : QString title; 55 : : 56 : : //! Optional URL for image associated with entry 57 : : QString imageUrl; 58 : : 59 : : //! Optional image data 60 : : QPixmap image; 61 : : 62 : : //! HTML content of news entry 63 : : QString content; 64 : : 65 : : //! Optional URL link for entry 66 : : QUrl link; 67 : : 68 : : //! TRUE if entry is "sticky" and should always be shown at the top 69 : 0 : bool sticky = false; 70 : : 71 : : //! Optional auto-expiry time for entry 72 : : QDateTime expiry; 73 : : }; 74 : : 75 : : /** 76 : : * Constructor for QgsNewsFeedParser, parsing the specified \a feedUrl. 77 : : * 78 : : * The optional \a authcfg argument can be used to specify an authentication 79 : : * configuration to use when connecting to the feed. 80 : : */ 81 : : QgsNewsFeedParser( const QUrl &feedUrl, const QString &authcfg = QString(), QObject *parent SIP_TRANSFERTHIS = nullptr ); 82 : : 83 : : /** 84 : : * Returns a list of existing entries in the feed. 85 : : */ 86 : : QList< QgsNewsFeedParser::Entry > entries() const; 87 : : 88 : : /** 89 : : * Dismisses an entry with matching \a key. 90 : : * 91 : : * This removes the entry from the local store, ensuring it will never be present again. 92 : : * 93 : : * \see dismissAll() 94 : : */ 95 : : void dismissEntry( int key ); 96 : : 97 : : /** 98 : : * Dismisses all current news items. 99 : : * \see dismissEntry() 100 : : */ 101 : : void dismissAll(); 102 : : 103 : : /** 104 : : * Returns the authentication configuration for the parser. 105 : : */ 106 : : QString authcfg() const; 107 : : 108 : : /** 109 : : * Returns the settings key used for a feed with the given \a baseUrl. 110 : : */ 111 : : static QString keyForFeed( const QString &baseUrl ); 112 : : 113 : : public slots: 114 : : 115 : : /** 116 : : * Fetches new entries from the feed's URL. 117 : : * \see fetched() 118 : : */ 119 : : void fetch(); 120 : : 121 : : signals: 122 : : 123 : : /** 124 : : * Emitted when \a entries have fetched from the feed. 125 : : * 126 : : * \see fetch() 127 : : */ 128 : : void fetched( const QList< QgsNewsFeedParser::Entry > &entries ); 129 : : 130 : : /** 131 : : * Emitted whenever a new \a entry is available from the feed (as a result 132 : : * of a call to fetch()). 133 : : * 134 : : * \see fetch() 135 : : */ 136 : : void entryAdded( const QgsNewsFeedParser::Entry &entry ); 137 : : 138 : : /** 139 : : * Emitted whenever an \a entry is dismissed (as a result of a call 140 : : * to dismissEntry()). 141 : : * 142 : : * \see dismissEntry() 143 : : */ 144 : : void entryDismissed( const QgsNewsFeedParser::Entry &entry ); 145 : : 146 : : /** 147 : : * Emitted when the image attached to the entry with the specified \a key has been fetched 148 : : * and is now available. 149 : : */ 150 : : void imageFetched( int key, const QPixmap &pixmap ); 151 : : 152 : : private slots: 153 : : 154 : : void onFetch( const QString &content ); 155 : : 156 : : private: 157 : : 158 : : QString mBaseUrl; 159 : : QUrl mFeedUrl; 160 : : QString mAuthCfg; 161 : : qint64 mFetchStartTime = 0; 162 : : QString mSettingsKey; 163 : : 164 : : QList< Entry > mEntries; 165 : : bool mBlockSignals = false; 166 : : 167 : : void readStoredEntries(); 168 : : Entry readEntryFromSettings( int key ); 169 : : void storeEntryInSettings( const Entry &entry ); 170 : : void fetchImageForEntry( const Entry &entry ); 171 : : 172 : : friend class TestQgsNewsFeedParser; 173 : : 174 : : }; 175 : : 176 : : #endif // QGSNEWSFEEDPARSER_H