242 lines
8.0 KiB
JavaScript
242 lines
8.0 KiB
JavaScript
|
||
var MBstrBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
|
||
getService(Components.interfaces.nsIStringBundleService);
|
||
var mboximportbundle = MBstrBundleService.createBundle("chrome://openerp_plugin/locale/mboximport.properties");
|
||
|
||
|
||
function saveMsgAsEML(msguri,file,append,uriArray,hdrArray,fileArray) {
|
||
|
||
var myEMLlistner = {
|
||
|
||
scriptStream : null,
|
||
emailtext : "",
|
||
|
||
QueryInterface : function(iid) {
|
||
if (iid.equals(Components.interfaces.nsIStreamListener) ||
|
||
iid.equals(Components.interfaces.nsIMsgHeaderSink) ||
|
||
iid.equals(Components.interfaces.nsISupports))
|
||
return this;
|
||
|
||
throw Components.results.NS_NOINTERFACE;
|
||
return 0;
|
||
},
|
||
|
||
onStartRequest : function (aRequest, aContext) {
|
||
this.scriptStream = Components.classes['@mozilla.org/binaryinputstream;1'].createInstance(Components.interfaces.nsIBinaryInputStream);
|
||
},
|
||
|
||
onStopRequest : function (aRequest, aContext, aStatusCode) {
|
||
this.scriptStream = null;
|
||
|
||
if (append) {
|
||
if (this.emailtext != "") {
|
||
var data = this.emailtext + "\n";
|
||
// Some Imap servers don't add to the message the "From" prologue
|
||
if (data && ! data.match(/^From/)) {
|
||
var now = new Date;
|
||
var prologue = "From - " + now.toString() + "\n";
|
||
data = prologue+data;
|
||
}
|
||
data = IETescapeBeginningFrom(data);
|
||
}
|
||
var fileClone = file.clone();
|
||
IETwriteDataOnDisk(fileClone,data,true,this.sub,null);
|
||
}
|
||
else {
|
||
if (! hdrArray)
|
||
var sub = getSubjectForHdr(hdr);
|
||
else {
|
||
var parts = hdrArray[IETexported].split("§][§^^§");
|
||
var sub = parts[4];
|
||
}
|
||
|
||
var data = this.emailtext.replace(/^From.+\r?\n]/, "");
|
||
data = IETescapeBeginningFrom(data);
|
||
var clone = file.clone();
|
||
// The name is taken from the subject "corrected"
|
||
clone.append(sub+".eml");
|
||
clone.createUnique(0,0644);
|
||
var time = (hdr.dateInSeconds)*1000;
|
||
IETwriteDataOnDisk(clone,data,false,null,time);
|
||
}
|
||
IETexported = IETexported + 1;
|
||
IETwritestatus(mboximportbundle.GetStringFromName("exported")+" "+IETexported+" "+mboximportbundle.GetStringFromName("msgs")+" "+IETtotal);
|
||
|
||
if (IETexported < IETtotal) {
|
||
if (fileArray) {
|
||
var nextUri = uriArray[IETexported];
|
||
var nextFile = fileArray[IETexported];
|
||
}
|
||
else if (! hdrArray) {
|
||
var nextUri = uriArray[IETexported];
|
||
var nextFile = file;
|
||
}
|
||
else {
|
||
parts = hdrArray[IETexported].split("§][§^^§");
|
||
var nextUri = parts[5];
|
||
var nextFile = file;
|
||
}
|
||
saveMsgAsEML(nextUri,nextFile,append,uriArray,hdrArray,fileArray);
|
||
}
|
||
else {
|
||
IETexported = 0;
|
||
IETtotal = 0;
|
||
}
|
||
},
|
||
|
||
onDataAvailable : function (aRequest, aContext, aInputStream, aOffset, aCount) {
|
||
this.scriptStream.setInputStream(aInputStream);
|
||
var chunk = this.scriptStream.readBytes(aCount);
|
||
this.emailtext += chunk;
|
||
}
|
||
};
|
||
var mms = messenger.messageServiceFromURI(msguri).QueryInterface(Components.interfaces.nsIMsgMessageService);
|
||
var hdr = mms.messageURIToMsgHdr(msguri);
|
||
mms.streamMessage(msguri, myEMLlistner, msgWindow, null, false, null);
|
||
}
|
||
|
||
|
||
function nametoascii(str) {
|
||
if (! gPrefBranch.getBoolPref("mboximport.export.filenames_toascii")) {
|
||
str = str.replace(/[\x00-\x19]/g,"_");
|
||
return str.replace(/[\/\\:,<>*\?\"\|]/g,"_");
|
||
}
|
||
if (str)
|
||
str = str.replace(/[^a-zA-Z0-9]/g,"_");
|
||
else
|
||
str = "Undefinied_or_empty";
|
||
return str;
|
||
}
|
||
|
||
|
||
function IETwriteDataOnDisk(file,data,append,name,time) {
|
||
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
|
||
.createInstance(Components.interfaces.nsIFileOutputStream);
|
||
if (append) {
|
||
file.append(name);
|
||
foStream.init(file, 0x02 | 0x08 | 0x10, 0664, 0); // write, create, append
|
||
}
|
||
else
|
||
foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); // write, create, truncate
|
||
if (data)
|
||
foStream.write(data,data.length);
|
||
foStream.close();
|
||
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
|
||
.getService(Components.interfaces.nsIPrefBranch);
|
||
if (time && prefs.getBoolPref("mboximport.export.set_filetime"))
|
||
file.lastModifiedTime = time;
|
||
}
|
||
|
||
|
||
|
||
function IETescapeBeginningFrom(data) {
|
||
// Workaround to fix the "From " in beginning line problem in body messages
|
||
// See https://bugzilla.mozilla.org/show_bug.cgi?id=119441 and
|
||
// https://bugzilla.mozilla.org/show_bug.cgi?id=194382
|
||
// TB2 has uncorrect beahviour with html messages
|
||
// This is not very fine, but I didnt' find anything better...
|
||
var datacorrected = data.replace(/\nFrom /g, "\n From ");
|
||
return datacorrected;
|
||
}
|
||
|
||
|
||
function getPredefinedFolder(type) {
|
||
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
|
||
.getService(Components.interfaces.nsIPrefBranch);
|
||
// type 0 = folder
|
||
// type 1 = all messages
|
||
// type 2 = selected messages
|
||
|
||
var use_dir = "mboximport.exportMSG.use_dir";
|
||
var dirService = Components.classes["@mozilla.org/file/directory_service;1"].
|
||
getService(Components.interfaces.nsIProperties).get("Home", Components.interfaces.nsIFile);
|
||
var homeDir = dirService.path;
|
||
var dir_path = ((homeDir.search(/\\/) != -1) ? homeDir + "\\" : homeDir + "/")
|
||
try {
|
||
var localFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
|
||
localFile.initWithPath(dir_path);
|
||
return localFile;
|
||
|
||
}
|
||
catch(e) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
function getSubjectForHdr(hdr) {
|
||
var emlNameType = gPrefBranch.getIntPref("mboximport.exportEML.filename_format");
|
||
var mustcorrectname = gPrefBranch.getBoolPref("mboximport.export.filenames_toascii");
|
||
var subMaxLen = gPrefBranch.getIntPref("mboximport.subject.max_length")-1;
|
||
if (hdr.mime2DecodedSubject)
|
||
|
||
var subj = hdr.mime2DecodedSubject.substring(0, subMaxLen);
|
||
else
|
||
var subj =IETnosub;
|
||
subj = nametoascii(subj);
|
||
var dateInSec = hdr.dateInSeconds;
|
||
var msgDate8601string = dateInSecondsTo8601(dateInSec);
|
||
var key = hdr.messageKey;
|
||
if (emlNameType == 2) {
|
||
var pattern = gPrefBranch.getCharPref("mboximport.export.filename_pattern");
|
||
pattern = pattern.replace("%s",subj);
|
||
pattern = pattern.replace("%k",key);
|
||
pattern = pattern.replace("%d", msgDate8601string);
|
||
pattern = pattern.replace(/-%e/g, "");
|
||
pattern = pattern.replace(/[\x00-\x19]/g,"_");
|
||
var fname = pattern;
|
||
}
|
||
else {
|
||
|
||
var fname = msgDate8601string+"-"+subj+"-"+hdr.messageKey;
|
||
}
|
||
setFileName(fname)
|
||
fname = fname.replace(/[\x00-\x19]/g,"_");
|
||
if (mustcorrectname)
|
||
fname = nametoascii(fname);
|
||
else
|
||
fname = fname.replace(/[\/\\:,<>*\?\"\|]/g,"_");
|
||
return fname;
|
||
}
|
||
|
||
function dateInSecondsTo8601(secs) {
|
||
var addTime = gPrefBranch.getBoolPref("mboximport.export.filenames_addtime");
|
||
var msgDate = new Date(secs*1000);
|
||
var msgDate8601 = msgDate.getFullYear();
|
||
if (msgDate.getMonth() < 9)
|
||
var month = "0"+(msgDate.getMonth()+1);
|
||
else
|
||
var month = msgDate.getMonth()+1;
|
||
if (msgDate.getDate() < 10)
|
||
var day = "0"+ msgDate.getDate();
|
||
else
|
||
var day = msgDate.getDate();
|
||
var msgDate8601string = msgDate8601.toString()+month.toString()+day.toString();
|
||
if (addTime && gPrefBranch.getIntPref("mboximport.exportEML.filename_format") == 2) {
|
||
if (msgDate.getHours() < 10)
|
||
var hours = "0"+msgDate.getHours();
|
||
else
|
||
var hours = msgDate.getHours();
|
||
if (msgDate.getMinutes() < 10)
|
||
var min = "0"+msgDate.getMinutes();
|
||
else
|
||
var min = msgDate.getMinutes();
|
||
msgDate8601string += "-"+ hours.toString() + min.toString();
|
||
}
|
||
return msgDate8601string;
|
||
}
|
||
|
||
function IETwritestatus(text) {
|
||
document.getElementById("statusText").setAttribute("label", text);
|
||
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
|
||
var delay = prefs.getIntPref("mboximport.delay.clean_statusbar");
|
||
if (delay > 0)
|
||
window.setTimeout(function(){IETdeletestatus(text);}, delay);
|
||
}
|
||
|
||
function IETdeletestatus(text) {
|
||
if (document.getElementById("statusText").getAttribute("label") == text)
|
||
document.getElementById("statusText").setAttribute("label", "");
|
||
}
|
||
|
||
|