/** * JH Button Functions * @author Jens Hatlak * with parts from: * - http://developer.mozilla.org/ * - http://code.google.com/p/colorediffs/wiki/HowToGetMessageTextInThunderbird * - http://www.fstoffel.de/tbblog/2009/04/11/how-to-get-a-message-body/ * @version 2011-12-13 */ var EXPORTED_SYMBOLS = ["JHBF"]; var Ci = Components.interfaces; const JHBF = { /** * MailNews functions */ mailnews: { /** * View functions */ view: { /** * Return view flags and type */ getFlagsAndType: function(gDBView) { if (gDBView) return [gDBView.viewFlags, gDBView.viewType]; return [0, 0]; }, /** * Return whether the view is threaded */ isThreaded: function(aViewFlags) { return (aViewFlags & Ci.nsMsgViewFlagsType.kThreadedDisplay) != 0; }, /** * Return whether the view shows only unread messages */ showsOnlyUnread: function(aViewFlags) { return (aViewFlags & Ci.nsMsgViewFlagsType.kUnreadOnly) != 0; } }, /** * Change the status bar text */ setStatusText: function(aDocument, aText) { aDocument.getElementById("statusText").setAttribute("label", aText); }, /** * Get all servers as an array */ get allServers() { let servers = []; let allServers = Components.classes["@mozilla.org/messenger/account-manager;1"] .getService(Ci.nsIMsgAccountManager).allServers; for (let i = 0; i < allServers.Count(); ++i) servers.push(allServers.GetElementAt(i).QueryInterface(Ci.nsIMsgIncomingServer)); return servers; }, /** * Get all subfolders of a folder as an array */ getSubFolders: function(aFolder) { let subFolders = []; let allFolders = Components.classes["@mozilla.org/supports-array;1"] .createInstance(Ci.nsISupportsArray); aFolder.ListDescendents(allFolders); for (let i = 0; i < allFolders.Count(); ++i) subFolders.push(allFolders.GetElementAt(i).QueryInterface(Ci.nsIMsgFolder)); return subFolders; }, /** * Get the folder which has aFlag set */ getFolderWithFlag: function(aServer, aFlag) { let rootMsgFolder = aServer.rootMsgFolder; if (rootMsgFolder && aFlag in Ci.nsMsgFolderFlags) return rootMsgFolder.getFolderWithFlags(Ci.nsMsgFolderFlags[aFlag]); return null; }, /** * Get the subject from a message header object */ getSubjectFromMsgHdr: function(aMsgHdr) { if (aMsgHdr.mime2DecodedSubject) return aMsgHdr.mime2DecodedSubject; return aMsgHdr.subject; }, /** * Get the raw message (headers and body) from a message URI */ getRawMessageFromURI: function(aURI) { let messenger = Components.classes["@mozilla.org/messenger;1"] .createInstance(Ci.nsIMessenger); let messageService = messenger.messageServiceFromURI(aURI); let messageStream = Components.classes["@mozilla.org/network/sync-stream-listener;1"] .createInstance(Ci.nsIInputStream); let inputStream = Components.classes["@mozilla.org/scriptableinputstream;1"] .createInstance(Ci.nsIScriptableInputStream); inputStream.init(messageStream); messageService.streamMessage(aURI, messageStream, {}, null, false, null); let rawMessage = ""; inputStream.available(); while (inputStream.available()) rawMessage += inputStream.read(512); messageStream.close(); inputStream.close(); return rawMessage; }, /** * Get the message body from a message URI */ getBodyFromURI: function(aURI) { let rawMessage = this.getRawMessageFromURI(aURI); let stringStream = Components.classes["@mozilla.org/io/string-input-stream;1"] .createInstance(Ci.nsIStringInputStream); stringStream.setData(rawMessage, rawMessage.length); let messenger = Components.classes["@mozilla.org/messenger;1"] .createInstance(Ci.nsIMessenger); let messageService = messenger.messageServiceFromURI(aURI); let msgHdr = messageService.messageURIToMsgHdr(aURI); let body = msgHdr.folder.getMsgTextFromStream(stringStream, msgHdr.Charset, msgHdr.messageSize, msgHdr.messageSize, false, true, {}); return body; } }, /** * Copy HTML (and UTF-8) to the clipboard */ copyHTMLToClipboard: function(aHTMLText) { let strlen = aHTMLText.length * 2; let str = Components.classes["@mozilla.org/supports-string;1"] .createInstance(Ci.nsISupportsString); if (!str) return false; str.data = aHTMLText; var trans = Components.classes["@mozilla.org/widget/transferable;1"] .createInstance(Ci.nsITransferable); if (!trans) return false; trans.addDataFlavor("text/unicode"); trans.setTransferData("text/unicode", str, strlen); trans.addDataFlavor("text/html"); trans.setTransferData("text/html", str, strlen); var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"] .getService(Ci.nsIClipboard); if (!clipboard) return false; clipboard.setData(trans, null, Ci.nsIClipboard.kGlobalClipboard); return true; }, /** * Write HTML (UTF-8) to a file */ writeHTMLToFile: function(aHTMLText, aSuggestedName) { let dirService = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Ci.nsIProperties); let file = dirService.get("Desk", Ci.nsIFile); file.append(aSuggestedName); file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0666); var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance(Ci.nsIFileOutputStream); foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0); var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"] .createInstance(Ci.nsIConverterOutputStream); converter.init(foStream, "UTF-8", 0, 0); converter.writeString(aHTMLText); converter.close(); return file.path; }, /** * Open a file in Composer */ openFileInComposer: function(aWindow, aFile) { aWindow.openDialog("chrome://editor/content/", "_blank", "chrome,all,dialog=no", aFile); }, /** * Launch a file */ launchFile: function(aFile) { let file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Ci.nsILocalFile); file.initWithPath(aFile); file.launch(); }, /** * Change the status bar text */ setStatusText: function(aDocument, aText) { aDocument.getElementById("statusbar-display").setAttribute("label", aText); } };