1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-31 01:48:16 +03:00

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

metze
This commit is contained in:
Stefan Metzmacher 2005-05-02 13:37:05 +00:00 committed by Gerald (Jerry) Carter
parent af16ecb7ac
commit 23b529ee09
5 changed files with 87 additions and 6 deletions

View File

@ -60,7 +60,7 @@ sub HeaderElement($)
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 "*";
}

View File

@ -86,6 +86,10 @@ my $scalars = {
C_TYPE => "const char *",
NDR_ALIGN => 4 #???
},
"string_array" => {
C_TYPE => "const char **",
NDR_ALIGN => 4 #???
},
# time types
"time_t" => {

View File

@ -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

View File

@ -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;

View File

@ -497,3 +497,75 @@ uint32_t ndr_size_string(int ret, const char * const* string, int flags)
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--;
}