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

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

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

FileSpecObject - объект, подобный значению (value-like object), который передается между методами других объектов в системе XPInstall. Совершать какие-либо действия с этим объектом приходится редко. Он никогда не порождается оператором new в JavaScript. Он имеет лишь одно полезное свойство:

String toString()

Этот метод возвращает путь к папке, уникальный для каждой операционной системы, который представляет объект FileSpecObject.

17.3.5.3. File

Объект Install отвечает за установку и проверку соответствия папок, файлов и поддеревьев файлов. Объект File, по сравнению с ним, отвечает за проверку и точное манипулирование конкретным файлом. Некоторые из методов объекта Install используются для выполнения запланированных задач во время установки. Все методы объекта File выполняются на более позднем этапе.

Всегда используется только один объект File, он доступен как свойство с именем File глобального объекта. Все методы этого объекта доступны как:

File.method_name(args);
Таблица 17.6. Имена свойств платформы Mozilla
Имя Имя Имя
ACCESS_DENIED INSUFFICIENT_DISK_SPACE READ_ONLY
ALREADY_EXISTS INVALID_ARGUMENTS REBOOT_NEEDED
APPLE_SINGLE_ERR IS_DIRECTORY SCRIPT_ERROR
BAD_PACKAGE_NAME IS_FILE SOURCE_DOES_NOT_EXIST
CANT_READ_ARCHIVE KEY_ACCESS_DENIED SOURCE_IS_DIRECTORY
CHROME_REGISTRY_ERROR KEY_DOES_NOT_EXIST SOURCE_IS_FILE
DOES_NOT_EXIST MALFORMED_INSTALL SUCCESS
DOWNLOAD_ERROR NETWORK_FILE_IS_IN_USE UNABLE_TO_LOAD_LIBRARY
EXTRACTION_FAILED NO_INSTALL_SCRIPT UNABLE_TO_LOCATE_LIB_FUNCTION
FILENAME_ALREADY_USED NO_SUCH_COMPONENT UNEXPECTED_ERROR
GESTALT_INVALID_ARGUMENT PACKAGE_FOLDER_NOT_SET UNINSTALL_FAILED
GESTALT_UNKNOWN_ERR PATCH_BAD_CHECKSUM_RESULT USER_CANCELLED
INSTALL_CANCELLED PATCH_BAD_CHECKSUM_TARGET VALUE_DOES_NOT_EXIST
INSTALL_NOT_STARTED PATCH_BAD_DIFF
Таблица 17.7. Ключи-идентификаторы Install.getFolder()
Cross-platform Microsoft Windows Macintosh UNIX
"Plugins" "Win System" "Mac System" "Unix Local"
"Program" "Windows" "Mac Desktop" "Unix Lib"
"Temporary" "Mac Trash"
"Profile" "Mac Startup"
"Preferences" "Mac Shutdown"
"OS Drive" "Mac Apple Menu"
"file:///" "Mac Control Panel"
"Components" "Mac Extension"
"Chrome" "Mac Fonts"
"Mac Preferences"
"Mac Documents"

Таблица 17.8 описывает объект File.

