Формат Sims3Pack и его декодирование: Часть практическая, реализация декодера
Реализация декодирования формата Sims3Pack содержится в файле siS3PackDecoder.pas
Статьи по теме
- библиотека компонентов для работы с файлами TS3 – Sims3Pack: описание формата, на русском языке;
- библиотека компонентов для работы с файлами TS3 – Sims3Pack: типы данных, на русском языке;
Реализация декодера
Декодер представляет собой наследника класса TComponent и может (и должен во избежание багов с парсером xml) устанавливаться на форму. Для работы с исходным файлом используется первичный поток, в его качестве допустим любой (естественно неабстрактный) потомок TStream; он должен быть создан и файл загружен в него – сделано это для того чтобы не привязываться к размещению исходного файла. Для освобождения первичного потока нельзя использовать его "родные" методы, для этого используется метод FreeStream декодера.
Свойства
- Items: TS3PackItems – массив записей по каждому из файлов в пакете;
- Count: integer – число файлов в пакете;
- Header: TS3PackHeader – заголовок пакета, содержит те самые 17 байт, категорически не рекомендуется лезть в него грязными руками (чистыми, кстати, тоже) – свойство информационное для отладки;
- PackageName: string, имя пакета, если есть русская локализация, то берется из LocalizedNames\ru-RU, иначе какая есть (обычно английская) из DisplayName манифеста;
- PackageDescription: string, описание пакета, если есть русская локализация, то берется из LocalizedDescriptions\ru-RU, иначе какая есть (обычно английская) из Description манифеста;
Методы
constructor Create (AOwner: TComponent) – конструктор класса;
destructor Destroy – виртуальный деструктор освобождает все связанные потоки (и первичный и вторичные) – естественно вместо него лучше использовать метод Free;
procedure FreeStream – освобождает вторичные потоки, освобождает первичный поток, после его вызова нельзя использовать остальные поля и методы для данного файла, для освобождения потока нельзя использовать его "родные" методы;
procedure Decode(AReader: TStream) – связывает поток декодирования с декодером, декодирует индексную таблицу, должен вызывается первым, все остальные поля и методы используются после нее, до ее вызова состояние полей неопределенно, кроме Count, который равен 0;
function Alloc: TS3PackItem – защищенный метод, увеличивает индексную запись на один элемент и вызывает его конструктор;
Пример использования
Практическое использование может быть, например, такое:
В примере, выбранный пользователем файл:
-
открывается и декодируется;
-
в лог добавляются данные манифеста;
-
затем для каждой записи:
-
- в лог добавляются данные о ней;
-
- она декодируется и сохраняется на диск;
-
первичный поток закрывается;
Пример довольно условный, т.к. для записи на диск TFileStream подходит лучше – зато иллюстрирует правильное создание, доступ и уничтожение вторичных потоков.
Обратите внимание на необходимость использования вызова Application.ProcessMessages в теле цикла декодирования, в случае его отсутствия при больших файлах заметна "заморозка" программы.