public void Load(BinaryReader reader, Action <int, int> progressCallback) { var stream = reader.BaseStream; if (!stream.CanRead || !stream.CanSeek) { throw new ArgumentException("BaseStream must be readable and seekable", "reader"); } string signature = Encoding.ASCII.GetString(reader.ReadBytes(properSignature.Length)); if (signature != properSignature) { throw new InvalidDataException("File does not have a proper TLK V3.0 signature"); } LanguageID = (TlkLanguageID)reader.ReadInt32(); int entriesCount = reader.ReadInt32(); int entriesOffset = reader.ReadInt32(); isLoading = true; try { Entries.Clear(); for (int i = 0; i < entriesCount; ++i) { var entry = new TlkEntry { StrRef = i }; int flags = reader.ReadInt32(); byte[] soundResRef = reader.ReadBytes(16); if ((flags & 0x2) != 0) { entry.SoundResRef = Encoding.ASCII.GetString(soundResRef).TrimEnd('\0'); } entry.VolumeVariance = reader.ReadInt32(); entry.PitchVariance = reader.ReadInt32(); int offset = reader.ReadInt32(); int length = reader.ReadInt32(); float soundLength = reader.ReadSingle(); if ((flags & 0x4) != 0) { entry.SoundLength = soundLength; } if ((flags & 0x1) != 0) { long bookmark = stream.Position; stream.Position = entriesOffset + offset; entry.Text = latin1.GetString(reader.ReadBytes(length)); stream.Position = bookmark; } Entries.Add(entry); if (progressCallback != null) { progressCallback(i + 1, entriesCount); } } IsModified = false; } finally { isLoading = false; } undoStack.Clear(); redoStack.Clear(); OnPropertyChanged(new PropertyChangedEventArgs("CanUndo")); OnPropertyChanged(new PropertyChangedEventArgs("CanRedo")); }
public EntryRemovedChange(int entryIndex, TlkEntry entry) { this.entryIndex = entryIndex; this.entry = entry; }