Пример #1
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string file = (string)e.Argument;

            try
            {
                m_dbreader = DBReaderFactory.GetReader(file, m_definition);
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];
            int[]    sizes = new int[m_fields.Count];

            for (int j = 0; j < m_fields.Count; ++j)
            {
                types[j] = m_fields[j].Attributes["type"].Value;
                sizes[j] = int.Parse(m_fields[j].Attributes["size"]?.Value ?? "1");
            }

            m_formats = new XmlAttribute[sizes.Sum()];
            for (int j = 0, k = 0; j < m_fields.Count; ++j, ++k)
            {
                for (var s = 0; s < sizes[j]; ++s)
                {
                    m_formats[k] = m_fields[j].Attributes["format"];
                }
            }

            // hack for *.adb files (because they don't have FieldsCount)
            bool notADB = !(m_dbreader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notWDB = !(m_dbreader is WDBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notSTL = !(m_dbreader is STLReader);
            // hack for *.db2 files v3 (because they don't have FieldsCount)
            bool notDB3 = !(m_dbreader is DB3Reader);

            if (m_fields.Count != m_dbreader.FieldsCount && notADB && notWDB && notSTL && notDB3)
            {
                string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_dbreader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable        = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            //bool extraData = false;

            foreach (var row in m_dbreader.Rows) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                using (BinaryReader br = row)
                {
                    int j = 0;
                    if (m_dbreader.HasSeparateIndexColumn)
                    {
                        dataRow[j++] = br.ReadUInt32();
                    }

                    for (int c = 0; c < m_fields.Count; ++c)    // Add cells
                    {
                        for (var arrSize = 0; arrSize < sizes[c]; ++arrSize, ++j)
                        {
                            var type = types[c];
                            if (type == "int" || type == "uint")
                            {
                                var typeOverride = m_dbreader.GetIntLength(c);
                                if (typeOverride != null)
                                {
                                    type = typeOverride;
                                }
                            }

                            switch (type)
                            {
                            case "long":
                                dataRow[j] = br.ReadInt64();
                                break;

                            case "ulong":
                                dataRow[j] = br.ReadUInt64();
                                break;

                            case "int":
                                dataRow[j] = br.ReadInt32();
                                break;

                            case "uint":
                                dataRow[j] = br.ReadUInt32();
                                break;

                            case "short":
                                dataRow[j] = br.ReadInt16();
                                break;

                            case "ushort":
                                dataRow[j] = br.ReadUInt16();
                                break;

                            case "sbyte":
                                dataRow[j] = br.ReadSByte();
                                break;

                            case "byte":
                                dataRow[j] = br.ReadByte();
                                break;

                            case "float":
                                dataRow[j] = br.ReadSingle();
                                break;

                            case "double":
                                dataRow[j] = br.ReadDouble();
                                break;

                            case "string":
                                if (m_dbreader.HasInlineStrings)
                                {
                                    dataRow[j] = br.ReadStringNull();
                                }
                                else if (m_dbreader is STLReader)
                                {
                                    int offset = br.ReadInt32();
                                    dataRow[j] = (m_dbreader as STLReader).ReadString(offset);
                                }
                                else
                                {
                                    try
                                    {
                                        dataRow[j] = m_dbreader.StringTable[br.ReadInt32()];
                                    }
                                    catch
                                    {
                                        dataRow[j] = "Invalid string index!";
                                    }
                                }
                                break;

                            case "intarray":
                            {
                                int columns = br.ReadByte();
                                var sb      = new StringBuilder();
                                for (var c2 = 0; c2 < columns; ++c2)
                                {
                                    sb.Append(br.ReadUInt32()).Append(", ");
                                }

                                dataRow[j] = sb.ToString();
                                break;
                            }

                            case "int24":
                                dataRow[j] = br.ReadInt24();
                                break;

                            case "uint24":
                                dataRow[j] = br.ReadUInt24();
                                break;

                            default:
                                throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", type));
                            }
                        }
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / m_dbreader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            //if (extraData)
            //{
            //    MessageBox.Show("extra data detected!");
            //}

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
            {
                SetDataSource(m_dataTable.DefaultView);
            }

            e.Result = file;
        }
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            var file = (string)e.Argument;

            try
            {
                m_reader = DBReaderFactory.GetReader(file);
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];

            for (var j = 0; j < m_fields.Count; ++j)
                types[j] = m_fields[j].Attributes["type"].Value;

            // hack for *.adb files (because they don't have FieldsCount)
            var notADB = !(m_reader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            var notWDB = !(m_reader is WDBReader);

            if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB)
            {
                var msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            for (var i = 0; i < m_reader.RecordsCount; ++i) // Add rows
            {
                var dataRow = m_dataTable.NewRow();

                #region Test
                //var bytes = m_reader.GetRowAsByteArray(i);
                //unsafe
                //{
                //    fixed (void* b = bytes)
                //    {
                //        IntPtr ptr = new IntPtr(b);

                //        int offset = 0;

                //        for (var j = 0; j < m_fields.Count; ++j)    // Add cells
                //        {
                //            switch (types[j])
                //            {
                //                case "long":
                //                    dataRow[j] = *(long*)(ptr + offset);
                //                    offset += 8;
                //                    break;
                //                case "ulong":
                //                    dataRow[j] = *(ulong*)(ptr + offset);
                //                    offset += 8;
                //                    break;
                //                case "int":
                //                    dataRow[j] = *(int*)(ptr + offset);
                //                    offset += 4;
                //                    break;
                //                case "uint":
                //                    dataRow[j] = *(uint*)(ptr + offset);
                //                    offset += 4;
                //                    break;
                //                case "short":
                //                    dataRow[j] = *(short*)(ptr + offset);
                //                    offset += 2;
                //                    break;
                //                case "ushort":
                //                    dataRow[j] = *(ushort*)(ptr + offset);
                //                    offset += 2;
                //                    break;
                //                case "sbyte":
                //                    dataRow[j] = *(sbyte*)(ptr + offset);
                //                    offset += 1;
                //                    break;
                //                case "byte":
                //                    dataRow[j] = *(byte*)(ptr + offset);
                //                    offset += 1;
                //                    break;
                //                case "float":
                //                    dataRow[j] = *(float*)(ptr + offset);
                //                    offset += 4;
                //                    break;
                //                case "double":
                //                    dataRow[j] = *(double*)(ptr + offset);
                //                    offset += 8;
                //                    break;
                //                case "string":
                //                    dataRow[j] = m_reader.StringTable[*(int*)(ptr + offset)];
                //                    offset += 4;
                //                    break;
                //                default:
                //                    throw new Exception(String.Format("Unknown field type {0}!", m_fields[j].Attributes["type"].Value));
                //            }
                //        }
                //    }
                //}
                #endregion
                var br = m_reader[i];

                for (var j = 0; j < m_fields.Count; ++j)    // Add cells
                {
                    switch (types[j])
                    {
                        case "long":
                            dataRow[j] = br.ReadInt64();
                            break;
                        case "ulong":
                            dataRow[j] = br.ReadUInt64();
                            break;
                        case "int":
                            dataRow[j] = br.ReadInt32();
                            break;
                        case "uint":
                            dataRow[j] = br.ReadUInt32();
                            break;
                        case "short":
                            dataRow[j] = br.ReadInt16();
                            break;
                        case "ushort":
                            dataRow[j] = br.ReadUInt16();
                            break;
                        case "sbyte":
                            dataRow[j] = br.ReadSByte();
                            break;
                        case "byte":
                            dataRow[j] = br.ReadByte();
                            break;
                        case "float":
                            dataRow[j] = br.ReadSingle();
                            break;
                        case "double":
                            dataRow[j] = br.ReadDouble();
                            break;
                        case "string":
                            dataRow[j] = m_reader is WDBReader ? br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()];
                            break;
                        default:
                            throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j]));
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
                SetDataSource(m_dataTable.DefaultView);

            e.Result = file;
        }
Пример #3
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string file = (string)e.Argument;

            try
            {
                m_dbreader = DBReaderFactory.GetReader(file);
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];

            for (int j = 0; j < m_fields.Count; ++j)
                types[j] = m_fields[j].Attributes["type"].Value;

            // hack for *.adb files (because they don't have FieldsCount)
            bool notADB = !(m_dbreader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notWDB = !(m_dbreader is WDBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notSTL = !(m_dbreader is STLReader);

            int fcount = GetFieldsCount(m_fields);
            if (fcount != m_dbreader.FieldsCount && notADB && notWDB && notSTL)
            {
                string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), fcount, m_dbreader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            //bool extraData = false;

            for (int i = 0; i < m_dbreader.RecordsCount; ++i) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                using (BinaryReader br = m_dbreader[i])
                {
                    for (int j = 0; j < m_fields.Count; ++j)    // Add cells
                    {
                        switch (types[j])
                        {
                            case "long":
                                dataRow[j] = br.ReadInt64();
                                break;
                            case "ulong":
                                dataRow[j] = br.ReadUInt64();
                                break;
                            case "int":
                                dataRow[j] = br.ReadInt32();
                                break;
                            case "uint":
                                dataRow[j] = br.ReadUInt32();
                                break;
                            case "short":
                                dataRow[j] = br.ReadInt16();
                                break;
                            case "ushort":
                                dataRow[j] = br.ReadUInt16();
                                break;
                            case "sbyte":
                                dataRow[j] = br.ReadSByte();
                                break;
                            case "byte":
                                dataRow[j] = br.ReadByte();
                                break;
                            case "float":
                                dataRow[j] = br.ReadSingle();
                                break;
                            case "double":
                                dataRow[j] = br.ReadDouble();
                                break;
                            case "string":
                                if (m_dbreader is WDBReader)
                                    dataRow[j] = br.ReadStringNull();
                                else if (m_dbreader is STLReader)
                                {
                                    int offset = br.ReadInt32();
                                    dataRow[j] = (m_dbreader as STLReader).ReadString(offset);
                                }
                                else
                                {
                                    try
                                    {
                                        dataRow[j] = m_dbreader.StringTable[br.ReadInt32()];
                                    }
                                    catch
                                    {
                                        dataRow[j] = "Invalid string index!";
                                    }
                                }
                                break;
                            default:
                                throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j]));
                        }
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / (float)m_dbreader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            //if (extraData)
            //{
            //    MessageBox.Show("extra data detected!");
            //}

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
                SetDataSource(m_dataTable.DefaultView);

            e.Result = file;
        }
Пример #4
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            var file = (string)e.Argument;

            try
            {
                var ext = Path.GetExtension(file).ToUpperInvariant();
                if (ext == ".DBC")
                {
                    m_reader = new DBCReader(file);
                }
                else if (ext == ".DB2")
                {
                    m_reader = new DB2Reader(file);
                }
                else if (ext == ".ADB")
                {
                    m_reader = new ADBReader(file);
                }
                else if (ext == ".WDB")
                {
                    m_reader = new WDBReader(file);
                }
                else
                {
                    throw new InvalidDataException(String.Format("Unknown file type {0}", ext));
                }
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];

            for (var j = 0; j < m_fields.Count; ++j)
            {
                types[j] = m_fields[j].Attributes["type"].Value;
            }

            // hack for *.adb files (because they don't have FieldsCount)
            var notADB = !(m_reader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            var notWDB = !(m_reader is WDBReader);

            if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB)
            {
                var msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable        = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            for (var i = 0; i < m_reader.RecordsCount; ++i) // Add rows
            {
                var dataRow = m_dataTable.NewRow();

                #region Test
                //var bytes = m_reader.GetRowAsByteArray(i);
                //unsafe
                //{
                //    fixed (void* b = bytes)
                //    {
                //        IntPtr ptr = new IntPtr(b);

                //        int offset = 0;

                //        for (var j = 0; j < m_fields.Count; ++j)    // Add cells
                //        {
                //            switch (types[j])
                //            {
                //                case "long":
                //                    dataRow[j] = *(long*)(ptr + offset);
                //                    offset += 8;
                //                    break;
                //                case "ulong":
                //                    dataRow[j] = *(ulong*)(ptr + offset);
                //                    offset += 8;
                //                    break;
                //                case "int":
                //                    dataRow[j] = *(int*)(ptr + offset);
                //                    offset += 4;
                //                    break;
                //                case "uint":
                //                    dataRow[j] = *(uint*)(ptr + offset);
                //                    offset += 4;
                //                    break;
                //                case "short":
                //                    dataRow[j] = *(short*)(ptr + offset);
                //                    offset += 2;
                //                    break;
                //                case "ushort":
                //                    dataRow[j] = *(ushort*)(ptr + offset);
                //                    offset += 2;
                //                    break;
                //                case "sbyte":
                //                    dataRow[j] = *(sbyte*)(ptr + offset);
                //                    offset += 1;
                //                    break;
                //                case "byte":
                //                    dataRow[j] = *(byte*)(ptr + offset);
                //                    offset += 1;
                //                    break;
                //                case "float":
                //                    dataRow[j] = *(float*)(ptr + offset);
                //                    offset += 4;
                //                    break;
                //                case "double":
                //                    dataRow[j] = *(double*)(ptr + offset);
                //                    offset += 8;
                //                    break;
                //                case "string":
                //                    dataRow[j] = m_reader.StringTable[*(int*)(ptr + offset)];
                //                    offset += 4;
                //                    break;
                //                default:
                //                    throw new Exception(String.Format("Unknown field type {0}!", m_fields[j].Attributes["type"].Value));
                //            }
                //        }
                //    }
                //}
                #endregion
                var br = m_reader[i];

                for (var j = 0; j < m_fields.Count; ++j)    // Add cells
                {
                    switch (types[j])
                    {
                    case "long":
                        dataRow[j] = br.ReadInt64();
                        break;

                    case "ulong":
                        dataRow[j] = br.ReadUInt64();
                        break;

                    case "int":
                        dataRow[j] = br.ReadInt32();
                        break;

                    case "uint":
                        dataRow[j] = br.ReadUInt32();
                        break;

                    case "short":
                        dataRow[j] = br.ReadInt16();
                        break;

                    case "ushort":
                        dataRow[j] = br.ReadUInt16();
                        break;

                    case "sbyte":
                        dataRow[j] = br.ReadSByte();
                        break;

                    case "byte":
                        dataRow[j] = br.ReadByte();
                        break;

                    case "float":
                        dataRow[j] = br.ReadSingle();
                        break;

                    case "double":
                        dataRow[j] = br.ReadDouble();
                        break;

                    case "string":
                        dataRow[j] = m_reader is WDBReader?br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()];

                        break;

                    default:
                        throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j]));
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
            {
                SetDataSource(m_dataTable.DefaultView);
            }

            e.Result = file;
        }
Пример #5
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string file = (string)e.Argument;

            try
            {
                m_dbreader = DBReaderFactory.GetReader(file, m_definition);
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];
            int[] sizes = new int[m_fields.Count];

            for (int j = 0; j < m_fields.Count; ++j)
            {
                types[j] = m_fields[j].Attributes["type"].Value;
                sizes[j] = int.Parse(m_fields[j].Attributes["size"]?.Value ?? "1");
            }

            m_formats = new XmlAttribute[sizes.Sum()];
            for (int j = 0, k = 0; j < m_fields.Count; ++j, ++k)
                for (var s = 0; s < sizes[j]; ++s)
                    m_formats[k] = m_fields[j].Attributes["format"];

            // hack for *.adb files (because they don't have FieldsCount)
            bool notADB = !(m_dbreader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notWDB = !(m_dbreader is WDBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notSTL = !(m_dbreader is STLReader);
            // hack for *.db2 files v3 (because they don't have FieldsCount)
            bool notDB3 = !(m_dbreader is DB3Reader);

            if (m_fields.Count != m_dbreader.FieldsCount && notADB && notWDB && notSTL && notDB3)
            {
                string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count , m_dbreader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            //bool extraData = false;

            foreach (var row in m_dbreader.Rows) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                using (BinaryReader br = row)
                {
                    int j = 0;
                    if (m_dbreader.HasSeparateIndexColumn)
                        dataRow[j++] = br.ReadUInt32();

                    for (int c = 0; c < m_fields.Count; ++c)    // Add cells
                    {
                        for (var arrSize = 0; arrSize < sizes[c]; ++arrSize, ++j)
                        {
                            var type = types[c];
                            if (type == "int" || type == "uint")
                            {
                                var typeOverride = m_dbreader.GetIntLength(c);
                                if (typeOverride != null)
                                    type = typeOverride;
                            }

                            switch (type)
                            {
                                case "long":
                                    dataRow[j] = br.ReadInt64();
                                    break;
                                case "ulong":
                                    dataRow[j] = br.ReadUInt64();
                                    break;
                                case "int":
                                    dataRow[j] = br.ReadInt32();
                                    break;
                                case "uint":
                                    dataRow[j] = br.ReadUInt32();
                                    break;
                                case "short":
                                    dataRow[j] = br.ReadInt16();
                                    break;
                                case "ushort":
                                    dataRow[j] = br.ReadUInt16();
                                    break;
                                case "sbyte":
                                    dataRow[j] = br.ReadSByte();
                                    break;
                                case "byte":
                                    dataRow[j] = br.ReadByte();
                                    break;
                                case "float":
                                    dataRow[j] = br.ReadSingle();
                                    break;
                                case "double":
                                    dataRow[j] = br.ReadDouble();
                                    break;
                                case "string":
                                    if (m_dbreader.HasInlineStrings)
                                        dataRow[j] = br.ReadStringNull();
                                    else if (m_dbreader is STLReader)
                                    {
                                        int offset = br.ReadInt32();
                                        dataRow[j] = (m_dbreader as STLReader).ReadString(offset);
                                    }
                                    else
                                    {
                                        try
                                        {
                                            dataRow[j] = m_dbreader.StringTable[br.ReadInt32()];
                                        }
                                        catch
                                        {
                                            dataRow[j] = "Invalid string index!";
                                        }
                                    }
                                    break;
                                case "intarray":
                                    {
                                        int columns = br.ReadByte();
                                        var sb = new StringBuilder();
                                        for (var c2 = 0; c2 < columns; ++c2)
                                            sb.Append(br.ReadUInt32()).Append(", ");

                                        dataRow[j] = sb.ToString();
                                        break;
                                    }
                                case "int24":
                                    dataRow[j] = br.ReadInt24();
                                    break;
                                case "uint24":
                                    dataRow[j] = br.ReadUInt24();
                                    break;
                                default:
                                    throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", type));
                            }
                        }
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / m_dbreader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            //if (extraData)
            //{
            //    MessageBox.Show("extra data detected!");
            //}

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
                SetDataSource(m_dataTable.DefaultView);

            e.Result = file;
        }
Пример #6
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string file = (string)e.Argument;

            try
            {
                m_reader = DBReaderFactory.GetReader(file);
            }
            catch (Exception ex)
            {
                ShowErrorMessageBox(ex.Message);
                e.Cancel = true;
                return;
            }

            m_fields = m_definition.GetElementsByTagName("field");

            string[] types = new string[m_fields.Count];

            for (int j = 0; j < m_fields.Count; ++j)
            {
                types[j] = m_fields[j].Attributes["type"].Value;
            }

            // hack for *.adb files (because they don't have FieldsCount)
            bool notADB = !(m_reader is ADBReader);
            // hack for *.wdb files (because they don't have FieldsCount)
            bool notWDB = !(m_reader is WDBReader);

            if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB)
            {
                string msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount);
                ShowErrorMessageBox(msg);
                e.Cancel = true;
                return;
            }

            m_dataTable        = new DataTable(Path.GetFileName(file));
            m_dataTable.Locale = CultureInfo.InvariantCulture;

            CreateColumns();                                // Add columns

            CreateIndexes();                                // Add indexes

            for (int i = 0; i < m_reader.RecordsCount; ++i) // Add rows
            {
                DataRow dataRow = m_dataTable.NewRow();

                BinaryReader br = m_reader[i];

                for (int j = 0; j < m_fields.Count; ++j)    // Add cells
                {
                    switch (types[j])
                    {
                    case "long":
                        dataRow[j] = br.ReadInt64();
                        break;

                    case "ulong":
                        dataRow[j] = br.ReadUInt64();
                        break;

                    case "int":
                        dataRow[j] = br.ReadInt32();
                        break;

                    case "uint":
                        dataRow[j] = br.ReadUInt32();
                        break;

                    case "short":
                        dataRow[j] = br.ReadInt16();
                        break;

                    case "ushort":
                        dataRow[j] = br.ReadUInt16();
                        break;

                    case "sbyte":
                        dataRow[j] = br.ReadSByte();
                        break;

                    case "byte":
                        dataRow[j] = br.ReadByte();
                        break;

                    case "float":
                        dataRow[j] = br.ReadSingle();
                        break;

                    case "double":
                        dataRow[j] = br.ReadDouble();
                        break;

                    case "string":
                        dataRow[j] = m_reader is WDBReader?br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()];

                        break;

                    default:
                        throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j]));
                    }
                }

                m_dataTable.Rows.Add(dataRow);

                int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f);
                (sender as BackgroundWorker).ReportProgress(percent);
            }

            if (dataGridView1.InvokeRequired)
            {
                SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource);
                Invoke(d, new object[] { m_dataTable.DefaultView });
            }
            else
            {
                SetDataSource(m_dataTable.DefaultView);
            }

            e.Result = file;
        }