Фильтр чтения/записи

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Чего бы хотелось, точнее чего бы хотелось иметь возможность делать из плагина:
Возможно ли плагином как-то затесаться в процесс чтения/записи файла в качестве фильтра(назвем это так)?


У меня есть файл verybiglist.txt который занимает 20MiB. Для экономии места я хочу его сжать каким-нибудь потоковым архиватором(например gzip). Я то зажму, но потом что-бы его просто посмотреть нужно будет его сначала распаковать во временную папку аж потом смотреть. Не совсем удобно и быстро. Тем более если нужно отредактировать.
Второй, более распространенный и реальный пример: есть файл some_picture.svgz - GZip-нутый svg-файл(svg - xml, т.е. нами читаемый).


  1. Предположим формат специфицирован как набор 4-байтных блоков, которые представляют собой 32 беззнаковые целые.
  2. Тогда, при открытии этого файла АкелПадом, фильтр увидит что он формат понимает, развернет его в обычный читаемый текст(по одному числу на строчку) и выдаст как содержимое документа. При этом АкелПад должен запомнить каким фильтром он открыл документ.
  3. Если пользователь пожелает поредактирвовать документ, то при его сохранении Акел должен добросовестно обратится к запомненному фильтру. Фильтр свою очередь возьмет у АкелПад-а текст, распарсит его и сохранит в бинарном формате(если распарсит правильно). Также в диалоге выбора имени файла для сохранения "Сохранить как..." можно будет добавить список этих фильтров.


  • При открытии выбирают exe, dll, ocx, res и прочие файлы-контейнеры. Фильтр их де компилирует в исходный текст(задача 100% обратима).
  • Пользователь редактирвует всё что желает.
  • При сохранении фильтр попытается откомпилировать результат работы пользователя, и ложит в указанный модуль.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Идея любопытная, и вроде бы не очень сложно реализуемая. Добавлю в примеры редактирование *.fb2.zip файлов

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Fr0sT
Ну zip это немножко не то. Почему? Потому-что zip - многопоточный контейнер(читай может в содержать себе много файлов, в том числе ноль). А раз так, то работать прозрачно с каким-либо файлом внутри архива будет проблематично, ибо нужны будут дополнительные данные об идентификации ресурса внутри архива. Я лично знаю не много таких потоковых архиваторов(в скобках часто используемое расширение файлов): gzip(.gz, .tgz, .svgz), bzip2(.bz2, .tbz), lzma(.lzma, .tlz), lzma2(.xz, .txz), compress(.Z, .tlz). При желании(и практическом опыте) сюда можно добавить некоторые способы стеганографии. Думаю, если начинать, то с этого.
Насчет сложно: тут много роботы потребуется сделать на стороне АР. И не факт что оно себя оправдает. И на стороне плагинов тоже нужно будет потрудиться(ибо, скажем так, большинство из доступных реализаций и SDK мягко говоря не пригодны для реализации в WINAPI среде).

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

FeyFre, ну, обычно в fb2.zip хранится только один fb2 файл, так что тут всё нормально. К тому же плаг может на уровне кода проверять, единственный ли файл в архиве, и если нет, то выдавать ошибку. Что касается реализации на стороне AP, то мне не видится это сложной задачей - вместо прямого чтения из файла встроить обращение к плагину. Другое дело, что целесообразность и востребованность этой фичи пока довольно низкая.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Fr0sT
Да, скачанные с флибусты и с либрусека содержат один файл. В принципе специально для такого случая можно будет и написать плагинок.
Что касается реализации на стороне AP, то мне не видится это сложной задачей - вместо прямого чтения из файла встроить обращение к плагину.
К фильтру обратится - пол беды, а вот сделать API интерфейс для фильтра нужно будет хорошенько подумать. Ибо фильтры так просто не получится вживить в АП, как это сделано с плагинами(да и схема взаимодействия с плагинами не за один день делалась)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

У меня fb2 лежат на диске с расширением fb2; редактирую их в AkelPad'е как обычный xml-файл, никаких проблем нет.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

VladSh
А у меня lilo.conf.5.gz лежит на диске как lilo.conf.5.gz и посмотреть мне его нечем.
Также у меня есть достаточно количество файлов .css.gz .js.gz
Но с .gz меньше проблем, ибо TC их понимает, а вот .bz2 .xz ни в какую.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

FeyFre
а вот сделать API интерфейс для фильтра нужно будет хорошенько подумать
А там нужно что-то еще кроме получить текст - отдать текст? Настройки для начала можно отдать на откуп самим фильтрам и текстовым конфигам.
Кстати о настройках, в Миранде здорово реализован централизованный интерфейс для настроек плагинов
Image
насколько я понял, плагины содержат ресурсы диалогов без самостоятельных рамок, а программа их встраивает в свое собственное окно.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

А там нужно что-то еще кроме получить текст - отдать текст?
Да, у фильтра будут в основном вызывать команды типа:
1. Тебе понятен этот формат?
2. Вот тебе ПОТОК1 с бинарными данными(например содержимого gz файла), выдай мне в ПОТОК2 текст.
3. Вот тебе ПОТОК1 с текстом, положи его в понятном тебе формате в ПОТОК2.
Причем ПОТОКИ - это не имена файлов, которые фильтр будет самостоятельно открывать, а некий абстрактный объект(дескриптор). И как работать с этим объектом знает только АП, и предлагает фильтру функции по работе с ним(Это API я имел в виду).
в Миранде
Да, Миранда софтина мощная, продуманная. Да, программа встраивает в окно, но нет, ресурсы диалогов могут находится в любой форме(любой рамочности), Миранда сама подставит нужную.

