Initial working state
This commit is contained in:
192
folder_actions-api/api.js
Normal file
192
folder_actions-api/api.js
Normal file
@@ -0,0 +1,192 @@
|
||||
"use strict";
|
||||
|
||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
ChromeUtils.import("resource:///modules/MailServices.jsm");
|
||||
ChromeUtils.import("resource:///modules/iteratorUtils.jsm");
|
||||
ChromeUtils.import("resource:///modules/folderUtils.jsm");
|
||||
|
||||
// API provider for Folder Actions
|
||||
class FolderActionsProvider extends ExtensionCommon.EventEmitter {
|
||||
constructor(extension) {
|
||||
super();
|
||||
|
||||
this.extension = extension;
|
||||
}
|
||||
|
||||
get type() {
|
||||
return this.extension.id;
|
||||
}
|
||||
get displayName() {
|
||||
return this.extension.manifest.folder_actions.name;
|
||||
}
|
||||
get iconClass() {
|
||||
let { icon } = ExtensionParent.IconDetails.getPreferredIcon(this.extension.manifest.icons, this.extension, 32);
|
||||
return this.extension.getURL(icon);
|
||||
}
|
||||
|
||||
register() {
|
||||
let uuidgen = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator);
|
||||
let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
||||
let contractID = "@mozilla.org/mail/folder_actions;1?type=" + this.extension.id.replace(/@/g, "-");
|
||||
let self = this;
|
||||
|
||||
// unregisterFactory does not clear the contract id from Components.classes, therefore re-use
|
||||
// the class id from the unregistered factory
|
||||
if (contractID in Cc) {
|
||||
this.classID = Components.ID(Cc[contractID].number);
|
||||
} else {
|
||||
this.classID = Components.ID(uuidgen.generateUUID().toString());
|
||||
}
|
||||
|
||||
let factory = {
|
||||
QueryInterface: ChromeUtils.generateQI([Ci.nsIFactory]),
|
||||
|
||||
createInstance: function(outer, iid) {
|
||||
if (outer !== null) {
|
||||
throw Cr.NS_ERROR_NO_AGGREGATION;
|
||||
}
|
||||
|
||||
return self.QueryInterface(iid);
|
||||
},
|
||||
|
||||
lockFactory: function(doLock) {
|
||||
throw Cr.NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
};
|
||||
this.factory = factory.QueryInterface(Ci.nsIFactory);
|
||||
|
||||
registrar.registerFactory(
|
||||
this.classID, `Cloud file provider for ${this.extension.id}`, contractID, this.factory
|
||||
);
|
||||
|
||||
XPCOMUtils.categoryManager.addCategoryEntry(
|
||||
"cloud-files", this.extension.id, contractID, false, true
|
||||
);
|
||||
}
|
||||
|
||||
unregister() {
|
||||
let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
||||
|
||||
registrar.unregisterFactory(this.classID, this.factory);
|
||||
XPCOMUtils.categoryManager.deleteCategoryEntry("cloud-files", this.extension.id, false);
|
||||
}
|
||||
}
|
||||
|
||||
FolderActionsProvider.prototype.QueryInterface = ChromeUtils.generateQI([Ci.nsIMsgFolderActionsProvider]);
|
||||
|
||||
//
|
||||
// Implementation of folder_actions API
|
||||
//
|
||||
this.folder_actions = class extends ExtensionAPI {
|
||||
async onManifestEntry(entryName) {
|
||||
if (entryName == "folder_actions" && !this.provider) {
|
||||
this.provider = new FolderActionsProvider(this.extension);
|
||||
this.provider.register();
|
||||
}
|
||||
}
|
||||
|
||||
onShutdown() {
|
||||
if (this.provider) {
|
||||
this.provider.unregister();
|
||||
}
|
||||
}
|
||||
|
||||
getFolderInfo() {
|
||||
let data = [];
|
||||
|
||||
toArray(fixIterator(MailServices.accounts.accounts,Components.interfaces.nsIMsgAccount)).map(function(account) {
|
||||
let info = {
|
||||
server: null,
|
||||
type: null,
|
||||
emails: [],
|
||||
trashFolder: null,
|
||||
junkFolder: null,
|
||||
name: null,
|
||||
};
|
||||
let server = account.incomingServer;
|
||||
|
||||
let find_flagged_folders = function(folder,inf) {
|
||||
if (folder.getFlag(Ci.nsMsgFolderFlags.Trash)) {
|
||||
console.log("Folder: " + folder.URI + " has Trash flag ");
|
||||
inf.trashFolder = folder;
|
||||
console.log(folder);
|
||||
} else if (folder.getFlag(Ci.nsMsgFolderFlags.Junk)) {
|
||||
console.log("Folder: " + folder.URI + " has Junk flag ");
|
||||
inf.junkFolder = folder;
|
||||
console.log(folder);
|
||||
} else {
|
||||
if (folder.hasSubFolders) {
|
||||
toArray(fixIterator(folder.subFolders, Ci.nsMsgFolder)).map(function (f) {
|
||||
find_flagged_folders(f,inf);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (server) {
|
||||
info.server = server.prettyName;
|
||||
info.type = server.type;
|
||||
if (info.type != "none") {
|
||||
find_flagged_folders(server.rootFolder,info);
|
||||
}
|
||||
}
|
||||
toArray(fixIterator(account.identities, Ci.nsIMsgIdentity)).map(function(id) {
|
||||
if (id.email) info.emails.push(id.email);
|
||||
});
|
||||
data.push(info);
|
||||
});
|
||||
console.log(data);
|
||||
return data;
|
||||
}
|
||||
|
||||
getAPI(context) {
|
||||
const EventManager = ExtensionCommon.EventManager;
|
||||
let self = this;
|
||||
let mw = Components.classes["@mozilla.org/messenger/msgwindow;1"]
|
||||
.createInstance(Components.interfaces.nsIMsgWindow);;
|
||||
|
||||
return {
|
||||
folder_actions: {
|
||||
emptyFolder: function(folderName) {
|
||||
let finfo = self.getFolderInfo();
|
||||
},
|
||||
emptyTrashFolders: function() {
|
||||
let finfo = self.getFolderInfo();
|
||||
finfo.map(function(info) {
|
||||
if (info.trashFolder) {
|
||||
console.log("emptyTrashFolders: Considering " + info.trashFolder.URI);
|
||||
console.log("emptyTrashFolders: canDeleteMessages? " + info.trashFolder.canDeleteMessages);
|
||||
console.log("emptyTrashFolders: hasSubFolders? " + info.trashFolder.hasSubFolders);
|
||||
console.log(info.trashFolder);
|
||||
info.trashFolder.emptyTrash(null,null);
|
||||
}
|
||||
});
|
||||
},
|
||||
emptyJunkFolders: function() {
|
||||
let finfo = self.getFolderInfo();
|
||||
finfo.map(function(info) {
|
||||
if (info.junkFolder) {
|
||||
console.log("emptyTrashFolders: Considering " + info.junkFolder.URI);
|
||||
console.log("emptyTrashFolders: canDeleteMessages? " + info.junkFolder.canDeleteMessages);
|
||||
console.log("emptyTrashFolders: hasSubFolders? " + info.junkFolder.hasSubFolders);
|
||||
console.log(info.junkFolder);
|
||||
var junk_msgs = Cc["@mozilla.org/array;1"]
|
||||
.createInstance(Ci.nsIMutableArray);
|
||||
var enumerator = info.junkFolder.messages;
|
||||
while (enumerator.hasMoreElements())
|
||||
{
|
||||
var msg_hdr = enumerator.getNext().QueryInterface(Ci.nsIMsgDBHdr);
|
||||
junk_msgs.appendElement(msg_hdr, false);
|
||||
}
|
||||
if (junk_msgs.length) {
|
||||
info.junkFolder.deleteMessages(junk_msgs, mw, false, false, null, true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// vim: ts=2 sw=2 sts=2 et
|
78
folder_actions-api/schema.json
Normal file
78
folder_actions-api/schema.json
Normal file
@@ -0,0 +1,78 @@
|
||||
[
|
||||
{
|
||||
"namespace": "manifest",
|
||||
"types": [
|
||||
{
|
||||
"$extend": "WebExtensionManifest",
|
||||
"properties": {
|
||||
"folder_actions": {
|
||||
"type": "object",
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" },
|
||||
"properties": {
|
||||
"name": { "type": "string", "preprocess": "localize" }
|
||||
},
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"namespace": "folder_actions",
|
||||
"events": [
|
||||
{
|
||||
"name": "onEmptyFolder",
|
||||
"type": "function",
|
||||
"description": "Fired when a folder is emptied",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "folderName",
|
||||
"$ref": "MailFolder",
|
||||
"description": "The folder to be emptied"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"types": [
|
||||
{
|
||||
"id": "MailFolder",
|
||||
"type": "object",
|
||||
"description": "Information about a mail folder",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Name of the folder to be emptied"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"functions": [
|
||||
{
|
||||
"name": "emptyFolder",
|
||||
"type": "function",
|
||||
"description": "Empties specified mail folder",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "folderName",
|
||||
"$ref": "MailFolder",
|
||||
"description": "The mail folder to empty"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "emptyTrashFolders",
|
||||
"type": "function",
|
||||
"description": "Empties Trash folders in all accounts",
|
||||
"parameters": []
|
||||
},
|
||||
{
|
||||
"name": "emptyJunkFolders",
|
||||
"type": "function",
|
||||
"description": "Empties Junk folders in all accounts",
|
||||
"parameters": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
// vim: ts=2 sw=2 sts=2 et
|
Reference in New Issue
Block a user