In C, the Backdoor Initializer is used through a new _create like static method, _wrapObj. _wrapObj takes a pointer to the private data to be wrapped (a simple struct defined in wrapper_Data__Impl.h).
from wrapper_Data_Impl.h:
struct wrapper_Data__data { /* DO-NOT-DELETE splicer.begin(wrapper.Data._data) */ char* d_ctortest; char* d_string; int d_int; /* DO-NOT-DELETE splicer.end(wrapper.Data._data) */ };
From wrapper_Data_Impl.c; notice the new constructor ctor2,
which is only called with backdoor initialization.
void impl_wrapper_Data__ctor2( /* in */ wrapper_Data self, /* in */ void* private_data, /* out */ sidl_BaseInterface *_ex) { /* DO-NOT-DELETE splicer.begin(wrapper.Data._ctor2) */ struct wrapper_Data__data *dptr = (struct wrapper_Data__data *) private_data; dptr->d_ctorTest = "ctor was run"; /* DO-NOT-DELETE splicer.end(wrapper.Data._ctor2) */ } void impl_wrapper_Data_setString( /* in */ wrapper_Data self, /* in */ const char* s, /* out */ sidl_BaseInterface *_ex) { *_ex = 0; /* DO-NOT-DELETE splicer.begin(wrapper.Data.setString) */ struct wrapper_Data__data *dptr = wrapper_Data__get_data(self); if (dptr) { dptr->d_string = "Hello World!"; } /* DO-NOT-DELETE splicer.end(wrapper.Data.setString) */ } void impl_wrapper_Data_setInt( /* in */ wrapper_Data self, /* in */ int32_t i, /* out */ sidl_BaseInterface *_ex) { /* DO-NOT-DELETE splicer.begin(wrapper.Data.setInt) */ struct wrapper_Data__data *dptr = wrapper_Data__get_data(self); if (dptr) { dptr->d_int = 3; } /* DO-NOT-DELETE splicer.end(wrapper.Data.setInt) */ }
from the client program wraptest.c: (Note that we must include wrapper_Data_Impl.h)
#include "wrapper_User.h" #include "wrapper_Data.h" #include "wrapper_Data_Impl.h" int main(int argc, char** argv) { sidl_BaseInterface exception = NULL; wrapper_Data data = NULL; wrapper_User user = NULL; struct wrapper_Data__data *d_data = NULL; struct wrapper_Data__data *dptr = NULL; /*Create the data*/ dptr = malloc(sizeof(struct wrapper_Data__data)); /*Wrap the data*/ data = wrapper_Data__wrapObj(dptr, &exception); user = wrapper_User__create(&exception); ASSERT( strcmp(d_data->d_ctortest, "ctor was run") == 0); /* Test the data setting*/ wrapper_User_accept(user, data, &exception); ASSERT( strcmp(d_data->d_string, "Hello World!") == 0); ASSERT( d_data->d_int == 3); return 0; }