Ejemplo n.º 1
0
        private uint GetFieldDataOrOffset(GffField f)
        {
            if (GffComponent.IsSimple(f.Type))
            {
                var lB = f.Bytes;
                if (lB.Length < 4)
                {
                    Array.Resize(ref lB, 4);
                }
                return(BitConverter.ToUInt32(lB, 0));
            }
            var br  = new LatinBinaryWriter(_gb.FieldDataBlock);
            var pos = _gb.FieldDataBlock.Position;

            switch (f.Type)
            {
            case GffType.ResRef:
                br.Write((byte)f.Bytes.Length);
                break;

            case GffType.CExoString:
            case GffType.CExoLocString:
            case GffType.Void:
                br.Write((uint)f.Bytes.Length);
                break;
            }
            br.Write(f.Bytes);
            return((uint)pos);
        }
Ejemplo n.º 2
0
        private void CreateFrames(GffComponent cpnt)
        {
            var value = cpnt as GffStruct;

            if (value != null)
            {
                var sf = new GffStructFrame();
                _gb.StructArray.Add(sf);
                DsaS.Add(sf, value);
            }
            if (!(cpnt is GffInListStruct || cpnt is GffRootStruct))
            {
                var ff = new GffFieldFrame();
                _gb.FieldArray.Add(ff);
                DfaF.Add(ff, cpnt);
            }
            if (!GffComponent.IsComposite(cpnt.Type))
            {
                return;
            }
            var cpsit = cpnt as GffComposite;

            if (cpsit == null)
            {
                return;
            }
            foreach (var child in cpsit)
            {
                CreateFrames(child);
            }
        }
Ejemplo n.º 3
0
 private static void WriteLabel(XmlElement n, GffComponent c)
 {
     if (!string.IsNullOrEmpty(c.Label))
     {
         n.SetAttribute(ALabel, c.Label);
     }
 }
Ejemplo n.º 4
0
 public new void Add(GffComponent field)
 {
     if (field is GffInListStruct)
     {
         base.Add(field);
     }
     else
     {
         throw new CompositeException(ErrorLabels.AddWrongStructureClassToList);
     }
 }
Ejemplo n.º 5
0
        private void WriteField(XmlElement n, GffComponent c)
        {
            var fld = (GffField)c;

            n.SetAttribute(AType, Enum.GetName(typeof(GffType), fld.Type));
            var data = fld.Value;

            if (data != string.Empty)
            {
                n.AppendChild(Xdoc.CreateTextNode(data));
            }
        }
Ejemplo n.º 6
0
        private void Write(XmlNode xRoot, GffComponent vChild)
        {
            XmlElement xChild;

            if (vChild is GffStruct)
            {
                xChild = Xdoc.CreateElement(EStruct);
            }
            else if (vChild is GffList)
            {
                xChild = Xdoc.CreateElement(EList);
            }
            else if (vChild is GffField)
            {
                xChild = Xdoc.CreateElement(EField);
            }
            else
            {
                throw new ComponentException("Type de composant inconnu.");
            }
            WriteLabel(xChild, vChild);
            var child = vChild as GffStruct;

            if (child != null)
            {
                WriteStruct(xChild, child);
            }
            else if (vChild is GffField)
            {
                WriteField(xChild, vChild);
            }

            xRoot.AppendChild(xChild);

            var composite = vChild as GffComposite;

            if (composite == null)
            {
                return;
            }
            var cvChild = composite;

            foreach (var vChild2 in cvChild)
            {
                Write(xChild, vChild2);
            }
        }
