Опубликован: 10.12.2007 | Доступ: свободный | Студентов: 784 / 15 | Оценка: 5.00 / 5.00 | Длительность: 58:33:00
Лекция 16:

Объекты XPCOM

Аннотация: В данной лекции рассматривается применение скриптов для платформы Mozilla. Приведены примеры практической реализации, рассмотрены основные понятия и определения
Ключевые слова: Дополнение, интерфейс объекта, XML, HTML, механизмы, URL, HTTP, SOAP, Java, поток ввода-вывода, диапазон, Internet, ресурс, почтовый клиент, файл, приложение, Windows, информация, chrome, типизация, debugger, DOM, RDF, перечислимый тип, enumerate, MVAR, атрибут объекта, число с плавающей запятой, portability, netscape, Bind, ECMAScript, IID, система типов, синтаксический анализ, XDR, виртуальная машина, автоматическое преобразование, XML Schema, XML RPC, иерархия классов, аргументы командной строки, модель данных, w3c, SVG, сериализуемость, dictionary, итератор, чтение данных, ITERATE, traversal, сортировка массива, реляционная база данных, dbm, Berkeley DB, профиль пользователя, DTDS, MDB, схема базы данных, MBD, адресная книга, MSFS, mysql, newsgroup, DataSource, Unicode, бинарный файл, служба каталогов, полный путь, родительский каталог, относительный путь, LFN, UNC, saturn, handling, pipe, дескриптор файла, символическая ссылка, спецификатор, JAR, система команд, ipv6, удаленный вызов процедур, NDR, SOCKS, схема URL, Lookup, proxy, IPC, стандартный поток вывода, псевдокод, основная программа, командная оболочка, launch, запуск процесса, завершение процесса, setTimeout, компонентная модель, setInterval, eval, race condition, источник события, stream, поток работ, октет, доменная имя, channel, преобразование данных, тип содержимого, сток, универсальные интерфейсы, parser, serial, принципиальная схема, поток объектов, чтение файла, S/MIME, compression, deflating, MIX, gopher, transportation, handler, IMAP, WYSIWYG, bag, factory, sink, delegation, scheme, делегаты, %URI, сериализация, composite, Bookmark, history, список аргументов, flush, URN, @charset, store, Subscribe, @mediat, assertion, registry, стек протоколов, WSDL, UDDI, OASIS, ebxml, workflow, RFC, идентификатор ресурса, resolvability, относительный URI, состояние процесса, файлы ресурсов, XMLHttpRequest, кроссплатформенность, исключительная ситуация, XML-документ, fault, CGI-скрипт, echo, ping, IDL, CORBA, contract, заголовочный файл, viewer, XSLT, интеграция приложений, подключаемый модуль, апплет, beos, openvms, EXT, PRF, download, shutdown, системные шрифты, hi-res, uninstall, DAT, поисковая машина, scan, quicktime, Windows Media Player, файл настроек, safe, trust, certify, policy, тип ограничения, blank, открытый ключ, центр сертификации, цифровой сертификат, управление сертификатами, групповая политика, keyword, имя объекта, html-форма, связанный объект , ограничение доступа, оранжевая книга, контроль доступа, append, удаление файла, specs, rebuild, алгоритмический подход, подтип, загрузка данных, сохранение данных, onchange, dialog, NAV, undo, журналирование, журнал изменений, управление событиями, синтаксические ошибки, POSIX



В состав платформы Mozilla входит объектная библиотека, содержащая более тысячи объектов, которые могут использоваться разработчиком при создании собственных приложений. Многие из этих объектов не имеют никакого отношения к графическому интерфейсу пользователя. Задача этой лекции – рассказать, для каких целей разработчик может использовать различные группы объектов платформы.

Тысяча примеров скриптов – слишком много для одной лекции. Здесь мы можем лишь познакомиться с основными типами объектов, а также предложить читателю некоторые рекомендации и ориентиры для дальнейшего освоения библиотеки. Если вы займетесь разработкой на платформе Mozilla, в дополнение к материалу этой лекции вам придется читать определения интерфейсов объектов на языке XPIDL. В лекции приведены многочисленные фрагменты скриптов, демонстрирующие использование этих интерфейсов. Все примеры написаны на JavaScript.

Объектная библиотека Mozilla состоит, главным образом, из компонентов XPCOM. Без этих компонентов возможности разработчика приложений были бы ограничены работой с документами XML, будь то HTML или XUL. Механизмы взаимодействия приложений с внешним миром сводились бы к таким технологиям, как URL, HTTP, SOAP и WDSL. Добавление компонентов XPCOM радикально меняет ситуацию. Компоненты добавляют поддержку работы с сетью, базами данных, файлами и процессами – все, что нужно для разработки полноценных приложений с богатой функциональностью. Компоненты XPCOM доступны на всех платформах, где работает Mozilla, и код, использующий их, полностью переносим, за редким исключением.

