Технология IFA - дополнительные приложения для XSL


   Технология IFA (Integratable Friend Applications) позволяет программам расширять функциональность друг друга, добавляя возможность запуска одного приложения из другого и обеспечивая возможность выполнения произвольного API родительского приложения до и после запуска дочернего приложения.
   Если одно приложение (дочернее) желает расширить функциональность другого приложения (родительское), дав возможность программе-родителю запускать себя с определенными параметрами, оно должно предоставить ему описание способа собственного запуска и (возможно) последовательность необходимых API-функций, производящих некоторые действия над родительским приложением до и после запуска дочернего приложения. Это достигается применением простых XML-файлов, содержащих всю необходимую информацию. Родительское приложение читает этот файл и регистрирует все данные о приложении. Затем (в зависимости от реализации) создает пункт меню, активировав который, пользователь может запустить дочернее приложение.
   Отличие этой технологии от обычных файлов расширения меню состоит в возможности доступа к API родительского приложения для XML-файла. Это может оказаться полезным, если, например, дочернее приложение устанавливает некоторые файлы, а родительское приложение оперирует этими файлами, тогда после окончания работы дочернего приложения можно сделать автоматическое обновление списка доступных файлов родительского приложения. Возможность доступа к API различается в зависимости от языка, на котором написана (или от языка запросов к API). В интерпретируемых или компилируемых в байт-код языках (Python, например), выполнение произвольных функций может быть обеспечено использованием встроенных возможностей (exec в Python), другие же языки могут потребовать встраивания интерпретаторов, или других средств выполнения скриптов. Например, реализация для C++ и Qt4 может выглядеть, как интерпретация языка QSA.
   Файлы IFA так же имеют возможность локализации для изменения языка описания приложения. По умолчанию используется кодировка UTF-8, но реализация может быть различной.
   Ниже дан пример файла IFA для XSL, описывающий запуск терминала, а после выполнения дочернего приложения обновляющий список словарей:
   <?xml version="1.0" encoding="UTF-8"?>
   <app>
      <title>LLRepo Console</title>
      <title lang="ru">Консоль LLRepo</title>
      <description>LLRepo - root terminal mode</description>
      <description lang="ru">LLRepo - терминал root</description>
      <path>/usr/bin/xterm</path>
      <options>
         -e "echo To get started with LLRepo run su and enter the root password.
         To learn more details about the available options, run man llrepo &amp;&amp; /bin/sh"
      </options>
      <postcode lang="python">
         main.main_window.dicts_manager.updateDicts()
      </postcode>
   </app>

   В данном описании содержатся теги, задающие имя метки (текст пункта меню, которым будет вызываться дочерняя программа, например) по умолчанию и для Русской локали, описание того же формата (обычно отображается всплывающей подсказкой или, как в XSL, информацией в строке состояния в главном окне), путь к исполняемому файлу дочернего приложения, его опции и действия которые должны выполняться по завершению работы дочернего приложения.
   На последнем действии следует остановиться более подробно. Информация, заключенная между тегами <postcode>...</postcode> устанавливает последовательность функций родительского приложения (API), которые должны быть вызваны после закрытия дочернего приложения. Функции, в зависимости от реализации, могут быть представлены для выполнения в виде доступных интерпретатору команд, фиксированных строковых констант и т.п. В XSL это реализовано с помощью специального модуля, содержащего объект main, представляющий из себя главный объект программы, работая с которым можно обратиться к любому другому объекту или функции XSL. В данном случае мы обращаемся к функции updateDicts(), которая принадлежит объекту dicts_manager, находящемуся в главном окне main_window, к которому можно обратиться через объект main. Обязательный параметр lang="python" обозначает язык, с помощью которого возможно обратиться к объектам приложения, в случае с XSL это еще и язык, на котором было написано родительское приложение (следует отметить, что язык запросов и язык приложения могут различаться, в этом случае параметром указывается язык запросов). Аналогичный синтаксис и принцип работы имеет тег <precode>...</precode>, обозначающий код, выполняемый до запуска дочернего приложения. Реализация должна гарантировать выполнение функций описанных в этих тегах, независимо от результата работы дочернего приложения и других факторов, если это явно не указано в выполняемых функциях. Так же гарантировано, что будут выполнены все функции линейно, не зависимо от выполнения предыдущей функции в пределах тега, то есть если перечислено несколько функций, то будут выполнены все, содержащие ошибку вызовы будут пропущены.
   Следует отметить, что для обеспечения совместимости следует обращаться только к функциям, специально предназначенным для этого. В XSL такими являются почти все функции, помеченные кодом ### Public ###.

XML-теги файлов описания IFA

title Обозначает название приложения. Это текст, который, например, будет отображаться как пункт меню. Возможен необязательный параметр lang, для установки языка названия. Приоритет имеет тег с данным параметром, переопределяющий значение из тега по умолчанию (без параметра)
description Служит для описания приложения. Работает точно так же, как и тег title, но устанавливает свою информацию, например, в строку статуса главного окна родительской программы при наведении курсора на пункт меню дочернего приложения.
icon Определяет полный путь к иконке дочерней программы. Отображается, например, рядом с соответствующим пунктом меню.
path Определяет полный путь к исполняемому файлу дочернего приложения. Используется при запуске.
options Строка опций, которые будут переданы при запуске исполняемому файлу дочернего приложения. В принципе, реализация может содержать макросы, которые родительское приложение заменит на некоторые свои переменные при запуске. В текущей реализации они отсутствуют.
precode Обозначает код родительского приложения, который должен быть выполнен до запуска дочерней программы. Хорошим тоном является размещение одной функции на строку. Тег должен иметь обязательный параметр lang, обозначающий язык для запросов функций.
postcode Функционирует так же как и предыдущий тег, но код выполняется после завершения дочернего приложения.

   Таким образом обеспечен более гибкий метод интеграции приложений по сравнению с аналогичными методами.
   IFA в XSL используется для добавления возможности запуска других языковых приложений в Меню "Инструменты" --> Приложения. Для создания файла-расширения необходимо сделать точное описание в XML-файле, используя приведенную выше информацию. Если вы планируете использовать теги <precode> или <postcode>, то передавайте в качестве параметра обоим тегам lang="python" (для использования кода вам придется изучить дерево постоянных объектов в исходном коде XSL). После этого разместите файл (должен иметь расширение .xml или .ifa) в каталоге /usr/lib/xsl/ifa (префикс /usr зависит соответствующего заданного при установке параметра), если хотите, чтобы новое приложение было доступно всем пользователям, или в подкаталоге .xsl/ifa вашего домашнего каталога, тогда файл будет доступен только вам. Если файл составлен корректно, то после перезапуска XSL вы получите пункт для нового приложения.
   Автор оригинальной идеи и реализации для XSL - Деваев Максим. По всем вопросам применения данной технологии обращайтесь по электронной почте (mdevaev@gmail.com).