О простейшем плагине к FAR для работы с файлами ресурсов
Автор: Alexey Tarasov
версия документа: 0.91
Введение
Попытка обоснования необходимости плагина
Подготовка
Ссылки
Код
Введение
В данной статье описано как в кратчайшие сроки добавить в FAR поддержку работы с собственным файлом ресурсов.
Заметка будет полезна всем, кто хотел бы использовать привычный интерфейс для привычных действий.
Попытка обоснования необходимости плагина
Файлы ресурсов необходимы в силу того, что в идеале они удобнее в работе, позволяют производить защиту данных, более эффективно взаимодействовать с файловой подсистемой.
При самом хорошем раскладе сборка ресурсов осуществляется специальной утилитой единожды, после того как все файлы собраны в одну большую кучку и готовы к помещению в файл ресурсов. Связано это с тем, что файл ресурсов может иметь довольно сложную структуру внутренних потоков данных (сжатие, шифрование, шаманство с каталогами), или например, использовать сбалансированное дерево поиска по хэшу имени файла - поэтому добавление одного двух файлов приводит к перестройке значительной части системных данных или к неоптимальному хранению информации.
Однако бывает удобно тестировать более менее готовый файл ресурсов (добавляя/убавляя из него периодически информацию) и пересобирать его каждый раз только из-за этого не представляется эффективным. Естественно, такой подход ведёт к возможно неоптимальному хранению данных в процессе работы, но собственно ничего не мешает пересобрать с оптимизацией получившийся файл один раз на предрелизной стадии.
Подготовка
Перед тем как строить плагин выдвинем постулаты:
1.Есть хорошо нами понимаемый формат файла ресурсов.
2.Существуют средства работы с ним, в том числе библиотека поддержки и утилита сборки.
Первый постулат означает - мы понимаем, что собираемся делать. Второй означает наличие средств доступа к ресурсам (средства подразумеваются низкоуровневые в том плане, что у них отсутствует напрочь приятный графический пользовательский интерфейс)
Мы пойдём самым-самым лёгким путём и будем интегрироваться в FAR посредством плагина MultiArc, который создан именно для того чтобы организовывать работу с различными архивами (читай - файлами ресурсов) с наименьшими затратами на создание плагинов. MultiArc входит в стандартную поставку FAR 1.70.
Наша задача скомпилировать динамическую библиотеку, которая будет экспортировать определённые функции и положить библиотеку в нужное время, в нужное место, с нужным расширением. Эта библиотека будет запускать внешнюю утилиту для выполнения всех операций по работе с файлом ресурсов.
Для компиляции понадобится включить в проект файлы fmt.hpp и plugin.hpp поставляемые опять же с FAR. Выходной файл должен иметь расширение не dll, а fmt. Для экспортируемых функций важно не перемудрить с декорацией экспортируемых символов. Рекомендую также при линковке библиотеки указать нестандартный базовый адрес загрузки, дабы избежать лишних операций при загрузке MultiArc. Полученный плагин следует поместить в %FAR%\Plugins\Multiarc\Formats, где %FAR% - директория, в которую установлен FAR.
Необходимо экспортировать следующие функции (более подробно о работе с ними и параметрах можно узнать из документации и анализа кода приводимого ниже примера):
IsArchive() - вызывается MultiArc для проверки, является ли файл понимаемым нами файлом ресурсов. В частности, очень полезно, когда файл имеет нестандартное расширение.
OpenArchive() - вызывается при открытии файла ресурсов.
GetArcItem() - вызывается для получения данных следующего элемента файла ресурсов. Фактически самым важными будут являться полное имя файла в файле ресурсов и размер. Остальное - по желанию.
CloseArchive() - вызывается для закрытия файла ресурсов.
GetSFXPos() - возвращает смещение на начало данных архива в файле.
GetFormatName() - сообщает стандартное расширение файла ресурсов и его описание.
GetDefaultCommands() - используется для получения командных строк запуска внешней утилиты, которая умеет изменять данные файла ресурсов. В качестве параметров в эти строки можно передавать множество различных шаблонов подстановки, в частности:
%%A - Имя архива. %%W - Папка для временных файлов, включая завершающую косую черту. %%R - Текущая папка в архиве. %%L - Имя списка файлов. Список файлов - это файл, содержащий имена файлов, предназначенных для обработки внешним архиватором. %%F - Имена одного или нескольких файлов для обработки.
Также в командах применяются модификаторы переменных (приведена лишь часть):
Q - заключать имена с пробелами в кавычки; S - использовать '/' вместо '\' в путях файлов; M - передавать имена папок архиваторам как 'имя\*.*'; N - передавать имена папок архиваторам как 'имя'; W - использовать только имя без пути;
Если часть командной строки заключена в фигурные скобки, то она будет добавлена к итоговой строке, подаваемой на вход утилиты, лишь в том случае, если в ней содержится хотя бы одна непустая переменная.
Если внешняя утилита не поддерживает какую-либо команду, соответствующую строку оставляем пустой.
Итак, порядок выполнения примерно такой:
1. Пользователь нажимает ENTER на необходимом файле.
2. Если этот этап произошёл впервые за сеанс работы с FAR, MultiARC загружает плагины второго уровня (плагины к плагину :) ) в память, проверяет наличие у него экспортируемых функций и если всё хорошо, получает информацию о поддерживаемых файлах и командных строках для работы с файлом.
3. Запускается IsArchive() чтобы удостовериться, что файл действительно в том формате, что и должен быть. Если расширение файла неизвестно, эта функция используется для поиска плагина, который узнал в файле свой формат.
4. У GetSFXPos() запрашивается начало данных. Используется в ситуации когда архивы вложены друг в друга и несколько плагинов сообщают, что узнали свой формат. В таком случае выбирается тот, начало данных которого раньше.
5. Файл открывается OpenArchive()
6. Вызывается до тех пор, пока вызывается GetArcItem()
7. Файл закрывается CloseArchive()
8. Пользователь инициирует какое-либо действие (например, просмотр файла), запускается внешняя утилита, которая и достаёт данные необходимого файла.
Как видим, делать в общем-то совсем нечего. Поэтому сразу перейдём к реализации.
Ссылки
Всю необходимую информацию можно получить из документации, поставляемой с FAR'ом.
Список параметров, которые могут передаваться утилитам, запускаемым через MultiArc, можно просмотреть использовав чит-код: F1, Shift-F2, "Модуль работы с архивами", "Командные строки архиваторов"
27 февраля 2006 (Обновление: 28 фев. 2006)
Комментарии [2]