You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
6.8 KiB
270 lines
6.8 KiB
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; |
|
} |
|
}
|
|
|