r5672: Use switch_type() and the token storage mechanism for unions:
[samba.git] / source4 / librpc / ndr / ndr.c
index 6e0300146a21e4e37a24a09c2beb31c4f4c1d9a0..2e350aa0da7e72a880ecc17c2d63f40fa77d5c3f 100644 (file)
@@ -432,7 +432,7 @@ NTSTATUS ndr_push_error(struct ndr_push *ndr, enum ndr_err_code err, const char
   handle subcontext buffers, which in midl land are user-marshalled, but
   we use magic in pidl to make them easier to cope with
 */
-static NTSTATUS ndr_pull_subcontext_header(struct ndr_pull *ndr, 
+NTSTATUS ndr_pull_subcontext_header(struct ndr_pull *ndr, 
                                           size_t sub_size,
                                           struct ndr_pull *ndr2)
 {
@@ -465,62 +465,10 @@ static NTSTATUS ndr_pull_subcontext_header(struct ndr_pull *ndr,
        return NT_STATUS_OK;
 }
 
-/*
-  handle subcontext buffers, which in midl land are user-marshalled, but
-  we use magic in pidl to make them easier to cope with
-*/
-NTSTATUS ndr_pull_subcontext_fn(struct ndr_pull *ndr, size_t sub_size, 
-                               void *base, ndr_pull_fn_t fn)
-{
-       struct ndr_pull *ndr2;
-       NDR_ALLOC(ndr, ndr2);
-       NDR_CHECK(ndr_pull_subcontext_header(ndr, sub_size, ndr2));
-       NDR_CHECK(fn(ndr2, base));
-       if (sub_size) {
-               NDR_CHECK(ndr_pull_advance(ndr, ndr2->data_size));
-       } else {
-               NDR_CHECK(ndr_pull_advance(ndr, ndr2->offset));
-       }
-       return NT_STATUS_OK;
-}
-
-
-NTSTATUS ndr_pull_subcontext_flags_fn(struct ndr_pull *ndr, size_t sub_size,
-                                     void *base, ndr_pull_flags_fn_t fn)
-{
-       struct ndr_pull *ndr2;
-       NDR_ALLOC(ndr, ndr2);
-       NDR_CHECK(ndr_pull_subcontext_header(ndr, sub_size, ndr2));
-       NDR_CHECK(fn(ndr2, NDR_SCALARS|NDR_BUFFERS, base));
-       if (sub_size) {
-               NDR_CHECK(ndr_pull_advance(ndr, ndr2->data_size));
-       } else {
-               NDR_CHECK(ndr_pull_advance(ndr, ndr2->offset));
-       }
-       return NT_STATUS_OK;
-}
-
-NTSTATUS ndr_pull_subcontext_union_fn(struct ndr_pull *ndr, size_t sub_size,
-                                     uint32_t level, void *base, ndr_pull_union_fn_t fn)
-{
-       struct ndr_pull *ndr2;
-
-       NDR_ALLOC(ndr, ndr2);
-       NDR_CHECK(ndr_pull_subcontext_header(ndr, sub_size, ndr2));
-       NDR_CHECK(fn(ndr2, NDR_SCALARS|NDR_BUFFERS, level, base));
-       if (sub_size) {
-               NDR_CHECK(ndr_pull_advance(ndr, ndr2->data_size));
-       } else {
-               NDR_CHECK(ndr_pull_advance(ndr, ndr2->offset));
-       }
-       return NT_STATUS_OK;
-}
-
-
 /*
   push a subcontext header 
 */
-static NTSTATUS ndr_push_subcontext_header(struct ndr_push *ndr, 
+NTSTATUS ndr_push_subcontext_header(struct ndr_push *ndr, 
                                           size_t sub_size,
                                           struct ndr_push *ndr2)
 {
@@ -543,62 +491,6 @@ static NTSTATUS ndr_push_subcontext_header(struct ndr_push *ndr,
        return NT_STATUS_OK;
 }
 
-/*
-  handle subcontext buffers, which in midl land are user-marshalled, but
-  we use magic in pidl to make them easier to cope with
-*/
-NTSTATUS ndr_push_subcontext_fn(struct ndr_push *ndr, size_t sub_size, 
-                               void *base, ndr_push_fn_t fn)
-{
-       struct ndr_push *ndr2;
-
-       ndr2 = ndr_push_init_ctx(ndr);
-       if (!ndr2) return NT_STATUS_NO_MEMORY;
-
-       ndr2->flags = ndr->flags;
-       NDR_CHECK(fn(ndr2, base));
-       NDR_CHECK(ndr_push_subcontext_header(ndr, sub_size, ndr2));
-       NDR_CHECK(ndr_push_bytes(ndr, ndr2->data, ndr2->offset));
-       return NT_STATUS_OK;
-}
-
-/*
-  handle subcontext buffers for function that take a flags arg
-*/
-NTSTATUS ndr_push_subcontext_flags_fn(struct ndr_push *ndr, size_t sub_size,
-                                     void *base, ndr_push_flags_fn_t fn)
-{
-       struct ndr_push *ndr2;
-
-       ndr2 = ndr_push_init_ctx(ndr);
-       if (!ndr2) return NT_STATUS_NO_MEMORY;
-
-       ndr2->flags = ndr->flags;
-       NDR_CHECK(fn(ndr2, NDR_SCALARS|NDR_BUFFERS, base));
-       NDR_CHECK(ndr_push_subcontext_header(ndr, sub_size, ndr2));
-       NDR_CHECK(ndr_push_bytes(ndr, ndr2->data, ndr2->offset));
-       return NT_STATUS_OK;
-}
-
-/*
-  handle subcontext buffers for function that take a union
-*/
-NTSTATUS ndr_push_subcontext_union_fn(struct ndr_push *ndr, size_t sub_size,
-                                     uint32_t level, void *base, ndr_push_union_fn_t fn)
-{
-       struct ndr_push *ndr2;
-
-       ndr2 = ndr_push_init_ctx(ndr);
-       if (!ndr2) return NT_STATUS_NO_MEMORY;
-
-       ndr2->flags = ndr->flags;
-       NDR_CHECK(fn(ndr2, NDR_SCALARS|NDR_BUFFERS, level, base));
-       NDR_CHECK(ndr_push_subcontext_header(ndr, sub_size, ndr2));
-       NDR_CHECK(ndr_push_bytes(ndr, ndr2->data, ndr2->offset));
-       return NT_STATUS_OK;
-}
-
-
 /*
   mark the start of a structure
 */
@@ -749,11 +641,37 @@ NTSTATUS ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t length)
        return NT_STATUS_OK;
 }
 
+/*
+  store a switch value
+ */
+NTSTATUS ndr_push_set_switch_value(struct ndr_push *ndr, void *p, uint32_t val)
+{
+       return ndr_token_store(ndr, &ndr->switch_list, p, val);
+}
+
+NTSTATUS ndr_pull_set_switch_value(struct ndr_pull *ndr, void *p, uint32_t val)
+{
+       return ndr_token_store(ndr, &ndr->switch_list, p, val);
+}
+
+/*
+  retrieve a switch value
+ */
+uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, void *p)
+{
+       return ndr_token_peek(&ndr->switch_list, p);
+}
+
+uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, void *p)
+{
+       return ndr_token_peek(&ndr->switch_list, p);
+}
+
 /*
   pull a relative object - stage1
   called during SCALARS processing
 */
-NTSTATUS ndr_pull_relative1(struct ndr_pull *ndr, const void *p, uint32_t rel_offset)
+NTSTATUS ndr_pull_relative_ptr1(struct ndr_pull *ndr, const void *p, uint32_t rel_offset)
 {
        if (ndr->flags & LIBNDR_FLAG_RELATIVE_CURRENT) {
                return ndr_token_store(ndr, &ndr->relative_list, p, 
@@ -767,7 +685,7 @@ NTSTATUS ndr_pull_relative1(struct ndr_pull *ndr, const void *p, uint32_t rel_of
   pull a relative object - stage2
   called during BUFFERS processing
 */
-NTSTATUS ndr_pull_relative2(struct ndr_pull *ndr, const void *p)
+NTSTATUS ndr_pull_relative_ptr2(struct ndr_pull *ndr, const void *p)
 {
        uint32_t rel_offset;
        NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, p, &rel_offset));
@@ -778,7 +696,7 @@ NTSTATUS ndr_pull_relative2(struct ndr_pull *ndr, const void *p)
   push a relative object - stage1
   this is called during SCALARS processing
 */
-NTSTATUS ndr_push_relative1(struct ndr_push *ndr, const void *p)
+NTSTATUS ndr_push_relative_ptr1(struct ndr_push *ndr, const void *p)
 {
        if (p == NULL) {
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
@@ -793,7 +711,7 @@ NTSTATUS ndr_push_relative1(struct ndr_push *ndr, const void *p)
   push a relative object - stage2
   this is called during buffers processing
 */
-NTSTATUS ndr_push_relative2(struct ndr_push *ndr, const void *p)
+NTSTATUS ndr_push_relative_ptr2(struct ndr_push *ndr, const void *p)
 {
        struct ndr_push_save save;
        if (p == NULL) {