2004 г.
Оригинал статьи: http://open-beos.sourceforge.net/nsl.php?mode=display&id=51#181
Перевод опубликован на сайте www.qube.ru
Драйвер
принтера в BeOS R5 — это модуль (add-on), который экспортирует
специфический API. Этот модуль используется сервером печати
(print_server) для того, чтобы добавить новый принтер, настроить
страницу, управлять заданием печати (Print Job) и наконец напечатать
задание на принтере. Эта статья поможет понять, как сервер печати
взаимодействует с драйвером принтера.
Сервер печати отвечает за
управление настройками (например размер бумаги). Обмен настройками между
сервером печати и драйвером происходит при помощи BMessage. Если драйвер
принтера возвращает объект BMessage и хочет указать на удачное
завершение работы, то значением поля what будет 'okok'. При ошибке этот
метод должен вернуть NULL. В большинстве случаев сервер печати
интепретирует значение what, отличающееся от 'okok', как неудачную
операцию. В любом случае драйвер принтера не должен полагаться на это и
при ошибке всегда возвращать NULL.
Задание печати — файл,
созданный печатающим приложением. Для создания задания, приложение
использует класс BPrintJob из Interface Kit (рис 1). Этот файл содержит
архивированные объекты BPicture, одно на каждый вызов
BPrintJob::DrawView(). Для примера растровый драйвер принтера может
использовать BPicture для каждой страницы и рисовать его в BBitmap.
После этого конвертировать BBitmap в формат, понятный принтеру. Драйвер
также может изменять BPicture, включая преобразование в полутона и
цветокоррекцию. Учтите, что в BeOS не существует общего подхода для
реализации таких особенностей печати.
Для передачи задания на
принтер драйвер использует транспортный модуль (transport add-on). Этот
модуль «знает» как передать данные на устройство (через LPT, USB, TCP/IP
итп). Разделяя транспорт и драйвер принтера, мы получаем возможность
использовать один драйвер для принтера, подключенного разными способами,
например, через LPT или USB. Это позволяет упростить код. Драйвер не
должен знать, каким способом будут доставляться данные на принтер,
он—просто выводит поток данных.
Местонахождение
драйвера
Системные драйвера, которые установлены с ОС,
находятся в B_BEOS_ADDONS_DIRECTORY в подкаталоге Print (т.е.
/boot/beos/system/add-ons/Print). Драйвера, установленные пользователем,
находятся в B_USER_ADDONS_DIRECTORY в подкаталоге Print (т.е.
/boot/home/config/add-ons/Print).
Транспортные модули находятся в
пользовательском или системном каталоге драйверов в подкаталоге
transport.
Жизнь драйвера
принтера
Установка драйвера
Для установки
драйвера достаточно скопировать нужный файл в каталог драйверов. Драйвер
не должен быть слинкован с какими-либо динамическими библиотеками кроме
системных. Старайтесь использовать статическую линковку. Это позволит
избежать проблем с конфликтом версий.
Добавление нового
принтера
Если пользователь добавит новый принтер через диалог
Printers, он выберет имя принтера, модель принтера и транспортный
модуль. Приложение Printers создаст каталог спулера (spooler), названный
именем принтера в B_USER_PRINTERS_DIRECTORY
(например:
/boot/home/config/settings/printers). Имя транспортного модуля
сохранится в атрибуте transport каталога спулера. Тип этого атрибута -
B_STRING_TYPE.
Когда сервер печати получит сообщение, что был
добавлен новый принтер, то он вызовет драйвер, чтобы его настроить.
Прототип функции в драйвере принтера выглядит так:
char*
add_printer(char* printer_name);
Это даст шанс драйверу открыть
диалог конфигурирования. Все настройки могут сохранены в атрибутах
каталога спулера. При удачном завершении операции драйвер должен вернуть
указатель на строку printer_name, а в случае неудачи, как было оговорено
выше — NULL.
Настройка страницы
Когда
приложение пользователя вызовет BPrintJob::ConfigPage(), сервер печати
вызовет следующую функцию в драйвере:
BMessage* config_page
(BNode* spool_folder, BMessage* settings);
В этом вызове драйверу
будет передан указатель на спулер печати, и в результате этого драйвер
сможет прочитать настройки из атрибутов спулера. В settings будут
переданы настройки печати предыдущей страницы. Как минимум, ореинтация и
размер бумаги.
Обычно драйвер принтера открывает диалог настройки
страницы для того, чтобы пользователь мог выбрать размер бумаги,
орентацию и возможно, другие настройки (например ручной лоток или лоток
автоподачи). Все другие настройки специфичны для каждой модели принтера,
а упомянутые выше обязательные поля приведены в таблице:
| Поле | Тип | Примечание |
|---|---|---|
| printable_rect | B_RECT_TYPE | размер печатаемой области в разрешении 72 пикселя на дюйм. |
| paper_rect | B_RECT_TYPE | размер бумаги в разрешении 72 пикселя на дюйм |
| orientation | B_INT32_TYPE | 0-портрет, 1-пейзаж |
| xres | B_INT32_TYPE | горизонтальное разрешение |
| yres | B_INT32_TYPE | вертикальное разрешение |
PrintJobReader reader(print_job);
if (reader.InitCheck() == B_OK) {
// the settings stored in the print job
BMessage* settings = reader.JobSettings();
// получим номер первой страницы
int32 firstPage = reader.FirstPage();
// получим номер последней станицы
int32 lastPage = reader.LastPage();
// размер бумаги и размер печатаемой области
BRect paperRect = reader.PaperRect();
BRect printableRect = reader.PrintableRect();
// разрешение
int32 xdpi, ydpi;
reader.GetResolution(pi, &ydpi);
int32 pages = reader.NumberOfPages();
// для каждой страницы
for (int page = 0; page < pages; page ++) {
PrintJobPage pjp;
if (reader.GetPage(page, pjp) == B_OK) {
BPicture picture;
BPoint point;
BRect rect;
// для каждого изображения на странице
while (pjp.NextPicture(picture, point, rect) == B_OK) {
// проделываем "черную работу" с каждым изображением
}
}
}
}
| Заголовок задания печати |
|---|
|
| Эта структура декларирована в PrintJob.h. В файле задания
печати после заголовка следует плоский BMessage, содержащий в себе настройки переданные take_job().Задание печати содержит в себе page_count страниц. Первая станица находится по смещению first_page. |
| Заголовок Страницы |
|---|
|
| Этот заголовок находится перед picture_count изображений.
Следующая станица начинается со смещения next_page. |
| Заголовок Изображения |
|---|
|
| Содержит плоский BPicture объект. |
| Файл | Местонахождение |
|---|---|
| PrintJobReader.cpp | current/src/add-ons/print/shared |
| PrintJobReader.h | current/headers/private/print |
| Printer Drivers | current/src/add-ons/print |
| Transport Protocols | current/src/add-ons/print/transports |