Каталог статей
Главная » Статьи » S3DecoderLib |
S3DecoderLib: "Обертывание" вторичного потока
|
"Обертывание" вторичного потока [ Стабильный билд • Типы данных • Декодер и кодер ]
Програмный модуль и версия DBPF2Decoder.pas, rev.130517
О чем собственно идет речь
Как было написано ранее, вторичный поток содержит декодированную (точнее декомпрессированную) запись данных, т.е. набор raw-байт, которые что-то как-то обозначают. В связи с тем, что это "что-то как-то" весьма растяжимое понятие, особенно с учетом того что в каждом аддоне его дополняют, причем не так как делают все белые люди – в конце, а почему-то посредине, с версии 1.60 библиотеки было введено понятие "обертывание вторичного потока". Этот механизм представляет набор raw-байт в виде тех данных которые содержатся в записи. Реализуется это на основе наследования от класса TDBPF2ItemDecoder. При этом наследующий класс должен: - при получении конструктором класса как одного из параметров вторичного потока он автоматически должен декодировать его через метод Decode; - иметь реализованный метод Decode, описанный как procedure Decode(AStream: TStream); virtual;, реализующий алгоритм декодирования; - при необходимости реализовывать метод procedure Commit;, обеспечивающий обратную запись данных в поток; Запрещено разрушать вторичный поток (вызов FStream.Free или аналогичный абсолютно не допустим).
Требования к классу: - метод Decode не должен изменять вторичный поток, при вызове метода запрещено делать предположения о местоположении внутреннего указателя потока (вызов FStream.Seek обязателен); - класс содержит любое количество дополнительных данных которые оформляются как общие (public) свойства; - только метод procedure Commit; имеет право писать в поток, состояние внутреннего указателя потока также должно быть явно указано в методе;
Как минимум один метод модуля вида IsXXXX(AResourceType: DWORD): boolean; должен осуществлять проверку типа данных. Работа с данными после "обертывания" ведется через метод Wrapper класса TDBPF2Item.
Реализация на Pascal
class TDBPF2ItemDecoder – абстрактный базовый класс декодера записи type TDBPF2ItemDecoder = class protected FStream: TStream; FOwner: TDBPF2Item; public constructor Create(AStream: TStream = nil); // декодирует данные записи procedure UnlinkStream; // удаляет ссылку на вторичный поток procedure Decode(AStream: TStream); virtual; abstract; property Owner: TDBPF2Item read FOwner write FOwner; end; Методы constructor Create(AStream: TStream = nil) – конструктор класса, автоматически декодирует данные записи; procedure UnlinkStream – удаляет ссылку на вторичный поток (освобождает внутренний указатель FSteram); procedure Decode(AStream: TStream); virtual; abstract – виртуальный абстрактный метод осуществляющий декодирование, должен быть перекрыт;
Пример использования TDBPF2LDES неабстрактный наследник TDBPF2ItemDecodertry t:= ''; templ:= GetParam('LDES.Template', 'Records'); for i:= 0 to frmMain.DBPF2Decoder.Count-1 do with frmMain.DBPF2Decoder.Items[i] do if Exists and IsLDES(ResourceType) then begin t1:= templ; Decode(TDBPF2LDES.Create); with Wrapper as TDBPF2LDES do begin Replace(t1, '$R.Name', LotName); Replace(t1, '$R.Addr', LotAddr); Replace(t1, '$R.Descr', LotDescr); Replace(t1, '$R.Type', Format('%d', [LotType])); Replace(t1, '$R.Width', Format('%d', [Width])); Replace(t1, '$R.Height', Format('%d', [Height])); Replace(t1, '$R.Version', Format('0x%.2X', [Ver])); ReplaceIcon(t1, InstanceHi, InstanceLo, [TS3ResLotPNG], 'OBJD'); sDescr:= sDescr+Format(' "%.4X", 0x%.8X, 0x%.8X, 0x%.8X, 0x%.8X,'#13#10, [Row, ResourceType, LotType, Width, Height]); end; t:= t+RecordReplace(t1, i); inc(row); FreeStream; end; Replace(S, '$V.LDES', t); except on E: Exception do OnError(S, 'uView::ViewAsPackage::LDES', E); end; | |
Категория: S3DecoderLib | Добавил: crazylab (28.09.2013) | |
Просмотров: 762 |