基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件
2008-05-18 20:50
591 查看
Mozilla扩展系列链接: 1,浅谈基于Mozilla Thunderbird的扩展开发 2,基于Mozilla平台的扩展开发(续)----XPCOM组件篇 3,基于MozillaThunderbird的扩展开发(三)---如何获取邮件的完整信息 4,基于MozillaThunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件 |
Thunderbird中已经有保存附件的功能,但需要手动去操作,既然手头有它的源代码,为什么我们不自己尝试对它进行修改,从而使得它能自动保存所有附件呢?Ok,这篇文章就是基于这样思想的一个尝试。
首先明确一个前提,本文并不想开发一个扩展,而是尝试直接修改Thunderbird的源代码,但你也可以将它修改为一个扩展,这里为了调试开发简单起见,因此我选择了直接修改其代码。
要想自动保存附件,首先需要知道在它源代码中的哪个点去执行保存附件这样一个动作,在多次试验后发现可以msgMail3PaneWindow.js中的177行处的folderListener对象进行修改如下:
var folderListener =
{
OnItemIntPropertyChanged: function(item, property, oldValue, newValue)
{
if (item == gMsgFolderSelected)
{
if(property.toString() == "TotalMessages" || property.toString() == "TotalUnreadMessages")
{
UpdateStatusMessageCounts(gMsgFolderSelected);
UpdateFolderLocationPicker(item);
//***************************************************************************
//Author: phinecos
//Date : 2008/5/8
//Description:自动保存邮件到指定文件夹下
//Contact:phinecos@163.com
//***************************************************************************
if(property.toString()=="TotalMessages" && newValue>oldValue)
{//保存邮件到指定文件夹下
if(messenger!=null && gDBView!=null)
{
try
{
SaveAllMessages(saveFolderName);
}
catch(err)
{
}
}
}
}
}
},
//***************************************************************************
//Author: phinecos
//Date : 2008/5/8
//Description:保存所有邮件
//Contact:phinecos@163.com
//***************************************************************************
function SaveAllMessages(folerName)
{//保存所有邮件,folerName是文件夹名称
if(gDBView==null)
{//gDBView是空的
return;
}
var treeView = gDBView.QueryInterface(Components.interfaces.nsITreeView);
var count = treeView.rowCount;
if (!count)
return;
gDBView.doCommand(nsMsgViewCommandType.expandAll);//展开所有的邮件
var messageUri;
var msgKey = null;
for (var i = 0; i < count; ++i)
{//保存第i个邮件
try
{
messageUri = gDBView.getURIForViewIndex(i);//邮件Uri
msgKey = gDBView.getKeyAt(i);//邮件key
try
{
gDBView.loadMessageByMsgKey(msgKey);//加载邮件
}
catch(err)
{
alert("sory");
}
var msgHdr = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri);
var result = true;
result = msgHdr.folder.hasMsgOffline(msgHdr.messageKey);
if(result==false)
{//本地数据源中读取邮件
readOffline(msgHdr,messageUri,folerName);
}
else
{//从服务器上读邮件
//to be do future
}
}
catch (ex)
{// blow off errors for dummy rows
continue;
}
}
}
接下来那些具体保存邮件的代码这里就省略了,具体可以参考上一篇文章,要重点提的一点是这一句代码:
gDBView.loadMessageByMsgKey(msgKey);//加载邮件
当执行它时,会加载邮件信息,从而会触发对附件的处理函数,因此我们可以在附件的处理函数中进行保存附件的处理。
msgHdrViewOverlay.js文件中第425行处的handleAttachment方法就是我们需要修改的地方。
handleAttachment: function(contentType, url, displayName, uri, isExternalAttachment)
{
….(省略)
//保存当前邮件的附件信息
var currentAttachment = new createNewAttachmentInfo(contentType, url, displayName, uri, isExternalAttachment);
….(省略)
//
//***************************************************************************
//Author: phinecos
//Date : 2008/5/17
//Description:保存附件
//Contact:phinecos@163.com
//***************************************************************************
var actionIndex = 0;
// for (index in currentAttachment) {
// exclude all attachments already deleted
var attachment = currentAttachment;//当前待处理的附件
if (attachment.contentType != 'text/x-moz-deleted')
{
var path = getDefaultSaveFolder();//附件保存目录路径
var destFolder=makeFile();
destFolder.initWithPath(path);
var folder=destFolder;
var proposedfileobject = makeFile();
proposedfileobject.initWithFile(folder);
proposedfileobject.appendRelativePath(attachment.displayName);//附件的目标文件
if (proposedfileobject && proposedfileobject.parent && !proposedfileobject.parent.exists())
{//若父目录不存在,则先创建父目录
proposedfileobject.parent.create(proposedfileobject.DIRECTORY_TYPE, 0600);
}
aeMessenger.saveAttachmentToFolder(attachment.contentType, attachment.url,proposedfileobject.leafName, attachment.uri, proposedfileobject.parent, index);//保存当前待处理的附件
}
// }
},
真正完成保存附件的是下面的aeMessenger对象:
var aeMessenger =
{
Cc:Components.classes,
Ci:Components.interfaces,
/**//* ************************************* saving ************************************* */
saveAttachmentToFolder:function(contentType,url,displayName,messageUri,aDestFolder,attachmentindex)
{
var out=aDestFolder.clone();
out=out.QueryInterface(Components.interfaces.nsILocalFile);
out.append(displayName);
if (this.saveAttachment(out, url, messageUri, contentType, attachmentindex)) return out;//保存附件的实际动作
else return null;
}, //##
// simplied version of this function, taking out all fetchservice stuff.
saveAttachment:function(file, url, messageUri, contentType, attachmentindex)
{
try
{
// strip out ?type=application/x-message-display because it confuses libmime
if (url.indexOf("?type=application/x-message-display")!=-1)
{
url=url.replace("?type=application/x-message-display","").replace('&','?');
}
url=url.replace("/;section","?section");
var saveListener = new aeSaveMsgListener(file, messenger,contentType,null,null,false);
var convertedListener=saveListener.QueryInterface(Components.interfaces.nsIStreamListener);//流监听器
var messageService=messenger.messageServiceFromURI(messageUri);//邮件服务提供者
var openAttArgs=new Array(contentType,file.leafName,url,messageUri,convertedListener,null,null);//apply方法所需要的参数
messageService.openAttachment.apply(null,openAttArgs); //真正去保存附件
}
catch (e)
{
return false;
}
return true;
},
};
注:这里设置了一个流监听器的作用是为了对文件流的写入进行监控,并不是必须的
好了,这下就可以用make命令重新编译thunderbird源代码了,测试时先启动thunderbird,当接收到新邮件并且其含有附件时,就会自动下载并保存。
如果需要完整的源代码,请发email至:phinecos#163.com(#改为@)
Reference:
1, http://www.eviljeff.com/?page=moz-extensions
相关文章推荐
- 基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件
- Spring Boot在开发时实现热部署(开发时修改文件保存后自动重启应用)(spring-boot-devtools)
- VB6.0 基于ewededitor4.8商业版扩展功能——屏幕截图自动保存功能开发笔记
- 基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作
- 基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作
- Android开发之使用BroadcastReceiver实现开机自动启动(源代码分享)
- 基于Smack3.0.4+ Openfire3.10.2下学习开发IM(一)实现用户登录、修改密码、删除指定用户和注册新用户等
- node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- 基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
- java实现记事本基本功能:新建、打开、保存、另存为、退出、替换、全部替换、复制、剪切、粘贴、全选、获取当前时间日期、修改字体、颜色、自动换行等
- Android开发之使用BroadcastReceiver实现开机自动启动(源代码分享)
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- ArcGIS C#插件式开发总结1——编辑过程自动保存插件(Button实现)
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
- iOS 开发 -- 使用KeyChain保存用户名、密码并实现自动登录
- 基于CSerialPort修改类的串口调试助手源代码(支持中文、自动保存等)
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等