[Bbs2ch-cvs 264] [246] b2rGlobalService

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2007年 11月 3日 (土) 21:53:58 JST


Revision: 246
          http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=bbs2ch&view=rev&rev=246
Author:   flyson
Date:     2007-11-03 21:53:58 +0900 (Sat, 03 Nov 2007)

Log Message:
-----------
b2rGlobalService

Added Paths:
-----------
    trunk/bbs2chreader/components/b2rGlobalService.js
    trunk/bbs2chreader/components/b2rIGlobalService.xpt
    trunk/bbs2chreader/components/idl/b2rIGlobalService.idl


-------------- next part --------------
Added: trunk/bbs2chreader/components/b2rGlobalService.js
===================================================================
--- trunk/bbs2chreader/components/b2rGlobalService.js	2007-11-02 12:47:24 UTC (rev 245)
+++ trunk/bbs2chreader/components/b2rGlobalService.js	2007-11-03 12:53:58 UTC (rev 246)
@@ -0,0 +1,649 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is bbs2chreader.
+ *
+ * The Initial Developer of the Original Code is
+ * flyson.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *    flyson <flyso****@users*****>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const XPC = {
+	createInstance: function(aContractId, aInterface){
+		return Components.classes[aContractId].createInstance(Components.interfaces[aInterface]);
+	},
+	getService: function(aContractId, aInterface){
+	    return Components.classes[aContractId].getService(Components.interfaces[aInterface]);
+	}
+}
+
+
+
+
+const B2R_GLOBAL_SERVICE_CONTRACTID = "@bbs2ch.sourceforge.jp/b2r-global-service;1";
+const B2R_GLOBAL_SERVICE_CID = Components.ID("{e3c8ad09-ff53-40cf-9942-26c8d7a96fe7}");
+const B2R_GLOBAL_SERVICE_CNAME = "b2rGlobalService js component";
+
+
+
+
+	// ********** ********* b2rGlobalIO ********** **********
+
+function b2rGlobalIO(){
+}
+
+b2rGlobalIO.prototype = {
+
+	getDataDir: function(){
+		const DATA_DIR_NAME = "bbs2chreader";
+
+		if(!this._dataDir){
+			var pref = XPC.getService("@mozilla.org/preferences-service;1", "nsIPrefBranch");
+
+				// ログファイルの位置を指定
+			if(pref.getBoolPref("extensions.bbs2chreader.appoint_data_dir")){
+				try{
+					var dataDirPath = pref.getComplexValue("extensions.bbs2chreader.data_dir",
+												Ci.nsISupportsString).data;
+					this._dataDir = XPC.createInstance("@mozilla.org/file/local;1", "nsILocalFile");
+					this._dataDir.initWithPath(dataDirPath);
+					if(this._dataDir.leafName != DATA_DIR_NAME){
+						this._dataDir.appendRelativePath(DATA_DIR_NAME);
+					}
+				}catch(ex){
+					dump("b2rGlobalIO.getDataDir() :" + ex +"\n");
+					this._dataDir = null;
+				}
+			}
+			if(!this._dataDir){
+					// 指定していないときはプロファイルディレクトリ
+				var dirService = XPC.getService("@mozilla.org/file/directory_service;1", "nsIProperties");
+				this._dataDir = dirService.get("ProfD", Ci.nsILocalFile);
+				this._dataDir.appendRelativePath(DATA_DIR_NAME);
+			}
+		}
+
+		var dataDir = this._dataDir.clone().QueryInterface(Ci.nsILocalFile);
+		if(!dataDir.exists()){
+			dataDir.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, 0666);
+		}
+		return dataDir;
+	},
+
+
+	getLogFileAtURL: function(aURLSpec){
+		const LOGS_DIR_NAME = "logs";
+
+		var ioService = XPC.getService("@mozilla.org/network/io-service;1", "nsIIOService");
+		var fromURL = ioService.newURI(aURLSpec, null, null).QueryInterface(Ci.nsIURL);
+
+		var logFile = this.getDataDir();
+		logFile.appendRelativePath(LOGS_DIR_NAME);
+		logFile.appendRelativePath(fromURL.host);
+
+		var pathArray = fromURL.path.split("/");
+		for(let [i, name] in Iterator(pathArray)){
+			if(name) logFile.appendRelativePath(name);
+		}
+
+		return logFile;
+	},
+
+
+	getFileInputStream: function(aLocalFile, aCharset){
+		const PR_RDONLY = 0x01;
+		var charset = aCharset || "UTF-8";
+
+		var fileInputStream = XPC.createInstance(
+				"@mozilla.org/network/file-input-stream;1", "nsIFileInputStream");
+		var converterInputStream = XPC.createInstance(
+				"@mozilla.org/intl/converter-input-stream;1", "nsIConverterInputStream");
+
+		try{
+			fileInputStream.init(aLocaFile, PR_RDONLY, 0666, Ci.nsIFileInputStream.CLOSE_ON_EOF);
+			converterInputStream.init(fileInputStream, charset, 1024*8,
+					Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
+		}catch(ex){
+			throw ex;
+		}
+		return converterInputStream;
+	},
+
+
+	getFileOutputStream: function(aLocalFile, aCharset, aAppend){
+		const PR_WRONLY = 0x02;
+		const PR_CREATE_FILE = 0x08;
+		const PR_APPEND = 0x10;
+		const PR_TRUNCATE = 0x20;
+
+		var charset = aCharset || "UTF-8";
+		var ioFlags = (aAppend==true) ? PR_WRONLY|PR_CREATE_FILE|PR_APPEND : PR_WRONLY|PR_CREATE_FILE|PR_TRUNCATE;
+
+		var fileOutputStream = XPC.createInstance(
+				"@mozilla.org/network/file-output-stream;1", "nsIFileOutputStream");
+		var converterOutputStream = XPC.createInstance(
+				"@mozilla.org/intl/converter-output-stream;1", "nsIConverterOutputStream");
+
+		try{
+			fileOutputStream.init(aLocaFile, ioFlags, 0666, 0);
+			converterOutputStream.init(fileOutputStream, charset, 1024*8,
+					Ci.nsIConverterOutputStream.DEFAULT_REPLACEMENT_CHARACTER);
+		}catch(ex){
+			throw ex;
+		}
+
+
+		return converterOutputStream;
+	}
+
+
+};
+
+
+
+
+	// ********** ********* b2rGlobalThreadUtils ********** **********
+
+function b2rGlobalThreadUtils(){
+		// getBoardType で利用する例外的な URL のリスト( 2ch だけど板じゃない URL)
+	this._exHosts = new Array(
+		"find.2ch.net",
+		"info.2ch.net",
+		"epg.2ch.net",
+		"headline.2ch.net",
+		"newsnavi.2ch.net",
+		"headline.bbspink.com"
+	);
+
+}
+
+b2rGlobalThreadUtils.prototype = {
+
+	getBoardType: function(aThreadURL){
+			// HTTP 以外
+		if(aThreadURL.scheme != "http") return Ci.b2rIGlobalService.BOARD_TYPE_PAGE;
+			// HOST だけの URL
+		if(aThreadURL.directory.length == 1) return Ci.b2rIGlobalService.BOARD_TYPE_PAGE;
+
+		if(this._exHosts.indexOf(aThreadURL.host) != -1) return Ci.b2rIGlobalService.BOARD_TYPE_PAGE;
+
+			// Be****@2ch*****
+		if(aThreadURL.host == "be.2ch.net") return Ci.b2rIGlobalService.BOARD_TYPE_BE2CH;
+			// 2ch.net
+		if(aThreadURL.host.indexOf(".2ch.net") != -1) return Ci.b2rIGlobalService.BOARD_TYPE_2CH;
+			// bbspink.com
+		if(aThreadURL.host.indexOf(".bbspink.com") != -1) return Ci.b2rIGlobalService.BOARD_TYPE_2CH;
+			// まちBBS
+		if(aThreadURL.host.indexOf(".machi.to") != -1) return Ci.b2rIGlobalService.BOARD_TYPE_2CH;
+			// JBBS
+		if(aThreadURL.host == "jbbs.livedoor.jp") return Ci.b2rIGlobalService.BOARD_TYPE_JBBS;
+
+			// スレッド URL
+		if(aThreadURL.directory.indexOf("/test/read.cgi/") != -1) return Ci.b2rIGlobalService.BOARD_TYPE_2CH;
+		if((aThreadURL.fileName == "read.cgi") && (aThreadURL.query.indexOf("key=") != -1))
+				return Ci.b2rIGlobalService.BOARD_TYPE_OLD2CH;
+
+		return Ci.b2rIGlobalService.BOARD_TYPE_PAGE;
+	},
+
+
+	getBoardURL: function(aURL){
+		var boardURLSpec = aURL.resolve("../");
+
+		switch(this.getBoardType(aURL)){
+			case Ci.b2rIGlobalService.BOARD_TYPE_2CH:
+			case Ci.b2rIGlobalService.BOARD_TYPE_BE2CH:
+				boardURLSpec = boardURLSpec.replace("/test/read.cgi/", "/");
+				break;
+			case Ci.b2rIGlobalService.BOARD_TYPE_JBBS:
+				boardURLSpec = boardURLSpec.replace("/bbs/read.cgi/", "/");
+				break;
+			case Ci.b2rIGlobalService.BOARD_TYPE_OLD2CH:
+			case Ci.b2rIGlobalService.BOARD_TYPE_MACHI:
+				boardURLSpec += aURL.query.match(/bbs=(\w+)/i) ? RegExp.$1 + "/" : null;
+				break;
+			case Ci.b2rIGlobalService.BOARD_TYPE_PAGE:
+				throw Components.results.NS_ERROR_INVALID_ARG;
+				break;
+		}
+
+		var ioService = XPC.getService("@mozilla.org/network/io-service;1", "nsIIOService");
+		return ioService.newURI(boardURLSpec, null, null).QueryInterface(Ci.nsIURL);
+	}
+
+};
+
+
+	// ********** ********* b2rGlobalHistory ********** **********
+
+function b2rGlobalHistory(aGlobalService){
+	this._init(aGlobalService);
+}
+
+b2rGlobalHistory.prototype = {
+
+	get historyDB(){
+		throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+	},
+
+
+	_init: function(aGlobalService){
+	},
+
+
+	visitPage: function(aBoardURL, aTitle, aType){
+	},
+
+
+	clearAll: function(){
+		throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+	}
+
+};
+
+
+
+
+	// ********** ********* b2rGlobalViewer ********** **********
+
+function b2rGlobalViewer(aGlobalService){
+	this._init(aGlobalService);
+}
+
+b2rGlobalViewer.prototype = {
+
+	get logined(){
+		throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+	},
+
+
+	get sessionID(){
+		throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+	},
+
+
+	_init: function(aGlobalService){
+	},
+
+
+	auth: function(){
+		throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+	}
+
+};
+
+
+
+
+	// ********** ********* b2rGlobalService ********** **********
+
+function b2rGlobalService(){
+	this._io = null;
+	this._threadUtils = null;
+	this._history = null;
+	this._viewer = null;
+
+	this._initialized = false;
+}
+
+b2rGlobalService.prototype = {
+
+	BOARD_TYPE_2CH:    Ci.b2rIGlobalService.BOARD_TYPE_2CH,
+	BOARD_TYPE_OLD2CH: Ci.b2rIGlobalService.BOARD_TYPE_OLD2CH,
+	BOARD_TYPE_BE2CH:  Ci.b2rIGlobalService.BOARD_TYPE_BE2CH,
+	BOARD_TYPE_JBBS:   Ci.b2rIGlobalService.BOARD_TYPE_JBBS,
+	BOARD_TYPE_MACHI:  Ci.b2rIGlobalService.BOARD_TYPE_MACHI,
+	BOARD_TYPE_PAGE:   Ci.b2rIGlobalService.BOARD_TYPE_PAGE,
+
+	get userAgent(){
+		if(!this._initialized) throw Components.results.NS_ERROR_NOT_INITIALIZED;
+		if(!this._userAgent){
+			try{
+				var extensionManager = XPC.getService("@mozilla.org/extensions/manager;1", "nsIExtensionManager");
+				var appInfo = XPC.getService("@mozilla.org/xre/app-info;1", "nsIXULAppInfo");
+				var bbs2chID = "{0B9D558E-6983-486b-9AAD-B6CBCD2FC807}";
+				var item = extensionManager.getItemForID(bbs2chID);
+				this._userAgent = new Array(
+							"Monazilla/1.00 (", item.name, "/", item.version, "; ",
+							appInfo.name, "/", appInfo.version, ")").join("");
+			}catch(ex){
+				this._userAgent = "Monazilla/1.00 (bbs2chreader/0.5.0)"
+			}
+		}
+
+		return this._userAgent;
+	},
+
+
+	get serverURL(){
+		if(!this._initialized) throw Components.results.NS_ERROR_NOT_INITIALIZED;
+		if(!this._serverURL){
+			var pref = XPC.getService("@mozilla.org/preferences-service;1", "nsIPrefBranch");
+			var port = 0;
+			try{
+				var appInfo = XPC.createInstance("@mozilla.org/xre/app-info;1", "nsIXULAppInfo");
+	    	    if(appInfo.name == "Firefox"){
+					port = pref.getIntPref("extensions.bbs2chreader.server_port");
+				}else if(appInfo.name == "SeaMonkey"){
+					port = pref.getIntPref("extensions.bbs2chreader.server_port.seamonkey");
+				}else{
+					port = pref.getIntPref("extensions.bbs2chreader.server_port.other");
+				}
+			}catch(ex){
+				port = pref.getIntPref("extensions.bbs2chreader.server_port.other");
+			}
+
+			var spec = "http://127.0.0.1:" + port;
+			var ioService = XPC.getService("@mozilla.org/network/io-service;1", "nsIIOService");
+			this._serverURL = ioService.newURI(spec, null, null).QueryInterface(Ci.nsIURL);
+		}
+		return this._serverURL.clone();
+	},
+
+
+	get io(){
+		if(!this._initialized) throw Components.results.NS_ERROR_NOT_INITIALIZED;
+		return this._io;
+	},
+	get threadUtils(){
+		if(!this._initialized) throw Components.results.NS_ERROR_NOT_INITIALIZED;
+		return this._threadUtils;
+	},
+	get history(){
+		if(!this._initialized) throw Components.results.NS_ERROR_NOT_INITIALIZED;
+		return this._history;
+	},
+	get viewer(){
+		if(!this._initialized) throw Components.results.NS_ERROR_NOT_INITIALIZED;
+		return this._viewer;
+	},
+
+
+	getHttpChannel: function(aURL){
+		if(!this._initialized) throw Components.results.NS_ERROR_NOT_INITIALIZED;
+		var httpChannel;
+		var pref = XPC.getService("@mozilla.org/preferences-service;1", "nsIPrefBranch");
+		var ioService = XPC.getService("@mozilla.org/network/io-service;1", "nsIIOService");
+
+			// 0=ブラウザの設定に従う  1=直接接続する  2=独自に設定する
+		var proxyMode = pref.getIntPref("extensions.bbs2chreader.http_proxy_mode");
+		if(proxyMode != 0){
+			var httpPHandler = ioService.getProtocolHandler("http").QueryInterface(Ci.nsIHttpProtocolHandler);
+			var pps = XPC.getService("@mozilla.org/network/protocol-proxy-service;1", "nsIProtocolProxyService");
+
+			if(proxyMode == 1){
+				var proxyInfo = pps.newProxyInfo("direct", "", -1, 0, 0, null);
+				httpChannel = httpPHandler.newProxiedChannel(aURL, proxyInfo).QueryInterface(Ci.nsIHttpChannel);
+			}else if(proxyMode == 2){
+				var httpProxyValue = pref.getComplexValue("extensions.bbs2chreader.http_proxy_value",
+							Ci.nsISupportsString).data;
+				httpProxyValue = httpProxyValue.replace(/\s/g, "");
+				if(httpProxyValue.match(/([^:]+):(\d+)/)){
+					var host = RegExp.$1;
+					var port = parseInt(RegExp.$2);
+					try{
+						var proxyInfoDirect = pps.newProxyInfo("direct", "", -1, 0, 0, null);
+						var proxyInfo = pps.newProxyInfo("http", host, port, 0, 10, proxyInfoDirect);
+						httpChannel = httpPHandler.newProxiedChannel(aURL, proxyInfo)
+							.QueryInterface(Ci.nsIHttpChannel);
+					}catch(ex){
+						dump("b2rGlobalIO.getHttpChannel() : " + ex +"\n");
+					}
+				}
+			}
+		}
+
+		if(!httpChannel){
+			httpChannel = ioService.newChannelFromURI(aURL).QueryInterface(Ci.nsIHttpChannel);
+		}
+
+		httpChannel.setRequestHeader("User-Agent", this.userAgent, false);
+		httpChannel.notificationCallbacks = {
+		    getInterface: function(aIID, aInstance) {
+	    	    Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
+	        	return null;
+		    }
+		};
+		return httpChannel;
+	},
+
+	openURL: function(aURLSpec, aReferrer, aAddTab){
+		var pref = XPC.getService("@mozilla.org/preferences-service;1", "nsIPrefBranch");
+		var windowMediator = XPC.getService("@mozilla.org/appshell/window-mediator;1", "nsIWindowMediator");
+		var browserWindow = windowMediator.getMostRecentWindow("navigator:browser");
+		if(browserWindow){
+			var contentBrowser = browserWindow.document.getElementById("content");
+			if(aAddTab){
+				var newTab = contentBrowser.addTab(aURLSpec, aReferrer);
+				if(pref.getBoolPref("extensions.bbs2chreader.tab_load_in_foreground"))
+					contentBrowser.selectedTab = newTab;
+			}else{
+				contentBrowser.loadURI(aURLSpec, aReferrer);
+			}
+			return;
+		}
+
+		// Firefox/Seamonkey 以外のブラウザでの処理はここに書く
+
+		this.openNewWindow(aURLSpec);
+	},
+
+
+	openNewWindow: function(aURLSpec){
+		var argString = XPC.createInstance("@mozilla.org/supports-string;1", "nsISupportsString");
+		argString.data = aURLSpec || "about:blank";
+
+		var pref = XPC.getService("@mozilla.org/preferences-service;1", "nsIPrefBranch");
+		var browserURL = pref.getCharPref("browser.chromeURL");
+		var winWatcher = XPC.getService("@mozilla.org/embedcomp/window-watcher;1", "nsIWindowWatcher");
+		winWatcher.openWindow(null, browserURL, "_blank", "chrome,all,dialog=no", argString);
+	},
+
+
+	_startup: function(){
+		this._io = new b2rGlobalIO();
+		this._threadUtils = new b2rGlobalThreadUtils();
+		this._history = new b2rGlobalHistory(this);
+		this._viewer = new b2rGlobalViewer(this);
+
+		this._initialized = true;
+		dump("b2rGlobalService._startup()\n");
+	},
+
+
+	_shutdown: function(){
+		this._io = null;
+		this._threadUtils = null;
+		this._history = null;
+		this._viewer = null;
+
+		this._initialized = false;
+		dump("b2rGlobalService._shutdown()\n");
+	},
+
+
+	// ********** ********* implements nsIObserver ********** **********
+
+	observe: function(aSubject, aTopic, aData){
+		var observerService = XPC.getService("@mozilla.org/observer-service;1", "nsIObserverService");
+
+		switch(aTopic){
+			case "app-startup":
+				observerService.addObserver(this, "profile-do-change", false);
+				observerService.addObserver(this, "xpcom-shutdown", false);
+				break;
+			case "profile-do-change":
+				this._startup();
+				observerService.removeObserver(this, "profile-do-change");
+				break;
+			case "xpcom-shutdown":
+				this._shutdown();
+				observerService.removeObserver(this, "xpcom-shutdown");
+				break;
+		}
+	},
+
+
+	// ********** ********* implements nsIClassInfo ********** **********
+
+	get classDescription() {
+		return B2R_GLOBAL_SERVICE_CNAME;
+	},
+
+
+	get classID() {
+		return B2R_GLOBAL_SERVICE_CID;
+	},
+
+
+	get implementationLanguage() {
+		return Ci.nsIProgrammingLanguage.JAVASCRIPT;
+	},
+
+
+	get flags() {
+		return Ci.nsIClassInfo.SINGLETON;
+	},
+
+
+	get contractID() {
+    	return B2R_GLOBAL_SERVICE_CONTRACTID;
+	},
+
+
+	getInterfaces: function(aCount) {
+	    var interfaces = [
+			Ci.b2rIGlobalService,
+			Ci.nsIClassInfo,
+			Ci.nsIObserver,
+			Ci.nsISupports
+		];
+	    aCount.value = interfaces.length;
+    	return interfaces;
+	},
+
+
+ 	getHelperForLanguage: function(aLanguage) {
+    	return null;
+	},
+
+
+	// ********** ********* implements nsISupports ********** **********
+
+	QueryInterface: function(aIID){
+		if(aIID.equals(Ci.b2rIGlobalService)) return this;
+		if(aIID.equals(Ci.nsIClassInfo)) return this;
+		if(aIID.equals(Ci.nsIObserver)) return this;
+		if(aIID.equals(Ci.nsISupports)) return this;
+	}
+
+};
+
+
+
+
+// ********** ********* Component Registration ********** **********
+
+
+var b2rGlobalServiceFactory = {
+
+	createInstance: function (aOuter, aIID){
+		if(aOuter != null)
+			throw Components.results.NS_ERROR_NO_AGGREGATION;
+
+		if(aIID.equals(Ci.b2rIGlobalService))
+			return this.getInstance(aIID);
+		if(aIID.equals(Ci.nsIClassInfo))
+			return this.getInstance(aIID);
+		if(aIID.equals(Ci.nsIObserver))
+			return this.getInstance(aIID);
+		if(aIID.equals(Ci.nsISupports))
+			return this.getInstance(aIID);
+	},
+
+
+	getInstance: function(aIID){
+		if(!this._instance){
+			this._instance = new b2rGlobalService();
+		}
+		return this._instance.QueryInterface(aIID);
+	}
+
+};
+
+
+var Module = {
+
+	registerSelf: function(aCompMgr, aFileSpec, aLocation, aType){
+		aCompMgr = aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
+
+		aCompMgr.registerFactoryLocation(
+						B2R_GLOBAL_SERVICE_CID,
+						B2R_GLOBAL_SERVICE_CNAME,
+						B2R_GLOBAL_SERVICE_CONTRACTID,
+						aFileSpec, aLocation, aType);
+
+		var categoryManager = XPC.getService("@mozilla.org/categorymanager;1", "nsICategoryManager");
+		categoryManager.addCategoryEntry("app-startup", B2R_GLOBAL_SERVICE_CNAME,
+											B2R_GLOBAL_SERVICE_CONTRACTID, true, true);
+	},
+
+
+	unregisterSelf: function(aCompMgr, aFileSpec, aLocation){
+		aCompMgr = aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
+		aCompMgr.unregisterFactoryLocation(B2R_GLOBAL_SERVICE_CID, aFileSpec);
+
+		var categoryManager = XPC.getService("@mozilla.org/categorymanager;1", "nsICategoryManager");
+		categoryManager.deleteCategoryEntry("app-startup", B2R_GLOBAL_SERVICE_CONTRACTID, true);
+	},
+
+
+	getClassObject: function(aCompMgr, aCID, aIID){
+		if(aCID.equals(B2R_GLOBAL_SERVICE_CID)) return b2rGlobalServiceFactory;
+
+		if(!aIID.equals(Ci.nsIFactory))
+			throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+
+		throw Components.results.NS_ERROR_NO_INTERFACE;
+	},
+
+
+	canUnload: function(aCompMgr){
+		return true;
+	}
+
+};
+
+
+function NSGetModule(aCompMgr, aFileSpec){
+	return Module;
+}
\ No newline at end of file

