summaryrefslogtreecommitdiff
path: root/extensions/thunderbird-extension/content/trackerUnindex.js
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/thunderbird-extension/content/trackerUnindex.js')
-rw-r--r--extensions/thunderbird-extension/content/trackerUnindex.js394
1 files changed, 394 insertions, 0 deletions
diff --git a/extensions/thunderbird-extension/content/trackerUnindex.js b/extensions/thunderbird-extension/content/trackerUnindex.js
new file mode 100644
index 000000000..fc5a8b5c0
--- /dev/null
+++ b/extensions/thunderbird-extension/content/trackerUnindex.js
@@ -0,0 +1,394 @@
+//
+// trackerUnindex.js: Unindexing code, used when data needs to be removed from index or unindexed
+//
+// Copyright (C) 2007 Pierre Östlund
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+
+// FIXME: This entire implementation should somehow be threaded (or similar) to update GUI correctly
+
+const FOLDER_MODE_REMOVE = 0;
+const FOLDER_MODE_UNINDEX = 1;
+const HDR_MODE_REMOVE = 2;
+const HDR_MODE_UNINDEX = 3;
+const EVERYTHING_MODE_REMOVE = 4;
+const EVERYTHING_MODE_UNINDEX = 5;
+
+var gTrackerIndexer = GetJsService ('@tracker-project.org/services/indexer;1');
+var gTrackerQueue = GetJsService ('@tracker-project.org/services/queue;1');
+
+//
+// Call one of the following functions to remove or unindex content
+//
+
+var gTrackerUnindex = {
+
+ RemoveFolder: function (folder, recursive, askUserMarked)
+ {
+ var userMarked = false;
+ if (askUserMarked) {
+ var ret = getUserMarkedChoice ();
+ if (ret == 0)
+ userMarked = true;
+ else if (ret == 2)
+ return;
+ }
+
+ window.openDialog ('chrome://tracker/content/trackerUnindex.xul',
+ 'UnindexWindow',
+ 'chrome,modal=yes,resizable=no',
+ FOLDER_MODE_REMOVE, folder, recursive, userMarked);
+ },
+
+ RemoveHdrs: function (hdrs, askUserMarked)
+ {
+ var userMarked = false;
+ if (askUserMarked) {
+ var ret = getUserMarkedChoice ();
+ if (ret == 0)
+ userMarked = true;
+ else if (ret == 2)
+ return;
+ }
+
+ window.openDialog ('chrome://tracker/content/trackerUnindex.xul',
+ 'UnindexWindow',
+ 'chrome,modal=yes,resizable=no',
+ HDR_MODE_REMOVE, hdrs, userMarked);
+ },
+
+ RemoveEverything: function (askUserMarked)
+ {
+ var userMarked = false;
+ if (askUserMarked) {
+ var ret = getUserMarkedChoice ();
+ if (ret == 0)
+ userMarked = true;
+ else if (ret == 2)
+ return;
+ }
+
+ window.openDialog ('chrome://tracker/content/trackerUnindex.xul',
+ 'UnindexWindow',
+ 'chrome,modal=yes,resizable=no',
+ EVERYTHING_MODE_REMOVE, userMarked);
+ },
+
+ UnindexFolder: function (folder, recursive, askUserMarked)
+ {
+ var userMarked = false;
+ if (askUserMarked) {
+ var ret = getUserMarkedChoice ();
+ if (ret == 0)
+ userMarked = true;
+ else if (ret == 2)
+ return;
+ }
+
+ window.openDialog ('chrome://tracker/content/trackerUnindex.xul',
+ 'UnindexWindow',
+ 'chrome,modal=yes,resizable=no',
+ FOLDER_MODE_UNINDEX, folder, recursive, userMarked);
+ },
+
+ UnindexHdrs: function (hdrs, askUserMarked)
+ {
+ var userMarked = false;
+ if (askUserMarked) {
+ var ret = getUserMarkedChoice ();
+ if (ret == 0)
+ userMarked = true;
+ else if (ret == 2)
+ return;
+ }
+
+ window.openDialog ('chrome://tracker/content/trackerUnindex.xul',
+ 'UnindexWindow',
+ 'chrome,modal=yes,resizable=no',
+ HDR_MODE_UNINDEX, hdrs, userMarked);
+ },
+
+ UnindexEverything: function (askUserMarked)
+ {
+ var userMarked = false;
+ if (askUserMarked) {
+ var ret = getUserMarkedChoice ();
+ if (ret == 0)
+ userMarked = true;
+ else if (ret == 2)
+ return;
+ }
+
+ window.openDialog ('chrome://tracker/content/trackerUnindex.xul',
+ 'UnindexWindow',
+ 'chrome,modal=yes,resizable=no',
+ EVERYTHING_MODE_UNINDEX, userMarked);
+ }
+};
+
+//
+// Various handlers and functions
+//
+
+function onLoad ()
+{
+ window.setTimeout (function () { startProcessing () }, 0);
+}
+
+function startProcessing ()
+{
+ // Make sure we have arguments (we should always have that)
+ if (!window.arguments || window.arguments.length < 1) {
+ window.close ();
+ return;
+ }
+
+ var remove = false;
+ switch (window.arguments [0]) {
+ case FOLDER_MODE_REMOVE:
+ remove = true;
+ case FOLDER_MODE_UNINDEX:
+ prepareFolder (window.arguments [1], window.arguments [2], true, window.arguments [3]);
+ handleFolder (window.arguments [1], window.arguments [2], remove, window.arguments [3]);
+ break;
+ case HDR_MODE_REMOVE:
+ remove = true;
+ case HDR_MODE_UNINDEX:
+ prepareHdrs (window.arguments [1], window.arguments [2]);
+ handleHdrs (window.arguments [1], window.arguments [2], remove);
+ break;
+ case EVERYTHING_MODE_REMOVE:
+ remove = true;
+ case EVERYTHING_MODE_UNINDEX:
+ prepareEverything ();
+ handleEverything (remove, window.arguments [1]);
+ break;
+ }
+
+ // Force a process
+ gTrackerQueue.forceProcess ();
+
+ window.close ();
+}
+
+// Returns 0 when true, 1 when false and 2 when cancel
+function getUserMarkedChoice ()
+{
+ var bundle = document.getElementById ('bundle_tracker');
+ var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
+ .getService(Components.interfaces.nsIPromptService);
+ var flags = prompts.BUTTON_POS_0 * prompts.BUTTON_TITLE_YES +
+ prompts.BUTTON_POS_1 * prompts.BUTTON_TITLE_NO +
+ prompts.BUTTON_POS_2 * prompts.BUTTON_TITLE_CANCEL;
+ var check = {value: true}
+ var button = prompts.confirmEx (window,
+ bundle.getString ('userMarkedContent'),
+ bundle.getString ('removeUserMarkedContent'),
+ flags,
+ null, null, null, null, check);
+
+ return button;
+}
+
+var folder_count = 0;
+var current_folder = 0;
+var message_count = 0;
+var current_message = 0;
+
+// Updates window with current statistics
+function updateWindow ()
+{
+ // Everything folder related goes here
+ var folderStatus = document.getElementById ('folder-status');
+ var folderMeter = document.getElementById ('folder-status-meter');
+ folderStatus.value = current_folder + '/' + folder_count;
+ folderMeter.value = 100 * (current_folder / folder_count);
+
+ // Next are message related things
+ var messageStatus = document.getElementById ('message-status');
+ var messageMeter = document.getElementById ('message-status-meter');
+ messageStatus.value = current_message + '/' + message_count;
+ messageMeter.value = 100 * (current_message / message_count);
+}
+
+function prepareDone ()
+{
+ // Take GUI from preparation mode to unindex/remove mode
+ var statusElem = document.getElementById ('unindex-mainstatus');
+ var prepareElem = document.getElementById ('unindex-preparestatus');
+ var currentElem = document.getElementById ('current-item')
+ currentElem.value = '';
+ prepareElem.setAttribute ('style', 'display: none;');
+ statusElem.setAttribute ('style', '');
+ updateWindow ();
+}
+
+// Preapares the GUI when removing/unindexing a folder
+function prepareFolder (folder, recursive, gui)
+{
+ if (!folder)
+ return;
+
+ // Update our statistics
+ if (recursive) {
+ var allFolders = Components.classes ['@mozilla.org/supports-array;1']
+ .createInstance (Components.interfaces.nsISupportsArray);
+ folder.ListDescendents (allFolders);
+ folder_count += allFolders.Count () + 1;
+ message_count += folder.getTotalMessages (true);
+ current_folder = 0;
+ current_message = 0;
+ } else {
+ folder_count += 1;
+ message_count += folder.getTotalMessages (false);
+ current_folder = 0;
+ current_message = 0;
+ }
+
+ if (gui)
+ prepareDone ();
+}
+
+function prepareHdrs (hdrs)
+{
+ // Pretty easy, huh?
+ folder_count = 1;
+ message_count = hdrs.Count ();
+ current_folder = 0;
+ current_message = 0;
+ prepareDone ();
+}
+
+function prepareEverything ()
+{
+ var gAccountManager = Components.classes ['@mozilla.org/messenger/account-manager;1']
+ .getService (Components.interfaces.nsIMsgAccountManager);
+ var accounts = gAccountManager.accounts;
+
+ for (var i = 0; i < accounts.Count (); i++) {
+ var account = accounts.QueryElementAt (i, Components.interfaces.nsIMsgAccount);
+ if (!account)
+ continue;
+
+ prepareFolder (account.incomingServer.rootFolder, true, false);
+ }
+
+ prepareDone ();
+}
+
+function handleFolder (folder, recursive, remove, userMarked)
+{
+ if (!folder)
+ return;
+
+ var currentItem = document.getElementById ('current-item');
+
+ if (recursive) {
+ var allFolders = Components.classes ['@mozilla.org/supports-array;1']
+ .createInstance (Components.interfaces.nsISupportsArray);
+ folder.ListDescendents (allFolders);
+ allFolders.AppendElement (folder);
+ for (var i = 0; i < allFolders.Count (); i++) {
+ var currentFolder = allFolders.QueryElementAt (i, Components.interfaces.nsIMsgFolder);
+ if (!currentFolder)
+ continue;
+
+ handleFolder (currentFolder, false, remove, userMarked);
+ }
+ } else {
+ try {
+ currentItem.value = folder.prettyName;
+
+ // Update user interface
+ current_folder++;
+ updateWindow ();
+
+ gTrackerIndexer.resetFolder (folder, userMarked, false, false);
+ if (remove)
+ gTrackerQueue.removeFolder (folder);
+
+ // Only process content if we have any content (getMessages will throw an exception otherwise)
+ if (folder.getTotalMessages (false) > 0) {
+ var enumerator = folder.getMessages (null);
+ while (enumerator.hasMoreElements ()) {
+ var hdr = enumerator.getNext ().QueryInterface (Components.interfaces.nsIMsgDBHdr);
+ if (!hdr)
+ continue;
+ current_message++;
+ updateWindow ();
+ gTrackerIndexer.resetHdr (hdr, userMarked);
+ }
+ folder.getMsgDatabase (null).Commit (1);
+ }
+ } catch (ex) {
+ }
+ }
+}
+
+function handleHdrs (hdrs, userMarked, remove)
+{
+ var folder = null;
+
+ for (var i = 0; i < hdrs.Count (); i++) {
+ var hdr = hdrs.QueryElementAt (i, Components.interfaces.nsIMsgDBHdr);
+ if (!hdr)
+ continue;
+
+ // We save the folder so we can mark it as "unindexed". Otherwise the extension won't try to re-index
+ // the content of the folder.
+ if (!folder)
+ folder = hdr.folder;
+
+ // We only remove in case the message is indexed
+ var isIndexed = gTrackerIndexer.isHdrIndexed (hdr);
+ if (isIndexed) {
+ if (remove)
+ gTrackerQueue.removeHdr (hdr);
+ else
+ gTrackerIndexer.resetHdr (hdr, false);
+ }
+ if (userMarked)
+ gTrackerIndexer.resetHdrUserMarked (hdr);
+
+ current_message++;
+ updateWindow ();
+ }
+
+ // Reset folder
+ if (folder)
+ gTrackerIndexer.resetFolder (folder, false, false, false);
+}
+
+function handleEverything (remove, userMarked)
+{
+ var gAccountManager = Components.classes ['@mozilla.org/messenger/account-manager;1']
+ .getService (Components.interfaces.nsIMsgAccountManager);
+ var accounts = gAccountManager.accounts;
+
+ for (var i = 0; i < accounts.Count (); i++) {
+ var account = accounts.QueryElementAt (i, Components.interfaces.nsIMsgAccount);
+ if (!account)
+ continue;
+ handleFolder (account.incomingServer.rootFolder, true, remove, userMarked);
+ }
+}
+