Набор компонентов Mozilla сравним с любой современной объектно- ориентированной библиотекой или стандартной библиотекой языка третьего поколения. Подобно языкам C++ и Java, платформа Mozilla использует концепцию потоков ввода-вывода. Подобно языкам С, Perl и множеству прочих, Mozilla предлагает средства для работы с файлами. В целом, объекты Mozilla почти эквивалентны современным универсальным библиотекам классов.

Это "почти" связано с тем, что Mozilla пока достигла лишь версий 1.x. С относительной новизной платформы связана некоторая ограниченность круга объектов, доступных разработчику. Вместо того чтобы предложить широкий диапазон объектов низкого уровня, Mozilla содержит некоторое количество объектов низкого и среднего уровней, а также ряд объектов очень высокого уровня, рассчитанных на приложения определенного типа. Поскольку первоначально платформа была разработана как средство создания браузера и других приложений для работы с Internet, специализированные объекты, созданные для решения этой задачи, присутствуют в библиотеке на всех уровнях абстракции. В отличие, например, от библиотеки классов Java, набор компонентов Mozilla не был с самого начала спроектирован, как мощная универсальная библиотека. Тем не менее, тысяча компонентов – весьма мощный ресурс, который по объему приближается к обширной библиотеке модулей Perl.

Еще одна нетипичная особенность библиотеки Mozilla состоит в том, что многие ее объекты рассчитаны на работу с сетью. Первоначальные приложения Mozilla – навигатор, почтовый клиент и Chatzilla – представляют собой сетевые клиенты, взаимодействующие с серверами. Это наложило на библиотеку определенный отпечаток. Внутренняя реализация некоторых простых действий, например открытия файла, может быть весьма сложной, поскольку файл может оказаться где угодно в Internet. Эта сложность повлияла и на интерфейсы, доступные разработчикам. С другой стороны, возможности некоторых интерфейсов могут быть ограничены системой защиты Mozilla.

Однако даже если разрабатываемое приложение не является браузером, почтовым клиентом или системой работы с документами XML, Mozilla способна предложить множество полезных инструментов, хотя некоторые специализированные объекты высокого уровня окажутся при этом бесполезными. С другой стороны, если приложению необходима функциональность браузера, использование специализированных объектов позволит значительно ускорить процесс разработки.

Как показано на схеме в начале лекции, компоненты XPCOM являются основой прикладной части Mozilla. Технологии XPCOM и XPConnect используют различные вспомогательные файлы, прежде всего реестр (простую базу данных, сходную с системным реестром Microsoft Windows) и библиотеки типов (описания компонентов). Настройки Mozilla и информация о сертификатах также хранятся отдельно от компонентов. С точки зрения разработчика, наиболее интересной частью архитектуры XPCOM являются отдельно хранимые файлы XPIDL, которые содержат описания всех интерфейсов XPCOM в форме, удобном для чтения.

Эта лекция начинается с изложения нескольких концепций, особенно важных для понимания программного окружения, в котором взаимодействуют компоненты XPCOM. Затем мы переходим к обсуждению типичных задач программирования и решений, предлагаемых платформой Mozilla. Сначала рассматриваются более общие задачи, а затем специфичные для отдельных групп приложений. Затем обсуждается платформа в целом и ее система защиты. Практический раздел лекции содержит множество примеров, демонстрирующих использование объектов для работы с JavaScript.

16.1. Концепции и терминология

Обширная библиотека компонентов XPCOM, входящая в состав платформы Mozilla, – особый мир, где действуют свои законы и правила. Чтобы эффективно использовать эту библиотеку, полезно познакомиться со сложившейся терминологией и принятыми соглашениями в этой области.

16.1.1.Читая чужой код: соглашения об именовании

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

  • Файлы на языке XPIDL, содержащие определения существующих интерфейсов XPCOM. Без этой информации разработка на платформе Mozilla практически невозможна.
  • Исходный код различных приложений Mozilla, находящийся в каталоге chrome. Разработчик может почерпнуть оттуда многочисленные и разнообразные примеры.
  • Исходный код платформы Mozilla на С/С++. Этот код более сложен и имеет меньшую ценность для разработчика приложений, однако также может быть полезным источником информации. Наряду с другими видами исходного кода, он является наиболее авторитетным источником информации по платформе Mozilla.

Из перечисленных источников основным являются определения XPIDL – это необходимый минимум для "выживания" на платформе Mozilla. URL этих файлов можно найти во введении к книге.

