Каталог статей
| Главная » Статьи » 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 неабстрактный наследник TDBPF2ItemDecoder
try
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) | |
| Просмотров: 809 |
