drsuapi.idl: use hand written push functions for the compressed blobs
authorStefan Metzmacher <metze@samba.org>
Wed, 20 Aug 2008 19:53:21 +0000 (21:53 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 21 Aug 2008 10:48:48 +0000 (12:48 +0200)
This isn't really the final solution, as we compress the data twice,
but it works.

metze
(This used to be commit 6da1d41173a7b82412fcebdd751eade51cf82b2a)

source4/librpc/idl/drsuapi.idl
source4/librpc/ndr/ndr_drsuapi.c

index b929bb0d58c45e30784106a9ebbe490916354dd4..cc76599be67a198f02a3661a724e992976d22b0f 100644 (file)
@@ -617,15 +617,15 @@ interface drsuapi
                WERROR drs_error;
        } drsuapi_DsGetNCChangesCtr6;
 
-       typedef struct {
+       typedef [public] struct {
                [subcontext(0xFFFFFC01)] drsuapi_DsGetNCChangesCtr1 ctr1;
        } drsuapi_DsGetNCChangesCtr1TS;
 
-       typedef struct {
+       typedef [public] struct {
                [subcontext(0xFFFFFC01)] drsuapi_DsGetNCChangesCtr6 ctr6;
        } drsuapi_DsGetNCChangesCtr6TS;
 
-       typedef struct {
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
                [subcontext(4),subcontext_size(compressed_length),
@@ -633,7 +633,7 @@ interface drsuapi
                 drsuapi_DsGetNCChangesCtr1TS *ts;
        } drsuapi_DsGetNCChangesMSZIPCtr1;
 
-       typedef struct {
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
                [subcontext(4),subcontext_size(compressed_length),
@@ -641,7 +641,7 @@ interface drsuapi
                 drsuapi_DsGetNCChangesCtr6TS *ts;
        } drsuapi_DsGetNCChangesMSZIPCtr6;
 
-       typedef struct {
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
                [subcontext(4),subcontext_size(compressed_length),
@@ -649,7 +649,7 @@ interface drsuapi
                 drsuapi_DsGetNCChangesCtr1TS *ts;
        } drsuapi_DsGetNCChangesXPRESSCtr1;
 
-       typedef struct {
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
                [subcontext(4),subcontext_size(compressed_length),
index 1b6be9ed8e2b518a61b328a879f682cbea840c14..e77ab54071eae0f3511d51741c06400e97b9660b 100644 (file)
@@ -24,6 +24,7 @@
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "lib/util/asn1.h"
+#include "librpc/ndr/ndr_compression.h"
 
 void ndr_print_drsuapi_DsReplicaObjectListItem(struct ndr_print *ndr, const char *name, 
                                               const struct drsuapi_DsReplicaObjectListItem *r)
@@ -176,3 +177,175 @@ size_t ndr_size_drsuapi_DsReplicaOID_oid(const char *oid, int flags)
        data_blob_free(&_blob);
        return ret;
 }
+
+enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr1(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesMSZIPCtr1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               uint32_t decompressed_length = 0;
+               uint32_t compressed_length = 0;
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       decompressed_length = _ndr_ts_compressed->offset;
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                               }
+                               compressed_length = _ndr_ts->offset;
+                               talloc_free(_ndr_ts);
+                       }
+               }
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                               }
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
+                       }
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesMSZIPCtr6(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesMSZIPCtr6 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               uint32_t decompressed_length = 0;
+               uint32_t compressed_length = 0;
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       decompressed_length = _ndr_ts_compressed->offset;
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                               }
+                               compressed_length = _ndr_ts->offset;
+                               talloc_free(_ndr_ts);
+                       }
+               }
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_MSZIP, -1));
+                               }
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
+                       }
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr1(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesXPRESSCtr1 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               uint32_t decompressed_length = 0;
+               uint32_t compressed_length = 0;
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       decompressed_length = _ndr_ts_compressed->offset;
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                               }
+                               compressed_length = _ndr_ts->offset;
+                               talloc_free(_ndr_ts);
+                       }
+               }
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr1TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                               }
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
+                       }
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+enum ndr_err_code ndr_push_drsuapi_DsGetNCChangesXPRESSCtr6(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_DsGetNCChangesXPRESSCtr6 *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               uint32_t decompressed_length = 0;
+               uint32_t compressed_length = 0;
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       decompressed_length = _ndr_ts_compressed->offset;
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                               }
+                               compressed_length = _ndr_ts->offset;
+                               talloc_free(_ndr_ts);
+                       }
+               }
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, decompressed_length));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, compressed_length));
+               NDR_CHECK(ndr_push_unique_ptr(ndr, r->ts));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               if (r->ts) {
+                       {
+                               struct ndr_push *_ndr_ts;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_ts, 4, -1));
+                               {
+                                       struct ndr_push *_ndr_ts_compressed;
+                                       NDR_CHECK(ndr_push_compression_start(_ndr_ts, &_ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                                       NDR_CHECK(ndr_push_drsuapi_DsGetNCChangesCtr6TS(_ndr_ts_compressed, NDR_SCALARS|NDR_BUFFERS, r->ts));
+                                       NDR_CHECK(ndr_push_compression_end(_ndr_ts, _ndr_ts_compressed, NDR_COMPRESSION_XPRESS, -1));
+                               }
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_ts, 4, -1));
+                       }
+               }
+       }
+       return NDR_ERR_SUCCESS;
+}