Example #1
0
        private void ParseElement(BinaryWriter writer, Dna.StructDecl fileStruct, Dna.ElementDecl memoryElement, long structOffset)
        {
            long elementOffset;

            Dna.ElementDecl elementOld = GetFileElement(fileStruct, memoryElement, out elementOffset);
            if (elementOld != null)
            {
                Dna.StructDecl typeStructOld = _fileDna.GetStruct(memoryElement.Type.Name);
                int            arrayLength   = elementOld.NameInfo.ArrayLength;
                for (int i = 0; i < arrayLength; i++)
                {
                    long subStructOffset = structOffset + i * typeStructOld.Type.Length + elementOffset;
                    ParseStruct(writer, memoryElement.Type.Struct, typeStructOld, subStructOffset);
                }
            }
        }
Example #2
0
 protected Dna.ElementDecl GetFileElement(Dna.StructDecl fileStruct, Dna.ElementDecl lookupElement, out long elementOffset)
 {
     elementOffset = 0;
     foreach (Dna.ElementDecl element in fileStruct.Elements)
     {
         if (element.NameInfo.Equals(lookupElement.NameInfo))
         {
             if (element.Type.Name.Equals(lookupElement.Type.Name))
             {
                 return(element);
             }
             break;
         }
         elementOffset += _fileDna.GetElementSize(element);
     }
     return(null);
 }
Example #3
0
 protected long GetFileElement(Dna.StructDecl firstStruct, Dna.ElementDecl lookupElement, long data, out Dna.ElementDecl found)
 {
     foreach (Dna.ElementDecl element in firstStruct.Elements)
     {
         if (element.Name.Equals(lookupElement.Name))
         {
             if (element.Type.Name.Equals(lookupElement.Type.Name))
             {
                 found = element;
                 return(data);
             }
             found = null;
             return(0);
         }
         data += _fileDna.GetElementSize(element);
     }
     found = null;
     return(0);
 }
Example #4
0
        protected void WriteElement(BinaryWriter writer, Dna.StructDecl fileStruct, Dna.ElementDecl memoryElement, long structOffset)
        {
            bool brokenDna = (Flags & FileFlags.BrokenDna) != 0;

            int elementOffset;

            Dna.ElementDecl fileElement = fileStruct.FindElement(_fileDna, brokenDna, memoryElement.NameInfo, out elementOffset);

            ChunkReader.BaseStream.Position = structOffset + elementOffset;

            if (fileElement == null)
            {
                int elementLength = _memoryDna.GetElementSize(memoryElement);
                writer.BaseStream.Position += elementLength;
            }
            else if (fileElement.NameInfo.Name[0] == '*')
            {
                SafeSwapPtr(writer, ChunkReader);
            }
            else if (fileElement.Type.Name.Equals(memoryElement.Type.Name))
            {
                int elementLength = _fileDna.GetElementSize(fileElement);
                if (elementLength != _memoryDna.GetElementSize(memoryElement))
                {
                    throw new InvalidDataException();
                }
                byte[] mem = new byte[elementLength];
                ChunkReader.Read(mem, 0, elementLength);
                writer.Write(mem);
            }
            else
            {
                throw new InvalidDataException();
                //GetElement(arrayLen, lookupType, type, data, strcData);
            }
        }
Example #5
0
        protected void GetMatchingFileDna(Dna.StructDecl dna, Dna.ElementDecl lookupElement, BinaryWriter strcData, long data, bool fixupPointers)
        {
            // find the matching memory dna data
            // to the file being loaded. Fill the
            // memory with the file data...

            foreach (Dna.ElementDecl element in dna.Elements)
            {
                int eleLen = _fileDna.GetElementSize(element);
                if ((_flags & FileFlags.BrokenDna) != 0)
                {
                    if (element.Type.Name.Equals("short") && element.Name.Name.Equals("int"))
                    {
                        eleLen = 0;
                    }
                }

                if (lookupElement.Name.Equals(element.Name))
                {
                    int arrayLen = element.Name.ArraySizeNew;

                    MemoryStream dataStream = new MemoryStream(_fileBuffer, false);
                    dataStream.Position = data;
                    BinaryReader dataReader = new BinaryReader(dataStream);

                    if (element.Name.Name[0] == '*')
                    {
                        SafeSwapPtr(strcData, dataReader);

                        if (fixupPointers)
                        {
                            if (arrayLen > 1)
                            {
                                throw new NotImplementedException();
                            }
                            else
                            {
                                if (element.Name.Name[1] == '*')
                                {
                                    throw new NotImplementedException();
                                }
                                else
                                {
                                    //_chunkPointerFixupArray.Add(strcData.BaseStream.Position);
                                }
                            }
                        }
                        else
                        {
                            //Console.WriteLine("skipped {0} {1} : {2:X}", element.Type.Name, element.Name.Name, strcData.BaseStream.Position);
                        }
                    }
                    else if (element.Type.Name.Equals(lookupElement.Type.Name))
                    {
                        byte[] mem = new byte[eleLen];
                        dataReader.Read(mem, 0, eleLen);
                        strcData.Write(mem);
                    }
                    else
                    {
                        throw new NotImplementedException();
                        //GetElement(arrayLen, lookupType, type, data, strcData);
                    }

                    dataReader.Dispose();
                    dataStream.Dispose();

                    break;
                }
                data += eleLen;
            }
        }