1 // voir : http://www.nexgenmedia.net/docs/protocol/
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}");
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";
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
;
18 /******* COPIER-COLLER de pref.js dans /chrome/content *******/
19 /******* TODO : trouver un moyen d'inclure pref.js *******/
20 function divxlistGetPreferencesService()
22 return Components
.classes
["@mozilla.org/preferences-service;1"].getService(Components
.interfaces
.nsIPrefService
).getBranch("");
24 function divxlistGetRoot()
26 return divxlistGetPreferencesService().getCharPref("divxlist.root");
28 function divxlistSetRoot(root
)
30 return divxlistGetPreferencesService().setCharPref("divxlist.root", root
);
32 function divxlistGetCommandes()
34 var commandes
= divxlistGetPreferencesService().getCharPref("divxlist.commandes");
35 var regex
= /'[^']*'/g
36 var res
= commandes
.match(regex
);
37 var commandesTab
= new Array()
39 for(var i
= 0; i
< res
.length
; i
+= 2)
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
);
48 function divxlistSetCommandes(commandes
)
50 var commandesStr
= "{"
51 for (var i
= 0; i
< commandes
.length
; i
++)
53 if (i
!= 0) commandesStr
+= ", "
54 commandesStr
+= "'" + commandes
[i
][0] + "' => "
55 commandesStr
+= "'" + commandes
[i
][1] + "'"
59 return divxlistGetPreferencesService().setCharPref("divxlist.commandes", commandesStr
);
63 * Classe ProtocolHandler.
65 function DivxProtocolHandler(scheme
)
70 // attributs par défaut
71 DivxProtocolHandler
.prototype.defaultPort
= -1;
72 DivxProtocolHandler
.prototype.protocolFlags
= nsIProtocolHandler
.URI_NORELATIVE
;
75 * est-ce qu'un port est autorisé
77 DivxProtocolHandler
.prototype.allowPort = function(aPort
, aScheme
)
83 * Renvoie le nouvel URI.
85 DivxProtocolHandler
.prototype.newURI = function(aSpec
, aCharset
, aBaseURI
)
87 var uri
= Components
.classes
[URI_CONTRACTID
].createInstance(nsIURI
);
93 * Renvoie le nouveau channel.
95 DivxProtocolHandler
.prototype.newChannel = function(aURI
)
97 var chemin
= aURI
.spec
;
99 // détermine quel commande utilisé en comparant le motif et le nom du fichier
100 var commandes
= divxlistGetCommandes();
102 for (var i
= 0; i
< commandes
.length
; i
++)
104 var regexp
= new RegExp(commandes
[i
][0], "i");
105 if (regexp
.test(chemin
))
107 commande
= commandes
[i
][1]
112 // ajoute le chemin (spécifié dans les options)
113 var root
= divxlistGetRoot();
114 // décodage UTF8->latin1 : http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html
115 chemin
= decodeURIComponent(chemin
.replace("divx://", root
+ "/"))
117 // extrait le chemin de l'application de la commande
118 // puis l'enlève de la commande
120 var regexp
= /^\s*"([^"]+)"\s*/;
121 var res
= regexp
.exec(commande
);
124 regexp
= /^\s*(\S+)\s*/;
125 res
= regexp
.exec(commande
);
128 commande
= commande
.replace(regexp
, "");
130 // sépare les paramètres restant, %f est remplacé par le chemin du fichier
131 var parametres
= commande
.split(' ');
132 for (var i
= 0; i
< parametres
.length
; i
++)
134 parametres
[i
] = parametres
[i
].replace("%f", chemin
)
137 // crée un nouveau fichier
138 var file
= Components
.classes
["@mozilla.org/file/local;1"].createInstance(Components
.interfaces
.nsILocalFile
);
139 file
.initWithPath(application
);
141 // crée un nouveau processus
142 var process
= Components
.classes
["@mozilla.org/process/util;1"].createInstance(Components
.interfaces
.nsIProcess
);
145 // lance le processus. false pour ne pas être blockant
146 process
.run(false, parametres
, parametres
.length
);
148 // trouver une méthode plus simple pour qu'il ne fasse rien..
150 var ios
= Components
.classes
[kIOSERVICE_CONTRACTID
].getService(nsIIOService
);
151 return ios
.newChannel("javascript:document.location='" + finalURL
+ "'", null, null);
155 * Classe DivxProtocolHandlerFactory.
157 function DivxProtocolHandlerFactory(scheme
)
159 this.scheme
= scheme
;
163 * Méthode permettant la création d'objet de type 'DivxProtocolHandler'.
165 DivxProtocolHandlerFactory
.prototype.createInstance = function(outer
, iid
)
167 if(outer
!= null) throw Components
.results
.NS_ERROR_NO_AGGREGATION
;
169 if(!iid
.equals(nsIProtocolHandler
) && !iid
.equals(nsISupports
))
170 throw Components
.results
.NS_ERROR_INVALID_ARG
;
172 return new DivxProtocolHandler(this.scheme
);
176 var factory_divx
= new DivxProtocolHandlerFactory("divx");
181 var DIVXModule
= new Object();
184 * Appelé lors de l'enregistrement du module.
186 DIVXModule
.registerSelf = function(compMgr
, fileSpec
, location
, type
)
188 compMgr
= compMgr
.QueryInterface(Components
.interfaces
.nsIComponentRegistrar
);
190 // on enregistre le protocole handler
191 compMgr
.registerFactoryLocation(DIVXPROT_HANDLER_CID
,
193 DIVXPROT_HANDLER_CONTRACTID
,
194 fileSpec
, location
, type
);
198 * Appelé lors du déchargement du module.
200 DIVXModule
.unregisterSelf = function(compMgr
, fileSpec
, location
)
202 compMgr
= compMgr
.QueryInterface(Components
.interfaces
.nsIComponentRegistrar
);
204 // on dés-enregistre notre protocole handler
205 compMgr
.unregisterFactoryLocation(DIVXPROT_HANDLER_CID
, fileSpec
);
209 * Demande la factory pour construire le protocole handler.
211 DIVXModule
.getClassObject = function(compMgr
, cid
, iid
)
213 if(!iid
.equals(Components
.interfaces
.nsIFactory
))
214 throw Components
.results
.NS_ERROR_NOT_IMPLEMENTED
;
216 if(cid
.equals(DIVXPROT_HANDLER_CID
)) return factory_divx
;
218 throw Components
.results
.NS_ERROR_NO_INTERFACE
;
222 * Est-ce que le module peut être déchargé
224 DIVXModule
.canUnload = function(compMgr
)
230 * Le point d'entré, retourne le module.
232 function NSGetModule(compMgr
, fileSpec
)