diff --git a/DotNetToJScript/JScriptGenerator.cs b/DotNetToJScript/JScriptGenerator.cs index 0124f15..150b052 100644 --- a/DotNetToJScript/JScriptGenerator.cs +++ b/DotNetToJScript/JScriptGenerator.cs @@ -16,15 +16,13 @@ // along with DotNetToJScript. If not, see . using System; +using System.Linq; using System.Text; namespace DotNetToJScript { class JScriptGenerator : IScriptGenerator { - static string debug_enabled = @"function debug(s) { WScript.Echo(s); }" + Environment.NewLine; - static string debug_disabled = @"function debug(s) { }" + Environment.NewLine; - static string GetScriptHeader(RuntimeVersion version, bool enable_debug) { StringBuilder builder = new StringBuilder(); @@ -42,10 +40,10 @@ namespace DotNetToJScript break; } builder.AppendLine("}"); - builder.AppendLine("function debug(s) {"); + builder.Append("function debug(s) {"); if (enable_debug) { - builder.AppendLine("WScript.Echo(s);"); + builder.Append("WScript.Echo(s);"); } builder.AppendLine("}"); return builder.ToString(); @@ -69,22 +67,17 @@ namespace DotNetToJScript public string GenerateScript(byte[] serialized_object, string entry_class_name, string additional_script, RuntimeVersion version, bool enable_debug) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < serialized_object.Length; ++i) + if ((serialized_object.Length % 3) != 0) { - builder.Append(serialized_object[i]); - if (i < serialized_object.Length - 1) - { - builder.Append(","); - } - if (i > 0 && (i % 32) == 0) - { - builder.AppendLine(); - } + int length = serialized_object.Length + (3 - serialized_object.Length % 3); + Array.Resize(ref serialized_object, length); } - + + string base64 = Convert.ToBase64String(serialized_object, Base64FormattingOptions.InsertLineBreaks); + string[] lines = base64.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).Select(s => String.Format("\"{0}\"", s)).ToArray(); + return GetScriptHeader(version, enable_debug) - + Properties.Resources.jscript_template.Replace("%SERIALIZED%", builder.ToString()).Replace("%CLASS%", entry_class_name).Replace("%ADDEDSCRIPT%", additional_script); + + Properties.Resources.jscript_template.Replace("%SERIALIZED%", String.Join("+"+Environment.NewLine, lines)).Replace("%CLASS%", entry_class_name).Replace("%ADDEDSCRIPT%", additional_script); } } } diff --git a/DotNetToJScript/Resources/jscript_template.txt b/DotNetToJScript/Resources/jscript_template.txt index 75f318d..4b2bf23 100644 --- a/DotNetToJScript/Resources/jscript_template.txt +++ b/DotNetToJScript/Resources/jscript_template.txt @@ -1,24 +1,28 @@ -var serialized_obj = [ -%SERIALIZED% -]; +function base64ToStream(b) { + var enc = new ActiveXObject("System.Text.ASCIIEncoding"); + var length = enc.GetByteCount_2(b); + var ba = enc.GetBytes_4(b); + var transform = new ActiveXObject("System.Security.Cryptography.FromBase64Transform"); + ba = transform.TransformFinalBlock(ba, 0, length); + var ms = new ActiveXObject("System.IO.MemoryStream"); + ms.Write(ba, 0, (length / 4) * 3); + ms.Position = 0; + return ms; +} + +var serialized_obj = %SERIALIZED%; var entry_class = '%CLASS%'; try { - setversion(); - var stm = new ActiveXObject('System.IO.MemoryStream'); - var fmt = new ActiveXObject('System.Runtime.Serialization.Formatters.Binary.BinaryFormatter'); - var al = new ActiveXObject('System.Collections.ArrayList') - - for (i in serialized_obj) { - stm.WriteByte(serialized_obj[i]); - } - - stm.Position = 0; - var n = fmt.SurrogateSelector; - var d = fmt.Deserialize_2(stm); - al.Add(n); - var o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class); - %ADDEDSCRIPT% + setversion(); + var stm = base64ToStream(serialized_obj); + var fmt = new ActiveXObject('System.Runtime.Serialization.Formatters.Binary.BinaryFormatter'); + var al = new ActiveXObject('System.Collections.ArrayList'); + var n = fmt.SurrogateSelector; + var d = fmt.Deserialize_2(stm); + al.Add(n); + var o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class); + %ADDEDSCRIPT% } catch (e) { debug(e.message); } \ No newline at end of file