Ejemplo n.º 1
0
        private async Task readExportTable(Action <DomainLoadProgress> progress)
        {
            DomainLoadProgress message = new DomainLoadProgress {
                Text = "Reading Export Table...", Current = 0, Total = ExportTableCount
            };

            reader.Seek(ExportTableOffset);

            for (int i = 0; i < ExportTableCount; ++i)
            {
                DomainExportTableEntry export = new DomainExportTableEntry {
                    TableIndex = i + 1
                };

                await export.ReadExportTableEntry(reader, this);

                ExportTable.Add(export);

                message.IncrementCurrent();

                if (ExportTableCount > 100)
                {
                    progress?.Invoke(message);
                }
            }

            message.Text    = "Expanding References...";
            message.Current = 0;
            message.Total   = 0;

            progress?.Invoke(message);

            await ExportTable.ForEachAsync(export => Task.Run(() => export.ExpandReferences(this)));
        }
Ejemplo n.º 2
0
        private async Task readNameTable(Action <DomainLoadProgress> progress)
        {
            DomainLoadProgress message = new DomainLoadProgress {
                Text = "Reading Name Table...", Current = 0, Total = NameTableCount
            };

            reader.Seek(NameTableOffset);

            for (int i = 0; i < NameTableCount; ++i)
            {
                DomainNameTableEntry name = new DomainNameTableEntry {
                    TableIndex = i
                };

                await name.ReadNameTableEntry(reader);

                NameTable.Add(name);

                message.IncrementCurrent();

                if (NameTableCount > 100)
                {
                    progress?.Invoke(message);
                }
            }
        }
Ejemplo n.º 3
0
        public async Task ReadHeaderAsync(Action <DomainLoadProgress> progress)
        {
            DomainLoadProgress message = new DomainLoadProgress {
                Text = "Parsing Header..."
            };

            progress?.Invoke(message);

            await readUpkHeader();

            const CompressionTypes validCompression = CompressionTypes.LZO | CompressionTypes.LZO_ENC;

            if (((CompressionTypes)CompressionFlags & validCompression) > 0)
            {
                message.Text = "Decompressing...";

                progress?.Invoke(message);

                reader = await decompressChunks();
            }
            else if (CompressionFlags > 0)
            {
                throw new Exception($"Unsupported compression type 0x{CompressionFlags:X8}.");
            }

            await readNameTable(progress);

            await readImportTable(progress);

            await readExportTable(progress);

            message.Text = "Slicing and Dicing...";

            progress?.Invoke(message);

            await readDependsTable();

            await decodePointers();

            message.Text  = "Reading Objects...";
            message.Total = ExportTableCount;

            progress?.Invoke(message);

            await ExportTable.ForEachAsync(export => {
                return(export.ReadDomainObject(reader).ContinueWith(t => {
                    message.IncrementCurrent();

                    if (ExportTableCount > 100)
                    {
                        progress?.Invoke(message);
                    }
                }));
            });

            message.IsComplete = true;

            progress?.Invoke(message);
        }
Ejemplo n.º 4
0
    private async Task readExportTable(Action<DomainLoadProgress> progress) {
      DomainLoadProgress message = new DomainLoadProgress { Text = "Reading Export Table...", Current = 0, Total = ExportTableCount };

      reader.Seek(ExportTableOffset);

      for(int i = 0; i < ExportTableCount; ++i) {
        DomainExportTableEntry export = new DomainExportTableEntry { TableIndex = i + 1 };

        await export.ReadExportTableEntry(reader, this);

        ExportTable.Add(export);

        message.IncrementCurrent();

        if (ExportTableCount > 100) progress?.Invoke(message);
      }

      message.Text    = "Expanding References...";
      message.Current = 0;
      message.Total   = 0;

      progress?.Invoke(message);

      await ExportTable.ForEachAsync(export => Task.Run(() => export.ExpandReferences(this)));
    }
Ejemplo n.º 5
0
    private async Task readNameTable(Action<DomainLoadProgress> progress) {
      DomainLoadProgress message = new DomainLoadProgress { Text = "Reading Name Table...", Current = 0, Total = NameTableCount };

      reader.Seek(NameTableOffset);

      for(int i = 0; i < NameTableCount; ++i) {
        DomainNameTableEntry name = new DomainNameTableEntry { TableIndex = i };

        await name.ReadNameTableEntry(reader);

        NameTable.Add(name);

        message.IncrementCurrent();

        if (NameTableCount > 100) progress?.Invoke(message);
      }
    }
Ejemplo n.º 6
0
    public async Task ReadHeaderAsync(Action<DomainLoadProgress> progress) {
      DomainLoadProgress message = new DomainLoadProgress { Text = "Parsing Header..." };

      progress?.Invoke(message);

      await readUpkHeader();

      const CompressionTypes validCompression = CompressionTypes.LZO | CompressionTypes.LZO_ENC;

      if (((CompressionTypes)CompressionFlags & validCompression) > 0 ) {
        message.Text = "Decompressing...";

        progress?.Invoke(message);

        reader = await decompressChunks();
      }
      else if (CompressionFlags > 0) throw new Exception($"Unsupported compression type 0x{CompressionFlags:X8}.");

      await readNameTable(progress);

      await readImportTable(progress);

      await readExportTable(progress);

      message.Text = "Slicing and Dicing...";

      progress?.Invoke(message);

      await readDependsTable();

      if (CookerVersion != 0) await decodePointers();

      message.Text  = "Reading Objects...";
      message.Total = ExportTableCount;

      progress?.Invoke(message);

      await ExportTable.ForEachAsync(export => {
        return export.ReadDomainObject(reader).ContinueWith(t => {
          message.IncrementCurrent();

          if (ExportTableCount > 100) progress?.Invoke(message);
        });
      });

      message.IsComplete = true;

      progress?.Invoke(message);
    }
Ejemplo n.º 7
0
 private void onLoadProgress(DomainLoadProgress progress)
 {
     messenger.Send(mapper.Map <LoadProgressMessage>(progress));
 }