summaryrefslogtreecommitdiffstats
path: root/content/modules/providers.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--content/modules/providers.js184
1 files changed, 184 insertions, 0 deletions
diff --git a/content/modules/providers.js b/content/modules/providers.js
new file mode 100644
index 0000000..562b763
--- /dev/null
+++ b/content/modules/providers.js
@@ -0,0 +1,184 @@
+/*
+ * This file is part of TbSync.
+ *
+ * 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/.
+ */
+
+ "use strict";
+
+var providers = {
+
+ //list of default providers (available in add menu, even if not installed)
+ defaultProviders: {
+ "google" : {
+ name: "Google's People API",
+ homepageUrl: "https://addons.thunderbird.net/addon/google-4-tbsync/"},
+ "dav" : {
+ name: "CalDAV & CardDAV",
+ homepageUrl: "https://addons.thunderbird.net/addon/dav-4-tbsync/"},
+ "eas" : {
+ name: "Exchange ActiveSync",
+ homepageUrl: "https://addons.thunderbird.net/addon/eas-4-tbsync/"},
+ },
+
+ loadedProviders: null,
+
+ load: async function () {
+ this.loadedProviders = {};
+ },
+
+ unload: async function () {
+ for (let provider in this.loadedProviders) {
+ await this.unloadProvider(provider);
+ }
+ },
+
+
+
+
+
+ loadProvider: async function (extension, provider, js) {
+ //only load, if not yet loaded and if the provider name does not shadow a fuction inside provider.js
+ if (!this.loadedProviders.hasOwnProperty(provider) && !this.hasOwnProperty(provider) && js.startsWith("chrome://")) {
+ try {
+ let addon = await AddonManager.getAddonByID(extension.id);
+
+ //load provider subscripts into TbSync
+ this[provider] = {};
+ Services.scriptloader.loadSubScript(js, this[provider], "UTF-8");
+ if (TbSync.apiVersion != this[provider].Base.getApiVersion()) {
+ throw new Error("API version mismatch, TbSync@"+TbSync.apiVersion+" vs " + provider + "@" + this[provider].Base.getApiVersion());
+ }
+
+ this.loadedProviders[provider] = {
+ addon, extension,
+ addonId: extension.id,
+ version: addon.version.toString(),
+ createAccountWindow: null
+ };
+
+ addon.contributorsURL = this[provider].Base.getContributorsUrl();
+
+ // check if provider has its own implementation of folderList
+ if (!this[provider].hasOwnProperty("folderList")) this[provider].folderList = new TbSync.manager.FolderList(provider);
+
+ //load provider
+ await this[provider].Base.load();
+
+ await TbSync.messenger.overlayManager.registerOverlay("chrome://tbsync/content/manager/editAccount.xhtml?provider=" + provider, this[provider].Base.getEditAccountOverlayUrl());
+ TbSync.dump("Loaded provider", provider + "::" + this[provider].Base.getProviderName() + " ("+this.loadedProviders[provider].version+")");
+
+ // reset all accounts of this provider
+ let providerData = new TbSync.ProviderData(provider);
+ let accounts = providerData.getAllAccounts();
+ for (let accountData of accounts) {
+ // reset sync objects
+ TbSync.core.resetSyncDataObj(accountData.accountID);
+
+ // set all accounts which are syncing to notsyncronized
+ if (accountData.getAccountProperty("status") == "syncing") accountData.setAccountProperty("status", "notsyncronized");
+
+ // set each folder with PENDING status to ABORTED
+ let folders = TbSync.db.findFolders({"status": "pending"}, {"accountID": accountData.accountID});
+
+ for (let f=0; f < folders.length; f++) {
+ TbSync.db.setFolderProperty(folders[f].accountID, folders[f].folderID, "status", "aborted");
+ }
+ }
+
+ Services.obs.notifyObservers(null, "tbsync.observer.manager.updateProviderList", provider);
+ Services.obs.notifyObservers(null, "tbsync.observer.manager.updateSyncstate", null);
+
+ // TB60 -> TB68 migration - remove icon and rename target if stale
+ for (let addressBook of MailServices.ab.directories) {
+ if (addressBook instanceof Components.interfaces.nsIAbDirectory) {
+ let storedProvider = TbSync.addressbook.getStringValue(addressBook, "tbSyncProvider", "");
+ if (provider == storedProvider && providerData.getFolders({"target": addressBook.UID}).length == 0) {
+ let name = addressBook.dirName;
+ addressBook.dirName = TbSync.getString("target.orphaned") + ": " + name;
+ addressBook.setStringValue("tbSyncIcon", "orphaned");
+ addressBook.setStringValue("tbSyncProvider", "orphaned");
+ addressBook.setStringValue("tbSyncAccountID", "");
+ }
+ }
+ }
+
+ let calManager = TbSync.lightning.cal.manager;
+ for (let calendar of calManager.getCalendars({})) {
+ let storedProvider = calendar.getProperty("tbSyncProvider");
+ if (provider == storedProvider && calendar.type == "storage" && providerData.getFolders({"target": calendar.id}).length == 0) {
+ let name = calendar.name;
+ calendar.name = TbSync.getString("target.orphaned") + ": " + name;
+ calendar.setProperty("disabled", true);
+ calendar.setProperty("tbSyncProvider", "orphaned");
+ calendar.setProperty("tbSyncAccountID", "");
+ }
+ }
+
+ } catch (e) {
+ delete this.loadedProviders[provider];
+ delete this[provider];
+ let info = new EventLogInfo(provider);
+ TbSync.eventlog.add("error", info, "FAILED to load provider <"+provider+">", e.message);
+ Components.utils.reportError(e);
+ }
+
+ }
+ },
+
+ unloadProvider: async function (provider) {
+ if (this.loadedProviders.hasOwnProperty(provider)) {
+ TbSync.dump("Unloading provider", provider);
+
+ if (this.loadedProviders[provider].createAccountWindow) {
+ this.loadedProviders[provider].createAccountWindow.close();
+ }
+
+ await this[provider].Base.unload();
+ delete this.loadedProviders[provider];
+ delete this[provider];
+ Services.obs.notifyObservers(null, "tbsync.observer.manager.updateProviderList", provider);
+ Services.obs.notifyObservers(null, "tbsync.observer.manager.updateSyncstate", null);
+ }
+ },
+
+ getDefaultAccountEntries: function (provider) {
+ let defaults = TbSync.providers[provider].Base.getDefaultAccountEntries();
+
+ // List of default system account properties.
+ // Do not remove search marker for doc.
+ // DefaultAccountPropsStart
+ defaults.provider = provider;
+ defaults.accountID = "";
+ defaults.lastsynctime = 0;
+ defaults.status = "disabled";
+ defaults.autosync = 0;
+ defaults.noAutosyncUntil = 0;
+ defaults.accountname = "";
+ // DefaultAccountPropsEnd
+
+ return defaults;
+ },
+
+ getDefaultFolderEntries: function (accountID) {
+ let provider = TbSync.db.getAccountProperty(accountID, "provider");
+ let defaults = TbSync.providers[provider].Base.getDefaultFolderEntries();
+
+ // List of default system folder properties.
+ // Do not remove search marker for doc.
+ // DefaultFolderPropsStart
+ defaults.accountID = accountID;
+ defaults.targetType = "";
+ defaults.cached = false;
+ defaults.selected = false;
+ defaults.lastsynctime = 0;
+ defaults.status = "";
+ defaults.foldername = "";
+ defaults.downloadonly = false;
+ // DefaultFolderPropsEnd
+
+ return defaults;
+ },
+}