d10fa53b690771930ba4e4ffe48518bab0afd7ba
[pompage.git] / xpi / components / handleProtocol.js
1 // voir : http://www.nexgenmedia.net/docs/protocol/
2
3 // le composant pour cette extension
4 const DIVXPROT_HANDLER_CONTRACTID = "@mozilla.org/network/protocol;1?name=divx";
5 const DIVXPROT_HANDLER_CID = Components.ID("{65aa548e-1dda-11dc-8314-0800200c9a66}");
6
7 // les composants utilisés
8 const URI_CONTRACTID = "@mozilla.org/network/simple-uri;1";
9 const kIOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
10
11 // les interfaces utilisées
12 const nsIProtocolHandler = Components.interfaces.nsIProtocolHandler;
13 const nsIURI = Components.interfaces.nsIURI;
14 const nsISupports = Components.interfaces.nsISupports;
15 const nsIIOService = Components.interfaces.nsIIOService;
16
17
18 /******* COPIER-COLLER de pref.js dans /chrome/content *******/
19 /******* TODO : trouver un moyen d'inclure pref.js *******/
20 function divxlistGetPreferencesService()
21 {
22 return Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
23 }
24 function divxlistGetRoot()
25 {
26 return divxlistGetPreferencesService().getCharPref("divxlist.root");
27 }
28 function divxlistSetRoot(root)
29 {
30 return divxlistGetPreferencesService().setCharPref("divxlist.root", root);
31 }
32 function divxlistGetCommandes()
33 {
34 var commandes = divxlistGetPreferencesService().getCharPref("divxlist.commandes");
35 var regex = /'[^']*'/g
36 var res = commandes.match(regex);
37 var commandesTab = new Array()
38 if (res != null)
39 for(var i = 0; i < res.length; i += 2)
40 {
41 var motifCommande = new Array(2);
42 motifCommande[0] = res[i].slice(1, res[i].length-1)
43 motifCommande[1] = res[i+1].slice(1, res[i+1].length-1)
44 commandesTab.push(motifCommande);
45 }
46 return commandesTab;
47 }
48 function divxlistSetCommandes(commandes)
49 {
50 var commandesStr = "{"
51 for (var i = 0; i < commandes.length; i++)
52 {
53 if (i != 0) commandesStr += ", "
54 commandesStr += "'" + commandes[i][0] + "' => "
55 commandesStr += "'" + commandes[i][1] + "'"
56 }
57 commandesStr += "}"
58
59 return divxlistGetPreferencesService().setCharPref("divxlist.commandes", commandesStr);
60 }
61
62 /**
63 * Classe ProtocolHandler.
64 */
65 function DivxProtocolHandler(scheme)
66 {
67 this.scheme = scheme;
68 }
69
70 // attributs par défaut
71 DivxProtocolHandler.prototype.defaultPort = -1;
72 DivxProtocolHandler.prototype.protocolFlags = nsIProtocolHandler.URI_NORELATIVE;
73
74 /**
75 * est-ce qu'un port est autorisé
76 */
77 DivxProtocolHandler.prototype.allowPort = function(aPort, aScheme)
78 {
79 return false;
80 }
81
82 /**
83 * Renvoie le nouvel URI.
84 */
85 DivxProtocolHandler.prototype.newURI = function(aSpec, aCharset, aBaseURI)
86 {
87 var uri = Components.classes[URI_CONTRACTID].createInstance(nsIURI);
88 uri.spec = aSpec;
89 return uri;
90 }
91
92 /**
93 * Renvoie le nouveau channel.
94 */
95 DivxProtocolHandler.prototype.newChannel = function(aURI)
96 {
97 var chemin = aURI.spec;
98
99 // détermine quel commande utilisé en comparant le motif et le nom du fichier
100 var commandes = divxlistGetCommandes();
101 var commande;
102 for (var i = 0; i < commandes.length; i++)
103 {
104 var regexp = new RegExp(commandes[i][0], "i");
105 if (regexp.test(chemin))
106 {
107 commande = commandes[i][1]
108 break;
109 }
110 }
111
112 // ajoute le chemin (spécifié dans les options)
113 var root = divxlistGetRoot();
114 chemin = chemin.replace("divx://", root + "/")
115
116 // extrait le chemin de l'application de la commande
117 // puis l'enlève de la commande
118 var application;
119 var regexp = /^\s*"([^"]+)"\s*/;
120 var res = regexp.exec(commande);
121 if (res == null)
122 {
123 regexp = /^\s*(\S+)\s*/;
124 res = regexp.exec(commande);
125 }
126 application = res[1]
127 commande = commande.replace(regexp, "");
128
129 // sépare les paramètres restant, %f est remplacé par le chemin du fichier
130 var parametres = commande.split(' ');
131 for (var i = 0; i < parametres.length; i++)
132 {
133 parametres[i] = parametres[i].replace("%f", chemin)
134 }
135
136 // crée un nouveau fichier
137 var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
138 file.initWithPath(application);
139
140 // crée un nouveau processus
141 var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
142 process.init(file);
143
144 // lance le processus. false pour ne pas être blockant
145 process.run(false, parametres, parametres.length);
146
147 // trouver une méthode plus simple pour qu'il ne fasse rien..
148 var finalURL = ""
149 var ios = Components.classes[kIOSERVICE_CONTRACTID].getService(nsIIOService);
150 return ios.newChannel("javascript:document.location='" + finalURL + "'", null, null);
151 }
152
153 /**
154 * Classe DivxProtocolHandlerFactory.
155 */
156 function DivxProtocolHandlerFactory(scheme)
157 {
158 this.scheme = scheme;
159 }
160
161 /**
162 * Méthode permettant la création d'objet de type 'DivxProtocolHandler'.
163 */
164 DivxProtocolHandlerFactory.prototype.createInstance = function(outer, iid)
165 {
166 if(outer != null) throw Components.results.NS_ERROR_NO_AGGREGATION;
167
168 if(!iid.equals(nsIProtocolHandler) && !iid.equals(nsISupports))
169 throw Components.results.NS_ERROR_INVALID_ARG;
170
171 return new DivxProtocolHandler(this.scheme);
172 }
173
174 // la factory
175 var factory_divx = new DivxProtocolHandlerFactory("divx");
176
177 /**
178 * Notre module.
179 */
180 var DIVXModule = new Object();
181
182 /**
183 * Appelé lors de l'enregistrement du module.
184 */
185 DIVXModule.registerSelf = function(compMgr, fileSpec, location, type)
186 {
187 compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
188
189 // on enregistre le protocole handler
190 compMgr.registerFactoryLocation(DIVXPROT_HANDLER_CID,
191 "divx",
192 DIVXPROT_HANDLER_CONTRACTID,
193 fileSpec, location, type);
194 }
195
196 /**
197 * Appelé lors du déchargement du module.
198 */
199 DIVXModule.unregisterSelf = function(compMgr, fileSpec, location)
200 {
201 compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
202
203 // on dés-enregistre notre protocole handler
204 compMgr.unregisterFactoryLocation(DIVXPROT_HANDLER_CID, fileSpec);
205 }
206
207 /**
208 * Demande la factory pour construire le protocole handler.
209 */
210 DIVXModule.getClassObject = function(compMgr, cid, iid)
211 {
212 if(!iid.equals(Components.interfaces.nsIFactory))
213 throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
214
215 if(cid.equals(DIVXPROT_HANDLER_CID)) return factory_divx;
216
217 throw Components.results.NS_ERROR_NO_INTERFACE;
218 }
219
220 /**
221 * Est-ce que le module peut être déchargé
222 */
223 DIVXModule.canUnload = function(compMgr)
224 {
225 return true;
226 }
227
228 /**
229 * Le point d'entré, retourne le module.
230 */
231 function NSGetModule(compMgr, fileSpec)
232 {
233 return DIVXModule;
234 }