|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace Kingo.Mobile.Shape2KOTool
|
|
|
|
|
{
|
|
|
|
|
// Token: 0x02000040 RID: 64
|
|
|
|
|
public class DBFDocument : IDisposable
|
|
|
|
|
{
|
|
|
|
|
// Token: 0x170000C7 RID: 199
|
|
|
|
|
// (get) Token: 0x060001FF RID: 511 RVA: 0x00009A2C File Offset: 0x00007C2C
|
|
|
|
|
public DataTable Data
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.GetData();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000200 RID: 512 RVA: 0x00009A44 File Offset: 0x00007C44
|
|
|
|
|
public DataTable GetData()
|
|
|
|
|
{
|
|
|
|
|
DataTable dataTable = new DataTable();
|
|
|
|
|
foreach (Header header in this.headers)
|
|
|
|
|
{
|
|
|
|
|
DataColumn column = new DataColumn(header.FieldName);
|
|
|
|
|
dataTable.Columns.Add(column);
|
|
|
|
|
}
|
|
|
|
|
int count = this.headers.Count;
|
|
|
|
|
int num = 0;
|
|
|
|
|
while ((long)num < this.GetRecordCount())
|
|
|
|
|
{
|
|
|
|
|
DataRow dataRow = dataTable.NewRow();
|
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
|
{
|
|
|
|
|
dataRow[i] = this.GetRecordFieldValue(num + 1, i + 1);
|
|
|
|
|
}
|
|
|
|
|
dataTable.Rows.Add(dataRow);
|
|
|
|
|
num++;
|
|
|
|
|
}
|
|
|
|
|
return dataTable;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000201 RID: 513 RVA: 0x00009B30 File Offset: 0x00007D30
|
|
|
|
|
public void LoadFile(string filename)
|
|
|
|
|
{
|
|
|
|
|
using (FileStream fileStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|
|
|
|
{
|
|
|
|
|
this.dbfBuffer = new byte[fileStream.Length];
|
|
|
|
|
fileStream.Read(this.dbfBuffer, 0, this.dbfBuffer.Length);
|
|
|
|
|
}
|
|
|
|
|
this.FillFileInfo();
|
|
|
|
|
this.FillHeadInfos();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000202 RID: 514 RVA: 0x00009BA4 File Offset: 0x00007DA4
|
|
|
|
|
private void FillFileInfo()
|
|
|
|
|
{
|
|
|
|
|
this.fileInfo.Mark = (char)this.dbfBuffer[0];
|
|
|
|
|
this.fileInfo.Year = (char)this.dbfBuffer[1];
|
|
|
|
|
this.fileInfo.Mmonth = (char)this.dbfBuffer[2];
|
|
|
|
|
this.fileInfo.Day = (char)this.dbfBuffer[3];
|
|
|
|
|
byte[] array = new byte[4];
|
|
|
|
|
for (int i = 4; i < 8; i++)
|
|
|
|
|
{
|
|
|
|
|
array[i - 4] = this.dbfBuffer[i];
|
|
|
|
|
}
|
|
|
|
|
this.fileInfo.RecordCount = (long)BitConverter.ToInt32(array, 0);
|
|
|
|
|
array = new byte[2];
|
|
|
|
|
for (int i = 8; i < 10; i++)
|
|
|
|
|
{
|
|
|
|
|
array[i - 8] = this.dbfBuffer[i];
|
|
|
|
|
}
|
|
|
|
|
this.fileInfo.HeaderLength = BitConverter.ToInt16(array, 0);
|
|
|
|
|
array = new byte[2];
|
|
|
|
|
for (int i = 10; i < 12; i++)
|
|
|
|
|
{
|
|
|
|
|
array[i - 10] = this.dbfBuffer[i];
|
|
|
|
|
}
|
|
|
|
|
this.fileInfo.RecordLength = BitConverter.ToInt16(array, 0);
|
|
|
|
|
this.fileInfo.LanguageDriverID = (char)this.dbfBuffer[29];
|
|
|
|
|
if (this.fileInfo.LanguageDriverID == '\0')
|
|
|
|
|
{
|
|
|
|
|
this.CurrentEncoding = Encoding.UTF8;
|
|
|
|
|
}
|
|
|
|
|
this.fileInfo.Reserved = this.CurrentEncoding.GetString(this.dbfBuffer, 11, 20);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000203 RID: 515 RVA: 0x00009D04 File Offset: 0x00007F04
|
|
|
|
|
private void FillHeadInfos()
|
|
|
|
|
{
|
|
|
|
|
int num = 0;
|
|
|
|
|
while (this.dbfBuffer[(num + 1) * 32] != 13 && num < this.GetFieldCount())
|
|
|
|
|
{
|
|
|
|
|
byte[] array = new byte[32];
|
|
|
|
|
for (int i = (num + 1) * 32; i < (num + 1) * 32 + 32; i++)
|
|
|
|
|
{
|
|
|
|
|
array[i - (num + 1) * 32] = this.dbfBuffer[i];
|
|
|
|
|
}
|
|
|
|
|
Header item = new Header();
|
|
|
|
|
this.FillHeaderInfo(ref item, array, (num + 1) * 32);
|
|
|
|
|
this.headers.Add(item);
|
|
|
|
|
num++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000204 RID: 516 RVA: 0x00009DAC File Offset: 0x00007FAC
|
|
|
|
|
private int GetFieldCount()
|
|
|
|
|
{
|
|
|
|
|
return (int)(this.fileInfo.HeaderLength / 32 - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000205 RID: 517 RVA: 0x00009DD0 File Offset: 0x00007FD0
|
|
|
|
|
private string GetFieldName(int FieldNum)
|
|
|
|
|
{
|
|
|
|
|
string result;
|
|
|
|
|
if (FieldNum < 1 || FieldNum > this.headers.Count)
|
|
|
|
|
{
|
|
|
|
|
result = null;
|
|
|
|
|
}
|
|
|
|
|
else if (FieldNum < 1)
|
|
|
|
|
{
|
|
|
|
|
result = "";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result = this.headers[FieldNum - 1].FieldName;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000206 RID: 518 RVA: 0x00009E28 File Offset: 0x00008028
|
|
|
|
|
private int GetFieldLength(int FieldNum)
|
|
|
|
|
{
|
|
|
|
|
int result;
|
|
|
|
|
if (FieldNum < 1)
|
|
|
|
|
{
|
|
|
|
|
result = -1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result = (int)this.headers[FieldNum - 1].FieldLength;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000207 RID: 519 RVA: 0x00009E5C File Offset: 0x0000805C
|
|
|
|
|
private string GetFieldType(int FieldNum)
|
|
|
|
|
{
|
|
|
|
|
string result;
|
|
|
|
|
if (FieldNum < 1)
|
|
|
|
|
{
|
|
|
|
|
result = "#";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result = new string(new char[]
|
|
|
|
|
{
|
|
|
|
|
this.headers[FieldNum - 1].FieldType
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000208 RID: 520 RVA: 0x00009EA4 File Offset: 0x000080A4
|
|
|
|
|
private int GetDecimal(int FieldNum)
|
|
|
|
|
{
|
|
|
|
|
int result;
|
|
|
|
|
if (FieldNum < 1)
|
|
|
|
|
{
|
|
|
|
|
result = -1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
result = (int)this.headers[FieldNum - 1].Decimal;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000209 RID: 521 RVA: 0x00009ED8 File Offset: 0x000080D8
|
|
|
|
|
private long GetRecordCount()
|
|
|
|
|
{
|
|
|
|
|
return this.fileInfo.RecordCount;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600020A RID: 522 RVA: 0x00009EF8 File Offset: 0x000080F8
|
|
|
|
|
private int GetRecordLength()
|
|
|
|
|
{
|
|
|
|
|
return (int)this.fileInfo.RecordLength;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600020B RID: 523 RVA: 0x00009F18 File Offset: 0x00008118
|
|
|
|
|
private string GetRecord(int RecordNum)
|
|
|
|
|
{
|
|
|
|
|
string result;
|
|
|
|
|
if (RecordNum < 1)
|
|
|
|
|
{
|
|
|
|
|
result = "";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
int index = (int)(this.fileInfo.HeaderLength + 1) + (RecordNum - 1) * this.GetRecordLength();
|
|
|
|
|
string @string = this.CurrentEncoding.GetString(this.dbfBuffer, index, this.GetRecordLength() - 1);
|
|
|
|
|
result = @string;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600020C RID: 524 RVA: 0x00009F74 File Offset: 0x00008174
|
|
|
|
|
private string GetRecordFieldValue(int RecordNum, int FieldNum)
|
|
|
|
|
{
|
|
|
|
|
string result;
|
|
|
|
|
if (RecordNum < 1 || FieldNum < 1)
|
|
|
|
|
{
|
|
|
|
|
result = "";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
int num = (int)(this.fileInfo.HeaderLength + 1) + (RecordNum - 1) * this.GetRecordLength();
|
|
|
|
|
int num2 = 1;
|
|
|
|
|
while (num2 < FieldNum && num2 <= this.headers.Count)
|
|
|
|
|
{
|
|
|
|
|
num += this.GetFieldLength(num2);
|
|
|
|
|
num2++;
|
|
|
|
|
}
|
|
|
|
|
string @string = this.CurrentEncoding.GetString(this.dbfBuffer, num, this.GetFieldLength(FieldNum));
|
|
|
|
|
result = @string;
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600020D RID: 525 RVA: 0x0000A008 File Offset: 0x00008208
|
|
|
|
|
private void FillHeaderInfo(ref Header dbfInfoHeader, byte[] buffer, int position)
|
|
|
|
|
{
|
|
|
|
|
dbfInfoHeader.FieldName = this.CurrentEncoding.GetString(buffer, 0, 9);
|
|
|
|
|
dbfInfoHeader.Reserved1 = (char)buffer[10];
|
|
|
|
|
dbfInfoHeader.FieldType = (char)buffer[11];
|
|
|
|
|
byte[] array = new byte[4];
|
|
|
|
|
for (int i = 12; i < 16; i++)
|
|
|
|
|
{
|
|
|
|
|
array[i - 12] = buffer[i];
|
|
|
|
|
}
|
|
|
|
|
dbfInfoHeader.Offset = (long)BitConverter.ToInt32(array, 0);
|
|
|
|
|
dbfInfoHeader.FieldLength = (char)buffer[16];
|
|
|
|
|
dbfInfoHeader.Decimal = (char)buffer[17];
|
|
|
|
|
dbfInfoHeader.Reserved = this.CurrentEncoding.GetString(buffer, 18, 14);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x0600020E RID: 526 RVA: 0x0000A0A2 File Offset: 0x000082A2
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
this.dbfBuffer = null;
|
|
|
|
|
GC.Collect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000160 RID: 352
|
|
|
|
|
private Encoding CurrentEncoding = Encoding.Default;
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000161 RID: 353
|
|
|
|
|
private FileInfo fileInfo = new FileInfo();
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000162 RID: 354
|
|
|
|
|
private List<Header> headers = new List<Header>();
|
|
|
|
|
|
|
|
|
|
// Token: 0x04000163 RID: 355
|
|
|
|
|
private byte[] dbfBuffer;
|
|
|
|
|
}
|
|
|
|
|
}
|