Адаптеры (или плагины на любых языках и с любым интерфейсом)

Разработка Far.
User avatar
DrKnS
Posts: 4581
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 115 times
Contact:

Адаптеры (или плагины на любых языках и с любым интерфейсом)

Post by DrKnS » Fri 02 Aug, 2013 18:33

Как известно, фар считает расово верным плагином только native win32 dll с чётко определенным интерфейсом.

В то же время:
- регулярно возникают желающие писать плагины на дотнете, луа, жаве, жаваскрипте, пхп etc.
- чуть реже, но тоже встречаются желающие использовать в качестве плагинов вполне себе native win32 dll, но более другие, например, плагины от Far2 или TC.

В принипе, и в том, и в другом случае проблема решаема:
- либо написанием своего лунапарка менеджера плагинов, как-то там загружающего требуемые псевдоплагины и выдающего их наружу в каком-то своём меню (farnet, w?x2far, luafar)
- либо написанием своего загрузчика, подкладываемого в каждую папку с псевдоплагином (far3wrap, luafar)

Недостатки и ограничения обоих подходов хорошо известны.


Но, в принципе, интерфейс плагинов в фаре достаточно абстрактен и его вполне можно сделать ещё немного абстрактнее:

Если изобразить dll с примерно таким интерфейсом:



- и примерно такой реализацией:



- то всё, что этот адаптер выдаст, будет трактоваться фаром как полноценный плагин первого уровня, с загрузкой/выгрузкой, локализацией и прочими плюшками.

Хотелось бы услышать комментарии от людей, которые на этом собаку съели.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman » Sat 03 Aug, 2013 02:46

Искать лень, но когда-то, вроде мной, предлагалось что-то подобное (или не подобное?), наверное, по ходу разработки Фарнет-а. Если не ошибаюсь, идея была проста - там, где сейчас одна структура инфы по плагину возвращается, возвращать массив этих структур, по одной на суб-плагин (как плагин верхнего уровня это делает и что он понимает под суб-плагинами с этими структурами - его дело). А Фар трактует их как обычные плагины первого уровня, ему-то какая разница. Бонус - не надо создавать полный лунапарк (локализация, хелп, кэширование, настройки, и еще, может, что-то делается в суб-плагинах обычными ср-вами Фара, плагин верхнего уровня не обязан извращаться).

Поскольку в Фарнет лунапарк для модулей создать пришлось все-равно (в чем-то не хуже родного Фаровского, кроме хелпа, который у суб-плагинов отсутствует "на верхнем уровне", без чего, в общем, жить можно), то актуальность для Фарнет как бы отпала. Но это было бы полезно для других будущих мультиплагинов, а то создание лунапарков в каждом - это и нехилый труд для автора верхнего уровня, и отсутствие стандарта лунапарка - каждый по своим правилам это будет делать, то есть писателям суб-плагинов будет сложней.

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Shmuel » Sat 03 Aug, 2013 05:37

Хотелось бы внести уточнения по поводу LuaFAR-плагинов и их мифических ограничений.

Исходной целью создания системы LuaFAR была возможность написания плагинов на Lua, и эта цель была достигнута в первом же релизе. То-есть, в принципе нет никакой разницы между "нативными" плагинами и LuaFAR-плагинами, если не считать, что последним нужны 2 длл-ки рантайма (lua5.1.dll и luafar3.dll), лежащие на %path% или в %farhome%, которые являются общими для всех LuaFAR-плагинов, будь их хоть 100.

Идея сделать LuaFAR-плагин "хостом" для скриптов и пакетов скриптов пользователя появилась позже и была реализована в плагине LuaFAR for Editor. При этом проявились ограничения, связанные с тем, что для архитектуры Фара понятия "плагина второго уровня" не существует, о чём уже многократно говорилось. Но эти ограничения никаким образом не связаны с архитектурой и дизайном системы LuaFAR: любой "нативный" плагин, который захочет стать хостом для других плагинов, столкнётся с теми же ограничениями.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman » Sat 03 Aug, 2013 06:39

