| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- using System;
- using System.IO;
- using System.Security.Cryptography;
- namespace Mono.CompilerServices.SymbolWriter
- {
- public class SourceFileEntry
- {
- public readonly int Index;
- private int DataOffset;
- private MonoSymbolFile file;
- private string file_name;
- private byte[] guid;
- private byte[] hash;
- private bool creating;
- private bool auto_generated;
- public static int Size
- {
- get
- {
- return 8;
- }
- }
- public string FileName
- {
- get
- {
- return this.file_name;
- }
- }
- public bool AutoGenerated
- {
- get
- {
- return this.auto_generated;
- }
- }
- public SourceFileEntry(MonoSymbolFile file, string file_name)
- {
- this.file = file;
- this.file_name = file_name;
- this.Index = file.AddSource(this);
- this.creating = true;
- }
- public SourceFileEntry(MonoSymbolFile file, string file_name, byte[] guid, byte[] checksum) : this(file, file_name)
- {
- this.guid = guid;
- this.hash = checksum;
- }
- //internal void WriteData(MyBinaryWriter bw)
- //{
- // this.DataOffset = (int)bw.BaseStream.Position;
- // bw.Write(this.file_name);
- // if (this.guid == null)
- // {
- // this.guid = Guid.NewGuid().ToByteArray();
- // try
- // {
- // using (FileStream fs = new FileStream(this.file_name, FileMode.Open, FileAccess.Read))
- // {
- // MD5 md5 = MD5.Create();
- // this.hash = md5.ComputeHash(fs);
- // }
- // }
- // catch
- // {
- // this.hash = new byte[16];
- // }
- // }
- // bw.Write(this.guid);
- // bw.Write(this.hash);
- // bw.Write(this.auto_generated ? 1 : 0);
- //}
- //internal void Write(BinaryWriter bw)
- //{
- // bw.Write(this.Index);
- // bw.Write(this.DataOffset);
- //}
- internal SourceFileEntry(MonoSymbolFile file, MyBinaryReader reader)
- {
- this.file = file;
- this.Index = reader.ReadInt32();
- this.DataOffset = reader.ReadInt32();
- int old_pos = (int)reader.BaseStream.Position;
- reader.BaseStream.Position = (long)this.DataOffset;
- this.file_name = reader.ReadString();
- this.guid = reader.ReadBytes(16);
- this.hash = reader.ReadBytes(16);
- this.auto_generated = (reader.ReadByte() == 1);
- reader.BaseStream.Position = (long)old_pos;
- }
- public void SetAutoGenerated()
- {
- if (!this.creating)
- {
- throw new InvalidOperationException();
- }
- this.auto_generated = true;
- this.file.OffsetTable.FileFlags |= OffsetTable.Flags.IsAspxSource;
- }
- public bool CheckChecksum()
- {
- bool result;
- try
- {
- using (FileStream fs = new FileStream(this.file_name, FileMode.Open))
- {
- MD5 md5 = MD5.Create();
- byte[] data = md5.ComputeHash(fs);
- for (int i = 0; i < 16; i++)
- {
- if (data[i] != this.hash[i])
- {
- result = false;
- return result;
- }
- }
- result = true;
- }
- }
- catch
- {
- result = false;
- }
- return result;
- }
- public override string ToString()
- {
- return string.Format("SourceFileEntry ({0}:{1})", this.Index, this.DataOffset);
- }
- }
- }
|