Опубликован: 10.12.2007 | Уровень: специалист | Доступ: платный
Лекция 17:

Система распространения и установки - XPInstall

< Лекция 16 || Лекция 17: 12345678910

17.3. Технологии установки

В оставшейся части лекции описываются технологии, используемые при удаленной установке.

17.3.1. Применяемые файлы и форматы

Платформа использует несколько различных типов файлов данных. Есть три главных типа этих файлов, и каждый из них имеет свой формат. Это регистры, манифесты и логи.

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

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

Логи - файлы, доступные платформе только на запись, их можно изучать независимо от процесса установки. Mozilla ведет логи первоначальной установки платформы и последующих удаленных установок. Можно организовать запись в логи расширенной информации, если скомпилировать платформу с опцией --enable-debug.

Форматы, используемые этими файлами, включают формат регистров Mozilla (он описывается ниже) формат файлов Microsoft Windows .ini, RDF и простой текстовый форматы. В таблице 17.1 описываются эти форматы и их использование.

17.3.2. Регистры Mozilla

Регистр Mozilla - файл, по формату напоминающий регистр Microsoft Windows. К нему практически нет доступа, но взглянуть на его устройство полезно, это позволит лучше понять некоторые особенности Mozilla.

Регистр состоит из иерархии ключей, каждый из которых может иметь несколько пар атрибут-значение. Ключи могут быть поименованы иерархически, что по сути является путем к ключу. В корне иерархии ключ "/" и несколько специальных имен, указывающих на важные разделы иерархии. Это эквиваленты именам HKEY_ в Microsoft. Mozilla использует юникодные unicode строки (UTF8-encoded) для имен в регистре.

В отличие от регистра Windows, Mozilla использует прямые слеши (/) в качестве разделителей в полном пути к ключу. Есть и иные отличия.

Таблица 17.1. Инсталляционные документы, используемые платформой
Тип файла Имена файлов, использующие этот тип Использование
Mozilla registry mozver.dat, mozregistry.dat, registry, registry.dat, appreg, global.regs, versions.regs, "Mozilla Registry," "Mozilla Versions" Регистр платформы, имена и версии приложений, информация, необходимая для удаления приложения, информация о плагинах и профилях пользователей
Microsoft Windows.ini pluginreg.dat, pluginreg, xpti.dat, compreg.dat Манифест установленных в данный момент плагинов, компонентов и библиотек типов XPConnect
manifest.ini, master.ini, talkback.ini Конфигурационные файлы
XML RDF overlays.rdf, contents.rdf, various other per-profile files Манифесты оверлеев и содержания JAR-архивов
Line-formatted plain text installed-chrome.txt, chromelist.txt Манифесты файлов chrome, необходимых для работы системы оверлеев, тем и локалей
Free format text install.log, install_status.log Логи полной установки системы и удаленной установки приложений
  • В настоящее время Mozilla не имеет утилиты, подобной regedit или regedit32.
  • Интерфейс регистров не полностью доступен прикладному программисту.
  • Регистры кроссплатформенны и существуют на платформах UNIX, MacOS, и иных.
  • Платформа при установке использует более одного регистра

Все регистры Mozilla имеют одинаковую структуру верхних уровней. Все регистры состоят из корня (а именно /) и четырех дочерних директорий:

"/Users/" 
"/Common/" 
"/Version Registry/" 
"/Private Arenas/"

Если при компиляции платформы указан специальный ключ, появляется пятая директория: "/Current User/". В стандартной системе она не присутствует. Ключ, хранимый в одном из четырех путей, может выглядеть, например, так:

"/Version Registry/mozilla.org/Mozilla/XPCom/bin"

Этот ключ не случайно выглядит как имя приложения в регистре - строка после "/Version Registry" именем приложения и является.

Регистр Mozilla - хранилище информации для старта платформы. После того, как платформа стартует, она считывает информацию из регистра. Наиболее смущающий аспект в системе регистров - то, что их несколько, и каждый содержит только часть необходимой информации. Таблица 17.2 разъясняет этот момент.

"Регистр chrome" не является файлом в формате регистров Mozilla. Это термин, которым описывается информация о конфигурации chrome, хранимая в RDF-фалах, включая базу данных оверлеев и дополнительных текстовых файлов, таких как installed-chrome.txt. См. "Оверлеи и Chrome" , "Оверлеи и chrome", для более подробного ознакомления.

Регистр Mozilla недоступен из скрипта install.js, если только не вызывается дополнительный выполняемый файл. К нему можно получить доступ из обычного приложения с помощью следующей пары XPCOM:

@mozilla.org/registry;1 nsIRegistry

Этот интерфейс предоставляет методы для чтения и записи, которые можно использовать для передвижения по дереву ключей регистра. Интерфейс не имеет очевидного способа прочитать (dump) все ключи разом. Ранее применялся один трюк, состоявший в том, чтобы использовать в качестве аргумента nsRegistryKey "магическое" значение 32 (hex 0x20). Это индекс корневого ключа. Имейте в виду, что ни корень, ни его непосредственные четверо "детей" не имеют пар атрибут-значение. Не пытайтесь получить значения этих пар, это имеет смысл делать лишь для боле глубоко лежащих ключей.

