The branch, master has been updated
       via  01d1aaf63e8170936139a01814211f6567c4b125 (commit)
       via  80a9a41d412aa61877a7497661197fd16ddb4903 (commit)
       via  c46fad3d1bdf1082a695d3df90e55e739e494a5c (commit)
      from  2390ea274bff7a8878a488db0893a393c9d1b51e (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 01d1aaf63e8170936139a01814211f6567c4b125
Author: Günther Deschner <g...@samba.org>
Date:   Wed Feb 25 13:46:08 2009 +0100

    s3-rpcclient: allow to set level in spoolss getform query and display all 
levels.
    
    Guenther

commit 80a9a41d412aa61877a7497661197fd16ddb4903
Author: Günther Deschner <g...@samba.org>
Date:   Wed Feb 25 14:20:40 2009 +0100

    s3: re-run make samba3-idl.
    
    Guenther

commit c46fad3d1bdf1082a695d3df90e55e739e494a5c
Author: Günther Deschner <g...@samba.org>
Date:   Wed Feb 25 13:45:15 2009 +0100

    spoolss: add spoolss_FormInfo2 used by Vista.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 librpc/gen_ndr/ndr_spoolss.c    |  293 +++++++++++++++++++++++++++++++++++++++
 librpc/gen_ndr/ndr_spoolss.h    |    2 +
 librpc/gen_ndr/spoolss.h        |   19 +++
 librpc/idl/spoolss.idl          |   20 +++
 source3/rpcclient/cmd_spoolss.c |   47 ++++++-
 5 files changed, 375 insertions(+), 6 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index fdafa25..25c9dc4 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -12232,6 +12232,275 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo1(struct 
ndr_print *ndr, const char *nam
        ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_spoolss_FormStringType(struct ndr_push *ndr, 
int ndr_flags, uint32_t r)
+{
+       NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_FormStringType(struct ndr_pull *ndr, 
int ndr_flags, uint32_t *r)
+{
+       uint32_t v;
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+       *r = v;
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_FormStringType(struct ndr_print *ndr, const 
char *name, uint32_t r)
+{
+       ndr_print_uint32(ndr, name, r);
+       ndr->depth++;
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), 
"SPOOLSS_FORM_STRING_TYPE_NONE", SPOOLSS_FORM_STRING_TYPE_NONE, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), 
"SPOOLSS_FORM_STRING_TYPE_MUI_DLL", SPOOLSS_FORM_STRING_TYPE_MUI_DLL, r);
+       ndr_print_bitmap_flag(ndr, sizeof(uint32_t), 
"SPOOLSS_FORM_STRING_TYPE_LANG_PAIR", SPOOLSS_FORM_STRING_TYPE_LANG_PAIR, r);
+       ndr->depth--;
+}
+
+static enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int 
ndr_flags, const struct spoolss_FormInfo2 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_spoolss_FormFlags(ndr, NDR_SCALARS, 
r->flags));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->form_name));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_spoolss_FormSize(ndr, NDR_SCALARS, 
&r->size));
+               NDR_CHECK(ndr_push_spoolss_FormArea(ndr, NDR_SCALARS, 
&r->area));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->keyword));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_spoolss_FormStringType(ndr, NDR_SCALARS, 
r->string_type));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->mui_dll));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->ressource_id));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_push_relative_ptr1(ndr, r->display_name));
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->lang_id));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->form_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, 
r->form_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, 
r->form_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->keyword) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, 
r->keyword));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, 
r->keyword));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->mui_dll) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, 
r->mui_dll));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, 
r->mui_dll));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->display_name) {
+                               NDR_CHECK(ndr_push_relative_ptr2(ndr, 
r->display_name));
+                               NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, 
r->display_name));
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int 
ndr_flags, struct spoolss_FormInfo2 *r)
+{
+       uint32_t _ptr_form_name;
+       TALLOC_CTX *_mem_save_form_name_0;
+       uint32_t _ptr_keyword;
+       TALLOC_CTX *_mem_save_keyword_0;
+       uint32_t _ptr_mui_dll;
+       TALLOC_CTX *_mem_save_mui_dll_0;
+       uint32_t _ptr_display_name;
+       TALLOC_CTX *_mem_save_display_name_0;
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_spoolss_FormFlags(ndr, NDR_SCALARS, 
&r->flags));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_form_name));
+                       if (_ptr_form_name) {
+                               NDR_PULL_ALLOC(ndr, r->form_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, 
r->form_name, _ptr_form_name));
+                       } else {
+                               r->form_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_spoolss_FormSize(ndr, NDR_SCALARS, 
&r->size));
+               NDR_CHECK(ndr_pull_spoolss_FormArea(ndr, NDR_SCALARS, 
&r->area));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_keyword));
+                       if (_ptr_keyword) {
+                               NDR_PULL_ALLOC(ndr, r->keyword);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, 
r->keyword, _ptr_keyword));
+                       } else {
+                               r->keyword = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_spoolss_FormStringType(ndr, NDR_SCALARS, 
&r->string_type));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_mui_dll));
+                       if (_ptr_mui_dll) {
+                               NDR_PULL_ALLOC(ndr, r->mui_dll);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, 
r->mui_dll, _ptr_mui_dll));
+                       } else {
+                               r->mui_dll = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->ressource_id));
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       NDR_CHECK(ndr_pull_generic_ptr(ndr, 
&_ptr_display_name));
+                       if (_ptr_display_name) {
+                               NDR_PULL_ALLOC(ndr, r->display_name);
+                               NDR_CHECK(ndr_pull_relative_ptr1(ndr, 
r->display_name, _ptr_display_name));
+                       } else {
+                               r->display_name = NULL;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->lang_id));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->form_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 
r->form_name));
+                               _mem_save_form_name_0 = 
NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->form_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, 
&r->form_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, 
_mem_save_form_name_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->keyword) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 
r->keyword));
+                               _mem_save_keyword_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->keyword, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, 
&r->keyword));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_keyword_0, 
0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->mui_dll) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 
r->mui_dll));
+                               _mem_save_mui_dll_0 = NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->mui_dll, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, 
&r->mui_dll));
+                               NDR_PULL_SET_MEM_CTX(ndr, _mem_save_mui_dll_0, 
0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+               {
+                       uint32_t _flags_save_string = ndr->flags;
+                       ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+                       if (r->display_name) {
+                               uint32_t _relative_save_offset;
+                               _relative_save_offset = ndr->offset;
+                               NDR_CHECK(ndr_pull_relative_ptr2(ndr, 
r->display_name));
+                               _mem_save_display_name_0 = 
NDR_PULL_GET_MEM_CTX(ndr);
+                               NDR_PULL_SET_MEM_CTX(ndr, r->display_name, 0);
+                               NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, 
&r->display_name));
+                               NDR_PULL_SET_MEM_CTX(ndr, 
_mem_save_display_name_0, 0);
+                               ndr->offset = _relative_save_offset;
+                       }
+                       ndr->flags = _flags_save_string;
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_spoolss_FormInfo2(struct ndr_print *ndr, const char 
*name, const struct spoolss_FormInfo2 *r)
+{
+       ndr_print_struct(ndr, name, "spoolss_FormInfo2");
+       ndr->depth++;
+       ndr_print_spoolss_FormFlags(ndr, "flags", r->flags);
+       ndr_print_ptr(ndr, "form_name", r->form_name);
+       ndr->depth++;
+       if (r->form_name) {
+               ndr_print_string(ndr, "form_name", r->form_name);
+       }
+       ndr->depth--;
+       ndr_print_spoolss_FormSize(ndr, "size", &r->size);
+       ndr_print_spoolss_FormArea(ndr, "area", &r->area);
+       ndr_print_ptr(ndr, "keyword", r->keyword);
+       ndr->depth++;
+       if (r->keyword) {
+               ndr_print_string(ndr, "keyword", r->keyword);
+       }
+       ndr->depth--;
+       ndr_print_spoolss_FormStringType(ndr, "string_type", r->string_type);
+       ndr_print_ptr(ndr, "mui_dll", r->mui_dll);
+       ndr->depth++;
+       if (r->mui_dll) {
+               ndr_print_string(ndr, "mui_dll", r->mui_dll);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "ressource_id", r->ressource_id);
+       ndr_print_ptr(ndr, "display_name", r->display_name);
+       ndr->depth++;
+       if (r->display_name) {
+               ndr_print_string(ndr, "display_name", r->display_name);
+       }
+       ndr->depth--;
+       ndr_print_uint32(ndr, "lang_id", r->lang_id);
+       ndr->depth--;
+}
+
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int 
ndr_flags, const union spoolss_FormInfo *r)
 {
        uint32_t _save_relative_base_offset = 
ndr_push_get_relative_base_offset(ndr);
@@ -12244,6 +12513,12 @@ _PUBLIC_ enum ndr_err_code 
ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int n
                                NDR_CHECK(ndr_push_spoolss_FormInfo1(ndr, 
NDR_SCALARS, &r->info1));
                        break; }
 