Таблица 17.8. Объект File системы XPInstall (* Действие откладывается до завершения установки?)
Константа, свойство или метод * Использование
Number copy(FileSpecObject src, FileSpecObject target) + Копирует файл или папку по месту назначения
Number dirCreate(FileSpecObject local) + Создает локальную директорию local
FileSpecObject dirGetParent(FileSpecObject dir) Возвращает имя директории, родительской по отношению к dir, или null
Number dirRemove(FileSpecObject local) + Удаляет директорию local
Number dirRename(FileSpecObject local) + Переименовывает директорию local
Number diskSpaceAvailable(FileSpecObject local) Возвращает количество доступного места в байтах на диске/томе, содержащем local
Number execute(FileSpecObject file [, String args [, Boolean blocking ] ] ) Запускает выполняемый файл file, с аргументами args. Если blocking имеет значение true, установка приостанавливается до окончания выполнения программы. По умолчанию blocking имеет значение false
Boolean exists(FileSpecObject local) Возвращает true, если файл или папка local существует
Boolean isDirectory(FileSpecObject local) Возвращает true, если local является локальной папкой
Boolean isFile(FileSpecObject local) Возвращает true, если local является локальным файлом, но не папкой
Boolean isWritable(FileSpecObjec local) Возвращает true, если для папки или файла local есть права на запись
Number macAlias(FileSpecObject src, String filename, FileSpecObject target) Number macAlias(FileSpecObject src, String filename, FileSpecObject target, String alias) + Создает Macintosh Alias в папке target, на основе файла filename из папки src
Number modDate(FileSpecObject local) Возвращает значение в миллисекундах, когда local был изменен. Это время вычисляется по-разному для каждой платформы
Boolean modDateChanged(FileSpecObject local, number modDate) Возвращает true, если файл local был изменен после modDate()
Number move(FileSpecObject src, FileSpecObject target) Передвигает файл src в папку target. Не может передвигать директории Microsoft Windows
String nativeVersion(FileSpecObject local) Считывает информацию о Microsoft Windows версии файла local (например, версию DLL)
Number remove(FileSpecObject local) + Удаляет файл или папку local
Number rename(FileSpecObject local, String name) + Присваивает файлу или папке local имя name
Number size(FileSpecObject local) Возвращает значение в байтах размера файла local
String windowsGetShortName(FileSpecObject local) Только для Microsoft Windows, возвращает 8.3-имя файла, в противном случае возвращает null
Number windowsRegisterServer(FileSpecObject local) + Только для Microsoft Windows - регистрирует файл local как сервер
Number windowsShortcut(FileSpecObject local, FileSpecObject target, String linkname, FileSpecObject dir, String params, FileSpecObject icondb, Number index) + Только для Microsoft Windows - создает ссылку на файл local в директории target. Дает ей имя linkname с расширением .lnk. Делает текущей директорией директорию ссылки. Дает ей параметры params. Использует пиктограмму indexth в файле по пути icondb в качестве иконки на рабочем столе
String windowsVersion(FileSpecObject local) Возвращает информацию для Microsoft Windows о версии файла local, или возвращает null
17.3.5.4. Объект WinProfile

Объект WinProfile, созданные с помощью метода Install.getWinProfile(), может выполнять операции с характерным для Microsoft Windows файлом .INI, например,C:\WINDOWS\WIN.INI. У него есть только два метода:

String getString(String section, String key) 
String writeString(String section, String key, String value)

Поскольку файл .INI имеет расширенный ASCII формат, в него нельзя записывать информацию в юникоде.

17.3.5.5. Объект WinReg

Объект WinReg, созданный с помощью метода Install.GetWinRegistry(), дает доступ к регистру Windows. Операции с регистром выполняются незамедлительно, они не откладываются.

Объект WinReg содержит текущий корневой ключ регистра. По-умолчанию, это HKEY_CLASSES_ROOT.

Имена путей в регистре Windows разделены обратным слешем (\). В скриптах JavaScript обратный слеш нужно писать дважды (\\), противном случае он понимается как управляющий символ.

Таблица 17.9 описывает объект WinReg. Некоторые методы возвращают данные, но многие лишь код статуса. Когда возвращается код статуса, null означает, что платформа Mozilla не может корректно обработать изменения регистра. Обычно это означает проблемы с аргументами метода. Если возвращается не null, значение берется из реальной операции с регистром. Даже когда возвращаемое значение - обычные данные, null означает неудачное действие, в этом случае также, скорее всего, из-за проблем с аргументами. Необходимо всегда проверять возвращаемое значение на null.

