Replaced old stream loader with base64 decoder.

This commit is contained in:
James Forshaw
2017-05-16 18:08:33 +01:00
parent 162da66cbc
commit e3cebf073f
2 changed files with 33 additions and 36 deletions
+11 -18
View File
@@ -16,15 +16,13 @@
// along with DotNetToJScript. If not, see <http://www.gnu.org/licenses/>.
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);
}
}
}
+22 -18
View File
@@ -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);
}