diff options
Diffstat (limited to 'mailnews/extensions/offline-startup')
3 files changed, 183 insertions, 0 deletions
diff --git a/mailnews/extensions/offline-startup/js/offlineStartup.js b/mailnews/extensions/offline-startup/js/offlineStartup.js new file mode 100644 index 000000000..56584465d --- /dev/null +++ b/mailnews/extensions/offline-startup/js/offlineStartup.js @@ -0,0 +1,170 @@ +/* -*- Mode: Java; 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/. */ + +Components.utils.import("resource://gre/modules/Services.jsm"); +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +var kDebug = false; +var kOfflineStartupPref = "offline.startup_state"; +var kRememberLastState = 0; +var kAskForOnlineState = 1; +var kAlwaysOnline = 2; +var kAlwaysOffline = 3; +var kAutomatic = 4; +var gStartingUp = true; +var gOfflineStartupMode; //0 = remember last state, 1 = ask me, 2 == online, 3 == offline, 4 = automatic + + +//////////////////////////////////////////////////////////////////////// +// +// nsOfflineStartup : nsIObserver +// +// Check if the user has set the pref to be prompted for +// online/offline startup mode. If so, prompt the user. Also, +// check if the user wants to remember their offline state +// the next time they start up. +// If the user shutdown offline, and is now starting up in online +// mode, we will set the boolean pref "mailnews.playback_offline" to true. +// +//////////////////////////////////////////////////////////////////////// + +var nsOfflineStartup = +{ + onProfileStartup: function() + { + debug("onProfileStartup"); + + if (gStartingUp) + { + gStartingUp = false; + // if checked, the "work offline" checkbox overrides + if (Services.io.offline && !Services.io.manageOfflineStatus) + { + debug("already offline!"); + return; + } + } + + var manageOfflineStatus = Services.prefs.getBoolPref("offline.autoDetect"); + gOfflineStartupMode = Services.prefs.getIntPref(kOfflineStartupPref); + let wasOffline = !Services.prefs.getBoolPref("network.online"); + + if (gOfflineStartupMode == kAutomatic) + { + // Offline state should be managed automatically + // so do nothing specific at startup. + } + else if (gOfflineStartupMode == kAlwaysOffline) + { + Services.io.manageOfflineStatus = false; + Services.io.offline = true; + } + else if (gOfflineStartupMode == kAlwaysOnline) + { + Services.io.manageOfflineStatus = manageOfflineStatus; + if (wasOffline) + Services.prefs.setBoolPref("mailnews.playback_offline", true); + // If we're managing the offline status, don't force online here... it may + // be the network really is offline. + if (!manageOfflineStatus) + Services.io.offline = false; + } + else if (gOfflineStartupMode == kRememberLastState) + { + Services.io.manageOfflineStatus = manageOfflineStatus && !wasOffline; + // If we are meant to be online, and managing the offline status + // then don't force it - it may be the network really is offline. + if (!manageOfflineStatus || wasOffline) + Services.io.offline = wasOffline; + } + else if (gOfflineStartupMode == kAskForOnlineState) + { + var bundle = Services.strings.createBundle("chrome://messenger/locale/offlineStartup.properties"); + var title = bundle.GetStringFromName("title"); + var desc = bundle.GetStringFromName("desc"); + var button0Text = bundle.GetStringFromName("workOnline"); + var button1Text = bundle.GetStringFromName("workOffline"); + var checkVal = {value:0}; + + var result = Services.prompt.confirmEx(null, title, desc, + (Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING) + + (Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_IS_STRING), + button0Text, button1Text, null, null, checkVal); + debug ("result = " + result + "\n"); + Services.io.manageOfflineStatus = manageOfflineStatus && result != 1; + Services.io.offline = result == 1; + if (result != 1 && wasOffline) + Services.prefs.setBoolPref("mailnews.playback_offline", true); + } + }, + + observe: function(aSubject, aTopic, aData) + { + debug("observe: " + aTopic); + + if (aTopic == "profile-change-net-teardown") + { + debug("remembering offline state"); + Services.prefs.setBoolPref("network.online", !Services.io.offline); + } + else if (aTopic == "app-startup") + { + Services.obs.addObserver(this, "profile-after-change", false); + Services.obs.addObserver(this, "profile-change-net-teardown", false); + } + else if (aTopic == "profile-after-change") + { + this.onProfileStartup(); + } + }, + + + QueryInterface: function(aIID) + { + if (aIID.equals(Components.interfaces.nsIObserver) || + aIID.equals(Components.interfaces.nsISupports)) + return this; + + throw Components.results.NS_ERROR_NO_INTERFACE; + } +} + +function nsOfflineStartupModule() +{ +} + +nsOfflineStartupModule.prototype = +{ + classID: Components.ID("3028a3c8-2165-42a4-b878-398da5d32736"), + _xpcom_factory: + { + createInstance: function(aOuter, aIID) + { + if (aOuter != null) + throw Components.results.NS_ERROR_NO_AGGREGATION; + + // return the singleton + return nsOfflineStartup.QueryInterface(aIID); + }, + + lockFactory: function(aLock) + { + // quieten warnings + } + } +}; + +//////////////////////////////////////////////////////////////////////// +// +// Debug helper +// +//////////////////////////////////////////////////////////////////////// +if (!kDebug) + debug = function(m) {}; +else + debug = function(m) {dump("\t *** nsOfflineStartup: " + m + "\n");}; + +var components = [nsOfflineStartupModule]; +var NSGetFactory = XPCOMUtils.generateNSGetFactory(components); diff --git a/mailnews/extensions/offline-startup/js/offlineStartup.manifest b/mailnews/extensions/offline-startup/js/offlineStartup.manifest new file mode 100644 index 000000000..61df84f76 --- /dev/null +++ b/mailnews/extensions/offline-startup/js/offlineStartup.manifest @@ -0,0 +1,3 @@ +component {3028a3c8-2165-42a4-b878-398da5d32736} offlineStartup.js +contract @mozilla.org/offline-startup;1 {3028a3c8-2165-42a4-b878-398da5d32736} +category app-startup Offline-startup @mozilla.org/offline-startup;1 diff --git a/mailnews/extensions/offline-startup/moz.build b/mailnews/extensions/offline-startup/moz.build new file mode 100644 index 000000000..a8a406295 --- /dev/null +++ b/mailnews/extensions/offline-startup/moz.build @@ -0,0 +1,10 @@ +# vim: set filetype=python: +# 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/. + +EXTRA_COMPONENTS += [ + 'js/offlineStartup.js', + 'js/offlineStartup.manifest', +] + |