[WINSPOOL]
[reactos.git] / reactos / win32ss / printing / base / spoolss / main.c
index 4ed1cf4..bc9963b 100644 (file)
@@ -7,80 +7,97 @@
 
 #include "precomp.h"
 
-BOOL WINAPI
-ClosePrinter(HANDLE hPrinter)
-{
-    return FALSE;
-}
+HANDLE hProcessHeap;
+PRINTPROVIDOR LocalSplFuncs;
 
-BOOL WINAPI
-EndDocPrinter(HANDLE hPrinter)
-{
-    return FALSE;
-}
 
 BOOL WINAPI
-EndPagePrinter(HANDLE hPrinter)
+DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
-    return FALSE;
-}
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hinstDLL);
+            hProcessHeap = GetProcessHeap();
+            break;
+    }
 
-BOOL WINAPI
-EnumPrintersW(DWORD Flags, LPWSTR Name, DWORD Level, LPBYTE pPrinterEnum, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned)
-{
-    return FALSE;
+    return TRUE;
 }
 
 BOOL WINAPI
-GetPrinterDriverW(HANDLE hPrinter, LPWSTR pEnvironment, DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf, LPDWORD pcbNeeded)
+InitializeRouter(HANDLE SpoolerStatusHandle)
 {
-    return FALSE;
-}
+    HINSTANCE hinstLocalSpl;
+    PInitializePrintProvidor pfnInitializePrintProvidor;
 
-BOOL WINAPI
-GetPrinterW(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter, DWORD cbBuf, LPDWORD pcbNeeded)
-{
-    return FALSE;
-}
+    // Only initialize localspl.dll for now.
+    // This function should later look for all available print providers in the registry and initialize all of them.
+    hinstLocalSpl = LoadLibraryW(L"localspl");
+    if (!hinstLocalSpl)
+    {
+        ERR("LoadLibraryW for localspl failed with error %lu!\n", GetLastError());
+        return FALSE;
+    }
 
-BOOL WINAPI
-GetPrintProcessorDirectoryW(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, LPBYTE pPrintProcessorInfo, DWORD cbBuf, LPDWORD pcbNeeded)
-{
-    return FALSE;
-}
+    pfnInitializePrintProvidor = (PInitializePrintProvidor)GetProcAddress(hinstLocalSpl, "InitializePrintProvidor");
+    if (!pfnInitializePrintProvidor)
+    {
+        ERR("GetProcAddress failed with error %lu!\n", GetLastError());
+        return FALSE;
+    }
 
-BOOL WINAPI
-InitializeRouter(HANDLE SpoolerStatusHandle)
-{
-    return FALSE;
+    if (!pfnInitializePrintProvidor(&LocalSplFuncs, sizeof(PRINTPROVIDOR), NULL))
+    {
+        ERR("InitializePrintProvidor failed for localspl with error %lu!\n", GetLastError());
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 BOOL WINAPI
-OpenPrinterW(LPWSTR pPrinterName, LPHANDLE phPrinter, LPPRINTER_DEFAULTSW pDefault)
+SplInitializeWinSpoolDrv(PVOID* pTable)
 {
-    return FALSE;
-}
+    HINSTANCE hWinspool;
+    int i;
 
-DWORD WINAPI
-StartDocPrinterW(HANDLE hPrinter, DWORD Level, LPBYTE pDocInfo)
-{
-    return 0;
-}
+    hWinspool = LoadLibraryW(L"winspool.drv");
+    if (!hWinspool)
+    {
+        ERR("Could not load winspool.drv, last error is %lu!\n", GetLastError());
+        return FALSE;
+    }
 
-BOOL WINAPI
-StartPagePrinter(HANDLE hPrinter)
-{
-    return FALSE;
+    // Get the function pointers which are meant to be returned by this function.
+    pTable[0] = GetProcAddress(hWinspool, "OpenPrinterW");
+    pTable[1] = GetProcAddress(hWinspool, "ClosePrinter");
+    pTable[2] = GetProcAddress(hWinspool, "SpoolerDevQueryPrintW");
+    pTable[3] = GetProcAddress(hWinspool, "SpoolerPrinterEvent");
+    pTable[4] = GetProcAddress(hWinspool, "DocumentPropertiesW");
+    pTable[5] = GetProcAddress(hWinspool, (LPSTR)212);
+    pTable[6] = GetProcAddress(hWinspool, (LPSTR)213);
+    pTable[7] = GetProcAddress(hWinspool, (LPSTR)214);
+    pTable[8] = GetProcAddress(hWinspool, (LPSTR)215);
+
+    // Verify that all calls succeeded.
+    for (i = 0; i < 9; i++)
+        if (!pTable[i])
+            return FALSE;
+
+    return TRUE;
 }
 
 BOOL WINAPI
-WritePrinter(HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf, LPDWORD pcWritten)
+SplIsUpgrade()
 {
-    return FALSE;
+       return FALSE;
 }
 
 BOOL WINAPI
-XcvDataW(HANDLE hXcv, PCWSTR pszDataName, PBYTE pInputData, DWORD cbInputData, PBYTE pOutputData, DWORD cbOutputData, PDWORD pcbOutputNeeded, PDWORD pdwStatus)
+SpoolerInit()
 {
-    return FALSE;
+    // Nothing to do here yet
+    SetLastError(ERROR_SUCCESS);
+    return TRUE;
 }