Exemplo n.º 1
0
        /// <summary>
        /// Generate an XmlElement representation of the BattleStepTarget for saving to file.
        /// </summary>
        /// <param name="xmldoc">The parent XmlDocument.</param>
        /// <returns>An XmlElement representing the BattleStepTarget.</returns>
        public new XmlElement ToXml(XmlDocument xmldoc)
        {
            XmlElement xmlelBattleStepTarget = xmldoc.CreateElement("BattleStepTarget");

            xmlelBattleStepTarget.AppendChild(base.ToXml(xmldoc));
            Global.SaveData(xmldoc, xmlelBattleStepTarget, "StackKey", StackKey.ToString("X"));
            Global.SaveData(xmldoc, xmlelBattleStepTarget, "TargetKey", TargetKey.ToString("X"));

            return(xmlelBattleStepTarget);
        }
        public void UpdateMemorySegements()
        {
            if (null == TypeInfoOrNull || null == TypeInfoOrNull.PureName)
            {
                return;
            }

            List <MemorySegmentViewModel> segments;
            var stackKeys = new Stack <StackKey>();

            {
                TypeInfo pureType       = PureTypeManager.GetType(TypeInfoOrNull.PureName);
                uint     sizePerSegment = TypeInfoOrNull.PointerLevel > 0 ? TypeInfo.POINTER_SIZE : pureType.Size;
                uint     totalLength    = Size / sizePerSegment;
                uint     remainSegment  = Size % sizePerSegment;

                segments = new List <MemorySegmentViewModel>((int)totalLength);

                for (uint i = 0; i < totalLength; ++i)
                {
                    var vm = new MemorySegmentViewModel()
                    {
                        TypeName         = TypeInfoOrNull.FullNameOrNull,
                        MemberNameOrNull = TypeInfoOrNull.MemberNameOrNull,
                        Memory           = new ArraySegment <byte>(ByteValues, (int)(i * sizePerSegment), (int)sizePerSegment),
                        Address          = Address + i * sizePerSegment,
                        AncestorOrNull   = null,
                        Children         = new ObservableCollection <List <MemorySegmentViewModel> >()
                    };

                    segments.Add(vm);
                    stackKeys.Push(new StackKey()
                    {
                        ViewModel = vm,
                        Type      = TypeInfoOrNull
                    });
                }
            }

            while (stackKeys.Count > 0)
            {
                StackKey popKey = stackKeys.Pop();

                if (popKey.Type.PointerLevel > 0 || popKey.Type.ArrayOrFunctionPointerLevels.Count > 0)
                {
                    continue;
                }

                foreach (TypeInfo memberType in popKey.Type.Members)
                {
                    uint totalLength    = memberType.GetTotalLength();
                    uint sizePerSegment = memberType.Size / totalLength;

                    TypeInfo elementOfArrayType = memberType.GetElementOfArray();

                    var memberArray = new List <MemorySegmentViewModel>((int)totalLength);
                    for (uint i = 0; i < totalLength; ++i)
                    {
                        var vm = new MemorySegmentViewModel()
                        {
                            TypeName         = totalLength > 1 ? elementOfArrayType.FullNameOrNull : memberType.FullNameOrNull,
                            MemberNameOrNull = memberType.MemberNameOrNull,
                            Memory           = new ArraySegment <byte>(ByteValues, popKey.ViewModel.Memory.Offset + (int)((memberType.Offset - popKey.Type.Offset) + i * sizePerSegment), (int)sizePerSegment),
                            Address          = popKey.ViewModel.Address + (memberType.Offset - popKey.Type.Offset) + i * sizePerSegment,
                            AncestorOrNull   = popKey.ViewModel,
                            Children         = new ObservableCollection <List <MemorySegmentViewModel> >()
                        };

                        stackKeys.Push(new StackKey()
                        {
                            ViewModel = vm,
                            Type      = memberType
                        });
                        memberArray.Add(vm);
                    }
                    popKey.ViewModel.Children.Add(memberArray);
                }
            }

            MemorySegments = segments;
        }