|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 const PFS_NS = "http://www.mozilla.org/2004/pfs-rdf#"; |
|
6 |
|
7 function nsRDFItemUpdater(aClientOS, aChromeLocale) { |
|
8 this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"] |
|
9 .getService(Components.interfaces.nsIRDFService); |
|
10 this._os = Components.classes["@mozilla.org/observer-service;1"] |
|
11 .getService(Components.interfaces.nsIObserverService); |
|
12 |
|
13 var app = Components.classes["@mozilla.org/xre/app-info;1"] |
|
14 .getService(Components.interfaces.nsIXULAppInfo); |
|
15 this.appID = app.ID; |
|
16 this.buildID = app.platformBuildID; |
|
17 this.appRelease = app.version; |
|
18 |
|
19 this.clientOS = aClientOS; |
|
20 this.chromeLocale = aChromeLocale; |
|
21 |
|
22 var prefBranch = Components.classes["@mozilla.org/preferences-service;1"] |
|
23 .getService(Components.interfaces.nsIPrefBranch); |
|
24 this.dsURI = prefBranch.getCharPref("pfs.datasource.url"); |
|
25 } |
|
26 |
|
27 nsRDFItemUpdater.prototype = { |
|
28 checkForPlugin: function (aPluginRequestItem) { |
|
29 var dsURI = this.dsURI; |
|
30 // escape the mimetype as mimetypes can contain '+', which will break pfs. |
|
31 dsURI = dsURI.replace(/%PLUGIN_MIMETYPE%/g, encodeURIComponent(aPluginRequestItem.mimetype)); |
|
32 dsURI = dsURI.replace(/%APP_ID%/g, this.appID); |
|
33 dsURI = dsURI.replace(/%APP_VERSION%/g, this.buildID); |
|
34 dsURI = dsURI.replace(/%APP_RELEASE%/g, this.appRelease); |
|
35 dsURI = dsURI.replace(/%CLIENT_OS%/g, this.clientOS); |
|
36 dsURI = dsURI.replace(/%CHROME_LOCALE%/g, this.chromeLocale); |
|
37 |
|
38 var ds = this._rdfService.GetDataSource(dsURI); |
|
39 var rds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource) |
|
40 if (rds.loaded) |
|
41 this.onDatasourceLoaded(ds, aPluginRequestItem); |
|
42 else { |
|
43 var sink = ds.QueryInterface(Components.interfaces.nsIRDFXMLSink); |
|
44 sink.addXMLSinkObserver(new nsPluginXMLRDFDSObserver(this, aPluginRequestItem)); |
|
45 } |
|
46 }, |
|
47 |
|
48 onDatasourceLoaded: function pfs_onDatasourceLoaded (aDatasource, aPluginRequestItem) { |
|
49 var container = Components.classes["@mozilla.org/rdf/container;1"] |
|
50 .createInstance(Components.interfaces.nsIRDFContainer); |
|
51 var resultRes = this._rdfService.GetResource("urn:mozilla:plugin-results:" + aPluginRequestItem.mimetype); |
|
52 var pluginList = aDatasource.GetTarget(resultRes, this._rdfService.GetResource(PFS_NS+"plugins"), true); |
|
53 |
|
54 var pluginInfo = null; |
|
55 |
|
56 try { |
|
57 container.Init(aDatasource, pluginList); |
|
58 |
|
59 var children = container.GetElements(); |
|
60 var target; |
|
61 |
|
62 // get the first item |
|
63 var child = children.getNext(); |
|
64 if (child instanceof Components.interfaces.nsIRDFResource) { |
|
65 var name = this._rdfService.GetResource("http://www.mozilla.org/2004/pfs-rdf#updates"); |
|
66 target = aDatasource.GetTarget(child, name, true); |
|
67 } |
|
68 |
|
69 try { |
|
70 container.Init(aDatasource, target); |
|
71 target = null; |
|
72 children = container.GetElements(); |
|
73 |
|
74 var child = children.getNext(); |
|
75 if (child instanceof Components.interfaces.nsIRDFResource) { |
|
76 target = child; |
|
77 } |
|
78 |
|
79 var rdfs = this._rdfService; |
|
80 |
|
81 function getPFSValueFromRDF(aValue) { |
|
82 var rv = null; |
|
83 |
|
84 var myTarget = aDatasource.GetTarget(target, rdfs.GetResource(PFS_NS + aValue), true); |
|
85 if (myTarget) |
|
86 rv = myTarget.QueryInterface(Components.interfaces.nsIRDFLiteral).Value; |
|
87 |
|
88 return rv; |
|
89 } |
|
90 |
|
91 pluginInfo = { |
|
92 name: getPFSValueFromRDF("name"), |
|
93 pid: getPFSValueFromRDF("guid"), |
|
94 version: getPFSValueFromRDF("version"), |
|
95 IconUrl: getPFSValueFromRDF("IconUrl"), |
|
96 InstallerLocation: getPFSValueFromRDF("InstallerLocation"), |
|
97 InstallerHash: getPFSValueFromRDF("InstallerHash"), |
|
98 XPILocation: getPFSValueFromRDF("XPILocation"), |
|
99 XPIHash: getPFSValueFromRDF("XPIHash"), |
|
100 InstallerShowsUI: getPFSValueFromRDF("InstallerShowsUI"), |
|
101 manualInstallationURL: getPFSValueFromRDF("manualInstallationURL"), |
|
102 requestedMimetype: getPFSValueFromRDF("requestedMimetype"), |
|
103 licenseURL: getPFSValueFromRDF("licenseURL"), |
|
104 needsRestart: getPFSValueFromRDF("needsRestart") |
|
105 }; |
|
106 } |
|
107 catch (ex) { |
|
108 Components.utils.reportError(ex); |
|
109 } |
|
110 } |
|
111 catch (ex) { |
|
112 Components.utils.reportError(ex); |
|
113 } |
|
114 |
|
115 gPluginInstaller.pluginInfoReceived(aPluginRequestItem, pluginInfo); |
|
116 }, |
|
117 |
|
118 onDatasourceError: function pfs_onDatasourceError (aPluginRequestItem, aError) { |
|
119 this._os.notifyObservers(aPluginRequestItem, "error", aError); |
|
120 Components.utils.reportError(aError); |
|
121 gPluginInstaller.pluginInfoReceived(aPluginRequestItem, null); |
|
122 } |
|
123 }; |
|
124 |
|
125 function nsPluginXMLRDFDSObserver(aUpdater, aPluginRequestItem) { |
|
126 this._updater = aUpdater; |
|
127 this._item = aPluginRequestItem; |
|
128 } |
|
129 |
|
130 nsPluginXMLRDFDSObserver.prototype = |
|
131 { |
|
132 _updater : null, |
|
133 _item : null, |
|
134 |
|
135 // nsIRDFXMLSinkObserver |
|
136 onBeginLoad: function(aSink) {}, |
|
137 onInterrupt: function(aSink) {}, |
|
138 onResume: function(aSink) {}, |
|
139 onEndLoad: function(aSink) { |
|
140 aSink.removeXMLSinkObserver(this); |
|
141 |
|
142 var ds = aSink.QueryInterface(Components.interfaces.nsIRDFDataSource); |
|
143 this._updater.onDatasourceLoaded(ds, this._item); |
|
144 }, |
|
145 |
|
146 onError: function(aSink, aStatus, aErrorMsg) { |
|
147 aSink.removeXMLSinkObserver(this); |
|
148 this._updater.onDatasourceError(this._item, aStatus.toString()); |
|
149 } |
|
150 }; |