| View previous topic :: View next topic |
| Author |
Message |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Fri Feb 11, 2011 1:44 pm Post subject: |
|
|
Чего бы хотелось, точнее чего бы хотелось иметь возможность делать из плагина:
Возможно ли плагином как-то затесаться в процесс чтения/записи файла в качестве фильтра(назвем это так)?
Например:
У меня есть файл verybiglist.txt который занимает 20MiB. Для экономии места я хочу его сжать каким-нибудь потоковым архиватором(например gzip). Я то зажму, но потом что-бы его просто посмотреть нужно будет его сначала распаковать во временную папку аж потом смотреть. Не совсем удобно и быстро. Тем более если нужно отредактировать.
Второй, более распространенный и реальный пример: есть файл some_picture.svgz - GZip-нутый svg-файл(svg - xml, т.е. нами читаемый).
Также такие фильтры могут быть использованы для чтения/редактирования некоторых файлов простых бинарных форматов по такому алгоритму(абстрактный пример, реального не дам):- Предположим формат специфицирован как набор 4-байтных блоков, которые представляют собой 32 беззнаковые целые.
- Тогда, при открытии этого файла АкелПадом, фильтр увидит что он формат понимает, развернет его в обычный читаемый текст(по одному числу на строчку) и выдаст как содержимое документа. При этом АкелПад должен запомнить каким фильтром он открыл документ.
- Если пользователь пожелает поредактирвовать документ, то при его сохранении Акел должен добросовестно обратится к запомненному фильтру. Фильтр свою очередь возьмет у АкелПад-а текст, распарсит его и сохранит в бинарном формате(если распарсит правильно). Также в диалоге выбора имени файла для сохранения "Сохранить как..." можно будет добавить список этих фильтров.
Более практический пример - редактирование ресурсов MS Windows:- При открытии выбирают exe, dll, ocx, res и прочие файлы-контейнеры. Фильтр их де компилирует в исходный текст(задача 100% обратима).
- Пользователь редактирвует всё что желает.
- При сохранении фильтр попытается откомпилировать результат работы пользователя, и ложит в указанный модуль.
|
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Mon Feb 14, 2011 11:41 am Post subject: |
|
|
| Идея любопытная, и вроде бы не очень сложно реализуемая. Добавлю в примеры редактирование *.fb2.zip файлов |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Mon Feb 14, 2011 4:59 pm Post subject: |
|
|
Fr0sT
Ну zip это немножко не то. Почему? Потому-что zip - многопоточный контейнер(читай может в содержать себе много файлов, в том числе ноль). А раз так, то работать прозрачно с каким-либо файлом внутри архива будет проблематично, ибо нужны будут дополнительные данные об идентификации ресурса внутри архива. Я лично знаю не много таких потоковых архиваторов(в скобках часто используемое расширение файлов): gzip(.gz, .tgz, .svgz), bzip2(.bz2, .tbz), lzma(.lzma, .tlz), lzma2(.xz, .txz), compress(.Z, .tlz). При желании(и практическом опыте) сюда можно добавить некоторые способы стеганографии. Думаю, если начинать, то с этого.
Насчет сложно: тут много роботы потребуется сделать на стороне АР. И не факт что оно себя оправдает. И на стороне плагинов тоже нужно будет потрудиться(ибо, скажем так, большинство из доступных реализаций и SDK мягко говоря не пригодны для реализации в WINAPI среде). |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Tue Feb 15, 2011 7:22 am Post subject: |
|
|
| FeyFre, ну, обычно в fb2.zip хранится только один fb2 файл, так что тут всё нормально. К тому же плаг может на уровне кода проверять, единственный ли файл в архиве, и если нет, то выдавать ошибку. Что касается реализации на стороне AP, то мне не видится это сложной задачей - вместо прямого чтения из файла встроить обращение к плагину. Другое дело, что целесообразность и востребованность этой фичи пока довольно низкая. |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Tue Feb 15, 2011 9:33 am Post subject: |
|
|
Fr0sT
Да, скачанные с флибусты и с либрусека содержат один файл. В принципе специально для такого случая можно будет и написать плагинок. | Quote: | | Что касается реализации на стороне AP, то мне не видится это сложной задачей - вместо прямого чтения из файла встроить обращение к плагину. | К фильтру обратится - пол беды, а вот сделать API интерфейс для фильтра нужно будет хорошенько подумать. Ибо фильтры так просто не получится вживить в АП, как это сделано с плагинами(да и схема взаимодействия с плагинами не за один день делалась) |
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2509 Location: Киев, Русь
|
Posted: Tue Feb 15, 2011 9:36 am Post subject: |
|
|
| У меня fb2 лежат на диске с расширением fb2; редактирую их в AkelPad'е как обычный xml-файл, никаких проблем нет. |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Tue Feb 15, 2011 12:11 pm Post subject: |
|
|
VladSh
А у меня lilo.conf.5.gz лежит на диске как lilo.conf.5.gz и посмотреть мне его нечем.
Также у меня есть достаточно количество файлов .css.gz .js.gz
Но с .gz меньше проблем, ибо TC их понимает, а вот .bz2 .xz ни в какую. |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Tue Feb 15, 2011 12:54 pm Post subject: |
|
|
FeyFre
| Quote: | | а вот сделать API интерфейс для фильтра нужно будет хорошенько подумать |
А там нужно что-то еще кроме получить текст - отдать текст? Настройки для начала можно отдать на откуп самим фильтрам и текстовым конфигам.
Кстати о настройках, в Миранде здорово реализован централизованный интерфейс для настроек плагинов
насколько я понял, плагины содержат ресурсы диалогов без самостоятельных рамок, а программа их встраивает в свое собственное окно. |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Tue Feb 15, 2011 1:41 pm Post subject: |
|
|
| Quote: | | А там нужно что-то еще кроме получить текст - отдать текст? | Да, у фильтра будут в основном вызывать команды типа:
1. Тебе понятен этот формат?
2. Вот тебе ПОТОК1 с бинарными данными(например содержимого gz файла), выдай мне в ПОТОК2 текст.
3. Вот тебе ПОТОК1 с текстом, положи его в понятном тебе формате в ПОТОК2.
Причем ПОТОКИ - это не имена файлов, которые фильтр будет самостоятельно открывать, а некий абстрактный объект(дескриптор). И как работать с этим объектом знает только АП, и предлагает фильтру функции по работе с ним(Это API я имел в виду).
Да, Миранда софтина мощная, продуманная. Да, программа встраивает в окно, но нет, ресурсы диалогов могут находится в любой форме(любой рамочности), Миранда сама подставит нужную. | Code: | opd->pTemplate->style&=~(WS_VISIBLE|WS_CHILD|WS_POPUP|WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|DS_MODALFRAME|DS_CENTER);
opd->pTemplate->style|=WS_CHILD; |
|
|
| Back to top |
|
 |
