OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Октябрь, 2018 03:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 94 ]  На страницу Пред.  1, 2, 3, 4, 5
Автор Сообщение
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Четверг, 24 Май, 2012 11:04 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Архивы на сайте обновлены:
Цитата:
r322 | SidorovVN | ...
Измененные пути:
M /Zlib/Zlib/Mod/Files.odc
M /Zlib/Zlib/Mod/Zip.odc

Исправлена ошибка с датами в архиве


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Пятница, 25 Май, 2012 20:24 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 195
Откуда: Украина, Днепропетровская обл.
Евгений Темиргалеев писал(а):
Раз уж Вы, Олег, на это дело подвязались, то может и займетесь внесением поправок?
Я бы с радостью, Евгений, но тут и хочется чтобы лежало для всех и без багов, и колется — явно моей квалификации на такие правки не хватает. Да и боязно туда лезть, где даже не разобрался толком. Честно признаюсь, без понтов. Хотя жизнь, бывает, и заставляет. Впрочем, как видите, в этом деле некоторая польза есть и от меня.

P.S. Всем спасибо, сегодня-завтра разместим исправленную версию на сайте Гельмута.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Среда, 06 Февраль, 2013 01:11 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 195
Откуда: Украина, Днепропетровская обл.
Господа, как быть, если нужно упаковывать/распаковывать с помощью Zlib файлы большого (1 Gb и выше) размера? Ведь, насколько я понимаю, в моменты работы процедур (раз)архивации будет происходить значительная задержка всех задач, работающих внутри BlackBox, запущенных по таймеру (сетевых и прочих). Решаема ли каким-либо образом эта проблема? Как сделать это максимально элегантно в духе кооперативной многозадачности BlackBox?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Среда, 06 Февраль, 2013 14:29 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9011
Откуда: Россия, Орёл
Надо перепрограммировать алгоритм сжатия на базе Action, чтобы работал "квантами".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Среда, 06 Февраль, 2013 14:49 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2524
Откуда: Россия, Ярославль
Я применял такой способ:

блокирующий цикл:
Код:
WHILE ~rd.eot DO
    rd.Read();
END;


превращается в

Код:
TYPE
    ReadAction = POINTER TO RECORD (Services.Action)
        rd: Reader;
    END;


PROCEDURE (a: ReadAction) Do;
   CONST maxSpeed = 10;
   VAR speedUp: INTEGER;
BEGIN
    speedUp:=0;
    WHILE ~a.rd.eot & (speedUp<maxSpeed) DO
        a.rd.Read;
        INC(speedUp)
    END;
    IF ~a.rd.eot THEN Services.DoLated(a, Services.immediately) END;
END Do;


Либо, если пользователям достаточно лишь неблокированного гуя, можно вставлять в цикл процедуру:
Код:
PROCEDURE Process;
   VAR msg: WinApi.MSG; res: INTEGER;
BEGIN
   res := WinApi.TranslateMessage(msg);
   res := WinApi.DispatchMessageW(msg)
END Process;


Либо можно в цикле внутри Action следить не за количеством квантов speedUp, а за временем, которое было потрачено, тогда реализация изменится на:
Код:
PROCEDURE (a: ReadAction) Do;
   CONST dt = 50; (* msecs *)
   VAR t0: LONGINT;
BEGIN
    t0:=Services.Ticks();
    WHILE ~a.rd.eot & ((Services.Ticks()-t0)<dt) DO
        a.rd.Read;
    END;
    IF ~a.rd.eot THEN Services.DoLated(a, Services.immediately) END;
END Do;


Ну а для тех, кто совсем не боится нового, могу предложить готовую реализацию всего вышеописанного в виде детали в модуле ypkTaskService, хотя бы в качестве примера.

И это всё без упоминания сторонних dll-библиотек, виндовых тредов, и прочего.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Четверг, 07 Февраль, 2013 07:29 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Или запускать еще один Blackbox под задачи архивации/разархивации
У Ильи Ермакова,по-моему, есть соответствующий опыт организации взаимодействия


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Четверг, 01 Июнь, 2017 07:57 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2190
Откуда: Красноярск
Опубликовал это расширение в новом хранилище:
https://blackbox.obertone.ru/component/Zlib


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Вторник, 06 Июнь, 2017 21:24 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2190
Откуда: Красноярск
Исследовал вопрос и выяснил, что если EFS бит заменить на 11 (сейчас стоит 10), то архивы нормально начинает распаковывать WinRar и 7-Zip.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Вторник, 06 Июнь, 2017 22:31 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2190
Откуда: Красноярск
Обновил с исправлением бита:
https://blackbox.obertone.ru/view/4a6c5 ... b28161ca09

