View Issue Details

IDProjectCategoryView StatusLast Update
0000466WishesMacropublic2013-05-30 14:25
ReporterCrOm Assigned Toshmuel  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Fixed in Version3.0 
Summary0000466: Расширение макроязыка плагинами
DescriptionДобавить возможность плагинам расширять функциональность макроязыка путем добавления своих функций, позволяющих обращаться к функциям плагина из макроязыка напрямую (а не программированием комбинаций клавиш)

выглядить это может примерно так.
плагин определяет свой неймспейс, в котором он работает. по этому неймспейсу фар будет определять какому длл отсылать функцию.

плагин должен экспортировать функцию обработки конструкций языка.
например:

paramType * ProcessMacro(char * macro, paramsArray * params, int paramsCount)
//macro - макрослово
//params - массив параметров (элементы либо переменного типа, либо строковые)
//paramsCount - количество переменных (размер массива)
//возвращается тоже либо переменный тип, либо строковый

т.е. если парсер встречает в скрипте что-нить типа math.sin("1.0"),
то из плагина, обрабатывающего неймспейс "math", вызовится функция
ProcessMacro("sin", "1.0", 1);

ну как-то так.
TagsNo tags attached.
Build2893

Relationships

related to 0000018 closedvskirdin Библиотека макрофункций 
child of 0000346 closedvskirdin Возможность построения меню выбора выполняющегося макроса 

Activities

vskirdin

2008-02-04 11:11

administrator   bugnote:0001169

Плагин сам будет исполнять код?
Или... хмм... только функции экспортить?

CrOm

2008-02-04 13:18

reporter   bugnote:0001170

исполнять код чего? макроса?
плагин будет обрабатывать только функцию с параметрами.

не буду далеко ходить за примерами.

вот сейчас чтобы обновить панель в qPlayEx я делаю так: вызываю в Control апдейт, а потом в AdvControl макрос, который вернет на экран окно управления и эквалайзер, если это необходимо после обновления панелей. выглядит макрос так: "ShiftF3 E".
он, естественно, будет работать только с панели плагина.
а вот если бы была возможность расширения макроязыка, то можно былобы сделать макрос типа такого: "qplay.show('main') E" и он бы сработал с любого места

vskirdin

2008-03-15 00:46

administrator   bugnote:0001324

Нужно подумать...
Как, например, макродвиг узнает, что для "qplay" нужно обращаться к плагину qPlayEx?
Наверное нужен какая-нибуть функция у плагина, которую будет дергать ФАР...
Как вариант - расширить структуру OpenPluginInfo - добавить поля "const char *macronamespace" (для "младших моделей" ФАРа, если все правильно программировалось, это будет невидимо, а для дальнейших версий...) + та самая экспортируемая функция ProcessMacro.
ы?

vskirdin

2008-03-15 01:24

administrator   bugnote:0001327

...точнее структура не OpenPluginInfo, а PluginInfo.

vskirdin

2008-03-15 01:38

administrator   bugnote:0001328

попутно вопрос.
в изначальном топике был пример
math.sin("1.0")
а зачем единицу в кавыки брать?
плагин сам будет заниматься парсеньем того, что ему подуснули?
Может имеет смысл плагину в ProcessMacro() передавать массив структур-параметров функции аля
struct {
  int type;
  enum{
    char *s;
    __int64 i;
  } val;
};

CrOm

2008-03-16 01:44

reporter   bugnote:0001333

да через PluginInfo будет наверное правильно. этот неймспейс можно будет кешировать. чтобы потом загружать плагин в нужный момент.

а насчет параметров...
ну просто если у фара только 2 типа данных: строка и целое число, то дробные придется посылать через строку.

vskirdin

2008-03-17 12:37

administrator   bugnote:0001361

ну... плавающую точка добавить непроблема - не было нужды, т.к. макросы предназначены в основном не для расчетов, а для упрощения управления ФАРом ;-)

vskirdin

2008-10-29 01:31

administrator   bugnote:0001900

CrOm, а как быть с потенциально опасными "функциями"?
Текст макроса можно проанализировать визуально, понять что и как.
В случае плагина - сорцов может и не быть (безобидный math.sin("1.0") вместо синуса будет форматировать CD-привод :-))
Хотя и обычные плагины такую же подлянку могут кинуть...

CrOm

2008-10-29 02:58

reporter   bugnote:0001902

потенциально опасными функциями пользоваться не нужно :)

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

зы. приятно, что к теме интерес не пропал

vskirdin

2008-10-29 11:06

administrator   bugnote:0001904

> зы. приятно, что к теме интерес не пропал
я думаю :-)

CrOm

2009-03-10 06:04

reporter   bugnote:0002732

опять на форуме подняли схожую хотелку.
как там, ы?

CrOm

2009-03-23 03:51

reporter   bugnote:0002816

svs 20.03.2009 22:20:25 +0300 - build 832

1. Macro: V=callplugin(SysID[,param])

это то, о чем я думаю?

