/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsRssIncomingServer.h" #include "nsMsgFolderFlags.h" #include "nsINewsBlogFeedDownloader.h" #include "nsIFile.h" #include "nsIMsgFolderNotificationService.h" #include "nsIMsgLocalMailFolder.h" #include "nsServiceManagerUtils.h" #include "nsComponentManagerUtils.h" #include "nsMsgUtils.h" nsrefcnt nsRssIncomingServer::gInstanceCount = 0; NS_IMPL_ISUPPORTS_INHERITED(nsRssIncomingServer, nsMsgIncomingServer, nsIRssIncomingServer, nsIMsgFolderListener, nsILocalMailIncomingServer) nsRssIncomingServer::nsRssIncomingServer() { m_canHaveFilters = true; if (gInstanceCount == 0) { nsresult rv; nsCOMPtr notifyService = do_GetService("@mozilla.org/messenger/msgnotificationservice;1", &rv); if (NS_SUCCEEDED(rv)) notifyService->AddListener( this, nsIMsgFolderNotificationService::folderAdded | nsIMsgFolderNotificationService::folderDeleted | nsIMsgFolderNotificationService::folderMoveCopyCompleted | nsIMsgFolderNotificationService::folderRenamed); } gInstanceCount++; } nsRssIncomingServer::~nsRssIncomingServer() { gInstanceCount--; if (gInstanceCount == 0) { nsresult rv; nsCOMPtr notifyService = do_GetService("@mozilla.org/messenger/msgnotificationservice;1", &rv); if (NS_SUCCEEDED(rv)) notifyService->RemoveListener(this); } } nsresult nsRssIncomingServer::FillInDataSourcePath( const nsAString& aDataSourceName, nsIFile** aLocation) { nsresult rv; // Get the local path for this server. nsCOMPtr localFile; rv = GetLocalPath(getter_AddRefs(localFile)); NS_ENSURE_SUCCESS(rv, rv); // Append the name of the subscriptions data source. rv = localFile->Append(aDataSourceName); localFile.forget(aLocation); return rv; } // nsIRSSIncomingServer methods NS_IMETHODIMP nsRssIncomingServer::GetSubscriptionsPath(nsIFile** aLocation) { return FillInDataSourcePath(u"feeds.json"_ns, aLocation); } NS_IMETHODIMP nsRssIncomingServer::GetFeedItemsPath(nsIFile** aLocation) { return FillInDataSourcePath(u"feeditems.json"_ns, aLocation); } NS_IMETHODIMP nsRssIncomingServer::CreateDefaultMailboxes() { // For Feeds, all we have is Trash. return CreateLocalFolder(u"Trash"_ns); } NS_IMETHODIMP nsRssIncomingServer::SetFlagsOnDefaultMailboxes() { nsCOMPtr rootFolder; nsresult rv = GetRootFolder(getter_AddRefs(rootFolder)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr localFolder = do_QueryInterface(rootFolder, &rv); NS_ENSURE_SUCCESS(rv, rv); localFolder->SetFlagsOnDefaultMailboxes(nsMsgFolderFlags::Trash); return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::PerformBiff(nsIMsgWindow* aMsgWindow) { // Get the account root (server) folder and pass it on. nsCOMPtr rootRSSFolder; GetRootMsgFolder(getter_AddRefs(rootRSSFolder)); nsCOMPtr urlListener = do_QueryInterface(rootRSSFolder); nsresult rv; bool isBiff = true; nsCOMPtr rssDownloader = do_GetService("@mozilla.org/newsblog-feed-downloader;1", &rv); NS_ENSURE_SUCCESS(rv, rv); rssDownloader->DownloadFeed(rootRSSFolder, urlListener, isBiff, aMsgWindow); return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::GetNewMail(nsIMsgWindow* aMsgWindow, nsIUrlListener* aUrlListener, nsIMsgFolder* aFolder, nsIURI** _retval) { // Pass the selected folder on to the downloader. if (_retval) { *_retval = nullptr; } NS_ENSURE_ARG_POINTER(aFolder); nsresult rv; bool isBiff = false; nsCOMPtr rssDownloader = do_GetService("@mozilla.org/newsblog-feed-downloader;1", &rv); NS_ENSURE_SUCCESS(rv, rv); rssDownloader->DownloadFeed(aFolder, aUrlListener, isBiff, aMsgWindow); return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::GetAccountManagerChrome(nsAString& aResult) { aResult.AssignLiteral("am-newsblog.xhtml"); return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::GetOfflineSupportLevel( int32_t* aSupportLevel) { NS_ENSURE_ARG_POINTER(aSupportLevel); *aSupportLevel = OFFLINE_SUPPORT_LEVEL_NONE; return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::GetSupportsDiskSpace( bool* aSupportsDiskSpace) { NS_ENSURE_ARG_POINTER(aSupportsDiskSpace); *aSupportsDiskSpace = true; return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::GetServerRequiresPasswordForBiff( bool* aServerRequiresPasswordForBiff) { NS_ENSURE_ARG_POINTER(aServerRequiresPasswordForBiff); // For Feed folders, we don't require a password. *aServerRequiresPasswordForBiff = false; return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::GetCanSearchMessages( bool* canSearchMessages) { NS_ENSURE_ARG_POINTER(canSearchMessages); *canSearchMessages = true; return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::MsgAdded(nsIMsgDBHdr* aMsg) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::MsgsClassified( const nsTArray>& aMsgs, bool aJunkProcessed, bool aTraitProcessed) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::MsgsJunkStatusChanged( const nsTArray>& messages) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::MsgsDeleted( const nsTArray>& aMsgs) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::MsgsMoveCopyCompleted( bool aMove, const nsTArray>& aSrcMsgs, nsIMsgFolder* aDestFolder, const nsTArray>& aDestMsgs) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::MsgKeyChanged(nsMsgKey aOldKey, nsIMsgDBHdr* aNewHdr) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::FolderAdded(nsIMsgFolder* aFolder) { // Nothing to do. Not necessary for new folder adds, as a new folder never // has a subscription. return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::FolderDeleted(nsIMsgFolder* aFolder) { // Not necessary for folder deletes, which are move to Trash and handled by // movecopy. Virtual folder or trash folder deletes send a folderdeleted, // but these should have no subscriptions already. return NS_OK; } NS_IMETHODIMP nsRssIncomingServer::FolderMoveCopyCompleted( bool aMove, nsIMsgFolder* aSrcFolder, nsIMsgFolder* aDestFolder) { return FolderChanged(aDestFolder, aSrcFolder, (aMove ? "move" : "copy")); } NS_IMETHODIMP nsRssIncomingServer::FolderRenamed(nsIMsgFolder* aOrigFolder, nsIMsgFolder* aNewFolder) { return FolderChanged(aNewFolder, aOrigFolder, "rename"); } nsresult nsRssIncomingServer::FolderChanged(nsIMsgFolder* aFolder, nsIMsgFolder* aOrigFolder, const char* aAction) { if (!aFolder) return NS_OK; nsresult rv; nsCOMPtr rssDownloader = do_GetService("@mozilla.org/newsblog-feed-downloader;1", &rv); NS_ENSURE_SUCCESS(rv, rv); rssDownloader->UpdateSubscriptionsDS(aFolder, aOrigFolder, aAction); return rv; } NS_IMETHODIMP nsRssIncomingServer::MsgUnincorporatedMoved( nsIMsgFolder* srcFolder, nsIMsgDBHdr* msg) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::FolderCompactStart(nsIMsgFolder* folder) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::FolderCompactFinish(nsIMsgFolder* folder) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::FolderReindexTriggered( nsIMsgFolder* folder) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsRssIncomingServer::GetSortOrder(int32_t* aSortOrder) { NS_ENSURE_ARG_POINTER(aSortOrder); *aSortOrder = 400000000; return NS_OK; }