Code: Select all

opd->pTemplate->style&=~(WS_VISIBLE|WS_CHILD|WS_POPUP|WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|DS_MODALFRAME|DS_CENTER);
opd->pTemplate->style|=WS_CHILD;

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

FeyFre wrote:Также у меня есть достаточно количество файлов .css.gz .js.gz
Но с .gz меньше проблем, ибо TC их понимает, а вот .bz2 .xz ни в какую.
Так может всё-таки это реквест к TC, на поддержку этих типов файлов?

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

VladSh, на TC реквест я то написал :), только вот ничего хорошего с этого не получится.
Ну напишут плагин распаковщик. Ну войдет ТС в архив. Ну увижу я там один файл, ну нажму F4, ну распакует ТС файл во временную папку, ну запустит оно АР натравив его на временный файл.
И всё, пиши пропало:
1. Запустится АР, увидит что запускаться дважды нельзя и один экземпляр уже запущен, ну и не долго думая передаст имя файла первому, а сам преспокойно завершится.
2. ТС увидит что АР завершился, ну и возьмет и удалит временный файл.
Всё, приехали:
1. АР колдует над несуществующим файлом.
2. А как думаешь, что попадет в список свежих(recent files)? Да правильно, путь к временному файлу в папочке %temp%\_tc либо %temp%\_tc_

А если TC нету? Только Проводник? Или нищий Far?

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

FeyFre
да, насчет потока это я не додумал. В самом деле, не повторять же в каждом фильтре открытие-чтение-сохранение файла. Хотя чем не вариант передача указателя? Всё равно ведь поточной (ака покусочной) загрузки нету, насколько мне известно, и данные считываются одним куском. Вот его-то и можно скормить плагину. Это автоматом сделает ненужным пункт AP->Фильтр "Знаешь ли ты этот формат". Либо декодировал, либо нет. Ну и в обратную сторону точно так же.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

не повторять же в каждом фильтре открытие-чтение-сохранение файла
Дело не столько в повторении, сколько в том, что это каждый будет делать по своему. Тот с теми флагами открывает файл, тот с другими, в итоге багов будет в избытке.
Второй плюс абстрактного ПОТОКА, это то , что фильтр не будет в общем то и не интересовать откуда пришли данные, если он имеет к ним доступ. А данные могут прийти и с файла, и с памяти, и с другого фильтра!
Ну например фильтр gzip-ит, но ему на вход приходит не просто текст, а выход из другого фильтра который tar-ит. Старый-добрый pipeline-нг. Ну мало там что может понадобится.
Всё равно ведь поточной (ака покусочной) загрузки нету, насколько мне известно, и данные считываются одним куском.
Да читается, но:
1. Это ненадежно. Я не знаю сможет ли ядро за один раз прочесть 2ГБ файл. По-моему что нет. И поэтому прочтет сколько сможет. Остальное недочитает.
2. Если дело пойдет к реализации это изменят, ибо не нужно.
Это автоматом сделает ненужным пункт AP->Фильтр "Знаешь ли ты этот формат"
Такой пункт всегда нужен. Пользователю он нуже в первую очередь. И возможно даже фильтрам(в дальней перспективе).

ЗЫ: пока писал ответ, весь разговор переехал в отдельную тему. Помогите кто может.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

1. Это ненадежно. Я не знаю сможет ли ядро за один раз прочесть 2ГБ файл. По-моему что нет. И поэтому прочтет сколько сможет. Остальное недочитает.
Ну, сам Акель-то тоже не за раз файл читает. Насчет одного куска - это я имел в виду, что сначала грузим всё содержимое файла, потом его перекодируем, а потом отображаем. Передача потоков хуже, потому как привязывает к языку, к версии Си, к разрядности наверняка. Либо придется реализовывать языко-независимый интерфейс (типа COM, не к ночи буде помянут). И то и другое - имхо, неудобно и муторно. Так что старые добрые указатели и буферы - то, что надо

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Ну, сам Акель-то тоже не за раз файл читает.
Упс. Моя ошибка. В закомментированую функцию посмотрел в исходнике, которая пыталась читать разом.
Передача потоков хуже, потому как привязывает к языку, к версии Си, к разрядности наверняка.
Ну я пока не уточняю что за объект будем понимать как поток: IStream, IPersist, File Mapping, Named/Unnamed pipe или что-то другое.
И к языку, а тем более к версии компилятора(наверное это имелось в виду, а не версии K&R, ANSI, C99 etc) привязки не задумывал. Точнее так: привязку даже задумывать не нужно, она у нас есть - архитектура процессора. На каком языке не писалась бы программа, ABI будет совместимо с учетом архитектуры. Ну например, если говорить о Windows, то соглашение вызовов __stdcall точно соблюдается всеми видами существующих компиляторов высокоуровневых языков(низкоуровневые ассемблеры сами себе хозяева в этом смысле, точнее программист хозяин), ибо на нем работает всё API ОС(все CALLBACK,WINAPI, APIENTRY, STDMETHOD(которым пользуется COM), STDCALL), так что с этим проблем не будет.
Указатели имеют привычку быть нулевыми, а буфера - переполняться %)
Post Reply