Version and install for library
[gssweb.git] / firefox / lib / main.js
1 var tabs = require("sdk/tabs");
2 const {Cu} = require("chrome");
3
4 Cu.import("resource://gre/modules/ctypes.jsm");
5
6
7 // TODO: detect which OS we're running, and proactively search for the
8 //       correct library name.
9 var json_gssapi;
10 try {
11     json_gssapi = ctypes.open("libjsongssapi.so");
12 }
13 catch (e) {
14     try {
15         json_gssapi = ctypes.open("jsongssapi.dll");
16     }
17     catch (e) {
18         console.log("Error loading the JSON GSS-API library: " + e);
19     }
20 }
21
22 var gss_request = function(msg) { return "{\"error_message\":\"JSON GSS-API library was not loaded properly\"}"; }
23 try {
24 gss_request = json_gssapi.declare("gss_request",
25     ctypes.default_abi,
26     ctypes.char.ptr,
27     ctypes.char.ptr);
28 }
29 catch (e) {
30   console.log("Could not find the function 'gss_request' in the JSON GSS-API library: " + e);
31 }
32
33 var self = require("sdk/self");
34 var data = require("sdk/self").data;
35 var pageMod = require("sdk/page-mod");
36
37 pageMod.PageMod({
38   include: "*",
39   contentScriptFile: [data.url("gssweb.contentscript.js")],
40   contentScriptWhen: "ready"
41 });
42
43
44
45 function invokeNativeGSS(msg)
46 {
47   var appTag;
48   var reply;
49   var response;
50   
51   // Deal with the cookies in the message
52   if ( typeof(msg.cookies) == 'undefined')
53   {
54     msg.cookies = {};
55   }
56   appTag = msg.cookies.app_tag;
57
58   // Send the message to the NativePort / command line
59   console.info(
60     '[' + appTag + '] About to invoke native function: [' +
61     JSON.stringify(msg) + ']'
62   );
63   reply = gss_request( JSON.stringify(msg) );
64   response = JSON.parse(reply.readString() );
65   console.info('[' + appTag + '] ... native function invoked.');
66   console.info('[' + appTag + '] ... returned: ' + response);
67   
68   return(response);
69 }
70
71 tabs.on("ready", function(tab) {
72   app = tab.attach({ contentScriptFile: data.url("gssweb.contentscript.js") });
73   app.port.on("gss_request", function(message) {
74     var response = invokeNativeGSS(message);
75     app.port.emit("gss_response", response);
76   });
77 });