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:
parent
af16ecb7ac
commit
23b529ee09
@ -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 "*";
|
||||
}
|
||||
|
@ -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" => {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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--;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user