基于Mozilla Thunderbird的扩展开发(六)---进程间通信之Socket篇(下)

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>

20080506.bmp

Mozilla扩展系列链接:

1浅谈基于Mozilla Thunderbird的扩展开发

2基于Mozilla平台的扩展开发(续)----XPCOM组件篇

3基于Mozilla Thunderbird的扩展开发(三)---如何获取邮件的完整信息

4基于Mozilla Thunderbird的扩展开发(四)---修改源代码实现自动保存附件

5基于Mozilla Thunderbird的扩展开发(五)---进程间通信之Socket篇(上)

6基于Mozilla Thunderbird的扩展开发(六)---进程间通信之Socket篇(下)

在上一篇《基于Mozilla Thunderbird的扩展开发(五)---进程间通信之Socket篇(上)》中开发了一个简单的TCP服务器,本文将介绍其对应的客户端。

客户端代码:

None.gifconsttBirdBiffClientUi=
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.giftBirdBiffClientOnLoad:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//removetoavoidduplicateinitialization
InBlock.gif
removeEventListener("load",tBirdBiffClientUi.tBirdBiffClientOnLoad,true);
InBlock.gif
//初始化客户端
InBlock.gif
varclient=Components.classes["@phinecos.cnblogs.com/TBbiff/client;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
InBlock.gifclient.initialize();
InBlock.gif
varwindowCount=client.getWindowCollection().Count();
InBlock.gifclient.addWindow(window);
InBlock.gifclient
=null;
InBlock.giftBirdBiffClientObserver.updateUi();
//更新UI
InBlock.gif
//registerfornotifications
InBlock.gif
varservice=Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
InBlock.gifservice.addObserver(tBirdBiffClientObserver,
"thunderbirdBiff.uiUpdate",false);//加入监控者
InBlock.gif
service=null;
ExpandedSubBlockEnd.gif}
,
InBlock.gif
InBlock.giftBirdBiffClientOnClose:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//removetoavoidduplicateinitialization
InBlock.gif
removeEventListener("close",tBirdBiffClientUi.tBirdBiffClientOnClose,true);
InBlock.gif
varservice=Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
InBlock.gifservice.removeObserver(tBirdBiffClientObserver,
"thunderbirdBiff.uiUpdate");//移除监控者
InBlock.gif
service=null;
InBlock.gif
InBlock.gif
varclient=Components.classes["@phinecos.cnblogs.com/TBbiff/client;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
InBlock.gifclient.removeWindow(window);
//移除窗口
InBlock.gif
client=null;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gifaddEventListener(
"load",tBirdBiffClientUi.tBirdBiffClientOnLoad,true);
None.gifaddEventListener(
"close",tBirdBiffClientUi.tBirdBiffClientOnClose,true);
None.gif

客户类:

None.gifconstCI=Components.interfaces,CC=Components.classes,CR=Components.results;
None.giftBirdBiffClient.classID
=Components.ID("{5b0bccd0-83b9-11db-9fe1-0800200c9a66}");
None.giftBirdBiffClient.contractID
="@phinecos.cnblogs.com/TBbiff/client;1";
None.giftBirdBiffClient.classDescription
="BiffClientService";
None.gif
None.gif
functiontBirdBiffClient()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
this.timer=CC["@mozilla.org/timer;1"].getService(CI.nsITimer);//定时器
InBlock.gif
this.interval=null;//定时器时间间隔
InBlock.gif
this.socketTransport=null;
InBlock.gif
this.biffState=null;//邮箱状态
InBlock.gif
this.socket=null;//socket对象
InBlock.gif
this.input=null;//输入流
InBlock.gif
this.port=null;//服务器端口
InBlock.gif
this.hostname=null;//服务器主机名称
InBlock.gif
this.windowCollection=CC["@mozilla.org/supports-array;1"].createInstance(CI.nsICollection);//客户端窗口集合
InBlock.gif
this.initialized=false;//是否已经初始化
ExpandedBlockEnd.gif
}

None.gif
None.giftBirdBiffClient.prototype
=
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifgetConnection:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
this.closeSocket();//关闭先前的连接
InBlock.gif
this.socket=this.socketTransport.createTransport(null,0,this.hostname,this.port,null);//创建socket连接
InBlock.gif
if(!this.socket)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
return;
ExpandedSubBlockEnd.gif}

InBlock.gif
varstream=this.socket.openInputStream(CI.nsITransport.OPEN_BLOCKING|CI.nsITransport.OPEN_UNBUFFERED,0,0);//打开输入流,类型为阻塞式,无缓冲
InBlock.gif
if(!stream)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
this.closeSocket();
InBlock.gif
return;
ExpandedSubBlockEnd.gif}

