Bug 4063

Summary: MSWORD: Не печатает больше 1 копии
Product: WINE@Etersoft Reporter: Patsev Anton <chemtech>
Component: Печать ; Диалог печатиAssignee: Виталий Перов <vitperov>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: normal    
Priority: P4 CC: aurimas, support
Version: 1.0.10   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 4111, 6598    
Bug Blocks: 42, 443    

Description Patsev Anton 2009-06-29 13:37:23 MSD
WINE@Etersoft 1.0 Local 1.0.10-eter25/18

Открываем word. Нажимаем печать. Ставим больше 1 копии (2,3 и т.п.)
Печатаем, печатает 1 копию, остальные не печатает.

Лог:

wine "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE"
/usr/bin/wine: line 437: [: слишком много аргументов
fixme:time:GetCalendarInfoW Unimplemented caltype 1
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(25) - not supported.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:winspool:EnumJobsW (0x1,first=0,no=0,level=1,job=(nil),cb=0,0x32dd30,0x32dd24), stub!
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(25) - not supported.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:winspool:EnumJobsW (0x1,first=0,no=0,level=1,job=(nil),cb=0,0x32c050,0x32c044), stub!
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(25) - not supported.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:reg:GetNativeSystemInfo (0x32f7e4) using GetSystemInfo()
fixme:storage:StgCreateStorageEx Stub: calling StgCreateDocfile, but ignoring pStgOptions and grfAttrs
fixme:storage:StgCreateDocfile Storage share mode not implemented.
fixme:storage:StorageImpl_Commit (0x1779c8 4): stub
fixme:storage:StorageImpl_Commit (0x1779c8 4): stub
fixme:storage:StorageImpl_Commit (0x1779c8 4): stub
Comment 1 Виталий Перов 2009-07-13 13:53:24 MSD
1) Хотел бы уточнить. Печатаете вы на принтер? Не в файл?
2) Пришлите, пожалуйста лог консоли:
WINEDEBUG=print wine <программа> 2>log.txt 
Comment 2 Patsev Anton 2009-07-13 15:42:24 MSD
(In reply to comment #1)
> 1) Хотел бы уточнить. Печатаете вы на
> принтер? Не в файл?
На принтер.

Лог:

fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(25) - not supported.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:font:WineEngRealizationInfo (0x19a990, 0x32e6c8): stub!
fixme:font:WineEngRealizationInfo (0x190430, 0x32e6c4): stub!
fixme:font:WineEngRealizationInfo (0x190430, 0x32e6c4): stub!
fixme:font:WineEngRealizationInfo (0x19a990, 0x32de94): stub!
fixme:font:WineEngRealizationInfo (0x190430, 0x32de90): stub!
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:shell:DllGetClassObject failed for CLSID=
        {2227a280-3aea-1069-a2de-08002b30309d} (unknown)
fixme:winspool:EnumJobsW (0x1,first=0,no=0,level=1,job=(nil),cb=0,0x32dd30,0x32dd24), stub!
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(25) - not supported.
fixme:winspool:EnumJobsW (0x1,first=0,no=0,level=1,job=(nil),cb=0,0x32c050,0x32c044), stub!
fixme:winspool:EnumJobsW (0x1,first=0,no=0,level=1,job=(nil),cb=0,0x32ddb8,0x32ddac), stub!
fixme:winspool:EnumJobsW (0x1,first=0,no=0,level=1,job=(nil),cb=0,0x32ddb8,0x32ddac), stub!
fixme:winspool:EnumJobsW (0x1,first=0,no=0,level=1,job=(nil),cb=0,0x32ddb8,0x32ddac), stub!
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
trace:print:StartDocW DocName = L"Microsoft Word - ��������1" Output = L"LPR:PatsevAA" Datatype = (null)
trace:print:OpenJob16 '|lpr -P'PatsevAA' -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o sides=one-sided' 'Microsoft Word - Документ1' f098
trace:print:CreateSpoolFile Got printerSpoolCommand '|lpr -P'PatsevAA' -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o sides=one-sided' for output device '|lpr -P'PatsevAA' -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o sides=one-sided'
trace:print:CreateSpoolFile command: '|lpr -P'PatsevAA' -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o sides=one-sided'
trace:print:CreateSpoolFile In child need to exec lpr -P'PatsevAA' -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o sides=one-sided
trace:print:CreateSpoolFile Need to execute a cmnd and pipe the output to it
trace:print:OpenJob16 return 0001
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
trace:print:WriteSpool16 0001 0x21b5100 001b
trace:print:CloseJob16 0001
fixme:reg:GetNativeSystemInfo (0x32f7e4) using GetSystemInfo()
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:time:GetCalendarInfoW Unimplemented caltype 1
err:ole:StdMarshalImpl_ReleaseMarshalData could not map object ID to stub manager, oxid=1100000010, oid=4
err:ole:CoReleaseMarshalData IMarshal::ReleaseMarshalData failed with error 0x8001011d
fixme:storage:StgCreateStorageEx Stub: calling StgCreateDocfile, but ignoring pStgOptions and grfAttrs
fixme:storage:StgCreateDocfile Storage share mode not implemented.
fixme:storage:StorageImpl_Commit (0x211fe0 4): stub
fixme:storage:StorageImpl_Commit (0x211fe0 4): stub
fixme:storage:StorageImpl_Commit (0x211fe0 4): stub
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
Comment 3 Виталий Перов 2009-07-13 16:10:01 MSD
Спасибо. Интересующая нас строчка:
trace:print:CreateSpoolFile Got printerSpoolCommand '|lpr -P'PatsevAA' -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o
sides=one-sided'