Code: Select all

// а это "как бы GetProcAddress"
FARPROC WINAPI GetFunctionAddress(HANDLE Instance, const wchar_t* functionname);
Это не очень будет работать для языков, где понятия адрес функции отсутствует. Но это и не особо надо, Фарнет же обходится. Т.е. в общем (идеальном?) случае вызываться-то по экспортируемым функциям должен все-таки верхний плагин, но он должен быть при каждом вызове обеспечен инфой, к кому из его суб-плагинов это относится. А верхний это разруливает (трансляция параметров и вызов чего-то в суб-плагине, в зависимости от языка программирования).

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman » Sat 03 Aug, 2013 06:52

Code: Select all

// Уж не плагин ли filename? Вызывается для всего подряд, в общем случае тут достаточно проверки расширения.
BOOL WINAPI *IsPlugin(const wchar_t* filename)
Это тоже не очень эффективно. Да и на положение файлов или их расширения накладывает ограничения, что не всегда будет удобно (скажем, у PowerShell скриптов обязано быть расширение ps1, это правило PowerShell). Плагин верхнего уровня сам решает, что у него является суб-плагинами и где они лежат. Просто он должен вернуть Фару всю нужную инфу в виде массива структур за один вызов специальной функции. То есть "сканирование" суб-плагинов все-таки лучше пусть плагин верхнего уровня делал бы (а Фар кеширует при первом вызове). Единственное но. При таком подходе, наверное, суб-плагины должны будут различаться по именам на начальном этапе загрузки и уже позже связываться с их гуидами, в том числе кешированными, а то "грузить" их придется всякий раз или мета-файлы с гуидами иметь и читать всякий раз.

Так или иначе, при желании все это решаемо красиво и универсально и без специфической привязки к С/С++ (как адреса ф-й, например). Но это хорошая задача, как сделать грамотно.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman » Sat 03 Aug, 2013 07:07

Вообще-то при подходе с мета-файлами можно и Фару поручить сканировать их (и расширение может быть специальное, любое оговоренное). Об этом можно подумать, что там должно быть, чтобы вполне идентифицировать суб-плагин и для Фара на этапе сканирования, и для верхнего плагина (часть этой инфы ему понадобится, либо Фар передаст, либо просто придется тоже прочитать мета-файл при нужде). Но такой подход мной еще не опробован, просто фантазирую пока.

User avatar
DrKnS
Posts: 4581
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 115 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS » Sat 03 Aug, 2013 07:15

Это не очень будет работать для языков, где понятия адрес функции отсутствует.
Так а я о чем. Перечитай спойлер ещё раз.
Для каждого "плагина" у адаптера спрашивается, что этот плагин "умеет".
Адаптер, естественно, возвращает адреса на свои функции. Или не возвращает.
Потом, при вызове функции, адаптер сможет по Info->Instance понять, кто это и действовать по ситуации.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman » Sat 03 Aug, 2013 08:57

То есть для ф-ии functionname, если ни один модуль не работает с ней, плагин вернет 0, иначе вернет адрес своей ф-ии, которая будет транслировать вызов по модулям в зависимости от Instance. Так? Если так, то да, хорошо.

З.Ы. Лучше не имена ф-й, а константные идентификаторы их.

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by t-rex » Sat 03 Aug, 2013 23:47

Недавно думал а таком же, вроде как то что надо.

User avatar
Alexey Samlyukov
Posts: 1759
Joined: Tue 15 Mar, 2005 17:28
Been thanked: 2 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Alexey Samlyukov » Wed 07 Aug, 2013 02:33

а можно сделать так, чтоб псевдоплагины/скрипты могли обновляться апдейтером? т.е. чтоб они заполняли структуру GlobalInfo.

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Sav » Wed 07 Aug, 2013 07:13

