Example #1
0
    static string decodeString(Stream stream, ReferenceLog refLog)
    {
        //
        UInt32 l = decodeU29(stream);

        bool isRef = (l & 1) == 0;

        l = l >> 1;

        if (isRef)
        {
            if (refLog.Strings.Length > 0)
            {
                return(refLog.Strings[l]);
            }
            else
            {
                throw new Exception("error code string");
            }
        }
        else
        {
            byte[] bs = new byte[l];
            stream.Read(bs, 0, bs.Length);
            string        toString = System.Text.Encoding.UTF8.GetString(bs);
            List <string> lists    = new List <string>()
            {
            };

            lists.AddRange(refLog.Strings);
            lists.Add(toString);
            refLog.Strings = lists.ToArray();
            return(toString);
        }
    }
Example #2
0
    static int encodeString(Stream stream, string value, ReferenceLog refLog)
    {
        //

        writeAmfType(stream, amf_string);


        bool isRef = false;


        UInt32 l = Convert.ToUInt32(System.Text.Encoding.UTF8.GetBytes(value).Length);

        for (int i = 0; i < refLog.Strings.Length; i++)
        {
            if (refLog.Strings[i] == value)
            {
                l     = Convert.ToUInt32(i);
                isRef = true;
                break;
            }
        }

        if (isRef)
        {
            l = l << 1;
        }
        else
        {
            l = (l << 1) | 1;
        }


        if (l > 0x1FFFFFFF)
        {
            throw new ArgumentOutOfRangeException();
        }

        int nl = encodeU29(stream, l);

        int ns = 0;


        if (!isRef)
        {
            byte[] valueBytes = System.Text.Encoding.UTF8.GetBytes(value);

            stream.Write(valueBytes, 0, valueBytes.Length);
            refLog.Strings = new string[] { value };

            List <string> lists = new List <string>()
            {
            };
            lists.Add(value);
            lists.AddRange(refLog.Strings);

            refLog.Strings = lists.ToArray();
        }

        return(ns + nl + 1);
    }
Example #3
0
    static byte[] decodeByteArray(Stream stream, ReferenceLog refLog)
    {
        UInt32 l = decodeU29(stream);

        bool isRef = (l & 1) == 0;

        l = l >> 1;

        if (isRef)
        {
            if (refLog.Bytes.Length > 0)
            {
                return(refLog.Bytes[l]);
            }
            else
            {
                throw new Exception("error code byte array");
            }
        }
        else
        {
            byte[] bs = new byte[l];
            stream.Read(bs, 0, bs.Length);
            List <byte[]> lists = new List <byte[]>()
            {
            };

            lists.AddRange(refLog.Bytes);
            lists.Add(bs);
            refLog.Bytes = lists.ToArray();
            return(bs);
        }
    }
Example #4
0
    int encodeArray(Stream stream, Array value, ReferenceLog refLog)
    {
        if (value.GetType() == typeof(System.Byte[]))
        {
            //直接encodeByteArray
            return(0);
        }

        writeAmfType(stream, amf_array);

        int l = value.Length;

        UInt32 el = (UInt32)((l << 1) | 1);

        if (el > 0x1FFFFFFF)
        {
            throw new ArgumentOutOfRangeException();
        }

        int nl = encodeU29(stream, el);

        stream.Write(new byte[] { 0x01 });

        int tl = nl + 2;

        for (int i = 0; i < l; i++)
        {
            int nc = encodeWithRef(stream, refLog, value.GetValue(i));
            tl += nc;
        }

        return(tl);
    }
