Author: janderwald
Date: Mon Oct 27 13:04:45 2008
New Revision: 37027
URL: 
http://svn.reactos.org/svn/reactos?rev=37027&view=rev
Log:
- Implement AddMonitorA, AddMonitorW
Modified:
    trunk/reactos/dll/win32/winspool/info.c
    trunk/reactos/dll/win32/winspool/stubs.c
    trunk/reactos/dll/win32/winspool/winspool.rbuild
Modified: trunk/reactos/dll/win32/winspool/info.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winspool/info.c?…
==============================================================================
--- trunk/reactos/dll/win32/winspool/info.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/winspool/info.c [iso-8859-1] Mon Oct 27 13:04:45 2008
@@ -37,6 +37,7 @@
 #include "winerror.h"
 #include "wingdi.h"
 #include "winreg.h"
+#include "shlwapi.h"
 #include "winspool.h"
 #include "wine/unicode.h"
 #include "wine/debug.h"
@@ -411,3 +412,161 @@
    return TRUE;
 }
+
+/*
+ * @unimplemented
+ */
+BOOL
+STDCALL
+AddMonitorA(LPSTR Name, DWORD Level, PBYTE Monitors)
+{
+   LPWSTR szName = NULL;
+   MONITOR_INFO_2W Monitor;
+   MONITOR_INFO_2A *pMonitor;
+   BOOL bRet = FALSE;
+
+   if (Level != 2 || !Monitors)
+   {
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
+   }
+
+   pMonitor = (MONITOR_INFO_2A*)Monitors;
+   if (pMonitor->pDLLName == NULL || pMonitor->pName == NULL)
+   {
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
+   }
+
+   ZeroMemory(&Monitor, sizeof(Monitor));
+
+   if (Name)
+   {
+      szName = HeapAlloc(GetProcessHeap(), 0, (strlen(Name) + 1) * sizeof(WCHAR));
+      if (!szName)
+      {
+         return FALSE;
+      }
+      MultiByteToWideChar(CP_ACP, 0, Name, -1, szName, strlen(Name)+1);
+      szName[strlen(Name)] = L'\0';
+   }
+
+   Monitor.pDLLName = HeapAlloc(GetProcessHeap(), 0, (strlen(pMonitor->pDLLName)+1) *
sizeof(WCHAR));
+   if (!Monitor.pDLLName)
+   {
+      goto cleanup;
+   }
+   MultiByteToWideChar(CP_ACP, 0, pMonitor->pDLLName, -1, Monitor.pDLLName,
strlen(pMonitor->pDLLName)+1);
+   pMonitor->pDLLName[strlen(pMonitor->pDLLName)] = L'\0';
+
+   Monitor.pName = HeapAlloc(GetProcessHeap(), 0, (strlen(pMonitor->pName)+1) *
sizeof(WCHAR));
+   if (!Monitor.pName)
+   {
+      goto cleanup;
+   }
+   MultiByteToWideChar(CP_ACP, 0, pMonitor->pName, -1, Monitor.pName,
strlen(pMonitor->pName)+1);
+   pMonitor->pName[strlen(pMonitor->pName)] = L'\0';
+
+
+   if (pMonitor->pEnvironment)
+   {
+      Monitor.pEnvironment = HeapAlloc(GetProcessHeap(), 0,
(strlen(pMonitor->pEnvironment)+1) * sizeof(WCHAR));
+      if (!Monitor.pEnvironment)
+      {
+         goto cleanup;
+      }
+      MultiByteToWideChar(CP_ACP, 0, pMonitor->pEnvironment, -1, Monitor.pEnvironment,
strlen(pMonitor->pEnvironment)+1);
+      pMonitor->pEnvironment[strlen(pMonitor->pEnvironment)] = L'\0';
+   }
+
+   bRet = AddMonitorW(szName, Level, (LPBYTE)&Monitor);
+
+cleanup:
+
+  if (szName)
+     HeapFree(GetProcessHeap(), 0, szName);
+
+  if (Monitor.pDLLName)
+     HeapFree(GetProcessHeap(), 0, Monitor.pDLLName);
+
+  if (Monitor.pEnvironment)
+     HeapFree(GetProcessHeap(), 0, Monitor.pEnvironment);
+
+  if (Monitor.pName)
+     HeapFree(GetProcessHeap(), 0, Monitor.pName);
+
+  return bRet;
+}
+
+
+/*
+ * @unimplemented
+ */
+BOOL
+STDCALL
+AddMonitorW(LPWSTR Name, DWORD Level, PBYTE Monitors)
+{
+   WCHAR szPath[MAX_PATH];
+   HMODULE hLibrary = NULL;
+   FARPROC InitProc;
+   HKEY hKey, hSubKey;
+   MONITOR_INFO_2W * pMonitor;
+
+
+   if (Level != 2 || !Monitors)
+   {
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
+   }
+
+   pMonitor = (MONITOR_INFO_2W*)Monitors;
+
+   if (pMonitor->pDLLName == NULL || pMonitor->pName == NULL)
+   {
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
+   }
+
+   if (wcschr(pMonitor->pDLLName, L'\\'))
+   {
+       hLibrary = LoadLibraryExW(pMonitor->pDLLName, NULL, 0);
+   }
+   else if (GetSystemDirectoryW(szPath, MAX_PATH) && PathAddBackslashW(szPath))
+   {
+      wcscat(szPath, pMonitor->pDLLName);
+      hLibrary = LoadLibraryExW(szPath, NULL, 0);
+   }
+
+   if (!hLibrary)
+   {
+      return FALSE;
+   }
+
+   InitProc = GetProcAddress(hLibrary, "InitializePrintMonitor");
+   if (!InitProc)
+   {
+      InitProc = GetProcAddress(hLibrary, "InitializePrintMonitor2");
+      if (!InitProc)
+      {
+         FreeLibrary(hLibrary);
+         SetLastError(ERROR_PROC_NOT_FOUND);
+         return FALSE;
+      }
+   }
+
+   // FIXME
+   // Initialize monitor
+   FreeLibrary(hLibrary);
+
+   if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors", 0, KEY_WRITE, &hKey)
== ERROR_SUCCESS)
+   {
+      if (RegCreateKeyExW(hKey, pMonitor->pName, 0, NULL, 0, KEY_WRITE, NULL,
&hSubKey, NULL) == ERROR_SUCCESS)
+      {
+         RegSetValueExW(hSubKey, L"Driver", 0, REG_SZ,
(LPBYTE)pMonitor->pDLLName, (wcslen(pMonitor->pDLLName)+1)*sizeof(WCHAR));
+         RegCloseKey(hSubKey);
+      }
+      RegCloseKey(hKey);
+   }
+   return TRUE;
+}
+
Modified: trunk/reactos/dll/win32/winspool/stubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winspool/stubs.c…
==============================================================================
--- trunk/reactos/dll/win32/winspool/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/winspool/stubs.c [iso-8859-1] Mon Oct 27 13:04:45 2008
@@ -94,32 +94,6 @@
 }
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-AddMonitorA(LPSTR Name, DWORD Level, PBYTE Monitors)
-{
-  OutputDebugStringW(L"winspool AddMonitorA stub called\n");
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-
-  return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-AddMonitorW(LPWSTR Name, DWORD Level, PBYTE Monitors)
-{
-  OutputDebugStringW(L"winspool AddMonitorW stub called\n");
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-
-  return FALSE;
-}
 /*
Modified: trunk/reactos/dll/win32/winspool/winspool.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winspool/winspoo…
==============================================================================
--- trunk/reactos/dll/win32/winspool/winspool.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/winspool/winspool.rbuild [iso-8859-1] Mon Oct 27 13:04:45 2008
@@ -5,6 +5,7 @@
        <library>ntdll</library>
        <library>kernel32</library>
        <library>advapi32</library>
+       <library>shlwapi</library>
        <file>info.c</file>
        <file>stubs.c</file>
        <file>winspool.rc</file>