Стиль кодирования для платформы Mozilla подразумевает использование определенных соглашений об именовании. Это особенно важно для кода на JavaScript, поскольку этот язык обладает лишь слабыми механизмами типизации по сравнению с такими языками, как Java или C++.

Ниже приведены некоторые примеры соглашений об именовании, применяемых в исходном коде Mozilla.

Для определения характера интерфейсов XPCOM используются префиксы. Наиболее распространенным является префикс nsI (от " n et s cape I nterface"), который применяется для обозначения интерфейсов, предназначенных для использования разработчиками приложений. Существует также ряд более специфичных префиксов, указывающих на связь интерфейса с определенным приложением или технологией, например imgI, inI, jsdI и mozI (от image, inspector, JavaScript debugger и Mozilla соответственно). Все эти интерфейсы тоже доступны для разработчиков приложений. Объекты, имеющие префикс ns (без I) не предназначены для использования разработчиками приложений. Как правило, эти объекты применяются в системном коде платформы.

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

  • Имена констант в интерфейсах, связанных с DOM, записываются прописными буквами ( ALL_UPPERCASE_STYLE ).
  • Имена констант в интерфейсах, не связанных с DOM, как правило, записываются со строчной буквы, причем отдельные слова, входящие в состав имени, обозначаются прописной буквой( initCapStyle ).
  • Имена переменных и методов записываются таким же образом ( initCapStyle ).
  • Интерфейсы, связанные с RDF, составляют исключение – имена их методов записываются с прописной буквы, а отдельные слова, входящие в состав имени, записываются также с прописной ( InitCapStyle ).

В любом случае, прописные и строчные буквы используются одинаковым образом в XPIDL и в JavaScript. В системном коде платформы (C/C++) имена методов транслируются из initCap в InitCap. Имена интерфейсов иногда используются в той же форме, что и в XPIDL, а иногда записываются только прописными буквами ( ALL_CAPS ).

В коде Mozilla часто используются однобуквенные префиксы для имен переменных – атрибутов интерфейсов и аргументов методов. Эта нотация широко используется в связках XBL, системном коде на C/C++, интерфейсах XPIDL и прикладном коде на JavaScript. В последнем случае эти префиксы могут использоваться несколько бессистемно. Основные однобуквенные префиксы, используемые в коде Mozilla, представлены в таблице 16.1.

Таблица 16.1. Однобуквенные префиксы для имен переменных, используемых в коде Mozilla.
Префикс Частота использования Значение
a Регулярно aVar – временная переменная либо аргумент функции или метода. Как правило, она используется для хранения значения или объекта, подлежащих обработке. Пример – aFile
e В некоторых случаях eVar – значение, чаще всего константа, которое используется в качестве одного из элементов перечислимого типа (enumeration). Пример – eTuesday (элемент для вторника в перечислимом типе, содержащем дни недели)
g В некоторых случаях gVar – глобальная переменная; глобальная в контексте текущего окна (JavaScript) или полностью глобальная (C/C++). Пример – gMenuControllers
k В некоторых случаях kVar – значение ключа (key), одно из фиксированного набора значений, которые может принимать некоторая переменная. Этот префикс сходен с префиксом e, однако в данном случае значения переменной часто являются побитовыми масками или строками, а не последовательными целыми, начиная с единицы. Пример – kMimeType
m Регулярно mVar – член (свойство или атрибут) объекта. Как правило, используется для хранения закрытых (private) данных объекта. Пример – mLength.
n В некоторых случаях nVar – как правило, содержит сумму или итог каких-либо вычислений. Это обычная переменная
s,i,b,f,r,p Редко Эти префиксы используются в системном коде платформы (C/C++), где они означают строку, целое, булево значение (Boolean), число с плавающей запятой, короткое целое и указатель соответственно. Как правило, они не используются в коде на JavaScript, где префикс f может означать, например, файл или папку (folder)

Еще один используемый префикс – PR, что означает Portable Runtime. Существует также аббревиатура NSPR, которая означает Netscape Portable Runtime – библиотека и стандарт кодирования, которые были разработаны для того, чтобы облегчить перенос Mozilla между различными операционными системами. На платформе Mozilla определен ряд типов, переносимость которых гарантирована, и эти типы имеют префикс PR. разработчик приложений, использующий компоненты XPCOM, в некоторых ситуациях может столкнуться с такой нотацией.

16.1.2. Модульное программирование

Платформа Mozilla использует разнообразные подходы к разделению программ на части или фрагменты. Практически любой термин для "части" или "фрагмента", используемый в разработке ПО, применяется в терминологии платформы Mozilla. Ниже приведены эти термины и их корректное использование в контексте Mozilla:

