XPCOM指南-6_开始编写WebLock

http://blog.csdn.net/lava_sdb/article/details/8578257

注: 本文部分翻译来自官网

在本章,我们开始设计和实现网络锁定功能本身。我们已经建立了实现多数的通用组件功能模块(例如注册)。这章将关注实际操作网页锁定的功能。

1. Getting Called at Startup

没有人是一个孤岛,组件也一样。你所建立的例子组件到目前为止还没有任何功能。他被注册以后,他没做任何事情。

为了当某些事件发生的时候能够触发相应动作(如,启动)或者接收到相应的事件通知,例子组件需要挂接到Mozilla,或者覆盖一个现存组件,或者在Mozilla上注册到一些事件(组件关心的)。WebLock用后面的方式,在Gecko Profile Startup事件发生的时候被触发产生调用。当Gecko应用启动的时候,会创建注册的组件,并通过通用观察者接口(nsIObserver)发出通知。

Observer是一些对象,当特定的事件发生时(他们关心的事件),会接收到相应的通知。这个机制很好,对象之间不需要相互了解细节,就可以进行消息传送。

通常,一个对象会通知一系列观察者。例如一个对象被创建的时候它的observe方法被调用,或者它可以注册一个消息,当XPCOM关闭的时候就可以接收到相应的通知。这个接口的核心是observe方法。

?
void observe(in nsISupports aSubject, 
              in string aTopic, 
              in wstring aData);

实际上observer方法的三个参数(aSubject, aTopic和aData)没有什么限制。这些参数根据事件的类型变化。例如,XPCOM关闭的时候,aSubject和aData被定 义,aTopic被定义为“xpcom-shutdown”,如果你的对象希望注册到这些事件上面,他首先要实现nsIObserver接口,一旦你完成这些,实现nsIObserverService的observer服务将会利用接口通知你的对象,如下所示:

''晕,原文的主要内容在另一个博客,可那个博客已关闭


在本章,我们开始设计和实现网络锁定功能本身。我们已经建立了实现多数的通用组件功能模块(例如注册)。这章将关注实际操作网页锁定的功能。

1. Getting Called at Startup

没有人是一个孤岛,组件也一样。你所建立的例子组件到目前为止还没有任何功能。他被注册以后,他没做任何事情。

为了当某些事件发生的时候能够触发相应动作(如,启动)或者接收到相应的事件通知,例子组件需要挂接到Mozilla,或者覆盖一个现存组件,或者在Mozilla上注册到一些事件(组件关心的)。WebLock用后面的方式,在Gecko Profile Startup事件发生的时候被触发产生调用。当Gecko应用启动的时候,会创建注册的组件,并通过通用观察者接口(nsIObserver)发出通知。

Observer是一些对象,当特定的事件发生时(他们关心的事件),会接收到相应的通知。这个机制很好,对象之间不需要相互了解细节,就可以进行消息传送。

通常,一个对象会通知一系列观察者。例如一个对象被创建的时候它的observe方法被调用,或者它可以注册一个消息,当XPCOM关闭的时候就可以接收到相应的通知。这个接口的核心是observe方法。

void observe(in nsISupports aSubject,  
             in string aTopic,  
             in wstring aData);

实际上observer方法的三个参数(aSubject, aTopic和aData)没有什么限制。这些参数根据事件的类型变化。例如,XPCOM关闭的时候,aSubject和aData被定 义,aTopic被定义为“xpcom-shutdown”,如果你的对象希望注册到这些事件上面,他首先要实现nsIObserver接口,一旦你完成这些,实现nsIObserverService的observer服务将会利用接口通知你的对象,如下所示:

The Observer Interfaces

6-1

上图表现了observer服务管理了所有nsIObserver对象的列表. 当通知产生的时候,nsIObserverService把呼叫者从NotifyObserver()发送出的消息传送给nsIObserver的Observe()方法。这是一个让不同的类解藕的办法。nsIObserver是一个通用的接口,用来在两个或多个对象间传递信息,而不必定义一个特定的冻结接口,它也是XPCOM建立扩展的一个方式。

WebLock组件对nsIObserver接口的实现方式与nsIFactory接口的实现方式类似。下面的例子2中,你类的定义改变为支持nsIObserver接口,并且也对NS_IMPL_ISUPOORTS1做了相应变化,从而QueryInterface的实现知道组件也支持nsIObserver。 支持启动启动消息观察的WebLock类定义如下:

class WebLock: public nsIObserver {
  public:

    WebLock();
    virtual ~WebLock();

    NS_DECL_ISUPPORTS
    NS_DECL_NSIOBSERVER

};

NS_IMPL_ISUPPORTS1(WebLock, nsIObserver);

Observe()最简单的实现仅仅是比较字符串aTopic和对象所接受事件所定义的值. 如果相匹配, 你可以按照你的方式处理事件. 如果对象仅仅注册到一个消息上, 那你可以忽略字符串 aTopic 而仅仅处理事件. 换句话说,对于对象所没有注册的事件,Observe 方法不应该被调用。

NS_IMETHODIMP
WebLock::Observe(nsISupports *aSubject,
                 const char *aTopic,
                 const PRUnichar *aData)
{
  return NS_OK;

}

从observer service来的消息可能是间接的. 直接获得来自observer service的消息的方法是初始化一个nsIObserver 对象. 大多数情况下这样是可以的,但是要注意当你通过这个消息建立组件的情况. 因为组件还没有被建立,所以不存在初始化的 nsIObserver 对象可以用来传递给 nsIObserverService, 组件代码在他被加载以前不能做什么.

1.1 挂接消息处理(Registering for Notifications)

nsIObserverService 接口包含了注册和注销 nsIObserver对象的方法。 这两个方法用于动态添加和移除通知的观察员。 但是WebLock需要自动初始化和添加到observer service,这也意味着一些数据需要持久化 (毕竟,我们需要组件在程序每次启动的时候也启动)。

我们需要一个新的服务来管理这些关联的数据集。 这个服务,就是nsICategoryService,XPCOM和Gecko嵌入式应用通过它来持久化存储需要接收启动消息的nsIObserver组件清单。

nsICategoryService 维护了名字-值对的集合,如下所示:

1.1.1 类型管理器

Image: category-manager-table.png

每个分类使用一个字符串作为标识,这个字符串通常就是分类的名字。 每一个分类包含了一组名字-值对的集合。 例如,你可能有一个分类,名字叫做“Important People”,他的名字-值对对应着人的名字和电话号码。 名字-值对的格式由你决定。

这个数据结构足以支持组件启动时需要的持久化信息。 分类的名字也能够很好的表达消息“topic”的意思。Topic的名字可能与“xpcom-startup”相似,例如,名字-值对可能包含请求启动时创建组件需要的契约ID。 实际上,这个分类的使用是很明确的,它正是用于处理XPCOM启动通知注册消息。 下面的章节,你将会看到怎么用代码来实现。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值