summaryrefslogtreecommitdiffstats
path: root/comm/mail/base/content/mail-offline.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/base/content/mail-offline.js')
-rw-r--r--comm/mail/base/content/mail-offline.js276
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);
+ }
+ },
+};