Line data Source code
1 : #include "BatchFeedDiscovery.h"
2 :
3 8 : BatchFeedDiscovery::BatchFeedDiscovery(QObject *parent) :
4 : FangObject(parent),
5 8 : feedList(nullptr)
6 : {
7 8 : }
8 :
9 8 : void BatchFeedDiscovery::checkFeedList(ListModel* feedList, int maxConcurrent)
10 : {
11 8 : this->feedList = feedList;
12 :
13 27 : for(int i = 0; i < feedList->count(); i++) {
14 19 : FeedItem* item = qobject_cast<FeedItem*>(feedList->row(i));
15 19 : if (i < maxConcurrent) {
16 : // Run the first few concurrently.
17 10 : FeedDiscovery* discovery = createFeedDiscovery();
18 10 : connect(discovery, &FeedDiscovery::done, this, &BatchFeedDiscovery::onFeedDiscoveryFinished);
19 :
20 10 : runDiscovery(discovery, item);
21 : } else {
22 : // Queue up the reset.
23 9 : queue.enqueue(item);
24 : }
25 : }
26 8 : }
27 :
28 0 : FeedDiscovery* BatchFeedDiscovery::createFeedDiscovery()
29 : {
30 0 : return new FeedDiscovery(this);
31 : }
32 :
33 19 : void BatchFeedDiscovery::onFeedDiscoveryFinished(FeedDiscovery* discovery)
34 : {
35 19 : FeedItem* item = lookup.take(discovery);
36 19 : item->setIsUpdating(false);
37 :
38 : // See what we got.
39 19 : if (discovery->error()) {
40 3 : item->setErrorFlag(true);
41 : } else {
42 : // Yay, we got one! Copy over the corrected URL.
43 16 : item->setURL(discovery->feedURL());
44 :
45 : // Now select it.
46 16 : item->setIsSelected(true);
47 : }
48 :
49 : // Last-item check.
50 19 : if (queue.isEmpty()) {
51 10 : if (lookup.isEmpty()) {
52 : // That's all, folks!
53 6 : emit done();
54 : }
55 :
56 10 : delete discovery;
57 10 : return;
58 : }
59 :
60 : // Grab the next one and DISOVERYize it!!11
61 9 : runDiscovery(discovery, queue.dequeue());
62 : }
63 :
64 19 : void BatchFeedDiscovery::runDiscovery(FeedDiscovery* discovery, FeedItem* item)
65 : {
66 19 : lookup.insert(discovery, item);
67 19 : item->setIsUpdating(true);
68 19 : discovery->checkFeed(item->getURL().toString());
69 19 : }
|