Author: cfinck
Date: Wed Jan  6 05:15:44 2016
New Revision: 70505

URL: http://svn.reactos.org/svn/reactos?rev=70505&view=rev
Log:
[WINSPOOL]
- Implement StartDocPrinterA.
- Fix an uninitialized access in StartDocPrinterW.
- Make OpenPrinterA and StartDocPrinterA consistent.

Modified:
    
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/printers.c

Modified: 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/printers.c
URL: 
http://svn.reactos.org/svn/reactos/branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/printers.c?rev=70505&r1=70504&r2=70505&view=diff
==============================================================================
--- 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/printers.c
      [iso-8859-1] (original)
+++ 
branches/colins-printing-for-freedom/reactos/win32ss/printing/base/winspool/printers.c
      [iso-8859-1] Wed Jan  6 05:15:44 2016
@@ -379,24 +379,23 @@
 OpenPrinterA(LPSTR pPrinterName, LPHANDLE phPrinter, LPPRINTER_DEFAULTSA 
pDefault)
 {
     BOOL bReturnValue = FALSE;
+    DWORD cch;
     PWSTR pwszPrinterName = NULL;
-    PWSTR pwszDatatype = NULL;
     PRINTER_DEFAULTSW wDefault = { 0 };
-    size_t StringLength;
 
     if (pPrinterName)
     {
         // Convert pPrinterName to a Unicode string pwszPrinterName
-        StringLength = strlen(pPrinterName) + 1;
-
-        pwszPrinterName = HeapAlloc(hProcessHeap, 0, StringLength * 
sizeof(WCHAR));
+        cch = strlen(pPrinterName);
+
+        pwszPrinterName = HeapAlloc(hProcessHeap, 0, (cch + 1) * 
sizeof(WCHAR));
         if (!pwszPrinterName)
         {
             ERR("HeapAlloc failed for pwszPrinterName with last error %lu!\n", 
GetLastError());
             goto Cleanup;
         }
 
-        MultiByteToWideChar(CP_ACP, 0, pPrinterName, -1, pwszPrinterName, 
StringLength);
+        MultiByteToWideChar(CP_ACP, 0, pPrinterName, -1, pwszPrinterName, cch 
+ 1);
     }
 
     if (pDefault)
@@ -405,18 +404,17 @@
 
         if (pDefault->pDatatype)
         {
-            // Convert pDefault->pDatatype to a Unicode string pwszDatatype 
that later becomes wDefault.pDatatype
-            StringLength = strlen(pDefault->pDatatype) + 1;
-
-            pwszDatatype = HeapAlloc(hProcessHeap, 0, StringLength * 
sizeof(WCHAR));
-            if (!pwszDatatype)
+            // Convert pDefault->pDatatype to a Unicode string 
wDefault.pDatatype
+            cch = strlen(pDefault->pDatatype);
+
+            wDefault.pDatatype = HeapAlloc(hProcessHeap, 0, (cch + 1) * 
sizeof(WCHAR));
+            if (!wDefault.pDatatype)
             {
-                ERR("HeapAlloc failed for pwszDatatype with last error 
%lu!\n", GetLastError());
+                ERR("HeapAlloc failed for wDefault.pDatatype with last error 
%lu!\n", GetLastError());
                 goto Cleanup;
             }
 
-            MultiByteToWideChar(CP_ACP, 0, pDefault->pDatatype, -1, 
pwszDatatype, StringLength);
-            wDefault.pDatatype = pwszDatatype;
+            MultiByteToWideChar(CP_ACP, 0, pDefault->pDatatype, -1, 
wDefault.pDatatype, cch + 1);
         }
 
         if (pDefault->pDevMode)
@@ -426,14 +424,14 @@
     bReturnValue = OpenPrinterW(pwszPrinterName, phPrinter, &wDefault);
 
 Cleanup:
+    if (wDefault.pDatatype)
+        HeapFree(hProcessHeap, 0, wDefault.pDatatype);
+
     if (wDefault.pDevMode)
         HeapFree(hProcessHeap, 0, wDefault.pDevMode);
 
     if (pwszPrinterName)
         HeapFree(hProcessHeap, 0, pwszPrinterName);
-
-    if (pwszDatatype)
-        HeapFree(hProcessHeap, 0, pwszDatatype);
 
     return bReturnValue;
 }
@@ -537,11 +535,97 @@
 }
 
 DWORD WINAPI
+StartDocPrinterA(HANDLE hPrinter, DWORD Level, PBYTE pDocInfo)
+{
+    DOC_INFO_1W wDocInfo1 = { 0 };
+    DWORD cch;
+    DWORD dwErrorCode;
+    DWORD dwReturnValue = 0;
+    PDOC_INFO_1A pDocInfo1 = (PDOC_INFO_1A)pDocInfo;
+
+    // Only check the minimum required for accessing pDocInfo.
+    // Additional sanity checks are done in StartDocPrinterW.
+    if (!pDocInfo1)
+    {
+        dwErrorCode = ERROR_INVALID_PARAMETER;
+        goto Cleanup;
+    }
+
+    if (Level != 1)
+    {
+        dwErrorCode = ERROR_INVALID_LEVEL;
+        goto Cleanup;
+    }
+
+    if (pDocInfo1->pDatatype)
+    {
+        // Convert pDocInfo1->pDatatype to a Unicode string wDocInfo1.pDatatype
+        cch = strlen(pDocInfo1->pDatatype);
+
+        wDocInfo1.pDatatype = HeapAlloc(hProcessHeap, 0, (cch + 1) * 
sizeof(WCHAR));
+        if (!wDocInfo1.pDatatype)
+        {
+            ERR("HeapAlloc failed for wDocInfo1.pDatatype with last error 
%lu!\n", GetLastError());
+            goto Cleanup;
+        }
+
+        MultiByteToWideChar(CP_ACP, 0, pDocInfo1->pDatatype, -1, 
wDocInfo1.pDatatype, cch + 1);
+    }
+
+    if (pDocInfo1->pDocName)
+    {
+        // Convert pDocInfo1->pDocName to a Unicode string wDocInfo1.pDocName
+        cch = strlen(pDocInfo1->pDocName);
+
+        wDocInfo1.pDocName = HeapAlloc(hProcessHeap, 0, (cch + 1) * 
sizeof(WCHAR));
+        if (!wDocInfo1.pDocName)
+        {
+            ERR("HeapAlloc failed for wDocInfo1.pDocName with last error 
%lu!\n", GetLastError());
+            goto Cleanup;
+        }
+
+        MultiByteToWideChar(CP_ACP, 0, pDocInfo1->pDocName, -1, 
wDocInfo1.pDocName, cch + 1);
+    }
+
+    if (pDocInfo1->pOutputFile)
+    {
+        // Convert pDocInfo1->pOutputFile to a Unicode string 
wDocInfo1.pOutputFile
+        cch = strlen(pDocInfo1->pOutputFile);
+
+        wDocInfo1.pOutputFile = HeapAlloc(hProcessHeap, 0, (cch + 1) * 
sizeof(WCHAR));
+        if (!wDocInfo1.pOutputFile)
+        {
+            ERR("HeapAlloc failed for wDocInfo1.pOutputFile with last error 
%lu!\n", GetLastError());
+            goto Cleanup;
+        }
+
+        MultiByteToWideChar(CP_ACP, 0, pDocInfo1->pOutputFile, -1, 
wDocInfo1.pOutputFile, cch + 1);
+    }
+
+    dwReturnValue = StartDocPrinterW(hPrinter, Level, (PBYTE)&wDocInfo1);
+    dwErrorCode = GetLastError();
+
+Cleanup:
+    if (wDocInfo1.pDatatype)
+        HeapFree(hProcessHeap, 0, wDocInfo1.pDatatype);
+
+    if (wDocInfo1.pDocName)
+        HeapFree(hProcessHeap, 0, wDocInfo1.pDocName);
+
+    if (wDocInfo1.pOutputFile)
+        HeapFree(hProcessHeap, 0, wDocInfo1.pOutputFile);
+
+    SetLastError(dwErrorCode);
+    return dwReturnValue;
+}
+
+DWORD WINAPI
 StartDocPrinterW(HANDLE hPrinter, DWORD Level, PBYTE pDocInfo)
 {
     DWORD cbAddJobInfo1;
     DWORD cbNeeded;
     DWORD dwErrorCode;
+    DWORD dwReturnValue = 0;
     PADDJOB_INFO_1W pAddJobInfo1 = NULL;
     PDOC_INFO_1W pDocInfo1 = (PDOC_INFO_1W)pDocInfo;
     PSPOOLER_HANDLE pHandle = (PSPOOLER_HANDLE)hPrinter;
@@ -611,14 +695,17 @@
     }
 
     if (dwErrorCode == ERROR_SUCCESS)
+    {
         pHandle->bStartedDoc = TRUE;
+        dwReturnValue = pHandle->dwJobID;
+    }
 
 Cleanup:
     if (pAddJobInfo1)
         HeapFree(hProcessHeap, 0, pAddJobInfo1);
 
     SetLastError(dwErrorCode);
-    return pHandle->dwJobID;
+    return dwReturnValue;
 }
 
 BOOL WINAPI


Reply via email to