Bug 3817

Summary: Переделать систему печати
Product: WINE@Etersoft Reporter: Виталий Перов <vitperov>
Component: Печать ; Диалог печатиAssignee: Виталий Перов <vitperov>
Status: CLOSED INVALID QA Contact:
Severity: normal    
Priority: P4 CC: lav
Version: 1.0.10   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 1185    

Description Виталий Перов 2009-04-14 18:32:35 MSD
Сейчас для печати используются 16-битные функции из gdi32, которые не всегда корректно работают.

К тому же появилась бага 1185, в которой так и не удалось отказаться от fork().

Думаю следует пререписать систему печати с использованием функций cups
Comment 1 Виталий Перов 2009-04-14 18:43:36 MSD
Сейчас в wine уже есть кусок кода (функция ScheduleJob), который может использовать функции cups.

На сайте CUPS: http://www.cups.org/documentation.php/api-cups.html очень хорошо документированы функции печати. Думаю вполне реально перейти на их использование.
Comment 2 Виталий Перов 2009-04-14 19:11:58 MSD
в wine есть вспомогательная функция schedule_cups, которая печатает через cupsPrintFile.
Проблема в том, что cupsPrintFile требует во входных параметрах указывать имя файла. Т.е перед её вызовом должен быть уже сформированный файл.

Есть ещё один способ печати через CUPS:
1) создаётся задание cupsCreateJob
2) в начале каждого документа задание вызывается cupsStartDocument
3) сам документ записывается с помощью cupsWriteRequestData (здесь я плохо разобрался)
4) документ завершается cupsFinishDocument.

Если я всё правильно понял, то это то, что надо.
Но есть несколько замечаний:
1) кроме jobId, при вызове Start и Finish нужно ещё передавать dest->name.
2) Пока не понятно что такое Destination name (dest->name), но это точно не название документа
3) при вызове cupsWriteRequestData не указывается ни dest->name, ни jobID. Отсюда следует, что 2 документа одновременно посылать на печать нельзя.
Comment 3 Виталий Перов 2009-04-14 19:44:44 MSD
Разобрался с DestinationName. Это имя принтера, на который производится печать.
Рекомендуется получать его с помощью функций cups:

cups_dest_t *dests;
int num_dests = cupsGetDests(&dests);
cups_dest_t *dest = cupsGetDest("name", NULL, num_dests, dests);

/* do something wiith dest */

cupsFreeDests(num_dests, dests);


Но теперь возникла проблема с options. В документации сказано "options members contain the default options for a particular destination, along with several informational attributes about the destination as shown in Table 1".
Все опции в таблице1 предназначены для получении информации о принтере.
Про остальные опции ничего не сказано.
Ещё в документации сказано, что можно добавлять свои опции, но не понятно зачем.
А вообще, я предполагал, что через опции можно задавать количество копий и разбивку по копиям, но как это сделать, и возможно ли это вообще - пока не ясно.
Comment 4 Виталий Перов 2009-04-14 20:20:16 MSD
Как я догадываюсь, количество копий и разбивка по копиям передаются через аттрибуты NumCopies и Collate.

Для проверки необходимо написать тестовую программу.
Comment 5 Виталий Перов 2009-04-14 21:19:00 MSD
Начал писать тест. Столкнулся с проблемой:
в cups/cups.h отсутствуют некоторые константы типа CUPS_HTTP_DEFAULT, а также прототипы функций cupsCreateJob и др.
Comment 6 Виталий Перов 2009-04-17 16:47:47 MSD
Оказалось, что данные команды и константы появились только в новой версии CUPS.

Если я правильно понимаю, то бага 1185 решена. Тогда отпадает надобность что-либо переделывать