<?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>
| Mozilla扩展系列链接: 1,浅谈基于Mozilla Thunderbird的扩展开发
2,基于Mozilla平台的扩展开发(续)----XPCOM组件篇 3,基于Mozilla Thunderbird的扩展开发(三)---如何获取邮件的完整信息 4,基于Mozilla Thunderbird的扩展开发(四)---修改源代码实现自动保存附件 |
在上一篇《基于Mozilla Thunderbird的扩展开发(五)---进程间通信之Socket篇(上)》中开发了一个简单的TCP服务器,本文将介绍其对应的客户端。
客户端代码:
consttBirdBiffClientUi
=

{
tBirdBiffClientOnLoad:function()

{
//removetoavoidduplicateinitialization
removeEventListener("load",tBirdBiffClientUi.tBirdBiffClientOnLoad,true);
//初始化客户端
varclient=Components.classes["@phinecos.cnblogs.com/TBbiff/client;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
client.initialize();
varwindowCount=client.getWindowCollection().Count();
client.addWindow(window);
client=null;
tBirdBiffClientObserver.updateUi();//更新UI
//registerfornotifications
varservice=Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
service.addObserver(tBirdBiffClientObserver,"thunderbirdBiff.uiUpdate",false);//加入监控者
service=null;
},
tBirdBiffClientOnClose:function()

{
//removetoavoidduplicateinitialization
removeEventListener("close",tBirdBiffClientUi.tBirdBiffClientOnClose,true);
varservice=Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
service.removeObserver(tBirdBiffClientObserver,"thunderbirdBiff.uiUpdate");//移除监控者
service=null;
varclient=Components.classes["@phinecos.cnblogs.com/TBbiff/client;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
client.removeWindow(window);//移除窗口
client=null;
}
}
addEventListener(
"
load
"
,tBirdBiffClientUi.tBirdBiffClientOnLoad,
true
);
addEventListener(
"
close
"
,tBirdBiffClientUi.tBirdBiffClientOnClose,
true
);
客户类:
constCI
=
Components.interfaces,CC
=
Components.classes,CR
=
Components.results;
tBirdBiffClient.classID
=
Components.ID(
"
{5b0bccd0-83b9-11db-9fe1-0800200c9a66}
"
);
tBirdBiffClient.contractID
=
"
@phinecos.cnblogs.com/TBbiff/client;1
"
;
tBirdBiffClient.classDescription
=
"
BiffClientService
"
;
function
tBirdBiffClient()
{
this.timer=CC["@mozilla.org/timer;1"].getService(CI.nsITimer);//定时器
this.interval=null;//定时器时间间隔
this.socketTransport=null;
this.biffState=null;//邮箱状态
this.socket=null;//socket对象
this.input=null;//输入流
this.port=null;//服务器端口
this.hostname=null;//服务器主机名称
this.windowCollection=CC["@mozilla.org/supports-array;1"].createInstance(CI.nsICollection);//客户端窗口集合
this.initialized=false;//是否已经初始化
}

tBirdBiffClient.prototype
=

{
getConnection:function()

{
this.closeSocket();//关闭先前的连接
this.socket=this.socketTransport.createTransport(null,0,this.hostname,this.port,null);//创建socket连接
if(!this.socket)

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

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

{
this.closeSocket();
return;
}
this.input.init(stream);//初始化输入流
},
closeSocket:function()

{//关闭socket连接
if(this.input)

{
this.input.close(null);
this.input=null;
}
if(this.socket)

{
this.socket.close(null);
this.socket=null;
}
},
currentEventQueue:function()

{//当前事件队列
varEQS=CC["@mozilla.org/event-queue-service;1"].getService(CI.nsIEventQueueService);
returnEQS.getSpecialEventQueue(EQS.CURRENT_THREAD_EVENT_QUEUE);
},
initialize:function()

{//初始化客户端
if(this.initialized)

{
return;
}
this.getIntervalPref();//获取时间间隔
this.hostname=this.utility.getHostnamePref();//获取主机名称
this.port=this.utility.getPortPref();//获取端口
this.socketTransport=CC["@mozilla.org/network/socket-transport-service;1"].getService(CI.nsISocketTransportService);
this.getConnection();//创建socket连接
this.timer.initWithCallback(tBirdBiffCheckMailCallback,1000,this.timer.TYPE_ONE_SHOT);//启动定时器监听来自服务器的响应
this.initialized=true;
},
updateUi:function(result)

{//更新客户端UI
varstate;
switch(result)

{
case"":

{
state="offline";
break;
}
case"0":

{
state="noMail";
break;
}
case"1":

{
state="newMail";
break;
}
case"-1":

{
state="error";
break;
}
default:

{
state="weirdness";
break;
}
}
this.biffState=state;
state=null;
varservice=CC["@mozilla.org/observer-service;1"].getService(CI.nsIObserverService);
service.notifyObservers(null,"thunderbirdBiff.uiUpdate",null);
service=null;
},
checkForMail:function()

{//检查是否有数据到来
this.timer.initWithCallback(tBirdBiffReadFromServerCallback,1000,this.timer.TYPE_ONE_SHOT);
},
readFromServer:function()

{//从服务器读取数据
if(!this.input)

{//还未初始化输入流
this.getConnection();
}
try

{
varresult=this.input.read(1);//读取数据
if(result.length==1)

{
this.updateUi(result);//更新状态
}
result=null;
}
catch(e)

{
this.getConnection();
this.updateUi("");
}
this.timer.initWithCallback(tBirdBiffCheckMailCallback,this.interval,this.timer.TYPE_ONE_SHOT);//设置定时器
},
}
客户端监听者,负责监视邮箱的状态变化和读取来自服务器端的数据:
consttBirdBiffReadFromServerCallback
=

{
notify:function(timer)

{//从服务器读取数据
varclient=CC[tBirdBiffClient.contractID].getService(CI.nsISupports).wrappedJSObject;
client.readFromServer();
client=null;
}
}

consttBirdBiffCheckMailCallback
=

{
notify:function(timer)

{//检查邮箱状态
varclient=CC[tBirdBiffClient.contractID].getService(CI.nsISupports).wrappedJSObject;
client.checkForMail();
client=null;
}
}
为了测试服务器和客户端,我们使用firefox作为客户端的载体,thunderbird作为服务器端载体,可以看到thunderbird的邮箱状态会定时传给firefox,从而使得后者能随之更新其状态。
Reference:
本文介绍基于Mozilla Thunderbird的扩展开发,重点讲解了如何通过客户端与服务器进行Socket通信,实现了邮箱状态的实时更新。

7122

被折叠的 条评论
为什么被折叠?