Code: Select all

drkns 06.08.2013 19:28:53 +0200 - build 3596

1. Внедряем адаптеры плагинов.
   Подробности на http://forum.farmanager.com/viewtopic.php?t=8114, описание интерфейса там же.
Ого, как быстро, даже без мантиса движуха пошла.
Честно говоря, читая тему не понял, что все дружно решили привязываться к файлам (плагин - обязательно файл). Думаю, это категорически неправильно. Языки со всякими закидонами бывают, можно и в одном файле несколько плагинов написать, может и на один плагин большая россыпь файлов быть (даже одного расширения), что обнюхивать их устанешь. Да и не всегда удобно их складывать в плагиновые каталоги. Можно нафантазировать и интернет-плагины, запускаемые сразу из http://..
Не правильнее ли спросить "адаптер" пусть поищет, скажет сколько у него плагинов, даст список?
Кстати, не понял что такое "адаптер" - я ожидал, что это будет тоже плагин, но в концепции опроса пофайлово непонятно, как сделать, чтобы он оказался загружен до поиска его файлов.
А теперь получается появится еще один новый вид плагинов - "адаптеры"?

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by t-rex » Wed 07 Aug, 2013 11:27

Sav wrote:Честно говоря, читая тему не понял, что все дружно решили привязываться к файлам (плагин - обязательно файл). Думаю, это категорически неправильно. Языки со всякими закидонами бывают, можно и в одном файле несколько плагинов написать, может и на один плагин большая россыпь файлов быть (даже одного расширения), что обнюхивать их устанешь. Да и не всегда удобно их складывать в плагиновые каталоги. Можно нафантазировать и интернет-плагины, запускаемые сразу из http://..
1. У тебя много плагинов в одном файле - сделай много xxx.plugin файлов которые будут to represent плагин.
2. Файл lala.http и готово, ни кто ни в чем не ограничен.

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Sav » Wed 07 Aug, 2013 11:58

Понятно, что выкрутится можно, но, по-моему, сущность лишняя.
Alexey Samlyukov wrote:чтоб псевдоплагины/скрипты могли обновляться апдейтером
Теперь еще надо будет и адаптеры обновлять.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman » Wed 07 Aug, 2013 12:02

Sav wrote:Понятно, что выкрутится можно, но, по-моему, сущность лишняя.
Нет не лишняя, ибо привязка к файлам на диске нужна все равно, например, для языковых файлов и файлов помощи, которые идут с суб-плагином (а у нормально сделанного эти файлы вполне подразумеваются).

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman » Wed 07 Aug, 2013 12:34

(Я пока код не смотрел) Подход с IsPlugin будет, да? То есть Фар сам сканирует файлы? Все подряд в папке плагина и подпапках?

-- Что если плагин хочет модули где-то отдельно иметь, например, как Фарнет сейчас?
-- Если среди этих файлов DLL-ки, то Фар будет их пытаться грузить как обычные DLL-ки, проверяя на обычный плагин?

User avatar
DrKnS
Posts: 4581
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 115 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS » Wed 07 Aug, 2013 14:11

Не правильнее ли спросить "адаптер" пусть поищет, скажет сколько у него плагинов, даст список?
-- Что если плагин хочет модули где-то отдельно иметь, например, как Фарнет сейчас?
Люди, вы тему читали?
Речь не о "плагинах с сабплагинами", речь о "прослойках", которые позволят считать плагинами то, что раньше считать плагинами было нельзя.

Если всё еще не понятно: в линухах например есть wine и mono, который позволяют совершенно чуждые операционке бинарники считать таки программами.
Но не за счёт написания одного большого линухового исполняемого файла, который бы "давал список, а модули где-то отдельно имел", а за счёт прослойки, прозрачно транслирующей чуждые вызовы в понятный системе формат.

Post Reply

Return to “Development”