diff options
Diffstat (limited to 'comm/mail/base/content/mail-offline.js')
-rw-r--r-- | comm/mail/base/content/mail-offline.js | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/comm/mail/base/content/mail-offline.js b/comm/mail/base/content/mail-offline.js new file mode 100644 index 0000000000..13024b874a --- /dev/null +++ b/comm/mail/base/content/mail-offline.js @@ -0,0 +1,276 @@ +/* -*- Mode: Javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * 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/. */ + +/* globals msgWindow */ // From mailWindow.js + +var MailOfflineMgr = { + offlineManager: null, + offlineBundle: null, + + init() { + Services.obs.addObserver(this, "network:offline-status-changed"); + + this.offlineManager = Cc[ + "@mozilla.org/messenger/offline-manager;1" + ].getService(Ci.nsIMsgOfflineManager); + this.offlineBundle = Services.strings.createBundle( + "chrome://messenger/locale/offline.properties" + ); + + // initialize our offline state UI + this.updateOfflineUI(!this.isOnline()); + }, + + uninit() { + Services.obs.removeObserver(this, "network:offline-status-changed"); + }, + + /** + * @returns true if we are online + */ + isOnline() { + return !Services.io.offline; + }, + + /** + * Toggles the online / offline state, initiated by the user. Depending on user settings + * we may prompt the user to send unsent messages when going online or to download messages for + * offline use when going offline. + */ + toggleOfflineStatus() { + // the offline manager(goOnline and synchronizeForOffline) actually does the dirty work of + // changing the offline state with the networking service. + if (!this.isOnline()) { + // We do the go online stuff in our listener for the online state change. + Services.io.offline = false; + // resume managing offline status now that we are going back online. + Services.io.manageOfflineStatus = + Services.prefs.getBoolPref("offline.autoDetect"); + } else { + // going offline + // Stop automatic management of the offline status since the user has + // decided to go offline. + Services.io.manageOfflineStatus = false; + var prefDownloadMessages = Services.prefs.getIntPref( + "offline.download.download_messages" + ); + // 0 == Ask, 1 == Always Download, 2 == Never Download + var downloadForOfflineUse = + (prefDownloadMessages == 0 && + this.confirmDownloadMessagesForOfflineUse()) || + prefDownloadMessages == 1; + this.offlineManager.synchronizeForOffline( + downloadForOfflineUse, + downloadForOfflineUse, + false, + true, + msgWindow + ); + } + }, + + observe(aSubject, aTopic, aState) { + if (aTopic == "network:offline-status-changed") { + this.mailOfflineStateChanged(aState == "offline"); + } + }, + + /** + * @returns true if there are unsent messages + */ + haveUnsentMessages() { + return Cc["@mozilla.org/messengercompose/sendlater;1"] + .getService(Ci.nsIMsgSendLater) + .hasUnsentMessages(); + }, + + /** + * open the offline panel in the account manager for the currently loaded + * account. + */ + openOfflineAccountSettings() { + window.parent.MsgAccountManager("am-offline.xhtml"); + }, + + /** + * Prompt the user about going online to send unsent messages, and then send them + * if appropriate. Puts the app back into online mode. + * + * @param aMsgWindow the msg window to be used when going online + */ + goOnlineToSendMessages(aMsgWindow) { + let goOnlineToSendMsgs = Services.prompt.confirm( + window, + this.offlineBundle.GetStringFromName("sendMessagesOfflineWindowTitle1"), + this.offlineBundle.GetStringFromName("sendMessagesOfflineLabel1") + ); + + if (goOnlineToSendMsgs) { + this.offlineManager.goOnline( + true /* send unsent messages*/, + false, + aMsgWindow + ); + } + }, + + /** + * Prompts the user to confirm sending of unsent messages. This is different from + * goOnlineToSendMessages which involves going online to send unsent messages. + * + * @returns true if the user wants to send unsent messages + */ + confirmSendUnsentMessages() { + let alwaysAsk = { value: true }; + let sendUnsentMessages = + Services.prompt.confirmEx( + window, + this.offlineBundle.GetStringFromName("sendMessagesWindowTitle1"), + this.offlineBundle.GetStringFromName("sendMessagesLabel2"), + Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 + + Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_1, + this.offlineBundle.GetStringFromName("sendMessagesNow2"), + this.offlineBundle.GetStringFromName("processMessagesLater2"), + null, + this.offlineBundle.GetStringFromName("sendMessagesCheckboxLabel1"), + alwaysAsk + ) == 0; + + // if the user changed the ask me setting then update the global pref based on their yes / no answer + if (!alwaysAsk.value) { + Services.prefs.setIntPref( + "offline.send.unsent_messages", + sendUnsentMessages ? 1 : 2 + ); + } + + return sendUnsentMessages; + }, + + /** + * Should we send unsent messages? Based on the value of + * offline.send.unsent_messages, this method may prompt the user. + * + * @returns true if we should send unsent messages + */ + shouldSendUnsentMessages() { + var sendUnsentWhenGoingOnlinePref = Services.prefs.getIntPref( + "offline.send.unsent_messages" + ); + if (sendUnsentWhenGoingOnlinePref == 2) { + // never send + return false; + } else if (this.haveUnsentMessages()) { + // if we we have unsent messages, then honor the offline.send.unsent_messages pref. + if ( + (sendUnsentWhenGoingOnlinePref == 0 && + this.confirmSendUnsentMessages()) || + sendUnsentWhenGoingOnlinePref == 1 + ) { + return true; + } + } + return false; + }, + + /** + * Prompts the user to download messages for offline use before going offline. + * May update the value of offline.download.download_messages + * + * @returns true if the user wants to download messages for offline use. + */ + confirmDownloadMessagesForOfflineUse() { + let alwaysAsk = { value: true }; + let downloadMessages = + Services.prompt.confirmEx( + window, + this.offlineBundle.GetStringFromName("downloadMessagesWindowTitle1"), + this.offlineBundle.GetStringFromName("downloadMessagesLabel1"), + Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 + + Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_1, + this.offlineBundle.GetStringFromName("downloadMessagesNow2"), + this.offlineBundle.GetStringFromName("processMessagesLater2"), + null, + this.offlineBundle.GetStringFromName("downloadMessagesCheckboxLabel1"), + alwaysAsk + ) == 0; + + // if the user changed the ask me setting then update the global pref based on their yes / no answer + if (!alwaysAsk.value) { + Services.prefs.setIntPref( + "offline.download.download_messages", + downloadMessages ? 1 : 2 + ); + } + return downloadMessages; + }, + + /** + * Get New Mail When Offline + * Prompts the user about going online in order to download new messages. + * Based on the response, will move us back to online mode. + * + * @returns true if the user confirms going online. + */ + getNewMail() { + let goOnline = Services.prompt.confirm( + window, + this.offlineBundle.GetStringFromName("getMessagesOfflineWindowTitle1"), + this.offlineBundle.GetStringFromName("getMessagesOfflineLabel1") + ); + + if (goOnline) { + this.offlineManager.goOnline( + this.shouldSendUnsentMessages(), + false /* playbackOfflineImapOperations */, + msgWindow + ); + } + return goOnline; + }, + + /** + * Private helper method to update the state of the Offline menu item + * and the offline status bar indicator + */ + updateOfflineUI(aIsOffline) { + document + .getElementById("goOfflineMenuItem") + .setAttribute("checked", aIsOffline); + var statusBarPanel = document.getElementById("offline-status"); + if (aIsOffline) { + statusBarPanel.setAttribute("offline", "true"); + statusBarPanel.setAttribute( + "tooltiptext", + this.offlineBundle.GetStringFromName("offlineTooltip") + ); + } else { + statusBarPanel.removeAttribute("offline"); + statusBarPanel.setAttribute( + "tooltiptext", + this.offlineBundle.GetStringFromName("onlineTooltip") + ); + } + }, + + /** + * private helper method called whenever we detect a change to the offline state + */ + mailOfflineStateChanged(aGoingOffline) { + this.updateOfflineUI(aGoingOffline); + if (!aGoingOffline) { + let prefSendUnsentMessages = Services.prefs.getIntPref( + "offline.send.unsent_messages" + ); + // 0 == Ask, 1 == Always Send, 2 == Never Send + let sendUnsentMessages = + (prefSendUnsentMessages == 0 && + this.haveUnsentMessages() && + this.confirmSendUnsentMessages()) || + prefSendUnsentMessages == 1; + this.offlineManager.goOnline(sendUnsentMessages, true, msgWindow); + } + }, +}; |