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