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;
}