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--; +}
