Пример #1
0
        public override object[] GetStructures()
        {
            object[] Res = new object[0];

            int SizeOfTextHeader = Marshal.SizeOf(typeof(MuDef.MUFile_TextItemHead));
            int SizeOfTextBody   = Marshal.SizeOf(typeof(MuDef.MUFile_Text));

            m_FileBuffer = new byte[SizeOfTextBody];

            try
            {
                //read BMD head
                m_FileStream.Read(m_FileBuffer, 0, Marshal.SizeOf(typeof(MuDef.TBmdHead)));

                object objBmdHeader = Marshal.PtrToStructure(
                    Marshal.UnsafeAddrOfPinnedArrayElement(m_FileBuffer, 0), typeof(MuDef.TBmdHead));

                MuDef.TBmdHead BmdHead = (MuDef.TBmdHead)objBmdHeader;

                //initialize Res
                Res = new object[BmdHead.LineCount];

                MuDef.MUFile_TextItemHead TextHead;
                MuDef.MUFile_TextManaged  TextObj;

                for (int i = 0; i < BmdHead.LineCount; i++)
                {
                    m_FileStream.Read(m_FileBuffer, 0, SizeOfTextHeader);
                    object objItemHeader = Marshal.PtrToStructure(
                        Marshal.UnsafeAddrOfPinnedArrayElement(m_FileBuffer, 0), typeof(MuDef.MUFile_TextItemHead));


                    TextHead = (MuDef.MUFile_TextItemHead)objItemHeader;

                    m_FileStream.Read(m_FileBuffer, 0, TextHead.LineLen);
                    XorFilter(ref m_FileBuffer, TextHead.LineLen);

                    string Tmp = ASCIIEncoding.ASCII.GetString(m_FileBuffer, 0, TextHead.LineLen);

                    TextObj = new MuDef.MUFile_TextManaged()
                    {
                        LineNr = TextHead.LineNr,
                        Text   = Tmp
                    };
                    Res[i] = TextObj;
                }
            }
            //todo: prevent
            catch (IndexOutOfRangeException)
            {
            }
            catch (Exception)
            {
                MessageBox.Show("Failed to read file structures.");
            }

            CloseSourceFile();
            return(Res);
        }
Пример #2
0
        public override void SaveAsBmd(string OutputPath, DataGridView dgv)
        {
            try
            {
                int FilledRowCount = dgv.Rows.Count - 1;

                FileStream OutputStream = File.Open(OutputPath, FileMode.Create, FileAccess.Write);

                MuDef.TBmdHead BmdHeader = new MuDef.TBmdHead()
                {
                    Version   = MuDef.cBmdVersion,
                    LineCount = FilledRowCount
                };

                MuDef.MUFile_TextItemHead TextItemHeader;


                //write bmd header
                int nBmdHeaderSize  = Marshal.SizeOf(typeof(MuDef.TBmdHead));
                int nTextHeaderSize = Marshal.SizeOf(typeof(MuDef.MUFile_TextItemHead));

                OutputStream.Write(StructureToByteArray(BmdHeader), 0, nBmdHeaderSize);


                //write text header
                for (int i = 0; i < FilledRowCount; i++)
                {
                    TextItemHeader = new MuDef.MUFile_TextItemHead()
                    {
                        LineNr  = int.Parse(dgv.Rows[i].Cells[0].Value.ToString()),
                        LineLen = dgv.Rows[i].Cells[1].Value.ToString().Length
                    };


                    OutputStream.Write(StructureToByteArray(TextItemHeader), 0, nTextHeaderSize);

                    if (TextItemHeader.LineLen > 0)
                    {
                        byte[] text_bytes = ASCIIEncoding.ASCII.GetBytes(dgv.Rows[i].Cells[1].Value.ToString());


                        XorFilter(ref text_bytes, text_bytes.Length);

                        OutputStream.Write(text_bytes, 0, TextItemHeader.LineLen);
                    }
                }

                OutputStream.Flush();
                OutputStream.Close();
            }
            catch
            { MessageBox.Show("Failed to save file."); }
        }