`

用ruby写了一个生成xpcom组件模板的小工具

阅读更多

写xpcom组件我们经常copy paste,因为xpcom组件的与业务无关的注册、QueryInterface代码都是基本固定的,
写了一个自动生成xpcom组件的template,这样就可以只关心核心业务,避免书写样板式的代码。

=begin
NOTICE:
Before use the code:
You should use command "gem install uuid" to install uuid gem for ruby
Once installed, create a uuid.state file by running command "uuid-setup"
=end

require 'uuid'

puts "please input the component interface name:"
component_interface_name = gets.chomp

puts "please input the component class name:"
class_name = gets.chomp
cid = "{#{UUID.new}}";

template = <<EOF
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;

const nsISupports = Ci.nsISupports;
const #{component_interface_name}  =  Ci.#{component_interface_name};

const CLASS_ID = Components.ID("#{cid}");
const CLASS_NAME = "#{class_name}";
const CONTRACT_ID = "@ibm.com/#{class_name.downcase};1";

function #{class_name}(){
};

#{class_name}.prototype = {

	QueryInterface: function(aIID){
		if(!aIID.equals(#{component_interface_name}) && 
		   !aIID.equals(nsISupports)) 
			throw Cr.NS_ERROR_NO_INTERFACE;
		return this;
	}
};	
	
var #{class_name}Factory = {
	createInstance: function(aOuter, aIID){
		if(aOuter != null)
			throw Cr.NS_ERROR_NO_AGGREGATION;
		return (new #{class_name}()).QueryInterface(aIID);
	}
};

var #{class_name}Module = {
	registerSelf: function(aComMgr, aFileSpec, aLocation, aType){
		aComMgr = aComMgr.QueryInterface(Ci.nsIComponentRegistrar);
		aComMgr.registerFactoryLocation(CLASS_ID, CLASS_NAME, CONTRACT_ID, aFileSpec, aLocation, aType);
	},
	
	unregisterSelf: function(aComMgr, aLocation, aType){
		aComMgr = aComMgr.QueryInterface(Ci.nsIComponentRegistrar);
		aComMgr.unregisterFactoryLocation(CLASS_ID, aLocation);
	},
	
	getClassObject: function(aComMgr, aCID, aIID){
		if(!aIID.equals(Ci.nsIFactory))
			throw Cr.NS_ERROR_NO_IMPLEMENTED;
		if(aCID.equals(CLASS_ID))
			return #{class_name}Factory;
		throw Cr.NS_ERROR_NO_INTERFACE;
	},
	
	canUnload: function(aComMgr){
		return true;
	}
};

function NSGetModule(aComMgr, aFileSpec){
	return #{class_name}Module;
};
EOF

file_name = "#{class_name}.js"

File.open(file_name,"w") do |file|
   file.puts template
end

 生成idl文件:

=begin
NOTICE:
Before use the code:
You should use command "gem install uuid" to install uuid gem for ruby
Once installed, create a uuid.state file by running command "uuid-setup"
=end

require 'uuid'

puts "please input the component interface name:"
component_interface_name = gets.chomp

template = <<EOF
#include "nsISupports.idl"

[scriptable, uuid(#{UUID.new})]
interface #{component_interface_name} : nsISupports{

};
EOF

file_name = "#{component_interface_name}.idl"

File.open(file_name,"w") do |file|
   file.puts template
end

 

分享到:
评论

相关推荐

    创建XPCOM组件Creating XPCOM Components

    这是一本有关Gecko的书,Gecko是所有Mozilla品牌的软件及其衍生产品中使用的开源Web浏览器布局引擎,以及有关为基于Gecko的应用程序创建XPCOM组件的书。

    Creating XPCOM Components.pdf

    - **第4章:教程——创建组件代码** 提供一个实际的例子,指导开发者完成一个简单的XPCOM组件。 #### 第1章:XPCOM简介 ##### XPCOM的概念 XPCOM(Cross Platform Component Object Model)是一种跨平台组件对象...

    XPCOM Wizard:该工具是用于xpcom组件开发的vc2010项目向导。-开源

    该工具是用于xpcom组件开发的vc2010项目向导。 您可以使用此向导创建xpcom组件。 工具的羽毛:1.所有xpcom组件开发环境均已创建(适用于vc2010); 2.支持简单的UI; 3.支持壁虎17/18/19

    xpcom.rar_xpcom

    这些示例可能会展示如何创建一个新的XPCom组件,如何暴露接口给其他组件调用,以及如何处理组件间的通信。 3. **头文件和库**:开发XPCom组件通常需要相关的头文件和库文件。这些文件包含了开发所需的接口定义和...

    xpcom descriptions

    标题“xpcom descriptions”指的是与XPCOM(Cross Platform Component Object Model)相关的描述性文档,这是一个在Mozilla项目中广泛使用的组件系统,允许不同编程语言之间的交互。XPCOM是Firefox、Thunderbird等...

    Bridging XPCOM.Bonobo - implementation.pdf

    Buxom 是一个开源工具,它可以帮助开发者自动化地生成从 XPCOM 到 Bonobo 的静态桥接基础部分。Buxom 通过读取目标组件的 CORBA IDL 文件来生成桥接代码,这极大地简化了手动编写繁琐的适配器代码的过程。 使用 ...

    XPCOM数组作为参数注意的问题

    在IT行业中,尤其是在软件开发领域,跨平台组件对象模型(XPCOM)是Mozilla基金会的开源项目,如Firefox浏览器所使用的底层技术之一。XPCOM允许开发者创建可重用的跨语言、跨平台的组件。当涉及到XPCOM组件间的交互...

    XPCOM实例供linux学习

    XPCOM,全称为“Cross Platform Component Object Model”,是由Mozilla基金会开发的一种跨平台的组件对象模型,主要用于构建可扩展的网络应用程序,特别是Firefox浏览器和其他基于Gecko引擎的应用。这个技术允许...

    用JS创建xpcom实例

    JavaScript是XPCOM的一个重要接口,允许开发者用JS编写组件,与Firefox的内部系统进行深度集成。 在本文中,我们将深入探讨如何使用JavaScript来创建XPCOM实例。首先,理解XPCOM的基础概念至关重要。XPCOM是基于COM...

    gecko-sdk,(用于XPCOM开发)

    Gecko SDK 是一个开发工具包,专门为构建和操作XPCOM组件而设计。 **1. Gecko SDK 的组成部分** - **appcomps**: 这个库包含了应用程序级别的组件,如浏览器或邮件客户端的特定功能。开发者可以利用这些组件来构建...

    creat xpcom componet

    《创造XPCOM组件》是一本面向C++开发者的指南,旨在教授如何为基于Gecko的应用程序创建XPCOM组件。XPCOM(Cross Platform Component Object Model)是Mozilla基金会开发的一种跨平台组件模型,它允许不同语言之间的...

    xul调用c++xpcom例子.rar

    为了开发一个XPCom组件,我们需要在Visual Studio 2005环境下进行配置。安装好VS2005后,创建一个新的C++项目,并包含必要的XPCom库。这些库包括nsIComponentRegistrar、nsISupports等接口,它们提供了注册组件、...

    本人整理的xpcom资料合集

    4. **NSPR支持**:XPCom依赖于NSPR(Netscape Portable Runtime),一个跨平台的低级库,负责线程、内存管理、网络和I/O操作。NSPR为XPCom提供了底层的多线程和异步功能。 5. **JS-XPCOM桥接**:JavaScript可以通过...

    xpcom-test.zip_visual c_xpcom

    `xpcom`是Mozilla开发的一个跨平台组件接口,它允许不同编程语言之间进行交互,并在Firefox等开源浏览器中扮演着重要角色。 描述中提到"xpcom资料太少,一个可完整编译工程",这表明该压缩包可能包含了一个完整的、...

    XPCOM开发笔记(包括嵌入式)

    每个XPCOM组件都需要一个全局唯一的标识符(GUID)。可以通过执行`uuidgen`命令来生成一个随机的GUID。例如: ```sh $ uuidgen ``` 生成的GUID将用于后续步骤中的组件定义。 ##### 3. 编写接口定义文件 使用`*....

    xpcom 托盘 开发

    XULRunner是Mozilla Firefox浏览器的基础,它提供了一个运行时环境,支持使用XML(XUL)语言创建用户界面,并通过XPCom组件实现底层功能。开发者需要使用C++来编写XPCom组件,这个组件会包含创建系统托盘图标、添加...

    xpcom descriptions 2

    XPCom(Cross Platform Component Object Model)是Mozilla基金会开源项目中的一个核心技术,它提供了一种跨平台的组件模型,允许不同编程语言之间进行交互。XPCom使得开发者能够创建可重用的软件组件,这些组件可以...

    Mitschek_Bakkalaureatsarbeit_XPCOM_XUL-final-20100706

    3. **XPCOM服务**:在XPCOM中,服务是一种特殊的组件,它们是单例的,即在应用程序的整个生命周期中只存在一个实例。通过XPCOM服务,开发者可以访问和操纵Mozilla应用中的各种功能,如网络请求、数据库操作等。 4. ...

    xpcom descriptions 3

    XPCom(eXtensible Platform Components)是Mozilla基金会开发的一个组件系统,主要用于跨进程通信和实现组件间的交互。这个“xpcom descriptions 3”可能指的是关于XPCom的第三版详细说明或者教程,特别针对Visual ...

Global site tag (gtag.js) - Google Analytics