+                       case 2: {
+                               NDR_CHECK(ndr_push_align(ndr, 4));
+                               
NDR_CHECK(ndr_push_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_push_spoolss_FormInfo2(ndr, 
NDR_SCALARS, &r->info2));
+                       break; }
+
                        default: {
                        break; }
 
@@ -12257,6 +12532,10 @@ _PUBLIC_ enum ndr_err_code 
ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int n
                                NDR_CHECK(ndr_push_spoolss_FormInfo1(ndr, 
NDR_BUFFERS, &r->info1));
                        break;
 
+                       case 2:
+                               NDR_CHECK(ndr_push_spoolss_FormInfo2(ndr, 
NDR_BUFFERS, &r->info2));
+                       break;
+
                        default:
                        break;
 
@@ -12279,6 +12558,12 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int n
                                NDR_CHECK(ndr_pull_spoolss_FormInfo1(ndr, 
NDR_SCALARS, &r->info1));
                        break; }
 
+                       case 2: {
+                               NDR_CHECK(ndr_pull_align(ndr, 4));
+                               
NDR_CHECK(ndr_pull_setup_relative_base_offset1(ndr, r, ndr->offset));
+                               NDR_CHECK(ndr_pull_spoolss_FormInfo2(ndr, 
NDR_SCALARS, &r->info2));
+                       break; }
+
                        default: {
                        break; }
 
