AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian)
View previous topic :: View next topic  
Author Message
FeyFre



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Fri Feb 11, 2011 1:44 pm    Post subject: Reply with quote

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

Например:

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


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


Более практический пример - редактирование ресурсов MS Windows:
  • При открытии выбирают exe, dll, ocx, res и прочие файлы-контейнеры. Фильтр их де компилирует в исходный текст(задача 100% обратима).
  • Пользователь редактирвует всё что желает.
  • При сохранении фильтр попытается откомпилировать результат работы пользователя, и ложит в указанный модуль.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Mon Feb 14, 2011 11:41 am    Post subject: Reply with quote

Идея любопытная, и вроде бы не очень сложно реализуемая. Добавлю в примеры редактирование *.fb2.zip файлов
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Mon Feb 14, 2011 4:59 pm    Post subject: Reply with quote

Fr0sT
Ну zip это немножко не то. Почему? Потому-что zip - многопоточный контейнер(читай может в содержать себе много файлов, в том числе ноль). А раз так, то работать прозрачно с каким-либо файлом внутри архива будет проблематично, ибо нужны будут дополнительные данные об идентификации ресурса внутри архива. Я лично знаю не много таких потоковых архиваторов(в скобках часто используемое расширение файлов): gzip(.gz, .tgz, .svgz), bzip2(.bz2, .tbz), lzma(.lzma, .tlz), lzma2(.xz, .txz), compress(.Z, .tlz). При желании(и практическом опыте) сюда можно добавить некоторые способы стеганографии. Думаю, если начинать, то с этого.
Насчет сложно: тут много роботы потребуется сделать на стороне АР. И не факт что оно себя оправдает. И на стороне плагинов тоже нужно будет потрудиться(ибо, скажем так, большинство из доступных реализаций и SDK мягко говоря не пригодны для реализации в WINAPI среде).
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Tue Feb 15, 2011 7:22 am    Post subject: Reply with quote

FeyFre, ну, обычно в fb2.zip хранится только один fb2 файл, так что тут всё нормально. К тому же плаг может на уровне кода проверять, единственный ли файл в архиве, и если нет, то выдавать ошибку. Что касается реализации на стороне AP, то мне не видится это сложной задачей - вместо прямого чтения из файла встроить обращение к плагину. Другое дело, что целесообразность и востребованность этой фичи пока довольно низкая.
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Tue Feb 15, 2011 9:33 am    Post subject: Reply with quote

Fr0sT
Да, скачанные с флибусты и с либрусека содержат один файл. В принципе специально для такого случая можно будет и написать плагинок.
Quote:
Что касается реализации на стороне AP, то мне не видится это сложной задачей - вместо прямого чтения из файла встроить обращение к плагину.
К фильтру обратится - пол беды, а вот сделать API интерфейс для фильтра нужно будет хорошенько подумать. Ибо фильтры так просто не получится вживить в АП, как это сделано с плагинами(да и схема взаимодействия с плагинами не за один день делалась)
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Tue Feb 15, 2011 9:36 am    Post subject: Reply with quote

У меня fb2 лежат на диске с расширением fb2; редактирую их в AkelPad'е как обычный xml-файл, никаких проблем нет.
Back to top
View user's profile Send private message Visit poster's website
FeyFre



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Tue Feb 15, 2011 12:11 pm    Post subject: Reply with quote

VladSh
А у меня lilo.conf.5.gz лежит на диске как lilo.conf.5.gz и посмотреть мне его нечем.
Также у меня есть достаточно количество файлов .css.gz .js.gz
Но с .gz меньше проблем, ибо TC их понимает, а вот .bz2 .xz ни в какую.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Tue Feb 15, 2011 12:54 pm    Post subject: Reply with quote

FeyFre
Quote:
а вот сделать API интерфейс для фильтра нужно будет хорошенько подумать

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

насколько я понял, плагины содержат ресурсы диалогов без самостоятельных рамок, а программа их встраивает в свое собственное окно.
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Tue Feb 15, 2011 1:41 pm    Post subject: Reply with quote

Quote:
А там нужно что-то еще кроме получить текст - отдать текст?
Да, у фильтра будут в основном вызывать команды типа:
1. Тебе понятен этот формат?
2. Вот тебе ПОТОК1 с бинарными данными(например содержимого gz файла), выдай мне в ПОТОК2 текст.
3. Вот тебе ПОТОК1 с текстом, положи его в понятном тебе формате в ПОТОК2.
Причем ПОТОКИ - это не имена файлов, которые фильтр будет самостоятельно открывать, а некий абстрактный объект(дескриптор). И как работать с этим объектом знает только АП, и предлагает фильтру функции по работе с ним(Это API я имел в виду).
Quote:
в Миранде
Да, Миранда софтина мощная, продуманная. Да, программа встраивает в окно, но нет, ресурсы диалогов могут находится в любой форме(любой рамочности), Миранда сама подставит нужную.
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
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
VladSh



Joined: 29 Nov 2006
Posts: 2584
Location: Киев, Русь

PostPosted: Tue Feb 15, 2011 1:53 pm    Post subject: Reply with quote

FeyFre wrote:
Также у меня есть достаточно количество файлов .css.gz .js.gz
Но с .gz меньше проблем, ибо TC их понимает, а вот .bz2 .xz ни в какую.
Так может всё-таки это реквест к TC, на поддержку этих типов файлов?
Back to top
View user's profile Send private message Visit poster's website
FeyFre



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Tue Feb 15, 2011 2:06 pm    Post subject: Reply with quote

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

А если TC нету? Только Проводник? Или нищий Far?
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Tue Feb 15, 2011 4:33 pm    Post subject: Reply with quote

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



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Tue Feb 15, 2011 5:18 pm    Post subject: Reply with quote

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

ЗЫ: пока писал ответ, весь разговор переехал в отдельную тему. Помогите кто может.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Tue Feb 15, 2011 9:20 pm    Post subject: Reply with quote

Quote:
1. Это ненадежно. Я не знаю сможет ли ядро за один раз прочесть 2ГБ файл. По-моему что нет. И поэтому прочтет сколько сможет. Остальное недочитает.

Ну, сам Акель-то тоже не за раз файл читает. Насчет одного куска - это я имел в виду, что сначала грузим всё содержимое файла, потом его перекодируем, а потом отображаем. Передача потоков хуже, потому как привязывает к языку, к версии Си, к разрядности наверняка. Либо придется реализовывать языко-независимый интерфейс (типа COM, не к ночи буде помянут). И то и другое - имхо, неудобно и муторно. Так что старые добрые указатели и буферы - то, что надо
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2008
Location: Vinnitsa, Ukraine

PostPosted: Tue Feb 15, 2011 10:05 pm    Post subject: Reply with quote

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
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian) All times are GMT
Page 1 of 1

 
Jump to:  
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


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group