Author: mhutch
Date: 2007-05-13 10:51:42 -0400 (Sun, 13 May 2007)
New Revision: 77311

Removed:
   trunk/jscall-sharp/src/jscallglue/
Modified:
   trunk/jscall-sharp/src/
   trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs
   trunk/jscall-sharp/src/ChangeLog
   trunk/jscall-sharp/src/Makefile.am
   trunk/jscall-sharp/src/Resources/JSCall.js
   trunk/jscall-sharp/src/jscall.dll.config.in
   trunk/jscall-sharp/src/jscall.mdp
Log:
2007-05-13  Michael Hutchinson <[EMAIL PROTECTED]>

        * src/AspNetEdit.JSCall/CommandManager.cs,
          src/Resources/JSCall.js: Removed the need for 
          glue code using "javascript:" urls instead.
          Thanks to Chris Howie for this idea.
          
          API changes:
          JSCallInit, JSCallRegisterClrHandler, and 
          JSCallUnregisterClrHandler are no longer necessary.
          The CommandManager will call any JS function, passing it the 
          arguments directly rather than as an array.
        
        * src/jscallglue: Removed C++ glue files.
        
        * src/Makefile.am,
          src/jscall.dll.config.in,
          src/jscall.mdp: Updated.




Property changes on: trunk/jscall-sharp/src
___________________________________________________________________
Name: svn:ignore
   - AssemblyInfo.cs
jscall.dll
Makefile.in
jscall.dll.mdb
libjscallglue.dll.so
Makefile
jscall.pidb
jscall.userprefs
jscall.dll.config
jscall.key
.deps

   + AssemblyInfo.cs
jscall.dll
Makefile.in
jscall.dll.mdb
libjscallglue.dll.so
Makefile
jscall.pidb
jscall.userprefs
jscall.usertasks
jscall.dll.config
jscall.key
.deps


Modified: trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs
===================================================================
--- trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs  2007-05-13 
11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/AspNetEdit.JSCall/CommandManager.cs  2007-05-13 
14:51:42 UTC (rev 77311)
@@ -4,7 +4,7 @@
  * Authors: 
  *  Michael Hutchinson <[EMAIL PROTECTED]>
  *  
- * Copyright (C) 2005 Michael Hutchinson
+ * Copyright (C) 2005-2007 Michael Hutchinson
  *
  * This sourcecode is licenced under The MIT License:
  * 
@@ -32,21 +32,12 @@
 using System.Collections;
 using Gecko;
 using System.Text;
