Техническое примечание TN2329

Игра в песочнице диалогового расширения печати

Цель этого документа состоит в том, чтобы объяснить шаги для Игры в песочнице Print Dialog Extension (PDE).

Распечатайте диалоговые расширения и тестовую среду приложения
Объявление совместимости песочницы
Тестирование совместимости песочницы
Связь с драйвером печати
Хранить динамические данные
Пример кода
История версии документа

Распечатайте диалоговые расширения и тестовую среду приложения

Эти Технические замечания описывают, как Диалоговые Расширения Печати (PDEs) затронуты Песочницей приложения узла. Тестовая среда приложения является механизмом защиты, разработанным для ограничения ущерба, который мог быть нанесен поставившим под угрозу или ошибочным приложением. Для получения дополнительной информации о Тестовой среде приложения, посмотрите целевую страницу разработчика Тестовой среды приложения.

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

Объявление совместимости песочницы

Тестовая среда приложения была представлена в OS X 10.7 Львов, но OS позволил несовместимому PDEs работать. Этот механизм обходного решения сохранялся в OS X 10.8 Пум. Наконец в OS X 10.9 Индивидуалистов, диалоговое окно Печати не загружает несовместимый PDEs. Поэтому весь PDEs должен соблюсти вышеупомянутые правила для совместимости Тестовой среды приложения.

Для объявления совместимости PDEs должен включать ключ в их Info.plist. Ключевым именем является PMSandboxCompatiblePDEs, и его значение должно быть установлено в Истину.

Тестирование совместимости песочницы

Самый простой способ определить, соответствует ли PDE правилам Песочницы, состоит в том, чтобы искать sandboxd сообщения в Консоли при выполнении большого разнообразия приложений OS X.

Связь с драйвером печати

PDEs может связаться с их связанными принтерами, косвенно, путем отправки заданий команды в их драйвер. И они могут получить информацию о принтере через печать системы APIs, включая PMPrinterCopyState заставить текущее состояние принтера и CUPS PostScript Printer Description (PPD) APIs получать опции и значения по умолчанию принтера.

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

Хранить динамические данные

Игра в песочнице предотвращает PDEs и драйверы от использования общего каталога на диске. Вместо этого они могут поделиться информацией с помощью файла PPD, связанного с очередью печати. Следующее является всесторонними шагами и примером кода для выполнения этого.

Шаги фильтра CUPS

Фильтры CUPS должны отправить»PPD: сообщения» демону CUPS, через stderr, для обеспечения файла PPD актуальны.

  • PPD: сообщения могут использоваться, чтобы установить или создать данные ключа/значения в файле PPD, например:

    PPD: DataLine1="foo" DataLine2="bar" ... DataLineN="baz"

    Если ключ аргумента существует, то он обновляется, иначе он вставляется. Все динамические данные должны храниться этим способом.

  • У Вас может быть многократный ключ/значения на PPD: сообщение, с максимумом PPD: сообщение 2k в размере при работе OS X 10.7 или позже. Ограничение размера прежде 10.7 является 1k.

  • Файл PPD воссоздается после каждого PPD: сообщение обрабатывается демоном CUPS. Рекомендуется сжать данные прежде, чем закодировать, чтобы оставить свободное место и минимизировать число ключевых слов, обновляющихся драйвером.

  • Архив, соединенный в разделе Sample Code, содержит исходные файлы, демонстрирующие чтение и запись данных PPD со следующими соответствующими примечаниями:

    • Дескрипторы в качестве примера, комбинирующие многократные опции PPD в единственную строку состояния до предела 1k, наложенного CUPS на OS X 10.6.

    • Данные являются gzip'd и Base64-закодированный. Для примера кода в testppdx.c мы заканчиваем с сетевые сбережения/сжатие приблизительно 40% в файле PPD.

    • Код помещает верхний предел ценности 16 МБ данных, которые могут быть встроены на ключевое слово. Это основывается на среднем факторе сжатия, максимальном количестве сжатых байтов, которые могут быть закодированы на строку (158), и число блоков (пронумерованные ключевые слова) поддерживаемый текущим кодом (64k).

Шаги PDE

PDEs тогда читают файл PPD для отражения опций принтера и значений в диалоговом окне Печати. Следующее является шагами, которые PDE должен использовать для чтения файла PPD.

  • Поскольку система печати не консолидирует PPD: сообщения прежде, чем записать PPD, может быть необходимо опросить относительно их завершения прежде, чем выполнить другую работу. Это выполняется путем отправки задания команды и ожидания того задания для завершения. Задание команды может быть любым заданием (как ReportStatus); все вышли PPD: сообщения, как гарантируют, закончатся, прежде чем состояние задания команды будет перемещено для завершения.

    Для отправки задания команды использовать PMPrinterSendCommand. Также cupsDoFileRequest и запросы IPP могут быть эффективно использованы, чтобы сделать это непосредственно. Для примера последнего посмотрите SampleSuppliesView-sendCommand: метод в проекте примера кода SampleRaster, реализующем фильтр командного файла в качестве примера и PDE.

    Имя задания, которое Вы указываете в качестве параметра, проверяется (использующий cupsGetJobs) для завершения задания. Имя задания является вводом jobTitle к PMPrinterSendCommand, как замечено здесь:

    (from PMCore.h: )
     
    *    jobTitle:
    *      The title of the job associated with the command file. If NULL,
    *      a job title will be automatically generated but it may not be
    *      meaningful to a user.
     
    extern OSStatus
    PMPrinterSendCommand(
      PMPrinter       printer,
      CFStringRef     commandString,
      CFStringRef     jobTitle,
      CFDictionaryRef options) AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER;
  • Получите доступ к обновленному файлу PPD в использовании PDE cupsGetPPD3, с CUPS_HTTP_DEFAULT и PMPrinterGetID как его основные параметры.

Пример кода

Этот загружаемый пример кода поддерживает метод, проиллюстрированный в разделе Storing Dynamic Data.



История версии документа


ДатаПримечания
13.12.2013

Новый документ, перечисляющий требования Игры в песочнице Print Driver Extension (PDE).