Постарался максимально убрать WinApi из основных модулей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Среда, 07 Июнь, 2017 02:45 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7861
Откуда: Троицк, Москва
Ценно, особенно насчёт WinApi ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Четверг, 08 Июнь, 2017 13:53 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2190
Откуда: Красноярск
Загрузил новую версию: https://blackbox.obertone.ru/component/Zlib

Подправил несколько недочетов еще. Один мой косяк был с тем, что не создавал строки перед записью в них.

Еще в старом варианте был нестабильный момент, связанный с тем, что миллисекунды не устанавливались в ноль в процедуре GetFileModifyDateTime. На винде это не приводило к ошибкам, а вот в Wine там оказывался мусор из оперативной памяти и миллисекунды не нулевые. Поэтому процедура выдавала нулевое время, которое устанавливалось для файлов в архиве.

Проверил эту версию на совместимость с Freenix сборкой. Все кроме установки дат измерения в файлах и модуля Хельмута Цинна ZlibCmds работает корректно.
В Linux Ubuntu кириллические названия файлов распаковываются корректно!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Суббота, 30 Сентябрь, 2017 21:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Иван Денисов писал(а):
Загрузил новую версию: https://blackbox.obertone.ru/component/Zlib

В моей версии 1.6 это не работает:
Код:
   IF Dialog.IsWindows() THEN
      ASSERT(Kernel.ThisMod("ZlibFilesWin") # NIL, 21);
      Log.String("Hook for Windows."); Log.Ln;
   ELSIF Dialog.IsLinux() THEN
      ASSERT(Kernel.ThisMod("ZlibFilesLin") # NIL, 21);
      Log.String("Hook for Linux."); Log.Ln;
   END

Если на то пошло, ОС-зависимые фишки лучше было вынести в отдельный модуль и компилировать в завивимости от выбора соответствующего командера.
Также из-за зависимости Kernel.Utf8ToString не компилируется код ZlibZip.

Далее, судя по коду, отсутствует обработка опциональной секции Data Descriptor файла ZIP (при включенном бите 3 флага genPurpBitFlag). Это означает, что файлы JAR, APK могут быть обработаны некорректно.

И ещё странно почему на КП написано так:
Код:
ent.dataDescriptor := ODD(sintDummy DIV 8);

а не так:
Код:
ent.dataDescriptor := 3 IN ent.genPurpBitFlag;


Вложения:
test_data_descriptor.zip [405 байт]
Скачиваний: 26
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Четверг, 07 Июнь, 2018 10:42 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Иван Денисов писал(а):
Исследовал вопрос и выяснил, что если EFS бит заменить на 11 (сейчас стоит 10), то архивы нормально начинает распаковывать WinRar и 7-Zip.
Похоже, это была просто описка -- значение 11 в описании формата.

Можно еще добавить хак для линуховых архиваторов, которые кодировку определяют не по флагу EFS, а по версии архиватора в центральном каталоге архива.
Код:
   (* Writes file header in central directory, updates ent.offsetCentralDir *)
   PROCEDURE WriteFileHeader(ent: Entry; wr: Files.Writer);
     VAR
       i, commentLen, nameLen: INTEGER;
       oem: POINTER TO ARRAY OF SHORTCHAR;
         vMadeBy: INTEGER;
   BEGIN
      ent.offsetCentralDir := wr.Pos();
      WriteInt(wr, CentralFileHeaderSignature);   (* central file header signature *)
      IF EFS IN ent.genPurpBitFlag THEN
         vMadeBy := (*UNIX*)3 * 100H + CompatibleVersions * 10;
      ELSE
         vMadeBy := (*MS-DOS*)0 * 100H + CompatibleVersions * 10
      END;
      ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Четверг, 07 Июнь, 2018 11:11 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
К сведению. Реализация (в оригинале A2 -- тоже) имеет ограничение -- метод "без сжатия" поддерживает только блоки чуть меньше 64К.
Код:
   CONST N = 64*1024; (* трап 113 в ZlibDeflate.CompressStored *)
   VAR in: ARRAY N OF SHORTCHAR;
   VAR out: ARRAY N+128 OF SHORTCHAR;
   VAR outLen: LONGINT; VAR res: INTEGER;
   ZlibDeflate.Compress(in, out, 0, N, 0, N+128, 0, 0, outLen, res);
   Log.String("res = "); Log.Int(res); Log.Tab; Log.String("outLen = "); Log.Real(outLen); Log.Ln;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 94 ]  На страницу Пред.  1, 2, 3, 4, 5

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB