The branch, master has been updated via a319eb9... testprogs: add test_PrinterDataW. via 55946dd... testprogs: use dump_data in dump_printer_data. via 74ba0b7... testprogs: add print_printer_dataw and dump_data to printlib. via 66b4463... testprogs: add some multibyte versions of PrinterData calls. from 6384f45... s3: Rerun genmsg after adding more strings.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit a319eb9700bb6ae8aa217877181eaa37268e1c3b Author: Günther Deschner <g...@samba.org> Date: Thu Mar 4 01:35:33 2010 +0100 testprogs: add test_PrinterDataW. Guenther commit 55946ddd1db070cc94f8208aaf8f0f10eeef30b6 Author: Günther Deschner <g...@samba.org> Date: Thu Mar 4 01:33:06 2010 +0100 testprogs: use dump_data in dump_printer_data. Guenther commit 74ba0b71891ce180079cc801e9fe11b4ea268e84 Author: Günther Deschner <g...@samba.org> Date: Thu Mar 4 01:31:30 2010 +0100 testprogs: add print_printer_dataw and dump_data to printlib. Guenther commit 66b4463fc1a8c9aa0caf12765c4899ee0058a2b3 Author: Günther Deschner <g...@samba.org> Date: Thu Mar 4 01:29:16 2010 +0100 testprogs: add some multibyte versions of PrinterData calls. Guenther ----------------------------------------------------------------------- Summary of changes: testprogs/win32/spoolss/printlib.c | 120 ++++++++++++++---- testprogs/win32/spoolss/printlib_proto.h | 1 + testprogs/win32/spoolss/spoolss.c | 211 ++++++++++++++++++++++++++++++ 3 files changed, 309 insertions(+), 23 deletions(-) Changeset truncated at 500 lines: diff --git a/testprogs/win32/spoolss/printlib.c b/testprogs/win32/spoolss/printlib.c index f3541c8..829ac40 100644 --- a/testprogs/win32/spoolss/printlib.c +++ b/testprogs/win32/spoolss/printlib.c @@ -24,6 +24,10 @@ #include <assert.h> #include <sddl.h> +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + void print_devmode(DEVMODE *pDevModeIn) { if (pDevModeIn == NULL) { @@ -1158,35 +1162,75 @@ LPSTR reg_type_str(DWORD type) } } -void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffer, DWORD type) +void print_asc(const BYTE *buf, DWORD len) { - DWORD i = 0; - LPSTR p = NULL; - - if (keyname) { - printf("\tKey Name:\t%s\n", keyname); + int i; + for (i=0; i<len; i++) { + printf("%c", isprint(buf[i])?buf[i]:'.'); } +} - printf("\tValue Name:\t%s\n", valuename); - printf("\tSize:\t\t0x%x (%d)\n", size, size); - printf("\tType:\t\t%s\n", reg_type_str(type)); +static void dump_data(const BYTE *buf, int len) +{ + int i=0; + static const BYTE empty[16] = { 0, }; - if (buffer == NULL || size == 0) { - return; + if (len<=0) return; + + for (i=0; i<len;) { + + if (i%16 == 0) { + if ((i > 0) && + (len > i+16) && + (memcmp(&buf[i], &empty, 16) == 0)) + { + i +=16; + continue; + } + + if (i<len) { + printf("[%04X] ",i); + } + } + + printf("%02x ", buf[i]); + i++; + + if (i%8 == 0) printf(" "); + if (i%16 == 0) { + print_asc(&buf[i-16],8); printf(" "); + print_asc(&buf[i-8],8); printf("\n"); + } + } + + if (i%16) { + int n; + n = 16 - (i%16); + printf(" "); + if (n>8) printf(" "); + while (n--) printf(" "); + n = MIN(8,i%16); + print_asc(&buf[i-(i%16)],n); printf( " " ); + n = (i%16) - n; + if (n>0) print_asc(&buf[i-n],n); + printf("\n"); } +} + +static void dump_printer_data(DWORD size, LPBYTE buffer, DWORD type) +{ + DWORD i = 0; + LPSTR p = NULL; switch (type) { case REG_SZ: - printf("\t\t"); - for (i=0; i < size; i++) { - printf("%c", buffer[i]); - } - printf("\n"); + dump_data(buffer, size); break; case REG_MULTI_SZ: + dump_data(buffer, size); p = (LPSTR)buffer; while (p && *p) { - printf("%s\n", p); + printf("\t\t%s\n", p); for (; *p; p = CharNext(p)) { p = CharNext(p); } @@ -1197,18 +1241,48 @@ void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffe printf("\t\t0x%08x\n", (DWORD)*buffer); break; case REG_BINARY: - for (i=0; i < size; i++) { - printf("\t0x%x", buffer[i]); - if (i%4 == 3) { - printf("\n"); - } - } + dump_data(buffer, size); break; default: break; } } +void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffer, DWORD type) +{ + if (keyname) { + printf("\tKey Name:\t%s\n", keyname); + } + + printf("\tValue Name:\t%s\n", valuename); + printf("\tSize:\t\t0x%x (%d)\n", size, size); + printf("\tType:\t\t%s\n", reg_type_str(type)); + + if (buffer == NULL || size == 0) { + return; + } + + dump_printer_data(size, buffer, type); +} + +void print_printer_dataw(LPCWSTR keyname, LPCWSTR valuename, DWORD size, LPBYTE buffer, DWORD type) +{ + if (keyname) { + printf("\tKey Name:\t%ls\n", keyname); + } + + printf("\tValue Name:\t%ls\n", valuename); + printf("\tSize:\t\t0x%x (%d)\n", size, size); + printf("\tType:\t\t%s\n", reg_type_str(type)); + + if (buffer == NULL || size == 0) { + return; + } + + dump_printer_data(size, buffer, type); +} + + void print_printer_enum_values(PRINTER_ENUM_VALUES *info) { print_printer_data(NULL, info->pValueName, info->cbData, info->pData, info->dwType); diff --git a/testprogs/win32/spoolss/printlib_proto.h b/testprogs/win32/spoolss/printlib_proto.h index 5a43999..8e44d3b 100644 --- a/testprogs/win32/spoolss/printlib_proto.h +++ b/testprogs/win32/spoolss/printlib_proto.h @@ -56,6 +56,7 @@ void print_doc_info_1(PDOC_INFO_1 info); void print_printer_keys(LPSTR buffer); LPSTR reg_type_str(DWORD type); void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffer, DWORD type); +void print_printer_dataw(LPCWSTR keyname, LPCWSTR valuename, DWORD size, LPBYTE buffer, DWORD type); void print_printer_enum_values(PRINTER_ENUM_VALUES *info); #undef _PRINTF_ATTRIBUTE #define _PRINTF_ATTRIBUTE(a1, a2) diff --git a/testprogs/win32/spoolss/spoolss.c b/testprogs/win32/spoolss/spoolss.c index 7417b7f..c4c5017 100644 --- a/testprogs/win32/spoolss/spoolss.c +++ b/testprogs/win32/spoolss/spoolss.c @@ -988,6 +988,7 @@ static BOOL test_OnePrinter(struct torture_context *tctx, ret &= test_EnumPrinterDataEx(tctx, printername, "PrinterDriverData", handle, NULL, NULL); ret &= test_DeviceModes(tctx, printername, handle); ret &= test_PrinterData(tctx, printername, handle); + ret &= test_PrinterDataW(tctx, printername, handle); ret &= test_ClosePrinter(tctx, handle); return ret; @@ -1247,6 +1248,60 @@ static BOOL test_GetPrinterDataEx(struct torture_context *tctx, /**************************************************************************** ****************************************************************************/ +static BOOL test_GetPrinterDataExW(struct torture_context *tctx, + LPSTR servername, + LPCWSTR keyname, + LPCWSTR valuename, + HANDLE handle, + DWORD *type_p, + LPBYTE *buffer_p, + DWORD *size_p) +{ + LPBYTE buffer = NULL; + DWORD needed = 0; + DWORD type; + DWORD err = 0; + char tmp[1024]; + + torture_comment(tctx, "Testing GetPrinterDataExW(%ls - %ls)", keyname, valuename); + + err = GetPrinterDataExW(handle, keyname, valuename, &type, NULL, 0, &needed); + if (err == ERROR_MORE_DATA) { + buffer = (LPBYTE)malloc(needed); + torture_assert(tctx, buffer, "malloc failed"); + err = GetPrinterDataExW(handle, keyname, valuename, &type, buffer, needed, &needed); + } + if (err) { + sprintf(tmp, "GetPrinterDataExW(%ls) failed on [%s] (buffer size = %d), error: %s\n", + valuename, servername, needed, errstr(err)); + torture_fail(tctx, tmp); + } + + if (tctx->print) { + print_printer_dataw(keyname, valuename, needed, buffer, type); + } + + if (type_p) { + *type_p = type; + } + + if (size_p) { + *size_p = needed; + } + + if (buffer_p) { + *buffer_p = buffer; + } else { + free(buffer); + } + + return TRUE; +} + + +/**************************************************************************** +****************************************************************************/ + static BOOL test_DeletePrinterDataEx(struct torture_context *tctx, LPSTR servername, LPSTR keyname, @@ -1271,6 +1326,31 @@ static BOOL test_DeletePrinterDataEx(struct torture_context *tctx, /**************************************************************************** ****************************************************************************/ +static BOOL test_DeletePrinterDataExW(struct torture_context *tctx, + LPSTR servername, + LPCWSTR keyname, + LPCWSTR valuename, + HANDLE handle) +{ + DWORD err = 0; + char tmp[1024]; + + torture_comment(tctx, "Testing DeletePrinterDataExW(%ls - %ls)", keyname, valuename); + + err = DeletePrinterDataExW(handle, keyname, valuename); + if (err) { + sprintf(tmp, "DeletePrinterDataExW(%ls - %ls) failed on [%s], error: %s\n", + keyname, valuename, servername, errstr(err)); + torture_fail(tctx, tmp); + } + + return TRUE; +} + + +/**************************************************************************** +****************************************************************************/ + static BOOL test_DeletePrinterKey(struct torture_context *tctx, LPSTR servername, LPSTR keyname, @@ -1294,6 +1374,29 @@ static BOOL test_DeletePrinterKey(struct torture_context *tctx, /**************************************************************************** ****************************************************************************/ +static BOOL test_DeletePrinterKeyW(struct torture_context *tctx, + LPSTR servername, + LPCWSTR keyname, + HANDLE handle) +{ + DWORD err = 0; + char tmp[1024]; + + torture_comment(tctx, "Testing DeletePrinterKeyW(%ls)", keyname); + + err = DeletePrinterKeyW(handle, keyname); + if (err) { + sprintf(tmp, "DeletePrinterKeyW(%ls) failed on [%s], error: %s\n", + keyname, servername, errstr(err)); + torture_fail(tctx, tmp); + } + + return TRUE; +} + +/**************************************************************************** +****************************************************************************/ + static BOOL test_SetPrinterDataEx(struct torture_context *tctx, LPSTR servername, LPSTR keyname, @@ -1321,6 +1424,34 @@ static BOOL test_SetPrinterDataEx(struct torture_context *tctx, /**************************************************************************** ****************************************************************************/ +static BOOL test_SetPrinterDataExW(struct torture_context *tctx, + LPCSTR servername, + LPCWSTR keyname, + LPCWSTR valuename, + HANDLE handle, + DWORD type, + LPBYTE buffer, + DWORD offered) +{ + DWORD err = 0; + char tmp[1024]; + + torture_comment(tctx, "Testing SetPrinterDataExW(%ls - %ls)", keyname, valuename); + + err = SetPrinterDataExW(handle, keyname, valuename, type, buffer, offered); + if (err) { + sprintf(tmp, "SetPrinterDataExW(%ls) failed on [%s] (buffer size = %d), error: %s\n", + valuename, servername, offered, errstr(err)); + torture_fail(tctx, tmp); + } + + return TRUE; +} + + +/**************************************************************************** +****************************************************************************/ + static BOOL test_PrinterData_Server(struct torture_context *tctx, LPSTR servername, HANDLE handle) @@ -1407,6 +1538,7 @@ static BOOL test_PrinterData(struct torture_context *tctx, break; case REG_DWORD: buffer = malloc(4); + memcpy(buffer, &value, 4); size = 4; break; case REG_SZ: @@ -1449,6 +1581,85 @@ static BOOL test_PrinterData(struct torture_context *tctx, /**************************************************************************** ****************************************************************************/ +static BOOL test_PrinterDataW(struct torture_context *tctx, + LPSTR printername, + HANDLE handle) +{ + char tmp[1024]; + LPCWSTR keyname = L"torture_key"; + LPCWSTR valuename = L"torture_value"; + BOOL ret = TRUE; + DWORD types[] = { + REG_SZ, + REG_DWORD, + REG_BINARY + }; + DWORD value = 12345678; + LPSTR str = "abcdefghijklmnopqrstuvwxzy"; + DWORD t, s; + + for (t=0; t < ARRAY_SIZE(types); t++) { + for (s=0; s < strlen(str); s++) { + + DWORD type, type_ex; + LPBYTE buffer, buffer_ex; + DWORD size, size_ex; + + if (types[t] == REG_DWORD) { + s = 0xffff; + } + + switch (types[t]) { + case REG_BINARY: + buffer = malloc(s); + memcpy(buffer, str, s); + size = s; + break; + case REG_DWORD: + buffer = malloc(4); + memcpy(buffer, &value, 4); + size = 4; + break; + case REG_SZ: + buffer = malloc(s); + memcpy(buffer, str, s); + size = s; + break; + default: + sprintf(tmp, "type %d untested\n", types[t]); + torture_fail(tctx, tmp); + break; + } + + type = types[t]; + + torture_comment(tctx, "Testing PrinterDataW (type: %s, size: 0x%08x)", reg_type_str(type), size); + + torture_assert(tctx, + test_SetPrinterDataExW(tctx, printername, keyname, valuename, handle, type, buffer, size), + "failed to call SetPrinterDataExW"); + torture_assert(tctx, + test_GetPrinterDataExW(tctx, printername, keyname, valuename, handle, &type_ex, &buffer_ex, &size_ex), + "failed to call GetPrinterDataExW"); + + if (!PrinterDataEqual(tctx, type_ex, type, size_ex, size, buffer_ex, buffer)) { + torture_warning(tctx, "GetPrinterDataExW does not return the same info as we set with SetPrinterDataExW"); + ret = FALSE; + } + ret &= test_DeletePrinterDataExW(tctx, printername, keyname, valuename, handle); + ret &= test_DeletePrinterKeyW(tctx, printername, keyname, handle); + + free(buffer); + free(buffer_ex); + } + } + + return ret; +} + +/**************************************************************************** +****************************************************************************/ + const char *get_string_param(const char *str) { const char *p; -- Samba Shared Repository