Связка (binding) – программный интерфейс, написанный на определенном языке программирования. В контексте Mozilla связки существуют в форме интерфейса JavaScript (ECMAScript) к объектной модели документа (DOM), описанного в стандартах Консорциума WWW, либо в форме связок XBL.

Класс. Единственные классы в Mozilla – классы компонентов XPCOM. На основе каждого класса может быть создано ноль или более объектов. JavaScript 2.0 (ECMAScript 1.4) будет поддерживать объектную модель, основанную на классах, но в версии JavaScript1.5, применяемой в Mozilla в настоящий момент, классы отсутствуют.

Компонент представляет собой сущность, имеющую уникальный идентификатор в системе XPCOM. Компонентом может быть класс с CID (идентификатором компонента) и соответствующим ContractID (вида @mozilla.org/test;1 ) или интерфейс с IID (идентификатором интерфейса). Иногда настоящими компонентами считают только классы.

Интерфейс – набор точек доступа к объекту. Интерфейсы XPCOM являются единственным примером интерфейсов в Mozilla. О каждом объекте, который предоставляет точки доступа, соответствующие описанию интерфейса, говорят, что он реализует этот интерфейс. Каждый объект XPCOM и связка XBL реализует ноль или более интерфейсов XPCOM. Объекты JavaScript также могут реализовывать интерфейсы XPCOM.

Библиотека. В состав платформы Mozilla входит несколько динамически подключаемых библиотек, но вряд ли они представляют особенный интерес для разработчика приложений. Иногда библиотеками называют скрипты или группы скриптов на JavaScript, которые могут предоставлять полезную функциональность другим программам. Библиотеки типов представляют собой файлы данных, определяющие интерфейсы XPCOM. Они создаются в момент компиляции платформы и автоматически используются механизмом XPConnect при обращении к интерфейсам.

Модуль. Компоненты XPCOM, входящие в состав платформы, сгруппированы в модули, но этот факт значим только для разработчиков самой платформы. Модули не имеют практического смысла для разработчика приложения, если только он не создает новый модуль XPCOM.

Объект. Mozilla содержит объекты XPCOM и объекты JavaScript. Объект XPCOM является экземпляром определенного класса XPCOM и реализует один или несколько интерфейсов. Объект JavaScript может находиться в широком диапазоне от простой структуры данных, целиком определенной на JavaScript, до сложного объекта платформы. Объекты платформы в скриптах на JavaScript могут быть либо объектами XPCOM, либо объектами Java.

Пакет – группа взаимосвязанных файлов, установленная в chrome. Пакет имеет имя, которое соответствует каталогу (папке) файловой системы.

Прототип – объект JavaScript, используемый в качестве основы для создания нового объекта JavaScript.

16.1.3. Внешние системы типов

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

Из скриптов JavaScript доступны пять внешних систем типов:

Базовые типы платформы, реализованные в составе NSPR. Это – переносимые типы C/C++, лежащие в основе платформы Mozilla.

Типы данных RDF. Типы в документах RDF, с которыми может работать Mozilla.

Типы данных схемы XML (XML schema). Mozilla способна выполнять синтаксический анализ файлов этого формата и может определять стандартные типы, встречающиеся в них.

XML RPC XDR. Mozilla поддерживает сетевой протокол RPC-через-XML, включая типы данных XDR, не зависящие от платформы.

Java. Виртуальная машина Java может выполняться как подключаемый модуль (plugin) платформы Mozilla, при этом скрипты могут получать доступ к типизированным объектам Java.

Из пяти перечисленных систем автоматическое преобразование типов выполняется лишь при работе с Java. Остальные четыре системы используют следующие интерфейсы XPCOM:

  • Типы NSPR представлены интерфейсами, основанными на интерфейсе nsISupportsPrimitive, например nsISupportsPRInt32.
  • Типы данных RDF имеют интерфейсы nsIRDFLiteral, nsIRDFDate и nsIRDFInt, основанные на nsIRDFNode.
  • Для доступа к типам данных XML schema используются константы с соответствующими именами, доступные через интерфейсы nsISchemaSimpleType и nsISchemaBuiltinType.
  • Кодирование данных XML RPC в формат XDR использует типы NSPR. Интерфейс nsIXmlRpcClient содержит метод-фабрику, который порождает необходимые объекты типов NSPR.

В дополнение к этим внешним системам типов, сама архитектура XPCOM и компоненты, входящие в ее состав, также образуют систему типов, основанную на объектной модели (иерархия классов и интерфейсов). Разработчики сложных приложений широко используют эти классы и интерфейсы.

Андрей Дементьев
Андрей Дементьев
Россия, Лодейное Поле