#1 - на печать посылается одна копия. Очень странно.
Comment 4 Patsev Anton 2009-07-13 16:20:35 MSD
(In reply to comment #3)
> Спасибо. Интересующая нас строчка:
> trace:print:CreateSpoolFile Got printerSpoolCommand '|lpr -P'PatsevAA'
> -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o
> sides=one-sided'
> 
> #1 - на печать посылается одна копия. Очень
> странно.
>

Приеду домой воспроизведу ошибку еще дома...
Comment 5 Виталий Перов 2009-07-13 17:41:38 MSD
> Приеду домой воспроизведу ошибку еще
> дома...
> 

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


Диалог печати вроде стандартный, но ни PRINTDLG_UpdatePrintDlgA, ни PRINTDLG_UpdatePrintDlgW не вызывается. А решение о обработка количества копий содержится именно там

Comment 6 Виталий Перов 2009-07-13 18:32:39 MSD
Есть 2 переменные, в которых задаётся число
копий:
- dmCopies в структуре DEVMODE - отвечает за драйвер
принтера
- nCopies в структуре PRINTDLG -  это количество копий, которе должно
создать приложение

В нашем случае на момент начала формирования документа (вызов PSDRV_StartDoc)
получаем в любом случае dmCopies = 1.

как получить информацию из структуры PRINTDLG - пока не знаю.

По идее Word, раз он использует какой-то свой диалог должен:
1) Узнать поддерживает ли принтер формирование нужного числа копий. - Проверил, PSDRV_DeviceCapabilities с параметром DC_COPIES вызывается.

2) Принять решение о том кто будет формировать нужное количество копий: драйвер или сам Word.

3) И либо самостоятельно формировать нужное количество копий, либо записать соответствующее значение в dmCopies.
Сам он нужное количество копий не формирует (видно по размеру файла), отсюда вывод - нужное он заполняет структуру DEVMODE, но до вызова PSDRV_StartDoc это значение как-то теряется.

Comment 7 Patsev Anton 2009-07-13 18:40:41 MSD
Ну если надо потестить, скажите..
Comment 8 Виталий Перов 2009-07-13 19:03:12 MSD
Вот и проблема:

