public static void Deserialize(MISP.GenericScriptObject into, ReadOnlyDatagram from, Database database) { var state = new SerializerState(); state.referencedObjects.Add(0, into); while (from.More) impleDeserialize(from, state, database); }
internal static void impleDeserialize(ReadOnlyDatagram datagram, SerializerState state, Database database) { uint index = 0; if (!datagram.ReadUInt(out index, 16)) throw new DeserializeError(); MISP.GenericScriptObject into = null; if (state.referencedObjects.ContainsKey(index)) into = state.referencedObjects[index]; else { into = new MISP.GenericScriptObject(); state.referencedObjects.Add(index, into); } uint propertyCount = 0; if (!datagram.ReadUInt(out propertyCount, 16)) throw new DeserializeError(); for (int i = 0; i < propertyCount; ++i) { String propertyName = ""; Object value = null; if (!datagram.ReadString(out propertyName)) throw new DeserializeError(); value = DeserializeObject(datagram, state, database); into.SetProperty(propertyName, value); } }
internal static Object DeserializeObject(ReadOnlyDatagram datagram, SerializerState state, Database database) { uint rawTypeCode = 0; if (!datagram.ReadUInt(out rawTypeCode, 8)) throw new DeserializeError(); switch ((SerializedTypeCode)rawTypeCode) { case SerializedTypeCode.Null: return null; case SerializedTypeCode.Integer: { uint value = 0; if (!datagram.ReadUInt(out value, 32)) throw new DeserializeError(); return (int)value; } case SerializedTypeCode.String: { String value = ""; if (!datagram.ReadString(out value)) throw new DeserializeError(); return value; } case SerializedTypeCode.List: { uint length = 0; if (!datagram.ReadUInt(out length, 16)) throw new DeserializeError(); var result = new MISP.ScriptList(); for (int i = 0; i < length; ++i) result.Add(DeserializeObject(datagram, state, database)); return result; } case SerializedTypeCode.InternalObject: return state.ReadObject(datagram, SerializedTypeCode.InternalObject, database); case SerializedTypeCode.NamedObject: return state.ReadObject(datagram, SerializedTypeCode.NamedObject, database); default: throw new DeserializeError(); } }
internal MISP.ScriptObject ReadObject(ReadOnlyDatagram datagram, SerializedTypeCode typeCode, Database database) { if (typeCode == SerializedTypeCode.NamedObject) { String objectName = ""; if (!datagram.ReadString(out objectName)) throw new DeserializeError(); return database.LoadObject(objectName); } else if (typeCode == SerializedTypeCode.InternalObject) { uint id = 0; if (!datagram.ReadUInt(out id, 16)) throw new DeserializeError(); if (referencedObjects.ContainsKey(id)) return referencedObjects[id]; else { var obj = new MISP.GenericScriptObject(); referencedObjects.Add(id, obj); return obj; } } else throw new DeserializeError(); }
public MISP.ScriptObject ReLoadObject(String path, bool timeOut = true) { if (!namedObjects.ContainsKey(path)) namedObjects.Upsert(path, new MISP.GenericScriptObject("@path", path)); try { Console.WriteLine(new String(' ', loadDepth) + "Loading object " + staticPath + path + "."); loadDepth += 1; bool hasData = false; var mudObject = namedObjects[path]; mudObject.ClearProperties(); var serializedObjectPath = serializedPath + path + ".obj"; if (System.IO.File.Exists(serializedObjectPath)) { hasData = true; Console.WriteLine(new String(' ', loadDepth) + "-Has serialized data."); try { var bytes = System.IO.File.ReadAllBytes(serializedObjectPath); var datagram = new ReadOnlyDatagram(bytes); ObjectDeserializer.Deserialize(mudObject as MISP.GenericScriptObject, datagram, this); } catch (Exception e) { Console.WriteLine("Error: Serialized data will be discarded.\n" + e.Message); mudObject.ClearProperties(); } } mudObject.SetProperty("@path", path); if (path != "object") mudObject.SetProperty("@base", LoadObject("object")); var staticObjectPath = staticPath + path + ".mud"; if (System.IO.File.Exists(staticObjectPath)) { hasData = true; Console.WriteLine(new String(' ', loadDepth) + "-Has static data."); var inFile = System.IO.File.ReadAllText(staticObjectPath); var scriptContext = new MISP.Context(); scriptContext.limitExecutionTime = timeOut; scriptContext.Scope.PushVariable("this", mudObject); core.scriptEngine.EvaluateString(scriptContext, inFile, staticObjectPath, true); scriptContext.Scope.PopVariable("this"); } if (!hasData) { Console.WriteLine(new String(' ', loadDepth) + "-Has no data."); namedObjects.Remove(path); mudObject = null; } loadDepth -= 1; Console.WriteLine(new String(' ', loadDepth) + (hasData ? "..Success." : "..Failure.")); return mudObject; } catch (Exception e) { Console.WriteLine("Error loading object " + staticPath + path + "."); if (e is MISP.ParseError) { Console.Write((e as MISP.ParseError).line + " "); } else if (e is MISP.ScriptError) { var node = (e as MISP.ScriptError).generatedAt; if (node != null) { Console.Write(node.source.filename + " " + node.line + " "); } } Console.WriteLine(e.Message); //Console.WriteLine(e.StackTrace); loadDepth -= 1; return null; } }