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?r... ============================================================================== --- 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/winspool... ============================================================================== --- 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>