OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 11:11

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




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

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

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


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

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

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


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

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


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

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


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

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

блокирующий цикл:
Код:
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
Сообщения: 3774
Опубликовал это расширение в новом хранилище:
https://blackbox.obertone.ru/component/Zlib


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

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


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

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

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


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

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


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

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

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

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

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


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

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Иван Денисов писал(а):
Загрузил новую версию: 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 байт]
Скачиваний: 249
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Четверг, 07 Июнь, 2018 10:42 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Иван Денисов писал(а):
Исследовал вопрос и выяснил, что если 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
Сообщения: 4625
Откуда: Россия, Орёл
К сведению. Реализация (в оригинале 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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Вторник, 20 Октябрь, 2020 07:12 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Для совместимости с подсистемой Odf пришлось убрать одну проверку постусловий. В версии, которая опубликована у Цинна нет вообще никаких проверок в этой процедуре GetFileModifyDateTime...
Также адаптировал расширение под версию 1.8.
https://blackbox.oberon.org/extension/Zlib
Если кто-то сделает реализацию для ZlibFilesLin, то вероятно в Linux версии файлы будут добавляться в архивы с корректными датами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Вторник, 20 Октябрь, 2020 11:00 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Попробовал по статье
http://www.vsokovikov.narod.ru/New_MSDN ... tetime.htm
сделать вот такую реализацию
Код:
date := SHORT(day + month * 16 + (year-1980) * 256);
time := SHORT(second DIV 2 +  minute * 16 + hour * 1024);

Но так вместо 20 октября 2020 выдаёт 5 мая 2000 года...
Есть идеи, что я не правильно понимаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Вторник, 20 Октябрь, 2020 12:30 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
коэффициенты неверные
Код:
date := SHORT(day + month * 32 + (year-1980) * 512);
time := SHORT(second DIV 2 +  minute * 32 + hour * 2048);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Вторник, 20 Октябрь, 2020 18:37 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
albobin писал(а):
коэффициенты неверные
Код:
date := SHORT(day + month * 32 + (year-1980) * 512);
time := SHORT(second DIV 2 +  minute * 32 + hour * 2048);

Спасибо. Так верно считает. Осталось только еще применить сдвиг относительно локального времени.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Zlib
СообщениеДобавлено: Вторник, 20 Октябрь, 2020 20:40 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Обнаружил, что есть нестыковочка в реализации HostFiles.GetModDate
В Windows возвращается системное время. А в Linux идет наоборот пересчёт в локальное. Наверное будет правильно подстроить всё п од Windows, чтобы было больше сходства?

Вложение:
GetModDate.png
GetModDate.png [ 58.72 КБ | Просмотров: 3621 ]


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Вот такая получилась кросс-платформенная реализация, чтобы взять метки времени и даты для файла в dos формате, чтобы затем записать в архив.

Код:
   VAR
      days: ARRAY 13 OF INTEGER;

   PROCEDURE (hk: Hook) GetFileModifyDateTime (f: Files.File; VAR date, time: SHORTINT);
   VAR year, month, day, hour, minute, second, bais: INTEGER;
      
      PROCEDURE Prev(): INTEGER;   
      BEGIN IF month = 1 THEN RETURN 12 ELSE RETURN month - 1 END
      END Prev;
      
      PROCEDURE Next(): INTEGER;   
      BEGIN IF month = 12 THEN RETURN 1 ELSE RETURN month + 1 END
      END Next;
      
   BEGIN
      HostFiles.GetModDate(f, year, month, day, hour, minute, second);      
      Dates.GetUTCBias(bais);
      minute := minute - bais;
      IF minute > 59 THEN
         hour := hour + minute DIV 60;
         minute := minute MOD 60;
      ELSIF minute < 0 THEN
         hour := hour + minute DIV 60;
         minute := minute MOD 60;
      END;
      IF hour > 23 THEN
         INC(day);
         hour := hour MOD 24;
      ELSIF hour < 0 THEN
         DEC(day);
         hour := hour MOD 24;
      END;
      IF year MOD 4 = 0 THEN days[2] := 29 ELSE days[2] := 28 END;
      IF day < 1 THEN
         month := Prev();
         IF month = 12 THEN DEC(year) END;
         day := days[month]
      ELSIF day > days[month] THEN
         month := Next();
         IF month = 1 THEN INC(year) END;
         day := 1
      END;
      date := SHORT(day + month * 32 + (year-1980) * 512);
      time := SHORT(second DIV 2 +  minute * 32 + hour * 2048);
   END GetFileModifyDateTime;

BEGIN   
   days[1] := 31; days[2] := 28; days[3] := 31; days[4] := 30; days[5] := 31; days[6] := 30;
   days[7] := 31; days[8] := 31; days[9] := 30; days[10] := 31; days[11] := 30; days[12] := 31;


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

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


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

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


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

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