1 /* 2 * PROJECT: ReactOS Spooler API 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Functions related to Print Providers 5 * COPYRIGHT: Copyright 2015-2017 Colin Finck (colin@reactos.org) 6 */ 7 8 #include "precomp.h" 9 10 BOOL WINAPI 11 AddPrintProvidorA(PSTR pName, DWORD Level, PBYTE pProviderInfo) 12 { 13 LPWSTR nameW = NULL; 14 PROVIDOR_INFO_1W pi1W; 15 PROVIDOR_INFO_2W pi2W; 16 DWORD len; 17 BOOL res; 18 PBYTE pPI = NULL; 19 20 TRACE("AddPrintProvidorA(%s, %lu, %p)\n", pName, Level, pProviderInfo); 21 22 ZeroMemory(&pi1W, sizeof(PROVIDOR_INFO_1W)); 23 pi2W.pOrder = NULL; 24 25 switch (Level) 26 { 27 case 1: 28 { 29 PROVIDOR_INFO_1A *pi1A = (PROVIDOR_INFO_1A*)pProviderInfo; 30 if (pi1A->pName) 31 { 32 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pName, -1, NULL, 0); 33 pi1W.pName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 34 MultiByteToWideChar(CP_ACP, 0, pi1A->pName, -1, pi1W.pName, len); 35 } 36 if (pi1A->pEnvironment) 37 { 38 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pEnvironment, -1, NULL, 0); 39 pi1W.pEnvironment = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 40 MultiByteToWideChar(CP_ACP, 0, pi1A->pEnvironment, -1, pi1W.pEnvironment, len); 41 } 42 if (pi1A->pDLLName) 43 { 44 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pDLLName, -1, NULL, 0); 45 pi1W.pDLLName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 46 MultiByteToWideChar(CP_ACP, 0, pi1A->pDLLName, -1, pi1W.pDLLName, len); 47 } 48 pPI = (PBYTE)&pi1W; 49 } 50 break; 51 52 case 2: 53 { 54 PROVIDOR_INFO_2A *pi2A = (PROVIDOR_INFO_2A*)pProviderInfo; 55 if (pi2A->pOrder) 56 { 57 len = MultiByteToWideChar(CP_ACP, 0, pi2A->pOrder, -1, NULL, 0); 58 pi2W.pOrder = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 59 MultiByteToWideChar(CP_ACP, 0, pi2A->pOrder, -1, pi2W.pOrder, len); 60 } 61 pPI = (PBYTE)&pi2W; 62 } 63 break; 64 65 default: 66 SetLastError(ERROR_INVALID_LEVEL); 67 return FALSE; 68 } 69 70 if (pName) 71 { 72 len = MultiByteToWideChar(CP_ACP, 0, pName, -1, NULL, 0); 73 nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 74 MultiByteToWideChar(CP_ACP, 0, pName, -1, nameW, len); 75 } 76 77 res = AddPrintProvidorW( nameW, Level, pPI ); 78 79 if (pName) HeapFree(GetProcessHeap(), 0, nameW); 80 if (pi1W.pName) HeapFree(GetProcessHeap(), 0, pi1W.pName); 81 if (pi1W.pEnvironment) HeapFree(GetProcessHeap(), 0, pi1W.pEnvironment); 82 if (pi1W.pDLLName) HeapFree(GetProcessHeap(), 0, pi1W.pDLLName); 83 if (pi2W.pOrder) HeapFree(GetProcessHeap(), 0, pi2W.pOrder); 84 85 return res; 86 } 87 88 BOOL WINAPI 89 AddPrintProvidorW(PWSTR pName, DWORD Level, PBYTE pProviderInfo) 90 { 91 DWORD dwErrorCode; 92 WINSPOOL_PROVIDOR_CONTAINER ProvidorContainer; 93 94 TRACE("AddPrintProvidorW(%S, %lu, %p)\n", pName, Level, pProviderInfo); 95 96 if ((Level < 1) || (Level > 2)) 97 { 98 SetLastError(ERROR_INVALID_LEVEL); 99 return FALSE; 100 } 101 102 ProvidorContainer.ProvidorInfo.pProvidorInfo1 = (WINSPOOL_PROVIDOR_INFO_1*)pProviderInfo; 103 ProvidorContainer.Level = Level; 104 105 RpcTryExcept 106 { 107 dwErrorCode = _RpcAddPrintProvidor( pName, &ProvidorContainer ); 108 } 109 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 110 { 111 dwErrorCode = RpcExceptionCode(); 112 ERR("_RpcEnumPorts failed with exception code %lu!\n", dwErrorCode); 113 } 114 RpcEndExcept; 115 116 SetLastError(dwErrorCode); 117 return (dwErrorCode == ERROR_SUCCESS); 118 } 119 120 BOOL WINAPI 121 DeletePrintProvidorA(PSTR pName, PSTR pEnvironment, PSTR pPrintProviderName) 122 { 123 UNICODE_STRING NameW, EnvW, ProviderW; 124 BOOL Ret; 125 126 TRACE("DeletePrintProvidorW(%s, %s, %s)\n", pName, pEnvironment, pPrintProviderName); 127 128 AsciiToUnicode(&NameW, pName); 129 AsciiToUnicode(&EnvW, pEnvironment); 130 AsciiToUnicode(&ProviderW, pPrintProviderName); 131 132 Ret = DeletePrintProvidorW(NameW.Buffer, EnvW.Buffer, ProviderW.Buffer); 133 134 RtlFreeUnicodeString(&ProviderW); 135 RtlFreeUnicodeString(&EnvW); 136 RtlFreeUnicodeString(&NameW); 137 138 return Ret; 139 } 140 141 BOOL WINAPI 142 DeletePrintProvidorW(PWSTR pName, PWSTR pEnvironment, PWSTR pPrintProviderName) 143 { 144 DWORD dwErrorCode; 145 146 TRACE("DeletePrintProvidorW(%S, %S, %S)\n", pName, pEnvironment, pPrintProviderName); 147 148 RpcTryExcept 149 { 150 dwErrorCode = _RpcDeletePrintProvidor( pName, pEnvironment, pPrintProviderName ); 151 } 152 RpcExcept(EXCEPTION_EXECUTE_HANDLER) 153 { 154 dwErrorCode = RpcExceptionCode(); 155 ERR("_RpcEnumPorts failed with exception code %lu!\n", dwErrorCode); 156 } 157 RpcEndExcept; 158 159 SetLastError(dwErrorCode); 160 return (dwErrorCode == ERROR_SUCCESS); 161 } 162