diff --git a/TODO.txt b/TODO.txt index e36a7f9..7be4121 100644 --- a/TODO.txt +++ b/TODO.txt @@ -8,9 +8,6 @@ Important improvements: * ~50kb per feed on download (+2MB w 40 feeds) * This leak is in Util.ccp, fetch(). I'm stumped here. * ~20kb per feed on parsing (+1MB w 40 feeds) - * Very slight on enqueue -* Use path-strings or entry_refs when communicating about feeds inter-threads, - and in the queue. * Fix background of Feeds List error status icon (it's black, not transparent) * Make UI friendly to whatever font-size you throw at it * Give a max size to the progress label in FeedsView @@ -21,9 +18,6 @@ Important improvements: Nice Improvements: * Proper scripting support * Show in desktray -* Store feeds in kEnqueueFeeds/etc messages as paths? hmm - * This way, if the user edits the feed after it is enqueued but before - processing, the changes will be applied. * Move the provisional BList download queue to a BJob + JobQueue system * This might add some more flexibility * Multiple downloads at once diff --git a/src/App.cpp b/src/App.cpp index 4bfab12..5818589 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -119,11 +119,10 @@ App::ArgvReceived(int32 argc, char** argv) refMsg.AddRef("refs", &ref); } else if (BUrl(argv[i]).IsValid()) { - Feed* newFeed = new Feed(BUrl(argv[i])); + BString url = BString(argv[i]); BMessage enqueue = BMessage(kEnqueueFeed); - enqueue.AddData("feeds", B_RAW_TYPE, (void*)newFeed, sizeof(Feed)); - + enqueue.AddData("feedPaths", B_STRING_TYPE, &url, sizeof(BString)); MessageReceived(&enqueue); } } diff --git a/src/Feed.cpp b/src/Feed.cpp index 87bcc76..f707537 100644 --- a/src/Feed.cpp +++ b/src/Feed.cpp @@ -57,6 +57,12 @@ Feed::Feed(BEntry entry) } +Feed::Feed(const char* pathStr) + : Feed(BEntry(pathStr)) +{ +} + + // For new feed Feed::Feed(BUrl xml, BEntry entry) : Feed() diff --git a/src/Feed.h b/src/Feed.h index 01594c4..1ed724a 100644 --- a/src/Feed.h +++ b/src/Feed.h @@ -24,6 +24,7 @@ public: Feed(BUrl); Feed(BUrl, BString); Feed(BEntry); + Feed(const char* pathStr); Feed(BUrl xml, BEntry entry); Feed(Feed*); Feed(); diff --git a/src/FeedController.cpp b/src/FeedController.cpp index 55994d1..639feac 100644 --- a/src/FeedController.cpp +++ b/src/FeedController.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "App.h" #include "AtomFeed.h" @@ -24,7 +25,7 @@ FeedController::FeedController() fMainThread(find_thread(NULL)), fDownloadThread(0), fParseThread(0), - fDownloadQueue(new BObjectList(5, true)), + fDownloadQueue(new BStringList()), fMessageRunner(new BMessageRunner(be_app, BMessage(kControllerCheck), 50000, -1)) { @@ -53,22 +54,21 @@ FeedController::MessageReceived(BMessage* msg) { int i = 0; const void* data; - ssize_t size = sizeof(Feed); + ssize_t size = sizeof(BString); - while (msg->HasData("feeds", B_RAW_TYPE, i)) { - msg->FindData("feeds", B_RAW_TYPE, i, &data, &size); - _EnqueueFeed((Feed*)data); - i++; - } + BStringList paths; + msg->FindStrings("feedPaths", &paths); + fDownloadQueue->Add(paths); + + fMessageRunner->SetCount(-1); _SendProgress(); break; } case kUpdateSubscribed: { - BList subFeeds = SubscribedFeeds(); - for (int i = 0; i < subFeeds.CountItems(); i++) { - _EnqueueFeed((Feed*)subFeeds.ItemAt(i)); - } + BStringList subFeeds = SubscribedFeeds(); + fDownloadQueue->Add(subFeeds); + _SendProgress(); break; } @@ -87,7 +87,7 @@ FeedController::MessageReceived(BMessage* msg) } -BList +BStringList FeedController::SubscribedFeeds() { BPath subPath; @@ -97,10 +97,12 @@ FeedController::SubscribedFeeds() BDirectory subDir(subPath.Path()); BEntry feedEntry; - BList feeds; + BPath feedPath; + BStringList feeds; - while (subDir.GetNextEntry(&feedEntry) == B_OK) - feeds.AddItem(new Feed(feedEntry)); + while (subDir.GetNextEntry(&feedEntry) == B_OK + && feedEntry.GetPath(&feedPath) == B_OK) + feeds.Add(feedPath.Path()); return feeds; } @@ -108,7 +110,7 @@ FeedController::SubscribedFeeds() void FeedController::_SendProgress() { - int32 dqCount = fDownloadQueue->CountItems(); + int32 dqCount = fDownloadQueue->CountStrings(); if (fEnqueuedTotal < dqCount) fEnqueuedTotal = dqCount; @@ -123,21 +125,19 @@ FeedController::_SendProgress() } -void -FeedController::_EnqueueFeed(Feed* feed) -{ - fMessageRunner->SetCount(-1); - fDownloadQueue->AddItem(feed); -} - - void FeedController::_ProcessQueueItem() { if (has_data(fDownloadThread) && !fDownloadQueue->IsEmpty()) { - Feed* buffer = fDownloadQueue->ItemAt(0); + BString feed = fDownloadQueue->Remove(0); + Feed* buffer; + + if (BUrl(feed.String()).IsValid() == true) + buffer = new Feed(BUrl(feed.String())); + else + buffer = new Feed(feed.String()); + send_data(fDownloadThread, 0, (void*)buffer, sizeof(Feed)); - fDownloadQueue->RemoveItemAt(0); BMessage downloadInit = BMessage(kDownloadStart); downloadInit.AddString("feed_name", buffer->GetTitle()); diff --git a/src/FeedController.h b/src/FeedController.h index 18c4802..1a681c7 100644 --- a/src/FeedController.h +++ b/src/FeedController.h @@ -11,6 +11,7 @@ class BMessage; class BMessageRunner; +class BStringList; class Feed; @@ -36,13 +37,11 @@ public: void MessageReceived(BMessage* msg); - static BList SubscribedFeeds(); + static BStringList SubscribedFeeds(); private: void _SendProgress(); - void _EnqueueFeed(Feed* feed); - void _ProcessQueueItem(); void _ReceiveStatus(); @@ -55,7 +54,7 @@ private: thread_id fDownloadThread; thread_id fParseThread; - BObjectList* fDownloadQueue; + BStringList* fDownloadQueue; BMessageRunner* fMessageRunner; }; diff --git a/src/FeedEditWindow.cpp b/src/FeedEditWindow.cpp index 2470fd9..165bd46 100644 --- a/src/FeedEditWindow.cpp +++ b/src/FeedEditWindow.cpp @@ -14,7 +14,6 @@ #include #include "App.h" -#include "Feed.h" #include "FeedController.h" #include "FeedListItem.h" #include "FeedsView.h" @@ -29,7 +28,7 @@ FeedEditWindow::FeedEditWindow() MoveOnScreen(); fDeleteButton->SetEnabled(false); - fFeed = new Feed(); + fFeed = Feed(); } @@ -38,10 +37,10 @@ FeedEditWindow::FeedEditWindow(BEntry feedEntry) FeedEditWindow() { SetTitle("Edit Feed"); - fFeed = new Feed(feedEntry); + fFeed = Feed(feedEntry); - fFeedNameText->SetText(fFeed->GetTitle().String()); - fFeedUrlText->SetText(fFeed->GetXmlUrl().UrlString().String()); + fFeedNameText->SetText(fFeed.GetTitle().String()); + fFeedUrlText->SetText(fFeed.GetXmlUrl().UrlString().String()); fDeleteButton->SetEnabled(true); } @@ -158,17 +157,17 @@ FeedEditWindow::_SaveFeed() filename = BString(title); subPath.Append(filename); - if (fFeed->GetCachePath().IsEmpty()) - fFeed->SetCachePath(BString(subPath.Path())); + if (fFeed.GetCachePath().IsEmpty()) + fFeed.SetCachePath(BString(subPath.Path())); if (!title.IsEmpty()) - fFeed->SetTitle(title.String()); - fFeed->SetXmlUrl(BUrl(urlString)); - fFeed->Filetize(); + fFeed.SetTitle(title.String()); + fFeed.SetXmlUrl(BUrl(urlString)); + fFeed.Filetize(); BMessage edited(kFeedsEdited); BMessage enqueueUpdated(kEnqueueFeed); - enqueueUpdated.AddData("feeds", B_RAW_TYPE, (void*)fFeed, sizeof(Feed)); + enqueueUpdated.AddString("feedPaths", fFeed.GetCachePath()); ((App*)be_app)->MessageReceived(&enqueueUpdated); ((App*)be_app)->PostMessage(&edited); @@ -179,7 +178,7 @@ FeedEditWindow::_SaveFeed() void FeedEditWindow::_DeleteFeed() { - fFeed->Unfiletize(); + fFeed.Unfiletize(); BMessage edited(kFeedsEdited); ((App*)be_app)->PostMessage(&edited); Quit(); diff --git a/src/FeedEditWindow.h b/src/FeedEditWindow.h index 41f3684..ca6fbad 100644 --- a/src/FeedEditWindow.h +++ b/src/FeedEditWindow.h @@ -7,6 +7,8 @@ #include +#include "Feed.h" + class BButton; class BStringView; class BTextControl; @@ -37,7 +39,7 @@ private: void _DeleteFeed(); BString fFeedPath; - Feed* fFeed; + Feed fFeed; BStringView* fFeedNameLabel; BTextControl* fFeedNameText; diff --git a/src/FeedsView.cpp b/src/FeedsView.cpp index 96a2e5f..b6bc00a 100644 --- a/src/FeedsView.cpp +++ b/src/FeedsView.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include "App.h" @@ -183,20 +184,18 @@ FeedsView::_RemoveSelectedFeed() void FeedsView::_PopulateFeedList() { - BList feeds = FeedController::SubscribedFeeds(); + BStringList feeds = FeedController::SubscribedFeeds(); int32 selected = fFeedsListView->CurrentSelection(); for (int i = fFeedsListView->CountItems(); i >= 0; i--) delete ((FeedListItem*)fFeedsListView->RemoveItem(i)); - for (int i = 0; i < feeds.CountItems(); i++) { - FeedListItem* item = new FeedListItem((Feed*)feeds.ItemAt(i)); + for (int i = 0; i < feeds.CountStrings(); i++) { + Feed feed = Feed(feeds.StringAt(i).String()); + FeedListItem* item = new FeedListItem(&feed); fFeedsListView->AddItem(item); } - for (int i = feeds.CountItems(); i >= 0; i--) - delete ((Feed*)feeds.RemoveItem(i)); - if (fFeedsListView->CountItems() < selected) selected = fFeedsListView->CountItems(); fFeedsListView->Select(selected);