fixme:psdrv:PSDRV_DeviceCapabilities DC_COPIES: returning 9999
fixme:psdrv:PSDRV_ExtDeviceMode (Driver=WINEPS.DRV, hwnd=(nil), devOut=(nil), Device='HpTest', Port='LPT1:', devIn=(nil), Profile='(null)', Mode=0000)
fixme:psdrv:PSDRV_ExtDeviceMode (Driver=WINEPS.DRV, hwnd=(nil), devOut=0x1b5ca48, Device='HpTest', Port='LPT1:', devIn=0x1b51a68, Profile='(null)', Mode=000a)
fixme:psdrv:PSDRV_MergeDevmodes CALL
fixme:psdrv:PSDRV_MergeDevmodes Changing Copies to 1 (was 1 copies)
fixme:psdrv:PSDRV_MergeDevmodes CALL
fixme:psdrv:PSDRV_MergeDevmodes Changing Copies to 1 (was 1 copies)
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_StartDocA HERE dm->dmCopies = 1;
fixme:print:OpenJob16 '|lpr -P'HpTest' -T'Microsoft Word - Документ1' -# 1 -o Collate=False -o sides=one-sided' 'Microsoft Word - Документ1' c200
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_DeviceCapabilities DC_COPIES: returning 9999
fixme:psdrv:PSDRV_ExtDeviceMode (Driver=WINEPS.DRV, hwnd=(nil), devOut=(nil), Device='HpTest', Port='LPT1:', devIn=(nil), Profile='(null)', Mode=0000)
fixme:psdrv:PSDRV_ExtDeviceMode (Driver=WINEPS.DRV, hwnd=(nil), devOut=0x1b559e8, Device='HpTest', Port='LPT1:', devIn=0x2678648, Profile='(null)', Mode=000a)
fixme:psdrv:PSDRV_MergeDevmodes CALL
fixme:psdrv:PSDRV_MergeDevmodes Changing Copies to 1 (was 1 copies)
fixme:psdrv:PSDRV_MergeDevmodes CALL
fixme:psdrv:PSDRV_MergeDevmodes Changing Copies to 1 (was 1 copies)
fixme:psdrv:PSDRV_DeviceCapabilities DC_BINADJUST: stub.
fixme:psdrv:PSDRV_ExtEscape QUERYESCSUPPORT(25) - not supported.
fixme:ole:snapshot_QueryGetData (0x1b50b50, 0x32ed44 {cf c00a ptd (nil) aspect 1 lindex -1 tymed 4})
fixme:ole:snapshot_QueryGetData (0x1b50b50, 0x32eb04 {cf c057 ptd (nil) aspect 1 lindex -1 tymed 1})
fixme:psdrv:PSDRV_DeviceCapabilities DC_COPIES: returning 9999
fixme:psdrv:PSDRV_ExtDeviceMode (Driver=WINEPS.DRV, hwnd=(nil), devOut=(nil), Device='HpTest', Port='LPT1:', devIn=(nil), Profile='(null)', Mode=0000)
fixme:psdrv:PSDRV_ExtDeviceMode (Driver=WINEPS.DRV, hwnd=(nil), devOut=0x1b5d658, Device='HpTest', Port='LPT1:', devIn=0x1b55a40, Profile='(null)', Mode=000a)
fixme:psdrv:PSDRV_MergeDevmodes CALL
fixme:psdrv:PSDRV_MergeDevmodes Changing Copies to 3 (was 3 copies)
fixme:psdrv:PSDRV_MergeDevmodes CALL
fixme:psdrv:PSDRV_MergeDevmodes Changing Copies to 3 (was 3 copies)


по вызову PSDRV_MergeDevmodes видно, что сначала dmCopies = 1.
потом Word вызывает PSDRV_StartDocA и начинает печать документа.
И только потом в структуре dmCopies  появляется значение 3
Comment 9 Виталий Перов 2009-07-13 19:23:38 MSD
Сейчас печать осуществляется вызовом комманды lpr через pipe()
При использовании pipe необходимо передавать все параметры коммандной строки сразу. (Т.е на момент вызова PSDRV_StartDoc количество копий должно быть известным)

Единственный способ решения данной баги - переписать систему печать так, чтобы печать происходила во временный файл (или область памяти), а комманда lpr вызывалась бы только из PSDRV_EndDoc, когда количество копий точно известно.

К сожалению данное решение требует много времени, к тому же затрагивает только одну программу, поэтому вряд ли стоит ожидать решения данной баги в ближайшее время.
Comment 10 Patsev Anton 2009-07-13 19:27:03 MSD
Ну хоть на этом спасибо
Comment 11 Виталий Перов 2009-07-13 19:28:50 MSD
Завёл отдельную багу 4111
Comment 12 Виталий Перов 2010-09-13 16:49:07 MSD
Проверил с патчем к баге 4111.

Сейчас не печатает вообще:

fixme:winspool:ScheduleJob Destination string = 'L"|lpr -P'hp@buh' -T'Microsoft Word - 2pages.doc' -# 0 -o Collate=False -o sides=one-sided"'

Видимо на момент использования структура DevMode оказалась не заполненной
Comment 13 Виталий Перов 2010-09-13 17:10:12 MSD
Проблема была в том, что в структуру job_t записывалось не LPDEVMODEW, а PSDRV_DEVMODEW.
Исправил. Работает.
Comment 14 Виталий Перов 2010-09-13 17:35:58 MSD
Проверил: всё работает.
Патч есть в eterwine и eterhack.
В стабильную версию 1.0.12 он никак не попадёт (там другой механизм печати).
Пользователям нужно скачать unstable версию (наверное это будет 1.3.0-alt1.6) или долго дожидаться следующего стабильного релиза
Comment 15 Labirint 2011-04-19 12:35:15 MSK
Подскажите пожалуйста, где скачать unstable версию
Comment 16 Виталий Перов 2011-06-10 15:21:04 MSK
(В ответ на comment #15)
> Подскажите пожалуйста, где скачать unstable версию
К сожалению, пока это не возможно. Мы ещё не разобрались как и на каких условиях будем её предоставлять