@@ -12291,6 +12576,10 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int n
                                NDR_CHECK(ndr_pull_spoolss_FormInfo1(ndr, 
NDR_BUFFERS, &r->info1));
                        break;
 
+                       case 2:
+                               NDR_CHECK(ndr_pull_spoolss_FormInfo2(ndr, 
NDR_BUFFERS, &r->info2));
+                       break;
+
                        default:
                        break;
 
@@ -12310,6 +12599,10 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo(struct 
ndr_print *ndr, const char *name
                        ndr_print_spoolss_FormInfo1(ndr, "info1", &r->info1);
                break;
 
+               case 2:
+                       ndr_print_spoolss_FormInfo2(ndr, "info2", &r->info2);
+               break;
+
                default:
                break;
 
diff --git a/librpc/gen_ndr/ndr_spoolss.h b/librpc/gen_ndr/ndr_spoolss.h
index 5b32d51..5ecadc0 100644
--- a/librpc/gen_ndr/ndr_spoolss.h
+++ b/librpc/gen_ndr/ndr_spoolss.h
@@ -344,6 +344,8 @@ void ndr_print_spoolss_FormFlags(struct ndr_print *ndr, 
const char *name, enum s
 void ndr_print_spoolss_FormSize(struct ndr_print *ndr, const char *name, const 
struct spoolss_FormSize *r);
 void ndr_print_spoolss_FormArea(struct ndr_print *ndr, const char *name, const 
struct spoolss_FormArea *r);
 void ndr_print_spoolss_FormInfo1(struct ndr_print *ndr, const char *name, 
const struct spoolss_FormInfo1 *r);
+void ndr_print_spoolss_FormStringType(struct ndr_print *ndr, const char *name, 
uint32_t r);
+void ndr_print_spoolss_FormInfo2(struct ndr_print *ndr, const char *name, 
const struct spoolss_FormInfo2 *r);
 enum ndr_err_code ndr_push_spoolss_FormInfo(struct ndr_push *ndr, int 
ndr_flags, const union spoolss_FormInfo *r);
 enum ndr_err_code ndr_pull_spoolss_FormInfo(struct ndr_pull *ndr, int 
ndr_flags, union spoolss_FormInfo *r);
 void ndr_print_spoolss_FormInfo(struct ndr_print *ndr, const char *name, const 
union spoolss_FormInfo *r);
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index ad4554d..ff2eb1b 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -958,8 +958,27 @@ struct spoolss_FormInfo1 {
        struct spoolss_FormArea area;
 };
 
+/* bitmap spoolss_FormStringType */
+#define SPOOLSS_FORM_STRING_TYPE_NONE ( 0x00000001 )
+#define SPOOLSS_FORM_STRING_TYPE_MUI_DLL ( 0x00000002 )
+#define SPOOLSS_FORM_STRING_TYPE_LANG_PAIR ( 0x00000004 )
+
+struct spoolss_FormInfo2 {
+       enum spoolss_FormFlags flags;
+       const char * form_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
+       struct spoolss_FormSize size;
+       struct spoolss_FormArea area;
+       const char * keyword;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
+       uint32_t string_type;
+       const char * mui_dll;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */
+       uint32_t ressource_id;
+       const char * display_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] 
*/
+       uint32_t lang_id;
+};
+
 union spoolss_FormInfo {
        struct spoolss_FormInfo1 info1;/* [case] */
+       struct spoolss_FormInfo2 info2;/* [case(2)] */
 }/* [relative_base,gensize,public,nodiscriminant] */;
 
 struct spoolss_AddFormInfo1 {
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index 3e35399..5359fdf 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -1237,8 +1237,28 @@ import "misc.idl", "security.idl", "winreg.idl";
                spoolss_FormArea area;
        } spoolss_FormInfo1;
 
+       typedef [bitmap32bit] bitmap {
+               SPOOLSS_FORM_STRING_TYPE_NONE           = 0x00000001,
+               SPOOLSS_FORM_STRING_TYPE_MUI_DLL        = 0x00000002,
+               SPOOLSS_FORM_STRING_TYPE_LANG_PAIR      = 0x00000004
+       } spoolss_FormStringType;
+
+       typedef struct {
+               spoolss_FormFlags flags;
+               [relative] nstring *form_name;
+               spoolss_FormSize size;
+               spoolss_FormArea area;
+               [relative] nstring *keyword;
+               spoolss_FormStringType string_type;
+               [relative] nstring *mui_dll;
+               uint32 ressource_id;
+               [relative] nstring *display_name;
+               uint32 lang_id;
+       } spoolss_FormInfo2;
+
        typedef [nodiscriminant,relative_base,public,gensize] union {
                [case(1)] spoolss_FormInfo1 info1;
+               [case(2)] spoolss_FormInfo2 info2;
                [default];
        } spoolss_FormInfo;
 
diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c
index eaee516..51fcaaa 100644
--- a/source3/rpcclient/cmd_spoolss.c
+++ b/source3/rpcclient/cmd_spoolss.c
@@ -1978,6 +1978,28 @@ static void display_form_info1(struct spoolss_FormInfo1 
*r)
 /****************************************************************************
 ****************************************************************************/
 
+static void display_form_info2(struct spoolss_FormInfo2 *r)
+{
+       printf("%s\n" \
+               "\tflag: %s (%d)\n" \
+               "\twidth: %d, length: %d\n" \
+               "\tleft: %d, right: %d, top: %d, bottom: %d\n",
+               r->form_name, get_form_flag(r->flags), r->flags,
+               r->size.width, r->size.height,
+               r->area.left, r->area.right,
+               r->area.top, r->area.bottom);
+       printf("\tkeyword: %s\n", r->keyword);
+       printf("\tstring_type: 0x%08x\n", r->string_type);
+       printf("\tmui_dll: %s\n", r->mui_dll);
+       printf("\tressource_id: 0x%08x\n", r->ressource_id);
+       printf("\tdisplay_name: %s\n", r->display_name);
+       printf("\tlang_id: %d\n", r->lang_id);
+       printf("\n");
+}
+
+/****************************************************************************
+****************************************************************************/
+
 static WERROR cmd_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX 
*mem_ctx,
                                    int argc, const char **argv)
 {
@@ -1989,11 +2011,12 @@ static WERROR cmd_spoolss_getform(struct 
rpc_pipe_client *cli, TALLOC_CTX *mem_c
        uint32_t offered = 0;
        union spoolss_FormInfo info;
        uint32_t needed;
+       uint32_t level = 1;
 
        /* Parse the command arguments */
 
-       if (argc != 3) {
-               printf ("Usage: %s <printer> <formname>\n", argv[0]);
+       if (argc < 3 || argc > 5) {
+               printf ("Usage: %s <printer> <formname> [level]\n", argv[0]);
                return WERR_OK;
         }
 
@@ -2008,24 +2031,28 @@ static WERROR cmd_spoolss_getform(struct 
rpc_pipe_client *cli, TALLOC_CTX *mem_c
        if (!W_ERROR_IS_OK(werror))
                goto done;
 
+       if (argc == 4) {
+               level = atoi(argv[3]);
+       }
+
        /* Get the form */
 
        status = rpccli_spoolss_GetForm(cli, mem_ctx,
                                        &handle,
                                        argv[2],
-                                       1,
+                                       level,
                                        NULL,
                                        offered,
                                        &info,
                                        &needed,
                                        &werror);
        if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
-               buffer = data_blob_talloc(mem_ctx, NULL, needed);
+               buffer = data_blob_talloc_zero(mem_ctx, needed);
                offered = needed;
                status = rpccli_spoolss_GetForm(cli, mem_ctx,
                                                &handle,
                                                argv[2],
-                                               1,
+                                               level,
                                                &buffer,
                                                offered,
                                                &info,
@@ -2037,7 +2064,15 @@ static WERROR cmd_spoolss_getform(struct rpc_pipe_client 
*cli, TALLOC_CTX *mem_c
                return werror;
        }


-- 
Samba Shared Repository

Reply via email to