写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
自我的JavaEye博客