Объекты XPCOM
16.2. Общие приемы и методы программирования
В этом разделе описано решение общих задач программирования на платформе Mozilla.
16.2.1. Аргументы командной строки
Платформа Mozilla, запущенная из командной строки, запоминает аргументы, переданные исполняемому файлу. В ОС Microsoft Windows платформа не запоминает аргументы командной строки, указанные при запуске последующих приложений, которые используют тот же экземпляр платформы.
Используйте эти компонент и интерфейс, чтобы получить доступ к аргументам командной строки:
@mozilla.org/appShell/commandLineService;1 nsICmdLineService
Интерфейс nsICmdLineService поддерживает свойство argc, содержащее количество аргументов, но не argv, которое могло бы содержать строки, образующие аргументы. Свойство argc содержит количество пар аргумент-значение, а не количество строк, разделенных пробелами (традиционная практика и в UNIX, и в Windows). Поскольку свойство argv или аналогичное ему не поддерживается, вам придется угадывать имена параметров, используя метод getCmdLineValue() для получения их значений. Типичный вызов этого метода выглядит следующим образом:
var url = cls.getCmdLineValue("-chrome");
Метод возвращает значение аргумента, а если аргумент с указанным именем не был использован при запуске, возвращается значение null.
Этот интерфейс также содержит метод-фабрику getHandlerForParam(), который возвращает объект, имеющий интерфейс nsICmdLineHandler. Такой объект представляет собой структуру данных, доступную только для чтения, и содержащую конфигурационную информацию для обработчика командной строки, например значения по умолчанию. Каждый существующий обработчик добавляет новые аргументы командной строки, доступные платформе. При необходимости такие обработчики могут создаваться при помощи JavaScript.
Средствами JavaScript невозможно получить исходную копию командной строки.
16.2.2. Структуры данных и алгоритмы
Язык JavaScript предоставляет простые массивы и объекты, которых достаточно для большинства несложных задач. За пределами JavaScript платформа Mozilla поддерживает обширную модель данных, которая представляет собой реализацию стандартов DOM Консорциума W3C. Эта модель используется при отображении и обработке документов HTML, XUL, MathML, SVG, а также XML вообще. Она обсуждается в разделе "Web- скрипты", а также в "Скрипты" "Скрипты".
Помимо DOM, платформа предоставляет ограниченное количество интерфейсов к структурам данных. Их основное назначение – обеспечивать доступ скриптов к внутренним данным платформы. Строго говоря, эти интерфейсы не предназначены для того, чтобы создавать на их основе новые структуры данных, хотя такое их использование при разработке приложений вполне допустимо.
Объекты-коллекции XPCOM, которые могут применяться сами по себе, перечислены в таблице 16.2. Хотя во многих ситуациях их использование не рекомендуется, они заслуживают упоминания.
Сами по себе эти коллекции не слишком полезны, однако для работы с ними существуют специальные интерфейсы – курсоры или итераторы. В XPCOM существует два типа курсоров. Более простой называется перечислителем (enumerator) и имеет два варианта:
nsIEnumerator nsIBidirectionalEnumerator
Перечислитель – курсор для перебора данной коллекции, допускающий лишь чтение данных. При этом коллекция должна быть статической, и в каждый момент времени в ней может быть определен лишь один перечислитель. Для каждого элемента коллекции перечислитель возвращает интерфейс nsISupports.
Более сложная разновидность курсора называется итератор (iterator). Итераторы поддерживают такие операции, как перебор динамически изменяемой коллекции, добавление элементов к коллекции, а также одновременное использование нескольких итераторов для одной коллекции. Все эти итераторы имеют интерфейсы вида nsI{некая_строка}Iterator и редко бывают нужны сами по себе. Однако их можно использовать в качестве образцов при проектировании сложных структур данных и способов доступа к ним. Иногда итераторы возвращаются другими интерфейсами XPCOM.
Стандарт DOM 2 Traversal and Ranges ("Обход и диапазоны [узлов]") описывает мощный итератор, реализация которого в Mozilla называется nsIDOMNodeIterator. Он может быть полезен при работе со структурами данных DOM.
Платформа Mozilla содержит не слишком много реализаций алгоритмов общего характера. В JavaScript доступны регулярные выражения и метод для сортировки массива Array.sort(). Возможности сортировки, применяемые в шаблонах XUL, недоступны за их пределами.
16.2.3. Базы данных
Платформа Mozilla в определенной степени поддерживает работу с базами данных, но эта поддержка развивается медленно. При сборке интегрированного пакета Mozilla с параметрами по умолчанию доступна лишь минимальная поддержка работы с базами данных; получение дополнительных возможностей требует дополнительных усилий. Базы данных, поддерживаемые платформой, можно условно разделить на пять групп: неструктурированные файлы, реляционные базы данных, базы данных, связанные с конкретными приложениями, хранилища фактов и кэши.
В таблице 16.3. перечислены поддерживаемые Mozilla базы данных, основанные на неструктурированных файлах.
Две последние строки таблицы требуют пояснений. dbm – устаревшая версия распространенного пакета Berkeley DB. Она используется для создания в каталоге профиля пользователя нескольких файлов, имеющих отношение к защите информации. Этот пакет не имеет интерфейса XPCOM и не может использоваться из JavaScript.
Формат файла | Поддержка в приложениях | Рассматривается в разделе |
---|---|---|
Произвольные файлы | Чтение/запись | "Файлы и папки", "Передача данных" |
Документы DTD | Только чтение | "Статическое содержимое" "Статическое содержимое" |
Файлы свойств | Только чтение | "Скрипты" "Скрипты" – пример с интерфейсом nsIStringBundle |
Настройки | Чтение/отложенная запись | "Настройки" |
Документы XML | Чтение или запись | "Web-скрипты" |
Документы RDF | Чтение/синхронизация кэша с файлом | "Источники данных" |
Реестр Mozilla | Чтение/запись | "Система распространения и установки - XPInstall" "Развертывание" |
dbm | Недоступна | См. в тексте |
Mdb | Недоступна | См. в тексте |
Mdb, "база данных сообщений" (message database) представляют собой базу данных, хранящую данные в одном файле и специально разработанную для Mozilla. В ней реализованы такие концепции, как курсоры, таблицы, строки, поля и схема базы данных. Mdb поддерживает как реляционные базы данных, так и более универсальные списки пар "атрибут–значение", а также связи между таблицами и строками, которые позволяют одной строке принадлежать сразу нескольким таблицам. Mdb не является многопользовательской базой данных и не поддерживает одновременное использование нескольких курсоров, транзакции и процесс восстановления. Формат файла Mbd является универсальным форматом для самоссылающихся данных, на низком уровне он сходен со структурой данных, лежащей в основе RDF. Существует интерфейс XPCOM для работы с Mdb, однако для него нет определения XPIDL, а, следовательно, и библиотеки типов. В результате эта функциональность недоступна из приложений на JavaScript.
Что касается реляционных СУБД, то в версии Mozilla, собираемой по умолчанию, их поддержка отсутствует. Однако она может быть добавлена. В таблице 16.4 представлена ситуация на момент выхода Mozilla 1.4 и прогноз на ближайшее будущее.
Наконец, платформа поддерживает ряд форматов файлов, разработанных для конкретных приложений. Работа со всеми этими файлами осуществляется опосредованно, с помощью интерфейсов высокого уровня. Все эти файлы находятся в каталоге профиля пользователя. Они перечислены в таблице 16.5.
Файлы закладок и cookies полностью переписываются при каждом изменении. Файл адресной книги частично переписывается при каждом изменении.
Mork, упоминаемая в таблице, представляет собой простую технологию хранения данных в неструктурированном файле, основанную на Mdb, о которой шла речь выше. Эта технология предоставляет ряд специализированных структур данных, которые могут использоваться для хранения записей адресной книги, а также информации о текущем состоянии сообщений электронной почты и конференций. Подобно Mdb, функциональность Mork недоступна из скриптов JavaScript. Вы можете увидеть содержимое базы данных Mork, открыв в любом текстовом редакторе файлы с информацией о сообщениях (они имеют расширение .msf), которые хранятся в том же каталоге, что и файлы почтовых ящиков.
СУБД/технология | Способ установки | Платформы | Примечания |
---|---|---|---|
MySQL | Загружаемый пакет XPInstall | Кросс-платформенный | См. mysqlxpcom.mozdev.org |
MySQL | Перекомпилировать Mozilla 1.5+ | Linux/UNIX | См. http://www.mozilla.org/projects/sql |
PostgreSQL | Перекомпилировать Mozilla 1.3+ | Linux/UNIX | См. http://www.mozilla.org/projects/sql |
Protozilla | Загружаемый пакет XPInstall | Кросс-платформенный | Обеспечивает возможность добавлять к Mozilla поддержку сетевых протоколов, включая взаимодействие с базами данных. См. protozilla.mozdev.org |
Web-интерфейс | Сделать доступным Web-сервер с базой данных | Кросс-платформенный | Стандартный метод доступа к базам данных – использовать запросы GET и POST протокола HTTP для работы с Web-сервером, взаимодействующим с сервером СУБД |
Mork/Mdb – технология хранения данных на диске. В качестве сходной технологии, но подразумевающей хранение данных в оперативной памяти, может рассматриваться хранилище фактов RDF, особенно при использовании источника данных in-memory-datasource.
Еще один вид технологий, применяемых в Mozilla и сходных с базами данных, – кэши. В частности, это кэш Web-документов, в котором хранятся локальные копии документов, расположенных на удаленных серверах, а также кэш быстрой загрузки XUL, в котором хранятся файлы chrome для отображаемых окон и элементов интерфейса.
16.2.4. Переменные окружения
Значения переменных окружения текущего процесса могут быть получены по одному значению за запрос при помощи следующей пары из компонента и интерфейса:
@mozilla.org/process/util;1 interface nsIProcess
Интерфейс nsIProcess предоставляет метод getEnvironment(), который возвращает значение переменной, имя которой было передано в виде параметра. Передаваемые имена переменных конвертируются из Unicode в расширенную (восьмибитную) кодировку ASCII. Возвращаемые значения конвертируются в Unicode из расширенной кодировки ASCII.
Тип операционной системы или версия Mozilla могут быть получены без обращения к переменным окружения. Для этого достаточно проанализировать значение свойства window.navigator.userAgent property.
Для версий Mozilla, собранных с поддержкой отладки, переменная MOZILLA_FIVE_HOME должна содержать путь к каталогу, в котором установлены бинарные файлы Mozilla.
Не существует переменной окружения, которая указывала бы путь к текущему или любому другому каталогу профиля пользователя. В целях защиты данных путь к этому каталогу содержит строку случайных символов, и установить путь к нему вручную невозможно, не зная или не угадав этой строки. Для доступа к каталогу профилей можно использовать специальный псевдоним (см. "Каталог файловой системы").
Целый ряд переменных, имеющих отношение к отладке, устанавливается при использовании версии Mozilla, собранной с поддержкой отладки (с ключом --debug-enabled ). Их интерпретация весьма сложна, наиболее надежным источником информации по этому вопросу является исходный код Mozilla.