winspool: StartDocDlg
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Fri Jul 22 11:08:46 CDT 2005
Huw Davies <huw at codeweavers.com>
Implement the undocumented StartDocDlg[A|W]. These will be
used by StartDoc.
--
Huw Davies
huw at codeweavers.com
Index: include/winspool.h
===================================================================
RCS file: /home/wine/wine/include/winspool.h,v
retrieving revision 1.28
diff -u -p -r1.28 winspool.h
--- include/winspool.h 18 Jul 2005 09:09:41 -0000 1.28
+++ include/winspool.h 22 Jul 2005 16:03:43 -0000
@@ -1160,6 +1160,10 @@ LONG WINAPI ExtDeviceMode( HWND hWnd, HA
LPSTR pDeviceName, LPSTR pPort, LPDEVMODEA pDevModeInput, LPSTR pProfile,
DWORD fMode);
+LPSTR WINAPI StartDocDlgA(HANDLE hPrinter, DOCINFOA *doc);
+LPWSTR WINAPI StartDocDlgW(HANDLE hPrinter, DOCINFOW *doc);
+#define StartDocDlg WINELIB_NAME_AW(StartDocDlg)
+
#ifdef __cplusplus
} /* extern "C" */
#endif
Index: dlls/winspool/info.c
===================================================================
RCS file: /home/wine/wine/dlls/winspool/info.c,v
retrieving revision 1.122
diff -u -p -r1.122 info.c
--- dlls/winspool/info.c 22 Jul 2005 09:04:08 -0000 1.122
+++ dlls/winspool/info.c 22 Jul 2005 16:03:43 -0000
@@ -5153,12 +5153,12 @@ INT_PTR CALLBACK file_dlg_proc(HWND hwnd
if(LOWORD(wparam) == IDOK)
{
HANDLE hf;
- DWORD len = SendDlgItemMessageW(hwnd, 201, WM_GETTEXTLENGTH, 0, 0);
+ DWORD len = SendDlgItemMessageW(hwnd, EDITBOX, WM_GETTEXTLENGTH, 0, 0);
LPWSTR *output;
filename = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
GetDlgItemTextW(hwnd, EDITBOX, filename, len + 1);
-
+
if(GetFileAttributesW(filename) != INVALID_FILE_ATTRIBUTES)
{
WCHAR caption[200], message[200];
@@ -5203,14 +5203,22 @@ INT_PTR CALLBACK file_dlg_proc(HWND hwnd
}
/*****************************************************************************
+ * get_filename
+ */
+static BOOL get_filename(LPWSTR *filename)
+{
+ return DialogBoxParamW(WINSPOOL_hInstance, MAKEINTRESOURCEW(FILENAME_DIALOG), GetForegroundWindow(),
+ file_dlg_proc, (LPARAM)filename) == IDOK;
+}
+
+/*****************************************************************************
* schedule_file
*/
static BOOL schedule_file(LPCWSTR filename)
{
LPWSTR output = NULL;
- if(DialogBoxParamW(WINSPOOL_hInstance, MAKEINTRESOURCEW(FILENAME_DIALOG), GetForegroundWindow(),
- file_dlg_proc, (LPARAM)&output) == IDOK)
+ if(get_filename(&output))
{
TRACE("copy to %s\n", debugstr_w(output));
CopyFileW(filename, output, FALSE);
@@ -5402,5 +5410,101 @@ BOOL WINAPI ScheduleJob( HANDLE hPrinter
}
end:
LeaveCriticalSection(&printer_handles_cs);
+ return ret;
+}
+
+/*****************************************************************************
+ * StartDocDlgA [WINSPOOL.@]
+ */
+ LPSTR WINAPI StartDocDlgA( HANDLE hPrinter, DOCINFOA *doc )
+{
+ UNICODE_STRING usBuffer;
+ DOCINFOW docW;
+ LPWSTR retW;
+ LPSTR ret = NULL;
+
+ docW.cbSize = sizeof(docW);
+ docW.lpszDocName = asciitounicode(&usBuffer, doc->lpszDocName);
+ docW.lpszOutput = asciitounicode(&usBuffer, doc->lpszOutput);
+ docW.lpszDatatype = asciitounicode(&usBuffer, doc->lpszDatatype);
+ docW.fwType = doc->fwType;
+
+ retW = StartDocDlgW(hPrinter, &docW);
+
+ if(retW)
+ {
+ DWORD len = WideCharToMultiByte(CP_ACP, 0, retW, -1, NULL, 0, NULL, NULL);
+ ret = HeapAlloc(GetProcessHeap(), 0, len);
+ WideCharToMultiByte(CP_ACP, 0, retW, -1, ret, len, NULL, NULL);
+ HeapFree(GetProcessHeap(), 0, retW);
+ }
+
+ HeapFree(GetProcessHeap(), 0, (LPWSTR)docW.lpszDatatype);
+ HeapFree(GetProcessHeap(), 0, (LPWSTR)docW.lpszOutput);
+ HeapFree(GetProcessHeap(), 0, (LPWSTR)docW.lpszDocName);
+
+ return ret;
+}
+
+/*****************************************************************************
+ * StartDocDlgW [WINSPOOL.@]
+ *
+ * Undocumented: Apparently used by gdi32:StartDocW() to popup the file dialog
+ * when lpszOutput is "FILE:" or if lpszOutput is NULL and the default printer
+ * port is "FILE:". Also returns the full path if passed a relative path.
+ *
+ * The caller should free the returned string from the process heap.
+ */
+LPWSTR WINAPI StartDocDlgW( HANDLE hPrinter, DOCINFOW *doc )
+{
+ LPWSTR ret = NULL;
+ DWORD len, attr;
+
+ if(doc->lpszOutput == NULL) /* Check whether default port is FILE: */
+ {
+ PRINTER_INFO_5W *pi5;
+ GetPrinterW(hPrinter, 5, NULL, 0, &len);
+ if(GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ return NULL;
+ pi5 = HeapAlloc(GetProcessHeap(), 0, len);
+ GetPrinterW(hPrinter, 5, (LPBYTE)pi5, len, &len);
+ if(!pi5->pPortName || strcmpW(pi5->pPortName, FILE_Port))
+ {
+ HeapFree(GetProcessHeap(), 0, pi5);
+ return NULL;
+ }
+ HeapFree(GetProcessHeap(), 0, pi5);
+ }
+
+ if(doc->lpszOutput == NULL || !strcmpW(doc->lpszOutput, FILE_Port))
+ {
+ LPWSTR name;
+ get_filename(&name);
+ if(name)
+ {
+ if(!(len = GetFullPathNameW(name, 0, NULL, NULL)))
+ {
+ HeapFree(GetProcessHeap(), 0, name);
+ return NULL;
+ }
+ ret = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ GetFullPathNameW(name, len, ret, NULL);
+ HeapFree(GetProcessHeap(), 0, name);
+ }
+ return ret;
+ }
+
+ if(!(len = GetFullPathNameW(doc->lpszOutput, 0, NULL, NULL)))
+ return NULL;
+
+ ret = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ GetFullPathNameW(doc->lpszOutput, len, ret, NULL);
+
+ attr = GetFileAttributesW(ret);
+ if(attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ HeapFree(GetProcessHeap(), 0, ret);
+ ret = NULL;
+ }
return ret;
}
Index: dlls/winspool/winspool.drv.spec
===================================================================
RCS file: /home/wine/wine/dlls/winspool/winspool.drv.spec,v
retrieving revision 1.28
diff -u -p -r1.28 winspool.drv.spec
--- dlls/winspool/winspool.drv.spec 22 Jun 2005 18:38:23 -0000 1.28
+++ dlls/winspool/winspool.drv.spec 22 Jul 2005 16:03:43 -0000
@@ -130,8 +130,8 @@
@ stdcall SetPrinterW(long long ptr long)
@ stub SpoolerDevQueryPrintW
@ stub SpoolerInit
-@ stub StartDocDlgA
-@ stub StartDocDlgW
+@ stdcall StartDocDlgA(ptr ptr)
+@ stdcall StartDocDlgW(ptr ptr)
@ stdcall StartDocPrinterA(long long ptr)
@ stdcall StartDocPrinterW(long long ptr)
@ stdcall StartPagePrinter(long)
More information about the wine-patches
mailing list