svn commit: samba r6572 - in branches/SAMBA_4_0/source: build/pidl librpc/idl librpc/ndr

metze at samba.org metze at samba.org
Mon May 2 13:37:05 GMT 2005


Author: metze
Date: 2005-05-02 13:37:05 +0000 (Mon, 02 May 2005)
New Revision: 6572

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6572

Log:
add "string_array" as new scalar type for handling SPOOLSS string array's

metze

Modified:
   branches/SAMBA_4_0/source/build/pidl/ndr_header.pm
   branches/SAMBA_4_0/source/build/pidl/typelist.pm
   branches/SAMBA_4_0/source/librpc/idl/idl_types.h
   branches/SAMBA_4_0/source/librpc/idl/spoolss.idl
   branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c


Changeset:
Modified: branches/SAMBA_4_0/source/build/pidl/ndr_header.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/ndr_header.pm	2005-05-02 12:34:44 UTC (rev 6571)
+++ branches/SAMBA_4_0/source/build/pidl/ndr_header.pm	2005-05-02 13:37:05 UTC (rev 6572)
@@ -60,7 +60,7 @@
     pidl tabs();
     HeaderType($element, $element->{TYPE}, "");
     pidl " ";
-    if ($element->{POINTERS} && $element->{TYPE} ne "string") {
+    if ($element->{POINTERS} && not $element->{TYPE} =~ "string") {
 	    for (my($i)=$element->{POINTERS}; $i > 0; $i--) {
 		    pidl "*";
 	    }

Modified: branches/SAMBA_4_0/source/build/pidl/typelist.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/typelist.pm	2005-05-02 12:34:44 UTC (rev 6571)
+++ branches/SAMBA_4_0/source/build/pidl/typelist.pm	2005-05-02 13:37:05 UTC (rev 6572)
@@ -86,6 +86,10 @@
 				C_TYPE		=> "const char *",
 				NDR_ALIGN	=> 4 #???
 			},
+	"string_array"	=> {
+				C_TYPE		=> "const char **",
+				NDR_ALIGN	=> 4 #???
+			},
 
 	# time types
 	"time_t"	=> {

Modified: branches/SAMBA_4_0/source/librpc/idl/idl_types.h
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/idl_types.h	2005-05-02 12:34:44 UTC (rev 6571)
+++ branches/SAMBA_4_0/source/librpc/idl/idl_types.h	2005-05-02 13:37:05 UTC (rev 6572)
@@ -81,6 +81,11 @@
 */
 #define utf8string	[flag(STR_UTF8|STR_NULLTERM)] string
 
+/*
+  a null terminated UCS2 string
+*/
+#define nstring_array	[flag(STR_NULLTERM)] string_array
+
 #define NDR_NOALIGN       LIBNDR_FLAG_NOALIGN
 #define NDR_REMAINING     LIBNDR_FLAG_REMAINING
 #define NDR_ALIGN2        LIBNDR_FLAG_ALIGN2

Modified: branches/SAMBA_4_0/source/librpc/idl/spoolss.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/spoolss.idl	2005-05-02 12:34:44 UTC (rev 6571)
+++ branches/SAMBA_4_0/source/librpc/idl/spoolss.idl	2005-05-02 13:37:05 UTC (rev 6572)
@@ -409,7 +409,7 @@
 		[relative] nstring *data_file;
 		[relative] nstring *config_file;
 		[relative] nstring *help_file;
-		[relative] nstring *dependent_files; /* array */
+		[relative] nstring_array *dependent_files;
 		[relative] nstring *monitor_name;
 		[relative] nstring *default_datatype;
 	} spoolss_DriverInfo3;
@@ -422,10 +422,10 @@
 		[relative] nstring *data_file;
 		[relative] nstring *config_file;
 		[relative] nstring *help_file;
-		[relative] nstring *dependent_files; /* array */
+		[relative] nstring_array *dependent_files;
 		[relative] nstring *monitor_name;
 		[relative] nstring *default_datatype;
-		[relative] nstring *previous_names; /* array */
+		[relative] nstring_array *previous_names;
 	} spoolss_DriverInfo4;
 
 	typedef struct {
@@ -448,10 +448,10 @@
 		[relative] nstring *data_file;
 		[relative] nstring *config_file;
 		[relative] nstring *help_file;
-		[relative] nstring *dependent_files; /* array */
+		[relative] nstring_array *dependent_files;
 		[relative] nstring *monitor_name;
 		[relative] nstring *default_datatype;
-		[relative] nstring *previous_names; /* array */
+		[relative] nstring_array *previous_names;
 		NTTIME driver_data;
 		hyper driver_version;
 		[relative] nstring *manufacturer_name;

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-05-02 12:34:44 UTC (rev 6571)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-05-02 13:37:05 UTC (rev 6572)
@@ -497,3 +497,75 @@
 	if(!(*string)) return ret;
 	return ret+strlen(*string)+1;
 }
+
+/*
+  pull a general string array from the wire
+*/
+NTSTATUS ndr_pull_string_array(struct ndr_pull *ndr, int ndr_flags, const char ***_a)
+{
+	const char **a = *_a;
+	uint32_t count;
+
+	if (!(ndr_flags & NDR_SCALARS)) {
+		return NT_STATUS_OK;
+	}
+
+	for (count = 0;; count++) {
+		const char *s = NULL;
+		a = talloc_realloc(ndr, a, const char *, count + 2);
+		NT_STATUS_HAVE_NO_MEMORY(a);
+		a[count]   = NULL;
+		a[count+1]   = NULL;
+
+		NDR_CHECK(ndr_pull_string(ndr, ndr_flags, &s));
+		if (strcmp("", s)==0) {
+			a[count] = NULL;
+			break;
+		} else {
+			a[count] = s;
+		}
+	}
+
+	*_a =a;
+	return NT_STATUS_OK;
+}
+
+/*
+  push a general string array onto the wire
+*/
+NTSTATUS ndr_push_string_array(struct ndr_push *ndr, int ndr_flags, const char **a)
+{
+	uint32_t count;
+
+	if (!(ndr_flags & NDR_SCALARS)) {
+		return NT_STATUS_OK;
+	}
+
+	for (count = 0; a && a[count]; count++) {
+		NDR_CHECK(ndr_push_string(ndr, ndr_flags, a[count]));
+	}
+
+	NDR_CHECK(ndr_push_string(ndr, ndr_flags, ""));
+
+	return NT_STATUS_OK;
+}
+
+void ndr_print_string_array(struct ndr_print *ndr, const char *name, const char **a)
+{
+	uint32_t count;
+	uint32_t i;
+
+	for (count = 0; a && a[count]; count++) {}
+
+	ndr->print(ndr, "%s: ARRAY(%d)", name, count);
+	ndr->depth++;
+	for (i=0;i<count;i++) {
+		char *idx=NULL;
+		asprintf(&idx, "[%d]", i);
+		if (idx) {
+			ndr_print_string(ndr, idx, a[i]);
+			free(idx);
+		}
+	}
+	ndr->depth--;
+}



More information about the samba-cvs mailing list