InBlock.gif
this.input=CC["@mozilla.org/scriptableinputstream;1"].createInstance(CI.nsIScriptableInputStream);
InBlock.gif
if(!this.input)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
this.closeSocket();
InBlock.gif
return;
ExpandedSubBlockEnd.gif}

InBlock.gif
this.input.init(stream);//初始化输入流
ExpandedSubBlockEnd.gif
}
,
InBlock.gifcloseSocket:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//关闭socket连接
InBlock.gif
if(this.input)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
this.input.close(null);
InBlock.gif
this.input=null;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
if(this.socket)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
this.socket.close(null);
InBlock.gif
this.socket=null;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}
,
InBlock.gifcurrentEventQueue:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//当前事件队列
InBlock.gif
varEQS=CC["@mozilla.org/event-queue-service;1"].getService(CI.nsIEventQueueService);
InBlock.gif
returnEQS.getSpecialEventQueue(EQS.CURRENT_THREAD_EVENT_QUEUE);
ExpandedSubBlockEnd.gif}
,
InBlock.gifinitialize:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//初始化客户端
InBlock.gif
if(this.initialized)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
return;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
this.getIntervalPref();//获取时间间隔
InBlock.gif
this.hostname=this.utility.getHostnamePref();//获取主机名称
InBlock.gif
this.port=this.utility.getPortPref();//获取端口
InBlock.gif
this.socketTransport=CC["@mozilla.org/network/socket-transport-service;1"].getService(CI.nsISocketTransportService);
InBlock.gif
this.getConnection();//创建socket连接
InBlock.gif
this.timer.initWithCallback(tBirdBiffCheckMailCallback,1000,this.timer.TYPE_ONE_SHOT);//启动定时器监听来自服务器的响应
InBlock.gif
this.initialized=true;
ExpandedSubBlockEnd.gif}
,
InBlock.gifupdateUi:
function(result)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//更新客户端UI
InBlock.gif
varstate;
InBlock.gif
switch(result)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
case"":
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstate
="offline";
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
case"0":
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstate
="noMail";
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
case"1":
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstate
="newMail";
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
case"-1":
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstate
="error";
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
default:
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifstate
="weirdness";
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
this.biffState=state;
InBlock.gifstate
=null;
InBlock.gif
varservice=CC["@mozilla.org/observer-service;1"].getService(CI.nsIObserverService);
InBlock.gifservice.notifyObservers(
null,"thunderbirdBiff.uiUpdate",null);
InBlock.gifservice
=null;
ExpandedSubBlockEnd.gif}
,
InBlock.gifcheckForMail:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//检查是否有数据到来
InBlock.gif
this.timer.initWithCallback(tBirdBiffReadFromServerCallback,1000,this.timer.TYPE_ONE_SHOT);
ExpandedSubBlockEnd.gif}
,
InBlock.gif
InBlock.gifreadFromServer:
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//从服务器读取数据
InBlock.gif
if(!this.input)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//还未初始化输入流
InBlock.gif
this.getConnection();
ExpandedSubBlockEnd.gif}

InBlock.gif
try
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
varresult=this.input.read(1);//读取数据
InBlock.gif
if(result.length==1)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
this.updateUi(result);//更新状态
ExpandedSubBlockEnd.gif
}

InBlock.gifresult
=null;
ExpandedSubBlockEnd.gif}

InBlock.gif
catch(e)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
this.getConnection();
InBlock.gif
this.updateUi("");
ExpandedSubBlockEnd.gif}

InBlock.gif
this.timer.initWithCallback(tBirdBiffCheckMailCallback,this.interval,this.timer.TYPE_ONE_SHOT);//设置定时器
ExpandedSubBlockEnd.gif
}
,
ExpandedBlockEnd.gif}

None.gif



客户端监听者,负责监视邮箱的状态变化和读取来自服务器端的数据:

None.gifconsttBirdBiffReadFromServerCallback=
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifnotify:
function(timer)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//从服务器读取数据
InBlock.gif
varclient=CC[tBirdBiffClient.contractID].getService(CI.nsISupports).wrappedJSObject;
InBlock.gifclient.readFromServer();
InBlock.gifclient
=null;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
None.gifconsttBirdBiffCheckMailCallback
=
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifnotify:
function(timer)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//检查邮箱状态
InBlock.gif
varclient=CC[tBirdBiffClient.contractID].getService(CI.nsISupports).wrappedJSObject;
InBlock.gifclient.checkForMail();
InBlock.gifclient
=null;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif

为了测试服务器和客户端,我们使用firefox作为客户端的载体,thunderbird作为服务器端载体,可以看到thunderbird的邮箱状态会定时传给firefox,从而使得后者能随之更新其状态。

Reference:

1 https://addons.mozilla.org/en-US/thunderbird/addon/3788

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页