Таблица 17.9. Объект XPInstall WinReg
Константа, свойство или метод Использование
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS Зарезервированные константы для хорошо известных корневых ключей
Number createKey(String subkey, String name) Создает подключ subkey с именем класса name. Имя может быть строкой длины нуль.
Number deleteKey(String subkey) Удаляет подключ subkey
Number deleteValue(String subkey, String name) Удаляет пару атрибут-значение подключа name
String enumKeys(String subkey, Number index) Возвращает подключ с номером index ключа subkey. Возвращает строку длины ноль, если ключ не существует
String enumValueNames(String subkey, Number index) Возвращает имя атрибута с номером index ключа subkey
Number getValueNumber(String subkey, String attr) Возвращает DWORD-значение атрибута attr ключа subkey
String getValueString(String subkey, String attr) Возвращает строковое значение атрибута attr ключа subkey
Number getValue(String subkey, String attr) Возвращает DWORD-значение атрибута attr ключа subkey
Boolean isKeyWritable(String subkey) Возвращает true, если есть права на запись ключа subkey
Boolean keyExists(String subkey) Возвращает true, если ключ subkey существует
void setRootKey(String key) Устанавливает корневой ключ в одно из перечисленных в первой строке таблицы значений. Возвращает null в случае неудачи
Number setValueNumber(String subkey, String attr, Number val) Устанавливает атрибут attr ключа subkey в значение val. Возвращает null в случае неудачи
Number setValueString(String subkey, String attr, String str) Устанавливает атрибут attr ключа subkey в значение str. Возвращает null в случае неудачи
Boolean valueExists(String subkey, String attr) Возвращает true, если ключ subkey имеет атрибут attr
17.3.6. Объекты XPCOM

Система XPInstall не дает доступа к интерфейсам XPCOM из скрипта install.js.

Есть, однако, несколько компонентов и интерфейсов за пределами XPInstall, которые дублируют функциональность XPCOM. Если необходима собственная система развертывания приложений, эти приложения и объекты стоит рассмотреть подробнее.

Данная XPCOM пара предоставляет доступ к регистру Mozilla, хотя она не завершена и не очень гибка:

@mozilla.org/registry;1 nsIRegistry

Этот интерфейс работает с различными файлами регистра, как если бы они были одним файлом. Регистр также можно понимать как источник данных RDF. В то время, когда писалась наша книга, этот источник данных RDF еще не был доступен. Будущая XPCOM пара для доступа:

@mozilla.org/registry-viewer;1 nsIRDFDataSource

Другой интерфейс к регистру предоставляется так называемым chrome-регистром. Этот интерфейс позволяет платформе перепрочитать содержание chrome, т.е. оверлеи, скины и локали. Он также может устанавливать в chrome пакеты, скины и локали. Пара XPCOM, предоставляющая эту функциональность:

@mozilla.org/chrome/chrome-registry;1 nsIXULChromeRegistry;1

Для разработчиков на платформе Microsoft Windows представляют интерес следующие два интерфейса:

@mozilla.org/winhooks;1 nsIWindowsRegistry 
@mozilla.org/winhooks;1 nsIWindowsHooks

Эти интерфейсы предоставляют много возможностей по низкоуровневому доступу к Microsoft Windows.

Особняком от этих интерфейсов, работающих с регистрами, стоит много интерфейсов для работы с файлами и сетью, описанными в "Объекты XPCOM" , "Объекты XPCOM", в том числе интерфейсы для распаковывания архивов ZIP.

Несколько замечаний относительно собственно объектов XPInstall. Объекты "на стороне Web", InstallTrigger и InstallVersion не имеют полезных интерфейсов XPIDL. Они, однако, имеют Contract ID, зарегистрированные в XPCOM, кроме самой инфраструктуры XPInstall:

@mozilla.org/xpinstall/installtrigger;1 
@mozilla.org/xpinstall/installversion;1 
@mozilla.rg/xpinstall;1

Тем не менее использовать эти Contract ID бессмысленно, поскольку полезных интерфейсов все равно нет. Объекты, доступные в скриптовом окружении install.js, также не представлены в XPCOM. В этом втором случае нет даже и Contract ID для этих объектов.

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