Пример #1
0
 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);
 }
Пример #2
0
        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);
            }
        }
Пример #3
0
 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();
     }
 }
Пример #4
0
 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();
 }
Пример #5
0
        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;
            }
        }