Example #5
0
    static int encodeWithRef(Stream stream, ReferenceLog refLog, object value)
    {
        AMF_TYPE amfType = Utils.utils.GetObjectType(value);

        switch (amfType)
        {
        case AMF_TYPE.Invalid:
            return(encodeNull(stream));

        case AMF_TYPE.Bool:
            return(encodeBool(stream, Convert.ToBoolean(value)));

        case AMF_TYPE.Int:
            return(encodeInt(stream, Convert.ToInt64(value)));

        case AMF_TYPE.Uint:
            return(encodeUint(stream, Convert.ToUInt64(value)));

        case AMF_TYPE.Float64:
            return(encodeFloat(stream, Convert.ToDouble(value)));

        case AMF_TYPE.Array:
            object[] obs = null;
            if (value is ArrayList)
            {
                obs = ((ArrayList)value).ToArray();
                throw new Exception("ArrayList Is Not Convert, Recommended byte[]");
            }
            else
            {
                List <object> list = new List <object>()
                {
                };

                Array array = (Array)(value);
                for (int i = 0; i < array.Length; i++)
                {
                    list.Add(array.GetValue(i));
                }
                obs = list.ToArray();
            }
            return(encodeArray(stream, obs, refLog));

        case AMF_TYPE.Struct:
            return(encodeArrayWithStruct(stream, value, refLog));

        case AMF_TYPE.String:
            return(encodeString(stream, Convert.ToString(value), refLog));

        case AMF_TYPE.Default:
            return(0);
        }


        return(0);
    }
Example #6
0
    static public object Decode(Stream reader)
    {
        reader.Position = 0;
        ReferenceLog referenceLog = new ReferenceLog()
        {
            Strings = new string[] { }, Bytes = new byte[][] { }
        };

        return(decodeWithRef(reader, referenceLog));
    }
Example #7
0
    static public int Encode(Stream writer, object v)
    {
        ReferenceLog referenceLog = new ReferenceLog()
        {
            Strings = new string[] { }, Bytes = new byte[][] { }
        };

        Utils.utils.Log("encode:--->>", v);
        return(encodeWithRef(writer, referenceLog, v));
    }
Example #8
0
    public void Start()
    {
        using (MemoryStream stream = new MemoryStream())
        {
            //encodeInt(stream,5);

            ReferenceLog reflog = new ReferenceLog();
            encodeArray(stream, new int[] { 1, 2, 3 }, reflog);

            byte[] datas = stream.ToArray();
            Array.Reverse(datas);
            Log(datas);
            //Console.WriteLine(this.Encode(stream, null));
            //Console.WriteLine(stream.ToArray().Length);
        }
    }
Example #9
0
    static object decodeArray(Stream stream, ReferenceLog refLog)
    {
        UInt32 l = decodeU29(stream);

        l = l >> 1;

        byte[] bs = new byte[1];

        stream.Read(bs, 0, bs.Length);

        object[] arrayList = new object[l];


        for (int i = 0; i < l; i++)
        {
            arrayList[i] = decodeWithRef(stream, refLog);
        }

        return(arrayList);
    }
Example #10
0
    static private object decodeWithRef(Stream stream, ReferenceLog refLog)
    {
        byte[] bs  = new byte[1];
        int    len = stream.Read(bs, 0, bs.Length);

        switch (bs[0])
        {
        case amf_undefine:
            return(null);

        case amf_null:
            return(null);

        case amf_false:
            return(false);

        case amf_true:
            return(true);

        case amf_integer:
            return(decodeInteger(stream));

        case amf_double:
            return(decodeFloat(stream));

        case amf_string:
            return(decodeString(stream, refLog));

        case amf_byte_array:
            return(decodeByteArray(stream, refLog));

        case amf_array:
            return(decodeArray(stream, refLog));

        default:
            break;
        }

        return(null);
    }
Example #11
0
    static int encodeArray(Stream stream, object[] value, ReferenceLog refLog)
    {
        if (value.GetType() == typeof(System.Byte[]))
        {
            List <byte> source = new List <byte>();
            for (int i = 0; i < value.Length; i++)
            {
                source.Add((byte)(value[i]));
            }

            //直接encodeByteArray
            return(encodeByteArray(stream, source.ToArray(), refLog));
        }


        writeAmfType(stream, amf_array);

        int l = value.Length;

        UInt32 el = Convert.ToUInt32((l << 1) | 1);

        if (el > 0x1FFFFFFF)
        {
            throw new ArgumentOutOfRangeException();
        }

        int nl = encodeU29(stream, el);

        stream.Write(new byte[] { 0x01 }, 0, 1);

        int tl = nl + 2;

        for (int i = 0; i < l; i++)
        {
            int nc = encodeWithRef(stream, refLog, value.GetValue(i));
            tl += nc;
        }

        return(tl);
    }
