1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
/* 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/. */
const EXPORTED_SYMBOLS = ["BaseProfileImporter"];
var { setTimeout } = ChromeUtils.importESModule(
"resource://gre/modules/Timer.sys.mjs"
);
/**
* An object to represent a source profile to import from.
*
* @typedef {object} SourceProfile
* @property {string} name - The profile name.
* @property {nsIFile} dir - The profile location.
*
* An object to represent items to import.
* @typedef {object} ImportItems
* @property {boolean} accounts - Whether to import accounts and settings.
* @property {boolean} addressBooks - Whether to import address books.
* @property {boolean} calendars - Whether to import calendars.
* @property {boolean} mailMessages - Whether to import mail messages.
*/
/**
* Common interfaces shared by profile importers.
*
* @abstract
*/
class BaseProfileImporter {
/** @type boolean - Whether to allow importing from a user picked dir. */
USE_FILE_PICKER = true;
/** @type ImportItems */
SUPPORTED_ITEMS = {
accounts: true,
addressBooks: true,
calendars: true,
mailMessages: true,
};
/** When importing from a zip file, ignoring these folders. */
IGNORE_DIRS = [];
/**
* Callback for progress updates.
*
* @param {number} current - Current imported items count.
* @param {number} total - Total items count.
*/
onProgress = () => {};
/**
* @returns {SourceProfile[]} Profiles found on this machine.
*/
async getSourceProfiles() {
throw Components.Exception(
`getSourceProfiles not implemented in ${this.constructor.name}`,
Cr.NS_ERROR_NOT_IMPLEMENTED
);
}
/**
* Actually start importing things to the current profile.
*
* @param {nsIFile} sourceProfileDir - The source location to import from.
* @param {ImportItems} items - The items to import.
* @returns {boolean} Returns true when accounts have been imported, which
* means a restart is needed. Otherwise, no restart is needed.
*/
async startImport(sourceProfileDir, items) {
throw Components.Exception(
`startImport not implemented in ${this.constructor.name}`,
Cr.NS_ERROR_NOT_IMPLEMENTED
);
}
/**
* Reset use_without_mail_account, so that imported accounts are correctly
* rendered in the folderPane.
*/
_onImportAccounts() {
Services.prefs.setBoolPref("app.use_without_mail_account", false);
}
/**
* Increase _itemsImportedCount by one, and call onProgress.
*/
async _updateProgress() {
this.onProgress(++this._itemsImportedCount, this._itemsTotalCount);
return new Promise(resolve => setTimeout(resolve));
}
_logger = console.createInstance({
prefix: "mail.import",
maxLogLevel: "Warn",
maxLogLevelPref: "mail.import.loglevel",
});
}
|