VladSh
Joined: 29 Nov 2006 Posts: 2509 Location: Киев, Русь
|
Posted: Tue Feb 15, 2011 1:53 pm Post subject: |
|
|
| FeyFre wrote: | Также у меня есть достаточно количество файлов .css.gz .js.gz
Но с .gz меньше проблем, ибо TC их понимает, а вот .bz2 .xz ни в какую. | Так может всё-таки это реквест к TC, на поддержку этих типов файлов? |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Tue Feb 15, 2011 2:06 pm Post subject: |
|
|
VladSh, на TC реквест я то написал , только вот ничего хорошего с этого не получится.
Ну напишут плагин распаковщик. Ну войдет ТС в архив. Ну увижу я там один файл, ну нажму F4, ну распакует ТС файл во временную папку, ну запустит оно АР натравив его на временный файл.
И всё, пиши пропало:
1. Запустится АР, увидит что запускаться дважды нельзя и один экземпляр уже запущен, ну и не долго думая передаст имя файла первому, а сам преспокойно завершится.
2. ТС увидит что АР завершился, ну и возьмет и удалит временный файл.
Всё, приехали:
1. АР колдует над несуществующим файлом.
2. А как думаешь, что попадет в список свежих(recent files)? Да правильно, путь к временному файлу в папочке %temp%\_tc либо %temp%\_tc_
А если TC нету? Только Проводник? Или нищий Far? |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Tue Feb 15, 2011 4:33 pm Post subject: |
|
|
FeyFre
да, насчет потока это я не додумал. В самом деле, не повторять же в каждом фильтре открытие-чтение-сохранение файла. Хотя чем не вариант передача указателя? Всё равно ведь поточной (ака покусочной) загрузки нету, насколько мне известно, и данные считываются одним куском. Вот его-то и можно скормить плагину. Это автоматом сделает ненужным пункт AP->Фильтр "Знаешь ли ты этот формат". Либо декодировал, либо нет. Ну и в обратную сторону точно так же. |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Tue Feb 15, 2011 5:18 pm Post subject: |
|
|
| Quote: | | не повторять же в каждом фильтре открытие-чтение-сохранение файла | Дело не столько в повторении, сколько в том, что это каждый будет делать по своему. Тот с теми флагами открывает файл, тот с другими, в итоге багов будет в избытке.
Второй плюс абстрактного ПОТОКА, это то , что фильтр не будет в общем то и не интересовать откуда пришли данные, если он имеет к ним доступ. А данные могут прийти и с файла, и с памяти, и с другого фильтра!
Ну например фильтр gzip-ит, но ему на вход приходит не просто текст, а выход из другого фильтра который tar-ит. Старый-добрый pipeline-нг. Ну мало там что может понадобится. | Quote: | | Всё равно ведь поточной (ака покусочной) загрузки нету, насколько мне известно, и данные считываются одним куском. | Да читается, но:
1. Это ненадежно. Я не знаю сможет ли ядро за один раз прочесть 2ГБ файл. По-моему что нет. И поэтому прочтет сколько сможет. Остальное недочитает.
2. Если дело пойдет к реализации это изменят, ибо не нужно. | Quote: | | Это автоматом сделает ненужным пункт AP->Фильтр "Знаешь ли ты этот формат" | Такой пункт всегда нужен. Пользователю он нуже в первую очередь. И возможно даже фильтрам(в дальней перспективе).
ЗЫ: пока писал ответ, весь разговор переехал в отдельную тему. Помогите кто может. |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Tue Feb 15, 2011 9:20 pm Post subject: |
|
|
| Quote: | | 1. Это ненадежно. Я не знаю сможет ли ядро за один раз прочесть 2ГБ файл. По-моему что нет. И поэтому прочтет сколько сможет. Остальное недочитает. |
Ну, сам Акель-то тоже не за раз файл читает. Насчет одного куска - это я имел в виду, что сначала грузим всё содержимое файла, потом его перекодируем, а потом отображаем. Передача потоков хуже, потому как привязывает к языку, к версии Си, к разрядности наверняка. Либо придется реализовывать языко-независимый интерфейс (типа COM, не к ночи буде помянут). И то и другое - имхо, неудобно и муторно. Так что старые добрые указатели и буферы - то, что надо |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Tue Feb 15, 2011 10:05 pm Post subject: |
|
|
| Quote: | | Ну, сам Акель-то тоже не за раз файл читает. | Упс. Моя ошибка. В закомментированую функцию посмотрел в исходнике, которая пыталась читать разом. | Quote: | | Передача потоков хуже, потому как привязывает к языку, к версии Си, к разрядности наверняка. | Ну я пока не уточняю что за объект будем понимать как поток: IStream, IPersist, File Mapping, Named/Unnamed pipe или что-то другое.
И к языку, а тем более к версии компилятора(наверное это имелось в виду, а не версии K&R, ANSI, C99 etc) привязки не задумывал. Точнее так: привязку даже задумывать не нужно, она у нас есть - архитектура процессора. На каком языке не писалась бы программа, ABI будет совместимо с учетом архитектуры. Ну например, если говорить о Windows, то соглашение вызовов __stdcall точно соблюдается всеми видами существующих компиляторов высокоуровневых языков(низкоуровневые ассемблеры сами себе хозяева в этом смысле, точнее программист хозяин), ибо на нем работает всё API ОС(все CALLBACK,WINAPI, APIENTRY, STDMETHOD(которым пользуется COM), STDCALL), так что с этим проблем не будет.
Указатели имеют привычку быть нулевыми, а буфера - переполняться %) |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|