можно пояснить как-нибудь?

vskirdin

2009-03-23 07:18

administrator   bugnote:0002818

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

CrOm

2009-03-23 07:58

reporter   bugnote:0002819

ну собственно, тоже неплохо. у меня применение этому уже есть.

а что такое "Писание" ?

vskirdin

2009-03-23 08:00

administrator   bugnote:0002820

> а что такое "Писание" ?
:-)
http://api.farmanager.com/

vskirdin

2009-09-07 14:07

administrator   bugnote:0004028

я вернулся... :-)

Есть 2 сценария

1. использовать namespace + ProcessMacroW (в этом случае трудности с контролем аргументов у функций... может что-то еще)

2. имеем MCMD_REGFUNC + ProcessMacroW - здесь ФАР точно будет знать к какому плагину обратится, сколько у функции параметров обязательных и необязательных (здесь по аналогии с регистрацией функций можно добавить MCMD_DEFCONST - регистрацию констант)

ы?

vskirdin

2009-09-07 14:41

administrator   bugnote:0004029

Хмм...
А если плагин "новый" и ни разу не загружался... то нет информации о том, что функция "foo.bar" принадлежит ЭТОМУ плагину!
Видимо namespace нужен... хотя бы для хранения онной в PluginsCache.
хмм..
а имена функций нужно ли сохранять в реестре?

CrOm

2009-09-08 05:05

reporter   bugnote:0004035

да кеширование неймспейса необходимо.
ну а имена функций хранить в реестре, думаю, нет смысла.

а насчет количества параметров... ну тут я даж не знаю.
можно экспортировать функцию-обработчик, примерно с такими параметрами:

ProcessMacroW(LPCTSR sFuncName, varParams* pParams, int nParams);

ну а плагин уже по имени функции будет знать сколько должно быть параметров и какие из них обязательные, а какие нет.
и если что возвращать код ошибки.

vskirdin

2009-09-08 05:59

administrator   bugnote:0004036

> ну а плагин уже по имени функции будет знать сколько должно быть параметров
а смысл от этого? гораздо удобнее на этапе компиляции макроса сказать "вот здесь что-то не так с количеством параметров", чем потом гадать, что за ошибку вернул плагин.

Еще открытый вопрос. Вот мы добавили плагин. Как ФАР узнает, что ЭТА функция относится к вновь прибывшему плагину? (это к тому, что потребуется 2 рестарта ФАРа :-)). Дело в том, что макросы грузятся и компилятся до загрузки плагинов...
так, надо наверное макросы грузить после плагинов...

CrOm

2009-09-08 07:25

reporter   bugnote:0004037

>а смысл от этого? гораздо удобнее на этапе компиляции макроса сказать "вот >здесь что-то не так с количеством параметров", чем потом гадать, что за ошибку >вернул плагин.

в таком случае да. надо заморачиваться с регистрацией функции. и макросы грузить уже опосля.

vskirdin

2009-09-08 14:11

administrator   bugnote:0004042

Тут подумалось.
А может нафиг эту неймспейс и регистрацию?
Можно проще :-)
Сделать через реестр, как описано в 0000018 (описание там я немного подправлю).
Т.е.:
1. плагин экспортирует функцию ProcessMacroW
2. в ветку KeyMacros\MCode забиваем нужную инфу - фар берет отсюда все что нужно.

типа дешево и сердито :-)

CrOm

2009-09-08 16:08

reporter   bugnote:0004045

> типа дешево и сердито :-)

если это означает, что возни меньше, то я согласен и за такой вариант. главное чтобы он привел к исходной идее - расширение макроязыка

vskirdin

2010-09-27 20:38

administrator   bugnote:0005838

небольшой тест: http://skirda-file.googlecode.com/files/m466-1.rar
просьба проверить как взлетит с макросами: просто поработать в этой версии.
здесь немного изменен механизм работы с функциями, без реализации которого дальше трудно двигаться, в разрезе 0000466 и 0000018 (и наследнико-последователей)

vskirdin

2010-09-28 13:16

administrator   bugnote:0005841

Утверждение верно?
"Макрофункция плагина возвращает в качестве результата своей работы только одно значение"

JohnDoe

2010-09-28 15:30

updater   bugnote:0005842

А помимо возвращаемого значения: сможет ли функция производить какие-либо действия?
Типа http://forum.farmanager.com/viewtopic.php?f=15&t=5409

vskirdin

2010-09-28 16:01

administrator   bugnote:0005843

а то!
например, если в плагине повторить математику бэйсиковского оператора PLYA и обозвать его как "sound.play", то вызов в макросе вот такого чуда:
sound.play("T150 ml O3 D#32 O3 C#32 O3 G#32 O2 G#32 O0 G#64 O1 G#64 O3 D#32 C#16")
проиграет первые аккорды Шопена ;-)

DAtaMan

2010-09-28 18:11

reporter   bugnote:0005844

>sound.play(
Только музыки в ФАРе и не хватает :-)

Погонял тестовую версию, ничего деструктивного не замечено.