Added: trunk/bbs2chreader/components/b2rIGlobalService.xpt
===================================================================
(Binary files differ)


Property changes on: trunk/bbs2chreader/components/b2rIGlobalService.xpt
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/bbs2chreader/components/idl/b2rIGlobalService.idl
===================================================================
--- trunk/bbs2chreader/components/idl/b2rIGlobalService.idl	2007-11-02 12:47:24 UTC (rev 245)
+++ trunk/bbs2chreader/components/idl/b2rIGlobalService.idl	2007-11-03 12:53:58 UTC (rev 246)
@@ -0,0 +1,177 @@
+#include "nsISupports.idl"
+
+interface nsILocalFile;
+interface nsIConverterInputStream;
+interface nsIConverterOutputStream;
+interface nsIURL;
+interface nsIHttpChannel;
+interface mozIStorageConnection;
+
+
+[scriptable, uuid(fe8fed8e-6449-4b68-8899-026f806be131)]
+interface b2rIGlobalIO : nsISupports
+{
+
+	/**
+	 * データ保存ディレクトリを nsILocalFile で返す
+	 * @return データ保存ディレクトリ
+	 */
+	nsILocalFile getDataDir();
+
+	/**
+	 * ログ保存ディレクトリ以下に URL のパスを追加して nsILocalFile を返す
+	 * 		(e.g. http://www.example.com/hoge/hage.txt なら 
+	 * 		  ログ保存ディレクトリ\www.example.com\hoge\hage.txt)
+	 * @param aURLSpec ファイルの URL
+	 * @return ログファイル
+	 */
+	nsILocalFile getLogFileAtURL(in AUTF8String aURLSpec);
+
+	/**
+	 * 初期化された nsIConverterInputStream を返す
+	 * @param aLocalFile 読み込むファイルの nsILocalFile
+	 * @param aCharset 読み込むファイルの文字コード
+	 * @return 初期化された nsIConverterInputStream
+	 */
+	nsIConverterInputStream getFileInputStream(in nsILocalFile aLocalFile, in string aCharset);
+
+	/**
+	 * 初期化された nsIConverterOutputStream を返す
+	 * @param aLocalFile 書き込むファイルの nsILocalFile
+	 * @param aCharset 書き込むファイルの文字コード
+	 * @return 初期化された nsIConverterOutputStream
+	 */
+	nsIConverterOutputStream getFileOutputStream(in nsILocalFile aLocalFile, in string aCharset);
+
+};
+
+
+[scriptable, uuid(D2048C64-C76C-46b5-B67F-9640B6BEE09B)]
+interface b2rIGlobalThreadUtils : nsISupports
+{
+
+	/**
+	 * URL から板のタイプを返す
+	 * @param aURL スレッド、又は板の URL
+	 * @return (b2rIGlobalService.BOARD_TYPE_XXX)
+	 */	
+	unsigned long getBoardType(in nsIURL aURL);
+
+	/**
+	 * スレッド URL から板の URL を返す
+	 * @param aThreadURL スレッド URL
+	 * @return 板の nsIURL
+	 */
+	nsIURL getBoardURL(in nsIURL aThreadURL);
+
+};
+
+
+[scriptable, uuid(2E375B4F-8963-41f4-99ED-27251CE96068)]
+interface b2rIGlobalHistory : nsISupports
+{
+
+	/**
+	 * 履歴データベース
+	 */
+	readonly attribute mozIStorageConnection database;
+
+	boolean visitPage(in nsIURL aBoardURL, in AString aTitle, in unsigned long aType);
+
+	void clearAll();
+
+};
+
+
+[scriptable, uuid(E52E3BFC-BFDF-49bd-B524-BBA9D945146D)]
+interface b2rIGlobal2chViewer : nsISupports
+{
+	/**
+	 * 2ch ビューアにログインしているか
+	 */
+	readonly attribute boolean logined;
+
+	/**
+	 * 2ch ビューアのセッションID
+	 */
+	readonly attribute string sessionID;
+
+	/**
+	 * 2ch ビューア認証を行う
+	 */
+	void auth();
+
+};
+
+
+[scriptable, uuid(b7823d3f-eb1c-44a2-b178-b3a8f64fa371)]
+interface b2rIGlobalService : nsISupports
+{
+
+	/**
+	 * 2ch 型 BBS
+	 */
+	const unsigned long BOARD_TYPE_2CH = 0;
+
+	/**
+	 * 旧 2ch 型 BBS
+	 */
+	const unsigned long BOARD_TYPE_OLD2CH = 1;
+
+	/**
+	 * Be @ 2ch BBS
+	 */
+	const unsigned long BOARD_TYPE_BE2CH = 2;
+
+	/**
+	 * したらば JBBS
+	 */
+	const unsigned long BOARD_TYPE_JBBS = 3;
+
+	/**
+	 * まちBBS
+	 */
+	const unsigned long BOARD_TYPE_MACHI = 4;
+
+	/**
+	 * 通常ページ
+	 */
+	const unsigned long BOARD_TYPE_PAGE = 5;
+
+	/**
+	 * 2ch サーバに接続する際のユーザエージェント
+	 */
+	readonly attribute string userAgent;
+
+	/**
+	 * b2rServer の URL
+	 */
+	readonly attribute nsIURL serverURL;
+
+	readonly attribute b2rIGlobalIO io;
+	readonly attribute b2rIGlobalThreadUtils threadUtils;
+	readonly attribute b2rIGlobalHistory history;
+	readonly attribute b2rIGlobal2chViewer viewer;
+
+	/**
+	 * プロクシや UserAgent などの設定を施した nsIHttpChannel を返す
+	 * @param aURL nsIHttpChannel を作成する URL 
+	 */
+	nsIHttpChannel getHttpChannel(in nsIURL aURL);
+
+	/**
+	 * ブラウザで指定した URI を開く
+	 * ブラウザウィンドウが無いときは新規ウィンドウで開く
+	 * @param aURLSpec 開くページの URI
+	 * @param aReferrer リファラ 送りたくないときは null
+	 * @param aAddTab タブで開くかどうか
+	 */
+	void openURL(in AUTF8String aURLSpec, in AUTF8String aReferrer, in boolean aAddTab);
+
+	/**
+	 * 新しいブラウザウィンドウで指定した URI を開く
+	 * aURISpec を指定しなかったときは about:blank
+	 * @param aURLSpec 新しいウィンドウで開くページの URI
+	 */
+	void openNewWindow(in AUTF8String aURLSpec);
+};


bbs2ch-cvs メーリングリストの案内
Back to archive index