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

jelmer at samba.org jelmer at samba.org
Fri Jun 17 21:40:43 GMT 2005


Author: jelmer
Date: 2005-06-17 21:40:42 +0000 (Fri, 17 Jun 2005)
New Revision: 7702

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

Log:
Implement [charset()] attribute.

Modified:
   branches/SAMBA_4_0/source/build/pidl/TODO
   branches/SAMBA_4_0/source/build/pidl/ndr_header.pm
   branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm
   branches/SAMBA_4_0/source/librpc/idl/echo.idl
   branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c


Changeset:
Modified: branches/SAMBA_4_0/source/build/pidl/TODO
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/TODO	2005-06-17 20:32:33 UTC (rev 7701)
+++ branches/SAMBA_4_0/source/build/pidl/TODO	2005-06-17 21:40:42 UTC (rev 7702)
@@ -1,7 +1,3 @@
-Implement:
-  ndr_parser.pm:
-   - if [charset()] specified, use instead of the for loops (call ndr_pu{ll,sh}_charset()
-
 - True multiple dimension array / strings in arrays support (closely related to 
 	things specified above)
 

Modified: branches/SAMBA_4_0/source/build/pidl/ndr_header.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/ndr_header.pm	2005-06-17 20:32:33 UTC (rev 7701)
+++ branches/SAMBA_4_0/source/build/pidl/ndr_header.pm	2005-06-17 21:40:42 UTC (rev 7702)
@@ -213,7 +213,11 @@
 		return;
 	}
 
-	pidl typelist::mapType($e->{TYPE});
+	if (util::has_property($e, "charset")) {
+		pidl "char";
+	} else {
+		pidl typelist::mapType($e->{TYPE});
+	}
 }
 
 #####################################################################

Modified: branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm	2005-06-17 20:32:33 UTC (rev 7701)
+++ branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm	2005-06-17 21:40:42 UTC (rev 7702)
@@ -550,7 +550,11 @@
 
 				my $nl = Ndr::GetNextLevel($e, $l);
 
-				pidl "NDR_CHECK(ndr_push_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
+				if (util::has_property($e, "charset")) {
+					pidl "NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . typelist::mapType($nl->{DATA_TYPE}) . "), $e->{PROPERTIES}->{charset}));";
+				} else {
+					pidl "NDR_CHECK(ndr_push_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
+				} 
 				return;
 			} 
 		} elsif ($l->{TYPE} eq "SWITCH") {
@@ -688,8 +692,12 @@
 			}
 
 			if (is_scalar_array($e, $l)) {
-				my $nl = Ndr::GetNextLevel($e, $l);
-				pidl "ndr_print_array_$nl->{DATA_TYPE}(ndr, \"$e->{NAME}\", $var_name, $length);";
+				if (util::has_property($e, "charset")) {
+					pidl "ndr_print_string(ndr, \"$e->{NAME}\", $var_name);";
+				} else {
+					my $nl = Ndr::GetNextLevel($e, $l);
+					pidl "ndr_print_array_$nl->{DATA_TYPE}(ndr, \"$e->{NAME}\", $var_name, $length);";
+				} 
 				last;
 			}
 
@@ -844,10 +852,14 @@
 				}
 				my $nl = Ndr::GetNextLevel($e, $l);
 
-				pidl "NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
-				if ($l->{IS_ZERO_TERMINATED}) {
-					# Make sure last element is zero!
-					pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $var_name, ndr_get_array_length(ndr, " . get_pointer_to($var_name) . "), sizeof(*$var_name)));";
+				if (util::has_property($e, "charset")) {
+					pidl "NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . typelist::mapType($nl->{DATA_TYPE}) . "), $e->{PROPERTIES}->{charset}));";
+				} else {
+					pidl "NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
+					if ($l->{IS_ZERO_TERMINATED}) {
+						# Make sure last element is zero!
+						pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $var_name, $length, sizeof(*$var_name)));";
+					}
 				}
 				return;
 			}
@@ -901,7 +913,7 @@
 
 			if ($l->{IS_ZERO_TERMINATED}) {
 				# Make sure last element is zero!
-				pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $var_name, ndr_get_array_length(ndr, " . get_pointer_to($var_name) . "), sizeof(*$var_name)));";
+				pidl "NDR_CHECK(ndr_check_string_terminator($ndr, $var_name, $length, sizeof(*$var_name)));";
 			}
 		}
 
@@ -1867,6 +1879,8 @@
 {
 	my ($e,$l,$ndr,$env,$size) = @_;
 
+	return if (util::has_property($e, "charset"));
+
 	my $var = ParseExpr($e->{NAME}, $env);
 
 	check_null_pointer($size);

Modified: branches/SAMBA_4_0/source/librpc/idl/echo.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/echo.idl	2005-06-17 20:32:33 UTC (rev 7701)
+++ branches/SAMBA_4_0/source/librpc/idl/echo.idl	2005-06-17 21:40:42 UTC (rev 7702)
@@ -34,8 +34,8 @@
 
 	/* test strings */
  	void echo_TestCall (
-		[in]       unistr *s1,
-		[out]      unistr *s2
+		[in,string,charset(CH_UTF16)]       uint16 *s1,
+		[out,string,charset(CH_UTF16)]      uint16 *s2
  		);
 
 

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-06-17 20:32:33 UTC (rev 7701)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-06-17 21:40:42 UTC (rev 7702)
@@ -587,8 +587,10 @@
 	const char *var = _var;
 	uint32_t i;
 
+	var += element_size*(count-1);
+
 	for (i = 0; i < element_size; i++) {
-		 if (var+element_size*(count-1)+i != 0) {
+		 if (var[i] != 0) {
 			return NT_STATUS_UNSUCCESSFUL;
 		 }
 	}
@@ -596,3 +598,37 @@
 	return NT_STATUS_OK;
 
 }
+
+NTSTATUS ndr_pull_charset(struct ndr_pull *ndr, int ndr_flags, char **var, uint32_t length, uint8_t byte_mul, int chset)
+{
+	int ret;
+	NDR_PULL_NEED_BYTES(ndr, length*byte_mul);
+	ret = convert_string_talloc(ndr, chset, CH_UNIX, 
+				    ndr->data+ndr->offset, 
+				    length*byte_mul,
+				    (void **)var);
+	if (ret == -1) {
+		return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
+				      "Bad character conversion");
+	}
+	NDR_CHECK(ndr_pull_advance(ndr, length*byte_mul));
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_push_charset(struct ndr_push *ndr, int ndr_flags, const char *var, uint32_t length, uint8_t byte_mul, int chset)
+{
+	int ret;
+	NDR_PUSH_NEED_BYTES(ndr, byte_mul*length);
+	ret = convert_string(CH_UNIX, chset, 
+			     var, length,
+			     ndr->data+ndr->offset, 
+			     byte_mul*length);
+	if (ret == -1) {
+		return ndr_push_error(ndr, NDR_ERR_CHARCNV, 
+				      "Bad character conversion");
+	}
+	ndr->offset += byte_mul*length;
+
+	return NT_STATUS_OK;
+}



More information about the samba-cvs mailing list