Example #12
0
    int encodeWithRef(Stream stream, ReferenceLog refLog, object value)
    {
        AMF_TYPE amfType = GetObjectType(value);

        Console.WriteLine(amfType);
        switch (amfType)
        {
        case AMF_TYPE.Invalid:
            return(encodeNull(stream));

        case AMF_TYPE.Bool:
            return(encodeBool(stream, Convert.ToBoolean(value)));

        case AMF_TYPE.Int:
            return(encodeInt(stream, Convert.ToInt64(value)));

        case AMF_TYPE.Uint:
            return(encodeUint(stream, Convert.ToUInt64(value)));

        case AMF_TYPE.Float64:
            return(encodeFloat(stream, Convert.ToDouble(value)));

        case AMF_TYPE.Array:
            return(encodeArray(stream, (Array)value, refLog));

        case AMF_TYPE.Struct:
            break;

        case AMF_TYPE.String:
            break;

        case AMF_TYPE.Default:
            break;
        }


        return(0);
    }
Example #13
0
    static int encodeByteArray(Stream stream, byte[] value, ReferenceLog refLog)
    {
        writeAmfType(stream, amf_byte_array);

        bool isRef = false;

        UInt32 l = Convert.ToUInt32(value.Length);


        if (isRef)
        {
            l = l << 1;
        }
        else
        {
            l = (l << 1) | 1;
        }

        if (l > 0x1FFFFFFF)
        {
            throw new ArgumentOutOfRangeException();
        }

        int nl = encodeU29(stream, l);


        int ns = 0;

        if (!isRef)
        {
            stream.Write(value, 0, value.Length);
            ns = value.Length;
        }


        return(ns + nl + 1);
    }
Example #14
0
    static int encodeArrayWithStruct(Stream stream, object value, ReferenceLog refLog)
    {
        //写入数组类型
        writeAmfType(stream, amf_array);



        Type tp = value.GetType();

        System.Reflection.FieldInfo[] infos = tp.GetFields();


        int l = infos.Length;


        UInt32 el = Convert.ToUInt32((l << 1) | 1);

        if (el > 0x1FFFFFFF)
        {
            throw new ArgumentOutOfRangeException();
        }

        int nl = encodeU29(stream, el);

        stream.Write(new Byte[] { 0x01 }, 0, 1);

        int tl = nl + 2;

        for (int i = 0; i < l; i += 1)
        {
            //
            int nc = encodeWithRef(stream, refLog, infos[i].GetValue(value));
            tl += nc;
        }
        //
        return(tl);
    }