-using System.Runtime.InteropServices;
 
 namespace AspNetEdit.JSCall
 {
        public class CommandManager
-       {
-               [DllImport ("jscallglue.dll")]
-               static extern int PlaceFunctionCall (IntPtr embed,
-                       [MarshalAs(UnmanagedType.LPWStr)] string call,
-                       [MarshalAs(UnmanagedType.LPWStr)] string returnto,
-                       [MarshalAs(UnmanagedType.LPWStr)] string args);
-               
-               [DllImport ("jscallglue.dll")]
-               static extern int ExecuteScript (IntPtr embed,
-                       [MarshalAs(UnmanagedType.LPWStr)] string script);
+       {
+               private const char delimiter = (char)234;
                
                private Hashtable functions = new Hashtable ();
                private WebControl webControl;
@@ -65,7 +56,7 @@
                        if (!webControl.Title.StartsWith ("JSCall"))
                                return;
                        
-                       string[] call = webControl.Title.Split ((char)234);
+                       string[] call = webControl.Title.Split (delimiter);
                        if (call.Length < 2)
                                throw new Exception ("Too few parameters in 
call from JavaScript.");
                                
@@ -97,105 +88,49 @@
                        if ((script == null) || (script.Length < 1))
                                throw new ArgumentNullException ("A null or 
empty script cannot be executed.", "script");
                        
-                       int result = ExecuteScript (webControl.Handle, script);
-                       string err;
-                       
-                       switch (result)
-                       {
-                               case 0:
-                                       return;
-                               
-                               case 1:
-                                       err = "Could not obtain IDOMDocument 
from GtkMozEmbed. Have you shown the window yet?";
-                                       break;
-                               
-                               case 2:
-                                       err = "Could not create script 
element.";
-                                       break;
-                               
-                               case 3:
-                                       err = "Could not cast script element to 
nsIDOMHTMLScriptElement.";
-                                       break;
-                               
-                               case 4:
-                                       err = "Could not locate body element.";
-                                       break;
-                                       
-                               case 5:
-                                       err = "Could not append script element 
to body.";
-                                       break;
-                       }
-                       
-                       throw new Exception ("Glue function ExecuteScript: " + 
err);
-               }
-
+                       webControl.LoadUrl ("javascript:" + script);
+               }
+               
                public void JSCall (string function, string returnTo, params 
string[] args)
                {
                        if ((function==null) || (function.Length < 1))
                                throw new ArgumentException ("A function name 
must be specified.", "function");
-                               
-                       if (returnTo == null) returnTo = string.Empty;
                        
-                       string argsOut = String.Empty;
-                       
-                       if (args != null) {
-                               argsOut +=  args[0];
-                               for (int i = 1; i <= args.Length - 1; i++) {
-                                       argsOut += (char)234 + args[i];
-                               }
+                       StringBuilder sb = new StringBuilder ();
+                       sb.Append ("javascript: ");
+                       
+                       //wrap the call in a function to handle the return value
+                       if (returnTo != null)
+                               sb.AppendFormat ("JSCallPlaceClrCall(\"{0}\", 
\"\", new Array( ", returnTo);
+                       
+                       //call the function
+                       sb.AppendFormat ("{0} (", function);
+                       
+                       //add the arguments
+                       if (args != null) {
+                               for (int i = 0; i < args.Length - 1; i++)       
                        
+                                       sb.AppendFormat ("\"{0}\", ", 
escapeJSString (args[i]));
+                               sb.AppendFormat ("\"{0}\"", escapeJSString 
(args[args.Length-1]));
                        }
-                       
-                       int result = PlaceFunctionCall (webControl.Handle, 
function, returnTo, argsOut);
-                       
-                       string err;
-                       
-                       switch (result)
-                       {
-                               case 0:
-                                       return;
-                               
-                               case 1:
-                                       err = "Could not obtain IDOMDocument 
from GtkMozEmbed. Have you shown the window yet?";
-                                       break;
-                                       
-                               case 2:
-                                       err = "Error finding 'jscall' nodes.";
-                                       break;
-                                       
-                               case 3:
-                                       err = "Error getting number of 'jscall' 
nodes.";
-                                       break;
-                                       
-                               case 4:
-                                       err = "More or fewer than one 'jscall' 
node.";
-                                       break;
-                                       
-                               case 5:
-                                       err = "Error getting 'jscall' node.";
-                                       break;
-                                       
-                               case 6:
-                                       err = "Error adding 'infunction' node.";
-                                       break;
-                                       
-                               case 7:
-                                       err = "Error setting attributes on 
'infunction' node.";
-                                       break;
-                                       
-                               case 8:
-                                       err = "Error getting nsIDOMNode 
interface on 'infunction' node.";
-                                       break;
-                                       
-                               case 9:
-                                       err = "Error appending 'infunction' 
node to 'jscall' node.";
-                                       break;
-                                       
-                               default:
-                                       err = "The glue wrapper returned an 
unknown error.";
-                                       break;
-                       }
-                       
-                       throw new Exception ("Glue function PlaceFunctionCall: 
"+err); 
+                       
+                       //close the function call                       
+                       sb.Append (")");
+                       
+                       //end return wrapper
+                       if (returnTo != null)
+                               sb.Append (") )");
+                       sb.Append(";");
+                       
+                       System.Diagnostics.Trace.WriteLine(sb.ToString ());
+                       
+                       webControl.LoadUrl (sb.ToString ());
+               }
+               
+               private string escapeJSString (string s)
+               {
+                       return s.Replace ("\\", "\\\\")
+                               .Replace ("\"", "\\\"")
+                               .Replace ("\n", "\\n");
                }
 
                public void RegisterJSHandler (string name, ClrCall handler)
@@ -222,9 +157,7 @@
                                throw new IndexOutOfRangeException ("A function 
with this name has not been registered.");
                        }
                }
-
        }
 
-
        public delegate string ClrCall (string[] args);
 }

Modified: trunk/jscall-sharp/src/ChangeLog
===================================================================
--- trunk/jscall-sharp/src/ChangeLog    2007-05-13 11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/ChangeLog    2007-05-13 14:51:42 UTC (rev 77311)
@@ -1,3 +1,22 @@
+2007-05-13  Michael Hutchinson <[EMAIL PROTECTED]>
+
+       * src/AspNetEdit.JSCall/CommandManager.cs,
+         src/Resources/JSCall.js: Removed the need for 
+         glue code using "javascript:" urls instead.
+         Thanks to Chris Howie for this idea.
+         
+         API changes:
+         JSCallInit, JSCallRegisterClrHandler, and 
+         JSCallUnregisterClrHandler are no longer necessary.
+         The CommandManager will call any JS function, passing it the 
+         arguments directly rather than as an array.
+       
+       * src/jscallglue: Removed C++ glue files.
+       
+       * src/Makefile.am,
+         src/jscall.dll.config.in,
+         src/jscall.mdp: Updated.
+
 2007-04-02  Michael Hutchinson <[EMAIL PROTECTED]>
 
        * jscallglue/Makefile.am: More dist fixes.

Modified: trunk/jscall-sharp/src/Makefile.am
===================================================================
--- trunk/jscall-sharp/src/Makefile.am  2007-05-13 11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/Makefile.am  2007-05-13 14:51:42 UTC (rev 77311)
@@ -1,5 +1,3 @@
-SUBDIRS = jscallglue
-
 ### Names ###
 
 ASSEMBLY_NAME=jscall

Modified: trunk/jscall-sharp/src/Resources/JSCall.js
===================================================================
--- trunk/jscall-sharp/src/Resources/JSCall.js  2007-05-13 11:01:05 UTC (rev 
77310)
+++ trunk/jscall-sharp/src/Resources/JSCall.js  2007-05-13 14:51:42 UTC (rev 
77311)
@@ -4,7 +4,7 @@
  * Authors: 
  *  Michael Hutchinson <[EMAIL PROTECTED]>
  *  
- * Copyright (C) 2005 Michael Hutchinson
+ * Copyright (C) 2005-2007 Michael Hutchinson
  *
  * This sourcecode is licenced under The MIT License:
  * 
@@ -27,67 +27,11 @@
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
- 
-var JSCallFunctions;
-var delimiter = unescape ("%ea");
 
-function JSCallInit()
-{
-       JSCallFunctions = Array();
-       
-       if (document.getElementsByTagName("jscall").length == 0) {
-               el = document.createElement("jscall");
-               document.documentElement.appendChild(el);
-       }
-       
-       if (document.getElementsByTagName("jscall").length != 1) {
-               throw "Error: the document already contains a <jscall> element";
-       }
-       
-       var el = document.getElementsByTagName("jscall")[0];
-       el.addEventListener( "DOMNodeInserted", JSCallHandler, false );
-       
-       //JSCallRegisterClrHandler("Redo", Redo);
-}
 
-
-//function Redo()
-//{
-//     alert("Yay!");
-//}
-
-
-function JSCallHandler(e) 
-{
-       if ( e.target.nodeName == "infunction" && e.target.nodeType == 1 ){     
-               fn = e.target.attributes[0].value;
-               returnTo = e.target.attributes[1].value;
-               args = e.target.attributes[2].value.split(delimiter);
-               
-               try {
-               if(JSCallFunctions[fn]) {
-                       f = JSCallFunctions[fn];
-                       result = f(args);
-               }
-               else {
-                       throw "JSCall: The '"+fn+"' function has not been 
registered";
-               }
-               
-               
-               if (returnTo.length  != 0) {
-                       JSCallPlaceClrCall(returnTo, "", new Array(result));
-               }
-               
-               }
-               catch(e) {
-                       alert(e)
-               }
-               e.target.parentNode.removeChild(e.target);
-       }
-}
-
-
-function JSCallPlaceClrCall(fn, returnTo, args) {
+function JSCallPlaceClrCall(fn, returnTo, args) {
+       var delimiter = unescape ("%ea");
+       
        var str = "JSCall" + delimiter + fn + delimiter + returnTo + delimiter;
        
        if (args && args.length > 0)
@@ -99,26 +43,3 @@
        document.title = str;
        document.title = oldTitle;      
 }
-
-
-function JSCallUnregisterClrHandler() {
-       if(JSCallFunctions[n]) {
-               delete JSCallFunctions[n];
-       }
-       else {
-               throw "Function with that name not registered";
-       } 
-}
-
-
-function JSCallRegisterClrHandler(n, fn) {
-       if((typeof fn) != "function") {
-               throw "The fn argument must be a function";
-       }
-       if(JSCallFunctions[n]) {
-               throw "Function with that name already registered";
-       }
-       else {
-               JSCallFunctions[n] = fn;
-       } 
-}

Modified: trunk/jscall-sharp/src/jscall.dll.config.in
===================================================================
--- trunk/jscall-sharp/src/jscall.dll.config.in 2007-05-13 11:01:05 UTC (rev 
77310)
+++ trunk/jscall-sharp/src/jscall.dll.config.in 2007-05-13 14:51:42 UTC (rev 
77311)
@@ -1,3 +1,2 @@
 <configuration>
-  <dllmap dll="jscallglue.dll" target="[EMAIL PROTECTED]@.so"/>
 </configuration>

Modified: trunk/jscall-sharp/src/jscall.mdp
===================================================================
--- trunk/jscall-sharp/src/jscall.mdp   2007-05-13 11:01:05 UTC (rev 77310)
+++ trunk/jscall-sharp/src/jscall.mdp   2007-05-13 14:51:42 UTC (rev 77311)
@@ -13,18 +13,6 @@
       <CodeGeneration compiler="Csc" warninglevel="4" optimize="True" 
unsafecodeallowed="False" generateoverflowchecks="True" mainclass="" 
generatexmldocumentation="False" ctype="CSharpCompilerParameters" />
     </Configuration>
   </Configurations>
-  <DeployTargets />
-  <DeploymentInformation strategy="File">
-    <excludeFiles>
-      <ExcludeFile file="./AssemblyInfo.cs.in" />
-      <ExcludeFile file="./ChangeLog" />
-      <ExcludeFile file="./Resources/ChangeLog" />
-      <ExcludeFile file="./jscallglue/ChangeLog" />
-      <ExcludeFile file="./AspNetEdit.JSCall/ChangeLog" />
-      <ExcludeFile file="./jscall.dll.mdb" />
-      <ExcludeFile file="./libjscallglue.dll.so" />
-    </excludeFiles>
-  </DeploymentInformation>
   <Contents>
     <File name="./AssemblyInfo.cs.in" subtype="Code" buildaction="Exclude" />
     <File name="./AspNetEdit.JSCall/CommandManager.cs" subtype="Code" 
buildaction="Compile" />
@@ -42,4 +30,16 @@
     <ProjectReference type="Gac" localcopy="True" refto="gecko-sharp, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=ccf7d78a55e9f021" />
     <ProjectReference type="Gac" localcopy="True" refto="atk-sharp, 
Version=2.6.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
   </References>
+  <DeployTargets />
+  <DeploymentInformation strategy="File">
+    <excludeFiles>
+      <ExcludeFile file="./AssemblyInfo.cs.in" />
+      <ExcludeFile file="./ChangeLog" />
+      <ExcludeFile file="./Resources/ChangeLog" />
+      <ExcludeFile file="./jscallglue/ChangeLog" />
+      <ExcludeFile file="./AspNetEdit.JSCall/ChangeLog" />
+      <ExcludeFile file="./jscall.dll.mdb" />
+      <ExcludeFile file="./libjscallglue.dll.so" />
+    </excludeFiles>
+  </DeploymentInformation>
 </Project>
\ No newline at end of file

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to