Четверг, 23.11.2017, 06:25
Приветствую Вас Гость

Каталог статей

Главная » Статьи » 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)
Просмотров: 122