Example #15
0
        public static bool Perform(object obj, GameObjectReference references, bool perform, bool reportFound)
        {
            bool immediate = false;

            bool report = true;

            if ((obj is RabbitHoleDoorJig) || (obj is PhoneCell))
            {
                report = ErrorTrap.kDebugging;
            }
            else if (obj is Lot)
            {
                immediate = true;
            }
            else if (obj is Sim)
            {
                Sim sim = obj as Sim;
                if (sim.LotHome != null)
                {
                    if ((RecoverMissingSimTask.FindPlaceholderForSim(sim.SimDescription) == null) &&
                        ((sim.SimDescription.CreatedSim == null) || (sim.SimDescription.CreatedSim == sim)))
                    {
                        immediate = true;
                    }
                }
            }

            ReferenceLog log = null;

            if (!perform)
            {
                log = new ReferenceLog("Potential Object Found: " + ErrorTrap.GetQualifiedName(obj), report, immediate);
            }

            if (references == null)
            {
                return(false);
            }

            if ((!ErrorTrap.kDebugging) && (references.Count == 0))
            {
                return(false);
            }

            if (perform)
            {
                log = new ReferenceLog("Destroyed Object Found: " + ErrorTrap.GetQualifiedName(obj), report, immediate);
            }

            log.Perform     = perform;
            log.ReportFound = reportFound;

            if ((!ErrorTrap.kDebugging) && (obj is Lot))
            {
                return(false);
            }

            List <DereferenceStack> stack = new List <DereferenceStack>();

            foreach (KeyValuePair <object, FieldInfo> pair in references)
            {
                stack.Add(new DereferenceStack(pair, new Dictionary <ReferenceWrapper, bool>(), new List <ReferenceWrapper>(), new ReferenceWrapper(obj), false, false));
            }

            bool firstFailure = true;

            int index = 0;

            while (index < stack.Count)
            {
                DereferenceStack stackObject = stack[index];
                index++;

                ReferenceWrapper key = new ReferenceWrapper(stackObject.mReference.Key);

                bool recursion = false;
                if (stackObject.ContainsKey(key))
                {
                    recursion = true;
                }

                if ((perform) && (stackObject.Count == 1))
                {
                    log.DumpLog(false);
                }

                object reference = stackObject.mReference.Key;

                string depth = "";

                for (int i = 0; i < stackObject.Count - 1; i++)
                {
                    depth += " ";
                }

                bool reset = false, success = false;

                foreach (IDereference dereference in DereferenceManager.Dereferences)
                {
                    DereferenceResult result = dereference.IPerform(stackObject.mReference, stackObject.mList, perform);
                    if (result == DereferenceResult.Found)
                    {
                        log.SetFoundSuccess();
                    }

                    if (result != DereferenceResult.Failure)
                    {
                        stackObject.mResult = depth + "  Reference " + result + ": " + reference.GetType() + " " + stackObject.mReference.Value + " (Using " + dereference.GetType().Name + ")";
                        if (report)
                        {
                            log.Add(stackObject.mResult);
                        }

                        success = true;

                        bool checkSuccess = false;

                        if (reference is GameObject)
                        {
                            stackObject.mEndFound = true;

                            checkSuccess = true;

                            GameObject gameObject = reference as GameObject;
                            if ((perform) && (!HasBeenDestroyed(gameObject)) && (!reset) && (!(reference is Sim)))
                            {
                                try
                                {
                                    reset = true;
                                    gameObject.SetObjectToReset();

                                    log.Add(depth + "  Object Reset: " + ErrorTrap.GetQualifiedName(gameObject));
                                }
                                catch //(Exception e)
                                {
                                    //Common.DebugException(gameObject, e);
                                }
                            }
                        }
                        else
                        {
                            switch (result)
                            {
                            case DereferenceResult.End:
                            case DereferenceResult.Found:
                                stackObject.mEndFound = true;
                                break;

                            case DereferenceResult.Continue:
                            case DereferenceResult.ContinueIfReferenced:
                            case DereferenceResult.Ignore:
                                bool unimportant = stackObject.mUnimportant;

                                switch (result)
                                {
                                case DereferenceResult.ContinueIfReferenced:
                                    unimportant = true;
                                    break;

                                case DereferenceResult.Ignore:
                                    unimportant = true;

                                    stackObject.mEndFound = true;
                                    break;
                                }

                                if (!recursion)
                                {
                                    if (ShouldRecurse(reference))
                                    {
                                        bool referenced = false;

                                        GameObjectReference gameReference = ObjectLookup.GetReference(key);
                                        if (gameReference != null)
                                        {
                                            foreach (KeyValuePair <object, FieldInfo> pair in gameReference)
                                            {
                                                stack.Insert(index, new DereferenceStack(pair, stackObject, key, unimportant, stackObject.mEndFound));
                                                referenced = true;
                                            }
                                        }

                                        if (!referenced)
                                        {
                                            checkSuccess = true;

                                            if (result == DereferenceResult.ContinueIfReferenced)
                                            {
                                                stackObject.mEndFound = true;
                                            }
                                        }
                                        else
                                        {
                                            stackObject.mBridge = true;
                                        }
                                    }
                                    else
                                    {
                                        stackObject.mEndFound = true;
                                    }
                                }
                                else if (result == DereferenceResult.ContinueIfReferenced)
                                {
                                    stackObject.mEndFound = true;
                                }
                                else
                                {
                                    checkSuccess = true;
                                }
                                break;

                            default:
                                if (recursion)
                                {
                                    checkSuccess = true;
                                }
                                break;
                            }
                        }

                        if (checkSuccess)
                        {
                            switch (result)
                            {
                            case DereferenceResult.End:
                            case DereferenceResult.Ignore:
                                break;

                            default:
                                if (recursion)
                                {
                                    if (!object.ReferenceEquals(key.mObject, obj))
                                    {
                                        log.SetFailure("A");
                                    }
                                    else
                                    {
                                        stackObject.mEndFound = true;
                                    }
                                }
                                else
                                {
                                    log.SetFailure("B");
                                }
                                break;
                            }
                        }
                    }
                }

                if (!success)
                {
                    bool mustRecurse = false;

                    string priority = "UNHANDLED";
                    if (recursion)
                    {
                        priority = "Recursion";

                        if (object.ReferenceEquals(key.mObject, obj))
                        {
                            stackObject.mEndFound = true;
                        }
                        else
                        {
                            stackObject.mBridge = true;
                        }
                    }
                    else if ((reference.GetType().IsArray) ||
                             (reference is IList) ||
                             (reference is IDictionary) ||
                             (reference is ICollection) ||
                             (reference.GetType().Name.Contains("ForgetfulList")) ||
                             (reference.GetType().Name.Contains("PairedListDictionary")))
                    {
                        priority    = "Bridge";
                        mustRecurse = true;

                        stackObject.mBridge = true;
                    }
                    else if (stackObject.mUnimportant)
                    {
                        priority = "Ancillary";

                        if ((reference is GameObject) || (reference is SimDescription))
                        {
                            recursion = true;
                        }
                        else
                        {
                            mustRecurse = true;
                        }

                        stackObject.mBridge = true;
                    }
                    else
                    {
                        log.ImportantFound();

                        log.SetFailure("C");
                    }

                    stackObject.mResult = depth + "  " + priority + " Reference: " + ErrorTrap.GetQualifiedName(reference) + " " + stackObject.mReference.Value;

                    if (report)
                    {
                        log.Add(stackObject.mResult);
                    }

                    bool referenced = false;
                    if (!recursion)
                    {
                        if (ShouldRecurse(reference))
                        {
                            GameObjectReference gameReference = ObjectLookup.GetReference(key);
                            if (gameReference != null)
                            {
                                foreach (KeyValuePair <object, FieldInfo> pair in gameReference)
                                {
                                    stack.Insert(index, new DereferenceStack(pair, stackObject, key, stackObject.mUnimportant, stackObject.mEndFound));
                                    referenced = true;
                                }
                            }
                        }
                        else
                        {
                            stackObject.mEndFound = true;

                            mustRecurse = false;
                        }
                    }

                    if (!referenced)
                    {
                        if (mustRecurse)
                        {
                            log.SetFailure("D");
                        }
                    }
                    else
                    {
                        stackObject.mBridge = true;
                    }
                }

                if ((!perform) && (!log.IsTotalSuccess) && (firstFailure))
                {
                    firstFailure = false;
                    log.Add(depth + "  RETAINED " + log.FailureReason);
                }
            }

            bool first = true;

            foreach (DereferenceStack stackObject in stack)
            {
                if (stackObject.mEndFound)
                {
                    continue;
                }

                if (stackObject.mBridge)
                {
                    continue;
                }

                log.EndMissing();

                if (first)
                {
                    first = false;

                    log.Add("  OPEN ENDED");
                }

                log.Add(stackObject.mResult);
            }

            log.DumpLog(false);

            Logger.ForceRecord();

            return(log.IsTotalSuccess);
        }
Example #16
0
    public int Encode(Stream stream, object v)
    {
        ReferenceLog reflog = new ReferenceLog();

        return(this.encodeWithRef(stream, reflog, v));
    }