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); +};