Ejemplo n.º 7
0
        private GffComponent CreateComponent(XmlNode node)
        {
            GffComponent cpnt = null;

            switch (node.Name)
            {
            case EStruct:
                switch (GetStructClass(node))
                {
                case SclassInField:
                    cpnt = new GffInFieldStruct(GetLabel(node), GetStructType(node));
                    break;

                case SclassInList:
                    cpnt = new GffInListStruct(GetStructType(node));
                    break;

                case SclassRoot:
                    cpnt = new GffRootStruct(GetExtention(node));
                    break;
                }
                break;

            case EList:
                cpnt = new GffList(GetLabel(node));
                break;

            case EField:
                cpnt = new GffField(GetLabel(node), GetFieldType(node), GetFieldValue(node));
                break;
            }
            var composite = cpnt as GffComposite;

            if (composite == null)
            {
                return(cpnt);
            }
            var cpsit = composite;

            foreach (XmlNode child in node.ChildNodes)
            {
                cpsit.Add(CreateComponent(child));
            }
            return(cpnt);
        }
Ejemplo n.º 8
0
        private GffComponent CreateComponent(uint fIndex)
        {
            MemoryStream dataStream;
            var          f      = _gbase.FieldArray[(int)fIndex];
            var          fLblId = f.LabelIndex;
            var          fLbl   = _gbase.LabelArray[(int)fLblId];
//            if (fLbl == null) {
//                throw new NotImplementedException();
//            }
            var fType = (GffType)f.Type;

            if (GffComponent.IsComposite(fType))
            {
                if (fType == GffType.Struct)
                {
                    // On va chercher la frame qui lui correspond.
                    var sIndex = f.DataOrDataOffset;
                    var s      = _gbase.StructArray[(int)sIndex];
                    var sType  = s.Type;
                    var vs     = new GffInFieldStruct(fLbl, sType);

                    PopulateStruct(vs, GetStructFieldIndices(s));

                    return(vs);
                }
                if (fType == GffType.List)
                {
                    var br = new LatinBinaryReader(_gbase.ListIndicesArray)
                    {
                        Stream = { Position = f.DataOrDataOffset }
                    };
                    var size         = (int)br.ReadUInt32();
                    var vl           = new GffList(fLbl);
                    var structIdList = br.GetUInt32List(size);
                    foreach (var structId in structIdList)
                    {
                        var sFrame = _gbase.StructArray[(int)structId];
                        var vls    = new GffInListStruct(sFrame.Type);
                        PopulateStruct(vls, GetStructFieldIndices(sFrame));
                        vl.Add(vls);
                    }
                    return(vl);
                }
                throw new CompositeException(ErrorLabels.UnknownCompositeType);
            }
            if (GffComponent.IsSimple(fType))
            {
                dataStream = new MemoryStream(BitConverter.GetBytes(f.DataOrDataOffset));
            }
            else if (GffComponent.IsLarge(fType))
            {
                var br  = new LatinBinaryReader(_gbase.FieldDataBlock);
                var pos = br.Stream.Position;
                br.Stream.Position = f.DataOrDataOffset;
                var size = 0;

                #region Switch de détermination de la taille.

                switch (fType)
                {
                case GffType.Dword64:
                    size = 8;
                    break;

                case GffType.Int64:
                    size = sizeof(long);
                    break;

                case GffType.Double:
                    size = sizeof(double);
                    break;

                case GffType.ResRef:
                    size = br.ReadByte();
                    break;

                case GffType.CExoString:
                case GffType.CExoLocString:
                case GffType.Void:
                    size = (int)br.ReadUInt32();
                    break;

                case GffType.Byte:
                    break;

                case GffType.Char:
                    break;

                case GffType.Word:
                    break;

                case GffType.Short:
                    break;

                case GffType.Dword:
                    break;

                case GffType.Int:
                    break;

                case GffType.Float:
                    break;

                case GffType.Struct:
                    break;

                case GffType.List:
                    break;

                case GffType.Invalid:
                    break;

                default:
                    throw new FieldException(ErrorLabels.UnknownLargeFieldType);
                }

                #endregion

                dataStream         = new MemoryStream(br.ReadBytes(size));
                br.Stream.Position = pos;
            }
            else
            {
                throw new FieldException(ErrorLabels.UnknownFieldType);
            }
            return(new GffField(fLbl, fType, dataStream.ToArray()));
        }