2 Unix SMB/CIFS implementation.
4 routines for marshalling/unmarshalling special ntprinting structures
6 Copyright (C) Guenther Deschner 2010
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "../librpc/gen_ndr/ndr_ntprinting.h"
25 _PUBLIC_ libndr_flags
ndr_ntprinting_string_flags(libndr_flags string_flags
)
27 libndr_flags flags
= LIBNDR_FLAG_STR_NULLTERM
;
29 if (string_flags
& LIBNDR_FLAG_STR_ASCII
) {
30 flags
|= LIBNDR_FLAG_STR_ASCII
;
31 } else if (string_flags
& LIBNDR_FLAG_STR_RAW8
) {
32 flags
|= LIBNDR_FLAG_STR_RAW8
;
34 flags
|= LIBNDR_FLAG_STR_UTF8
;
40 _PUBLIC_
enum ndr_err_code
ndr_pull_ntprinting_printer(struct ndr_pull
*ndr
, ndr_flags_type ndr_flags
, struct ntprinting_printer
*r
)
42 uint32_t _ptr_devmode
;
43 TALLOC_CTX
*_mem_save_devmode_0
;
45 libndr_flags _flags_save_STRUCT
= ndr
->flags
;
46 ndr_set_flags(&ndr
->flags
, LIBNDR_FLAG_NOALIGN
);
47 if (ndr_flags
& NDR_SCALARS
) {
48 NDR_CHECK(ndr_pull_align(ndr
, 5));
49 NDR_CHECK(ndr_pull_ntprinting_printer_info(ndr
, NDR_SCALARS
, &r
->info
));
50 NDR_CHECK(ndr_pull_generic_ptr(ndr
, &_ptr_devmode
));
52 NDR_PULL_ALLOC(ndr
, r
->devmode
);
57 if (ndr_flags
& NDR_BUFFERS
) {
59 _mem_save_devmode_0
= NDR_PULL_GET_MEM_CTX(ndr
);
60 NDR_PULL_SET_MEM_CTX(ndr
, r
->devmode
, 0);
61 r
->devmode
->string_flags
= r
->info
.string_flags
;
62 NDR_CHECK(ndr_pull_ntprinting_devicemode(ndr
, NDR_SCALARS
|NDR_BUFFERS
, r
->devmode
));
63 NDR_PULL_SET_MEM_CTX(ndr
, _mem_save_devmode_0
, 0);
66 if (ndr_flags
& NDR_SCALARS
) {
68 NDR_PULL_ALLOC_N(ndr
, r
->printer_data
, r
->count
);
69 while (ndr
->offset
+ 4 <= ndr
->data_size
) {
71 ptr
= IVAL(ndr
->data
, ndr
->offset
);
73 ndr
->offset
= ndr
->offset
+ 4;
76 r
->printer_data
= talloc_realloc(ndr
, r
->printer_data
, struct ntprinting_printer_data
, r
->count
+ 1);
77 NDR_ERR_HAVE_NO_MEMORY(r
->printer_data
);
78 r
->printer_data
[r
->count
].string_flags
= r
->info
.string_flags
;
79 NDR_CHECK(ndr_pull_ntprinting_printer_data(ndr
, NDR_SCALARS
, &r
->printer_data
[r
->count
]));
82 NDR_CHECK(ndr_pull_trailer_align(ndr
, 5));
84 ndr
->flags
= _flags_save_STRUCT
;
86 return NDR_ERR_SUCCESS
;