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 chemin
= chemin
.replace("divx://", root
+ "/")
116 // extrait le chemin de l'application de la commande
117 // puis l'enlève de la commande
119 var regexp
= /^\s*"([^"]+)"\s*/;
120 var res
= regexp
.exec(commande
);
123 regexp
= /^\s*(\S+)\s*/;
124 res
= regexp
.exec(commande
);
127 commande
= commande
.replace(regexp
, "");
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
++)
133 parametres
[i
] = parametres
[i
].replace("%f", chemin
)
136 // crée un nouveau fichier
137 var file
= Components
.classes
["@mozilla.org/file/local;1"].createInstance(Components
.interfaces
.nsILocalFile
);
138 file
.initWithPath(application
);
140 // crée un nouveau processus
141 var process
= Components
.classes
["@mozilla.org/process/util;1"].createInstance(Components
.interfaces
.nsIProcess
);
144 // lance le processus. false pour ne pas être blockant
145 process
.run(false, parametres
, parametres
.length
);
147 // trouver une méthode plus simple pour qu'il ne fasse rien..
149 var ios
= Components
.classes
[kIOSERVICE_CONTRACTID
].getService(nsIIOService
);
150 return ios
.newChannel("javascript:document.location='" + finalURL
+ "'", null, null);
154 * Classe DivxProtocolHandlerFactory.
156 function DivxProtocolHandlerFactory(scheme
)
158 this.scheme
= scheme
;
162 * Méthode permettant la création d'objet de type 'DivxProtocolHandler'.
164 DivxProtocolHandlerFactory
.prototype.createInstance = function(outer
, iid
)
166 if(outer
!= null) throw Components
.results
.NS_ERROR_NO_AGGREGATION
;
168 if(!iid
.equals(nsIProtocolHandler
) && !iid
.equals(nsISupports
))
169 throw Components
.results
.NS_ERROR_INVALID_ARG
;
171 return new DivxProtocolHandler(this.scheme
);
175 var factory_divx
= new DivxProtocolHandlerFactory("divx");
180 var DIVXModule
= new Object();
183 * Appelé lors de l'enregistrement du module.
185 DIVXModule
.registerSelf = function(compMgr
, fileSpec
, location
, type
)
187 compMgr
= compMgr
.QueryInterface(Components
.interfaces
.nsIComponentRegistrar
);
189 // on enregistre le protocole handler
190 compMgr
.registerFactoryLocation(DIVXPROT_HANDLER_CID
,
192 DIVXPROT_HANDLER_CONTRACTID
,
193 fileSpec
, location
, type
);
197 * Appelé lors du déchargement du module.
199 DIVXModule
.unregisterSelf = function(compMgr
, fileSpec
, location
)
201 compMgr
= compMgr
.QueryInterface(Components
.interfaces
.nsIComponentRegistrar
);
203 // on dés-enregistre notre protocole handler
204 compMgr
.unregisterFactoryLocation(DIVXPROT_HANDLER_CID
, fileSpec
);
208 * Demande la factory pour construire le protocole handler.
210 DIVXModule
.getClassObject = function(compMgr
, cid
, iid
)
212 if(!iid
.equals(Components
.interfaces
.nsIFactory
))
213 throw Components
.results
.NS_ERROR_NOT_IMPLEMENTED
;
215 if(cid
.equals(DIVXPROT_HANDLER_CID
)) return factory_divx
;
217 throw Components
.results
.NS_ERROR_NO_INTERFACE
;
221 * Est-ce que le module peut être déchargé
223 DIVXModule
.canUnload = function(compMgr
)
229 * Le point d'entré, retourne le module.
231 function NSGetModule(compMgr
, fileSpec
)