JohnDoe

2013-01-30 13:06

updater   bugnote:0010149

В LuaMacro предлагается "экспортировать" функции таким образом:

function sin(arg)
  return Plugin.Call("887631b9-49cc-415f-be22-d6b07510510d","Sin",arg)
end

http://forum.farmanager.com/viewtopic.php?p=102943#p102943

JohnDoe

2013-02-26 14:06

updater   bugnote:0010388

В Lua есть стандартное стредство - внешние модули, загружаемые через require.
Dll плагина могла бы одновременно служить и модулем, хотя врядли это будет удобно
http://forum.farmanager.com/viewtopic.php?p=104534#p104534

JohnDoe

2013-02-26 14:15

updater   bugnote:0010389

> function sin(arg)
> return Plugin.Call("887631b9-49cc-415f-be22-d6b07510510d","Sin",arg)
> end
Как выяснилось, есть более красивый способ.

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

А точнее базовыми средствами Lua, даже без какой-либо специальной подержки со стороны фара и плагинов

http://forum.farmanager.com/viewtopic.php?f=15&t=7759

shmuel

2013-03-10 09:32

developer   bugnote:0010488

Как уже было сказано, Plugin.Call + средства Lua дают возможность расширения макроязыка плагинами.

DrKnS

2013-03-15 20:49

administrator   bugnote:0010523

intptr_t WINAPI ProcessMacroW(struct ProcessMacroInfo *Info) и всё остальное под #ifdef MANTIS_0000466 ещё актуально или удаляем?

shmuel

2013-03-15 21:22

developer   bugnote:0010524

Мне кажется, что можно удалить.

shmuel

2013-05-30 14:25

developer   bugnote:0011052

Закрыто ввиду отсутствия фидбека.

Issue History

Date Modified Username Field Change
2008-02-04 03:12 CrOm New Issue
2008-02-04 11:11 vskirdin Note Added: 0001169
2008-02-04 13:18 CrOm Note Added: 0001170
2008-03-15 00:46 vskirdin Note Added: 0001324
2008-03-15 01:24 vskirdin Note Added: 0001327
2008-03-15 01:38 vskirdin Note Added: 0001328
2008-03-16 01:44 CrOm Note Added: 0001333
2008-03-17 12:37 vskirdin Note Added: 0001361
2008-10-24 12:05 vskirdin Project Wishes.Plugins => Wishes
2008-10-24 12:05 vskirdin Category _Common => Macro
2008-10-29 01:31 vskirdin Note Added: 0001900
2008-10-29 02:58 CrOm Note Added: 0001902
2008-10-29 11:06 vskirdin Note Added: 0001904
2008-11-01 00:28 vskirdin Status new => assigned
2008-11-01 00:28 vskirdin Assigned To => vskirdin
2009-03-10 06:04 CrOm Note Added: 0002732
2009-03-23 03:51 CrOm Note Added: 0002816
2009-03-23 07:18 vskirdin Note Added: 0002818
2009-03-23 07:58 CrOm Note Added: 0002819
2009-03-23 08:00 vskirdin Note Added: 0002820
2009-09-07 14:07 vskirdin Note Added: 0004028
2009-09-07 14:41 vskirdin Note Added: 0004029
2009-09-08 05:05 CrOm Note Added: 0004035
2009-09-08 05:59 vskirdin Note Added: 0004036
2009-09-08 07:25 CrOm Note Added: 0004037
2009-09-08 14:11 vskirdin Note Added: 0004042
2009-09-08 14:40 vskirdin Relationship added related to 0000018
2009-09-08 16:08 CrOm Note Added: 0004045
2009-09-30 07:28 vskirdin Relationship added child of 0000346
2010-09-27 20:38 vskirdin Note Added: 0005838
2010-09-28 13:16 vskirdin Note Added: 0005841
2010-09-28 15:30 JohnDoe Note Added: 0005842
2010-09-28 16:01 vskirdin Note Added: 0005843
2010-09-28 18:11 DAtaMan Note Added: 0005844
2013-01-30 13:06 JohnDoe Note Added: 0010149
2013-02-26 14:06 JohnDoe Note Added: 0010388
2013-02-26 14:15 JohnDoe Note Added: 0010389
2013-02-26 17:53 vskirdin Assigned To vskirdin =>
2013-02-26 17:53 vskirdin Status assigned => new
2013-03-10 09:32 shmuel Note Added: 0010488
2013-03-10 09:32 shmuel Assigned To => shmuel
2013-03-10 09:32 shmuel Status new => feedback
2013-03-15 20:49 DrKnS Note Added: 0010523
2013-03-15 21:22 shmuel Note Added: 0010524
2013-05-30 14:25 shmuel Build => 2893
2013-05-30 14:25 shmuel Note Added: 0011052
2013-05-30 14:25 shmuel Status feedback => closed
2013-05-30 14:25 shmuel Resolution open => fixed
2013-05-30 14:25 shmuel Fixed in Version => 3.0