1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/plugins/content/pluginInstallerDatasource.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,150 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +const PFS_NS = "http://www.mozilla.org/2004/pfs-rdf#"; 1.9 + 1.10 +function nsRDFItemUpdater(aClientOS, aChromeLocale) { 1.11 + this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"] 1.12 + .getService(Components.interfaces.nsIRDFService); 1.13 + this._os = Components.classes["@mozilla.org/observer-service;1"] 1.14 + .getService(Components.interfaces.nsIObserverService); 1.15 + 1.16 + var app = Components.classes["@mozilla.org/xre/app-info;1"] 1.17 + .getService(Components.interfaces.nsIXULAppInfo); 1.18 + this.appID = app.ID; 1.19 + this.buildID = app.platformBuildID; 1.20 + this.appRelease = app.version; 1.21 + 1.22 + this.clientOS = aClientOS; 1.23 + this.chromeLocale = aChromeLocale; 1.24 + 1.25 + var prefBranch = Components.classes["@mozilla.org/preferences-service;1"] 1.26 + .getService(Components.interfaces.nsIPrefBranch); 1.27 + this.dsURI = prefBranch.getCharPref("pfs.datasource.url"); 1.28 +} 1.29 + 1.30 +nsRDFItemUpdater.prototype = { 1.31 + checkForPlugin: function (aPluginRequestItem) { 1.32 + var dsURI = this.dsURI; 1.33 + // escape the mimetype as mimetypes can contain '+', which will break pfs. 1.34 + dsURI = dsURI.replace(/%PLUGIN_MIMETYPE%/g, encodeURIComponent(aPluginRequestItem.mimetype)); 1.35 + dsURI = dsURI.replace(/%APP_ID%/g, this.appID); 1.36 + dsURI = dsURI.replace(/%APP_VERSION%/g, this.buildID); 1.37 + dsURI = dsURI.replace(/%APP_RELEASE%/g, this.appRelease); 1.38 + dsURI = dsURI.replace(/%CLIENT_OS%/g, this.clientOS); 1.39 + dsURI = dsURI.replace(/%CHROME_LOCALE%/g, this.chromeLocale); 1.40 + 1.41 + var ds = this._rdfService.GetDataSource(dsURI); 1.42 + var rds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource) 1.43 + if (rds.loaded) 1.44 + this.onDatasourceLoaded(ds, aPluginRequestItem); 1.45 + else { 1.46 + var sink = ds.QueryInterface(Components.interfaces.nsIRDFXMLSink); 1.47 + sink.addXMLSinkObserver(new nsPluginXMLRDFDSObserver(this, aPluginRequestItem)); 1.48 + } 1.49 + }, 1.50 + 1.51 + onDatasourceLoaded: function pfs_onDatasourceLoaded (aDatasource, aPluginRequestItem) { 1.52 + var container = Components.classes["@mozilla.org/rdf/container;1"] 1.53 + .createInstance(Components.interfaces.nsIRDFContainer); 1.54 + var resultRes = this._rdfService.GetResource("urn:mozilla:plugin-results:" + aPluginRequestItem.mimetype); 1.55 + var pluginList = aDatasource.GetTarget(resultRes, this._rdfService.GetResource(PFS_NS+"plugins"), true); 1.56 + 1.57 + var pluginInfo = null; 1.58 + 1.59 + try { 1.60 + container.Init(aDatasource, pluginList); 1.61 + 1.62 + var children = container.GetElements(); 1.63 + var target; 1.64 + 1.65 + // get the first item 1.66 + var child = children.getNext(); 1.67 + if (child instanceof Components.interfaces.nsIRDFResource) { 1.68 + var name = this._rdfService.GetResource("http://www.mozilla.org/2004/pfs-rdf#updates"); 1.69 + target = aDatasource.GetTarget(child, name, true); 1.70 + } 1.71 + 1.72 + try { 1.73 + container.Init(aDatasource, target); 1.74 + target = null; 1.75 + children = container.GetElements(); 1.76 + 1.77 + var child = children.getNext(); 1.78 + if (child instanceof Components.interfaces.nsIRDFResource) { 1.79 + target = child; 1.80 + } 1.81 + 1.82 + var rdfs = this._rdfService; 1.83 + 1.84 + function getPFSValueFromRDF(aValue) { 1.85 + var rv = null; 1.86 + 1.87 + var myTarget = aDatasource.GetTarget(target, rdfs.GetResource(PFS_NS + aValue), true); 1.88 + if (myTarget) 1.89 + rv = myTarget.QueryInterface(Components.interfaces.nsIRDFLiteral).Value; 1.90 + 1.91 + return rv; 1.92 + } 1.93 + 1.94 + pluginInfo = { 1.95 + name: getPFSValueFromRDF("name"), 1.96 + pid: getPFSValueFromRDF("guid"), 1.97 + version: getPFSValueFromRDF("version"), 1.98 + IconUrl: getPFSValueFromRDF("IconUrl"), 1.99 + InstallerLocation: getPFSValueFromRDF("InstallerLocation"), 1.100 + InstallerHash: getPFSValueFromRDF("InstallerHash"), 1.101 + XPILocation: getPFSValueFromRDF("XPILocation"), 1.102 + XPIHash: getPFSValueFromRDF("XPIHash"), 1.103 + InstallerShowsUI: getPFSValueFromRDF("InstallerShowsUI"), 1.104 + manualInstallationURL: getPFSValueFromRDF("manualInstallationURL"), 1.105 + requestedMimetype: getPFSValueFromRDF("requestedMimetype"), 1.106 + licenseURL: getPFSValueFromRDF("licenseURL"), 1.107 + needsRestart: getPFSValueFromRDF("needsRestart") 1.108 + }; 1.109 + } 1.110 + catch (ex) { 1.111 + Components.utils.reportError(ex); 1.112 + } 1.113 + } 1.114 + catch (ex) { 1.115 + Components.utils.reportError(ex); 1.116 + } 1.117 + 1.118 + gPluginInstaller.pluginInfoReceived(aPluginRequestItem, pluginInfo); 1.119 + }, 1.120 + 1.121 + onDatasourceError: function pfs_onDatasourceError (aPluginRequestItem, aError) { 1.122 + this._os.notifyObservers(aPluginRequestItem, "error", aError); 1.123 + Components.utils.reportError(aError); 1.124 + gPluginInstaller.pluginInfoReceived(aPluginRequestItem, null); 1.125 + } 1.126 +}; 1.127 + 1.128 +function nsPluginXMLRDFDSObserver(aUpdater, aPluginRequestItem) { 1.129 + this._updater = aUpdater; 1.130 + this._item = aPluginRequestItem; 1.131 +} 1.132 + 1.133 +nsPluginXMLRDFDSObserver.prototype = 1.134 +{ 1.135 + _updater : null, 1.136 + _item : null, 1.137 + 1.138 + // nsIRDFXMLSinkObserver 1.139 + onBeginLoad: function(aSink) {}, 1.140 + onInterrupt: function(aSink) {}, 1.141 + onResume: function(aSink) {}, 1.142 + onEndLoad: function(aSink) { 1.143 + aSink.removeXMLSinkObserver(this); 1.144 + 1.145 + var ds = aSink.QueryInterface(Components.interfaces.nsIRDFDataSource); 1.146 + this._updater.onDatasourceLoaded(ds, this._item); 1.147 + }, 1.148 + 1.149 + onError: function(aSink, aStatus, aErrorMsg) { 1.150 + aSink.removeXMLSinkObserver(this); 1.151 + this._updater.onDatasourceError(this._item, aStatus.toString()); 1.152 + } 1.153 +};