The Backdoor Initializer in C

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





babel-1.4.0
users_guide Last Modified 2008-10-16

http://www.llnl.gov/CASC/components
components@llnl.gov