Таблица 17.2. Регистры Mozilla, поддерживаемые платформой.
Имя Однопользовательская ОС Многопользовательская ОС Файлы Ключи Использование
Регистр версий 1 1 на пользователя mozver.dat, "Mozilla Versions", Versions.regs Versions Private arenas Глобальный регистр информации о версиях для всех установок платформы, включая регистр Netscape Global информации для удаления всех установок, включая Netscape
Глобальный регистр 1 1 на пользователя mozregistry.dat, "Mozilla Registry", registry, Global.regs - Не используется в настоящее время
Регистр приложений 1 1 на пользователя Appreg, registry.dat Common Регистр всех пользовательских профилей и всех доступных плагинов и поддержки Java
Регистр компонентов 1 на платформу 1 на платформу component.reg, "Component Registry" Common Регистр всех доступных компонентов XPCOM
17.3.3. Мастера XUL

Иногда приложению требуется провести пользователя по весьма извилистому пути. Установка приложения - как раз такой случай. Обычный способ справиться с этой задачей - снабдить пользователя диалоговым окном, помогающим ему на каждом из шагов. Такие диалоговые окна иногда называют "мастерами" (wizard).

XUL имеет тег <wizard> для создания окна помощи при сложных процессах, подобных установке приложения. <wizard> подобен причудливой комбинации тегов <deck> и <dialog>. Каждый тег <wizard> содержит один или более тегов <wizardpage>. Каждый тег <wizardpage> может содержать произвольный XUL-контент.

Подобно тегу <dialog>, тег <wizard> представляет полное окно и используется вместо тега <window>. Как карты в колоде, теги <wizardpage> сложены в стопку один поверх другого. Тег <wizard> имеет кнопки Next, Back, Cancel и Finish, с помощью которых пользователь может перелистывать страницы, точно так же, как между вкладками (tabs). И <wizard>, и <wizardpage> основаны на связках XBL, хранящихся в файле wizard.xml архива toolkit.jar в chrome.

В архиве toolkit.jar в chrome есть еще несколько файлов с префиксом "wizard". Эти файлы содержат добавочные возможности тега <wizard>, в частности, в форме JavaScript-объекта WizardManager. Если ваше приложение нуждается в нескольких Мастерах, стоит заглянуть в этот код, это поможет сэкономить время. Он позволит создать центральный объект, хранящий всю скриптовую логику Мастеров. Это рекомендуемый способ действий.

На рисунке 17.7 показано окошко, основанное на теге <wizard>. Это окно используется в почтовом клиенте Mozilla при создании нового пользовательского счета.

Создание почтового счета на основе тега <wizard>.

Рис. 17.7. Создание почтового счета на основе тега <wizard>.

Эти теги не используются при обычной установке системы, обсуждаемой в данной лекции. Они используются при установке по выбору, установке из chrome и при удаленной установке приложений.

17.3.3.1. Тег <wizard>

Тег <wizard> предоставляет окошку некоторое содержание, логику навигации и обработку событий. Минимум, который должен реализовать программист приложения, - снабдить его недостающим содержанием в виде контента - тегов <wizardpage> (которые обычно состоят из элементов форм и объясняющего текста) и скриптов, проверяющих вводимые данные и реагирующих на действия пользователя. Тег <wizard> имеет следующие специальные атрибуты:

title pagestep firstpage lastpage onwizardnext onwizardback 
onwizardcancel onwizardfinish

title определяет строку, которая появится в верхней части окна, после слов "Welcome to the".

pagestep определяет, на сколько страниц нужно "перепрыгнуть", если выбраны кнопки Back или Next. Значение по умолчанию - 1 (одна).

firstpage получает значение true, когда показана первая страница.

lastpage получает значение true, когда показана последняя страница.

Остальные атрибуты - это обработчики событий, срабатывающие при нажатии кнопок Next, Back, Cancel, и Finish. Эти обработчики имеют значимые действия по умолчанию. Так же, как для <dialog> и <window>, атрибуты width, height, screenX и screenY не работают в теге <wizard>. Тег <wizard> автоматически получает width="500px", height="380px".

Вдобавок к атрибутам, XBL-определение тега <wizard> имеет методы и свойства, позволяющие имитировать пользовательскую реакцию из скрипта.

На рисунке 17.8 изображено содержание тега <wizard>, если никакого иного содержания программист не определил.

Простейший мастер на основе тега  <wizard>.

Рис. 17.8. Простейший мастер на основе тега <wizard>.
17.3.3.2. Тег <wizardpage>

Тег <wizardpage> подобен тегу <box>. Он используется практически только внутри тега <wizard>. Можно поместить в него любой XUL-контент, но не смешивайте его со встроенной системой навигации Мастера. Лучше добавить несколько страниц, чем усложнять существующие. <wizardpage> имеет следующие атрибуты:

pageid next onpagehide onpageshow onpagerewound onpageadvanced

pageid - идентификатор страницы, отдельный от идентификатора id. Он используется внутренним механизмом Мастера и всегда должен быть определен.

С помощью атрибута next можно нарушить стандартный порядок просмотра страниц Мастера. Он содержит идентификатор pageid. Если он установлен, Мастер больше не следует своей простой стратегии просмотра страниц вперед и назад. Вместо этого любой шаг навигации определяется атрибутом next. Чтобы это работало, нужно присвоить значение свойству next DOM-объекта тега <wizardpage>, а не самому тегу. Если это сделано, вся навигация определяется тегами <wizardpage>, имеющими атрибут next.

Остальные четыре атрибута - обработчики событий. Они срабатывают, когда страницы Мастера появляются и исчезают, и когда пользователь перелистывает страницы. Они не имеют реализации по умолчанию. <wizardpage> - действительно простейшая вещь.

< Лекция 16 || Лекция 17: 12345678910
Дмитрий Гуменюк
Дмитрий Гуменюк
Россия, Звенигород
Konstantin Grishko
Konstantin Grishko
Россия, Москва, Московский финансово-промышленный университет "Синергия", Москва