/* -*- mode: C; c-file-style: "bsd" -*- */ #include #include "interfaces.h" #include "errors.h" #include "extras.h" #include "exttypes.h" #include "globals.h" #include "idl.h" #include "server.h" #include "types.h" #include "porbit-perl.h" typedef CORBA_ORB CORBA__ORB; typedef CORBA_Object CORBA__Object; typedef CORBA_TypeCode CORBA__TypeCode; typedef ORBit_RootObject CORBA__ORBit__RootObject; typedef PORBitSource * CORBA__ORBit__Source; typedef CORBA_long_long CORBA__LongLong; typedef CORBA_unsigned_long_long CORBA__ULongLong; typedef CORBA_long_double CORBA__LongDouble; typedef PortableServer_POA PortableServer__POA; typedef PortableServer_POAManager PortableServer__POAManager; typedef PortableServer_ObjectId PortableServer__ObjectId; typedef PortableServer_Servant PortableServer__ServantBase; #define DEFINE_EXCEPTION(ev) \ CORBA_Environment ev; \ CORBA_exception_init (&ev); #define CHECK_EXCEPTION(ev) \ if (ev._major != CORBA_NO_EXCEPTION) { \ SV *__sv = porbit_builtin_except (&ev); \ porbit_throw (__sv); \ } #define TRY(expr) \ G_STMT_START { \ DEFINE_EXCEPTION(ev) \ expr; \ CHECK_EXCEPTION(ev) \ } G_STMT_END #define N_ELEMENTS(arr) (sizeof(arr) / sizeof((arr)[0])) /* Constants that we define in CORBA::ORBit namespace */ #define ELEMENT(foo) { #foo, G_ ## foo } static struct { const char *name; int value; } corba_orbit_constants[] = { ELEMENT (IO_IN), ELEMENT (IO_OUT), ELEMENT (IO_PRI), ELEMENT (IO_ERR), ELEMENT (IO_HUP), ELEMENT (IO_NVAL), ELEMENT (PRIORITY_HIGH), ELEMENT (PRIORITY_DEFAULT), ELEMENT (PRIORITY_HIGH_IDLE), ELEMENT (PRIORITY_DEFAULT_IDLE), ELEMENT (PRIORITY_LOW) }; #undef ELEMENT static AV * collect_source_args (SV *sv) { int i; AV *result = newAV(); if (SvRV(sv) && (SvTYPE(SvRV(sv)) == SVt_PVAV)) { AV *av = (AV*)SvRV(sv); for (i = 0; i <= av_len(av); i++) av_push(result, newSVsv(*av_fetch(av, i, 0))); } else { av_push (result, newSVsv(sv)); } return result; } static gboolean timeout_handler (gpointer data) { PORBitSource *source; SV *handler; gboolean result; int i, count; dSP; source = data; /* We keep a reference on source->args while invoking the callback * to handle the case where we source->destroy() is called * during invokation */ SvREFCNT_inc ((SV *) source->args); handler = *av_fetch(source->args, 0, 0); ENTER; SAVETMPS; PUSHMARK(sp); for (i=1;i<=av_len(source->args);i++) XPUSHs(sv_2mortal(newSVsv(*av_fetch(source->args, i, 0)))); PUTBACK; count = perl_call_sv(handler, G_SCALAR); SPAGAIN; if (count != 1) { warn ("handler returned %d items", count); while (count--) (void)POPs; return FALSE; } result = SvTRUE(*sp); POPs; PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec ((SV *) source->args); return result; } static gboolean io_watch_handler (GIOChannel *channel, GIOCondition condition, gpointer data) { PORBitSource *source; SV *handler; gboolean result; int i, count; dSP; source = data; /* We keep a reference on source->args while invoking the callback * to handle the case where we source->destroy() is called * during invokation */ SvREFCNT_inc ((SV *) source->args); handler = *av_fetch(source->args, 0, 0); ENTER; SAVETMPS; PUSHMARK(sp); for (i=1;i<=av_len(source->args);i++) XPUSHs(sv_2mortal(newSVsv(*av_fetch(source->args, i, 0)))); PUTBACK; XPUSHs(sv_2mortal(newSViv(g_io_channel_unix_get_fd (channel)))); XPUSHs(sv_2mortal(newSViv(condition))); count = perl_call_sv(handler, G_SCALAR); SPAGAIN; if (count != 1) { warn ("handler returned %d items", count); while (count--) (void)POPs; return FALSE; } result = SvTRUE(*sp); (void)POPs; PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec ((SV *) source->args); return result; } /*** GLOBALS ****/ CORBA_ORB porbit_orb; /* As an extension to CORBA, we support a recursive stack of * main loops */ static GSList *main_loops; static CORBA_Policy make_policy (PortableServer_POA poa, char *key, char *value, CORBA_Environment *ev) { switch (key[0]) { case 'i': if (!strcmp(key, "id_uniqueness")) { if (!strcmp (value, "UNIQUE_ID")) return (CORBA_Policy) PortableServer_POA_create_id_uniqueness_policy (poa, PortableServer_UNIQUE_ID, ev); else if (!strcmp (value, "MULTIPLE_ID")) return (CORBA_Policy) PortableServer_POA_create_id_uniqueness_policy (poa, PortableServer_MULTIPLE_ID, ev); else croak ("IdUniquenessPolicy should be \"UNIQUE_ID\" or \"MULTIPLE_ID\""); } else if (!strcmp(key, "id_assignment")) { if (!strcmp (value, "USER_ID")) return (CORBA_Policy) PortableServer_POA_create_id_assignment_policy (poa, PortableServer_USER_ID, ev); else if (!strcmp (value, "SYSTEM_ID")) return (CORBA_Policy) PortableServer_POA_create_id_assignment_policy (poa, PortableServer_SYSTEM_ID, ev); else croak ("IdAssignmentPolicy should be \"USER_ID\" or \"SYSTEM_ID\""); } else if (!strcmp(key, "implicit_activation")) { if (!strcmp (value, "IMPLICIT_ACTIVATION")) return (CORBA_Policy) PortableServer_POA_create_implicit_activation_policy (poa, PortableServer_IMPLICIT_ACTIVATION, ev); else if (!strcmp (value, "NO_IMPLICIT_ACTIVATION")) return (CORBA_Policy) PortableServer_POA_create_implicit_activation_policy (poa, PortableServer_NO_IMPLICIT_ACTIVATION, ev); else croak ("ImplicitActivationPolicy should be \"IMPLICIT_ACTIVATION\" or \"SYSTEM_ID\""); } case 'l': if (!strcmp(key, "lifespan")) { if (!strcmp (value, "TRANSIENT")) return (CORBA_Policy) PortableServer_POA_create_lifespan_policy (poa, PortableServer_TRANSIENT, ev); else if (!strcmp (value, "PERSISTENT")) return (CORBA_Policy) PortableServer_POA_create_lifespan_policy (poa, PortableServer_PERSISTENT, ev); else croak ("LifespanPolicy should be \"TRANSIENT\" or \"PERSISTENT\""); } case 'r': if (!strcmp(key, "request_processing")) { if (!strcmp (value, "USE_ACTIVE_OBJECT_MAP_ONLY")) return (CORBA_Policy) PortableServer_POA_create_request_processing_policy (poa, PortableServer_USE_ACTIVE_OBJECT_MAP_ONLY, ev); else if (!strcmp (value, "USE_DEFAULT_SERVANT")) return (CORBA_Policy) PortableServer_POA_create_request_processing_policy (poa, PortableServer_USE_DEFAULT_SERVANT, ev); else if (!strcmp (value, "USE_SERVANT_MANAGER")) return (CORBA_Policy) PortableServer_POA_create_request_processing_policy (poa, PortableServer_USE_SERVANT_MANAGER, ev); else croak ("RequestProcessingPolicy should be \"USE_ACTIVE_OBJECT_MAP_ONLY\", \"USE_DEFAULT_SERVANT\", or \"USE_SERVANT_MANAGER\""); } case 's': if (!strcmp(key, "servant_retention")) { if (!strcmp (value, "RETAIN")) return (CORBA_Policy) PortableServer_POA_create_servant_retention_policy (poa, PortableServer_RETAIN, ev); else if (!strcmp (value, "NON_RETAIN")) return (CORBA_Policy) PortableServer_POA_create_servant_retention_policy (poa, PortableServer_NON_RETAIN, ev); else croak ("ServantRetentionPolicy should be \"RETAIN\" or \"NON_RETAIN\""); } break; case 't': if (!strcmp(key, "thread")) { if (!strcmp (value, "ORB_CTRL_MODEL")) return (CORBA_Policy) PortableServer_POA_create_thread_policy (poa, PortableServer_ORB_CTRL_MODEL, ev); else if (!strcmp (value, "SINGLE_THREAD_MODEL")) return (CORBA_Policy) PortableServer_POA_create_thread_policy (poa, PortableServer_ORB_CTRL_MODEL, ev); else croak ("ThreadPolicyValue should be \"ORB_CTRL_MODEL\" or \"SINGLE_THREAD_MODEL\""); } break; } croak("Policy key should be one of \"id_uniqueness\", \"id_assignment\", \"implicit_activation\", \"lifespan\", \"request_processing\", \"servant_retention\" or \"thread\""); } MODULE = CORBA::ORBit PACKAGE = CORBA CORBA::ORB ORB_init (id) char * id CODE: { int argc, i; char ** argv; SV ** new_argv; AV * ARGV; SV * ARGV0; RETVAL = porbit_orb; if (!RETVAL) { DEFINE_EXCEPTION (ev); ARGV = perl_get_av("ARGV", FALSE); ARGV0 = perl_get_sv("0", FALSE); argc = av_len(ARGV)+2; argv = (char **)malloc (sizeof(char *)*argc); argv[0] = SvPV (ARGV0, PL_na); for (i=0;i<=av_len(ARGV);i++) argv[i+1] = SvPV(*av_fetch(ARGV, i, 0), PL_na); RETVAL = CORBA_ORB_init (&argc, argv, id, &ev); /* Note that we must create the new strings before * we clear the array and free the old ones. */ new_argv = (SV**)malloc(sizeof(SV*)*(argc-1)); for (i=1;iobject_id; OUTPUT: RETVAL void _narrow (self, repo_id) CORBA::Object self; char * repo_id; CODE: g_free(self->object_id); self->object_id = g_strdup(repo_id); SV * _is_a (self, repoid) CORBA::Object self; char * repoid; CODE: { DEFINE_EXCEPTION (ev); RETVAL = CORBA_Object_is_a (self, repoid, &ev) ? &PL_sv_yes : &PL_sv_no; CHECK_EXCEPTION (ev); } OUTPUT: RETVAL void DESTROY (self) CORBA::Object self CODE: porbit_objref_destroy (self); CORBA_Object_release (self, NULL); MODULE = CORBA::ORBit PACKAGE = CORBA::ORB CORBA_char * object_to_string (self, object) CORBA::ORB self CORBA::Object object CODE: { DEFINE_EXCEPTION (ev); RETVAL = CORBA_ORB_object_to_string (self, object, &ev); CHECK_EXCEPTION (ev); } OUTPUT: RETVAL SV * list_initial_services (self) CORBA::ORB self CODE: { CORBA_ORB_ObjectIdList *services; AV *av; int i, nservices; DEFINE_EXCEPTION (ev); services = CORBA_ORB_list_initial_services (self, &ev); CHECK_EXCEPTION (ev); av = newAV(); av_extend(av, services->_length); RETVAL = newRV_noinc((SV *)av); for (i = 0; i < services->_length; i++) av_store(av, i, newSVpv(services->_buffer[i],0)); CORBA_free(services); } OUTPUT: RETVAL SV * resolve_initial_references (self, str) CORBA::ORB self CORBA_char *str CODE: { CORBA_Object result; DEFINE_EXCEPTION (ev); result = CORBA_ORB_resolve_initial_references (self, str, &ev); CHECK_EXCEPTION (ev); /* Ugly hack. unfortunately, ORBit Psueudo-objects are typeless */ if (!result) { RETVAL = newSVsv(&PL_sv_undef); } else if (strcmp (str, "RootPOA") == 0) { RETVAL = newSV(0); sv_setref_pv(RETVAL, "PortableServer::POA", result); } else if (strcmp (str, "POACurrent") == 0) { RETVAL = newSV(0); sv_setref_pv(RETVAL, "PortableServer::Current", result); } else { RETVAL = porbit_objref_to_sv (result); } } OUTPUT: RETVAL CORBA::Object string_to_object (self, str) CORBA::ORB self CORBA_char *str CODE: { DEFINE_EXCEPTION (ev); RETVAL = CORBA_ORB_string_to_object (self, str, &ev); CHECK_EXCEPTION (ev); } OUTPUT: RETVAL void load_idl_file (self, filename, includes, caller) CORBA::ORB self char * filename char * includes char * caller CODE: porbit_parse_idl_file (filename, includes, caller); void preload (self, id) CORBA::ORB self char * id CODE: TRY(porbit_load_contained (NULL, id, &ev)); SV * work_pending (self) CORBA::ORB self CODE: RETVAL = newSVsv(g_main_pending() ? &PL_sv_yes : &PL_sv_no); OUTPUT: RETVAL void perform_work (self) CORBA::ORB self CODE: g_main_iteration(TRUE); /* Is the FALSE here correct? */ void run (self) CORBA::ORB self CODE: { GMainLoop *loop = g_main_new (FALSE); main_loops = g_slist_prepend (main_loops, loop); g_main_run (loop); g_main_destroy (loop); } void shutdown (self, wait_for_completion) CORBA::ORB self SV* wait_for_completion CODE: if (main_loops) { GSList *tmp_list; DEFINE_EXCEPTION(ev) if (SvTRUE(wait_for_completion)) while (g_main_iteration(FALSE)) /* nothing */; g_main_quit (main_loops->data); tmp_list = main_loops; main_loops = main_loops->next; g_slist_free_1 (tmp_list); if (!main_loops) CORBA_ORB_shutdown (porbit_orb, SvTRUE(wait_for_completion), &ev); CHECK_EXCEPTION (ev) } else { croak("CORBA::shutdown: No main loop active!"); } CORBA::ORBit::Source add_timeout (self, ...) CORBA::ORB self CODE: { int i; AV *args = NULL; gint interval = -1; gint priority = G_PRIORITY_DEFAULT; if (items % 2 != 1) croak ("CORBA::ORBit::add_timeout: the number of args must be event"); for (i = 1; i < items; i++) { const char *name = SvPV(ST(i), PL_na); gboolean found = FALSE; switch (name[0]) { case 'c': if (strcmp (name, "cb") == 0) { found = TRUE; i++; args = collect_source_args (ST(i)); } break; case 'p': if (strcmp (name, "priority") == 0) { found = TRUE; i++; priority = SvIV (ST(i)); } break; case 't': if (strcmp (name, "timeout") == 0) { found = TRUE; i++; interval = SvIV (ST(i)); } break; } if (!found) { if (args) av_undef (args); croak ("CORBA::ORBit::add_timeout: unknown key '%s'", name); } } if (!args) { croak ("CORBA::ORBit::add_timeout: a callback must be provided"); } if (interval < 0) { av_undef (args); croak ("CORBA::ORBit::add_timeout: a non-negative timeout must be provided"); } RETVAL = porbit_source_new (); RETVAL->args = args; RETVAL->id = g_timeout_add_full (priority, interval, timeout_handler, RETVAL, (GDestroyNotify)porbit_source_destroyed); porbit_source_ref (RETVAL); } OUTPUT: RETVAL CORBA::ORBit::Source add_io_watch (self, ...) CORBA::ORB self CODE: { int i; AV *args = NULL; gint fd = -1; gint condition = 0; gint priority = G_PRIORITY_DEFAULT; GIOChannel *channel; if (items % 2 != 1) { croak ("CORBA::ORBit::add_io_watch: the number of args must be event"); } for (i = 1; i < items; i++) { const char *name = SvPV(ST(i), PL_na); gboolean found = FALSE; switch (name[0]) { case 'c': if (strcmp (name, "cb") == 0) { found = TRUE; i++; args = collect_source_args (ST(i)); } else if (strcmp (name, "condition") == 0) { found = TRUE; i++; condition = SvUV (ST(i)); } break; case 'f': if (strcmp (name, "fd") == 0) { found = TRUE; i++; fd = SvIV (ST(i)); } break; case 'p': if (strcmp (name, "priority") == 0) { found = TRUE; i++; priority = SvIV (ST(i)); } break; } if (!found) { if (args) av_undef (args); croak ("CORBA::ORBit::add_io_watch: unknown key '%s'", name); } } if (!args) { croak ("CORBA::ORBit::add_io_watch: a callback must be provided"); } if (fd < 0) { av_undef (args); croak ("CORBA::ORBit::io_watch: a non-negative fd must be provided"); } if (condition == 0) { av_undef (args); croak ("CORBA::ORBit::io_watch: a non-negative fd must be provided"); } RETVAL = porbit_source_new (); RETVAL->args = args; channel = g_io_channel_unix_new (fd); RETVAL->id = g_io_add_watch_full (channel, priority, condition, io_watch_handler, RETVAL, (GDestroyNotify)porbit_source_destroyed); g_io_channel_unref (channel); porbit_source_ref (RETVAL); } OUTPUT: RETVAL MODULE = CORBA::ORBit PACKAGE = CORBA::LongLong CORBA::LongLong new (Class, str) char *str CODE: RETVAL = porbit_longlong_from_string (str); OUTPUT: RETVAL SV * stringify (self, other=0, reverse=&PL_sv_undef) CORBA::LongLong self CODE: { char *result = porbit_longlong_to_string (self); RETVAL = newSVpv (result, 0); Safefree (result); } OUTPUT: RETVAL CORBA::LongLong add (self, other, reverse=&PL_sv_undef) CORBA::LongLong self CORBA::LongLong other CODE: RETVAL = self+other; OUTPUT: RETVAL CORBA::LongLong subtract (self, other, reverse=&PL_sv_undef) CORBA::LongLong self CORBA::LongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other - self; else RETVAL = self - other; OUTPUT: RETVAL CORBA::LongLong div (self, other, reverse=&PL_sv_undef) CORBA::LongLong self CORBA::LongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other / self; else RETVAL = self / other; OUTPUT: RETVAL CORBA::LongLong mul (self, other, reverse=&PL_sv_undef) CORBA::LongLong self CORBA::LongLong other CODE: RETVAL = self*other; OUTPUT: RETVAL CORBA::LongLong mod (self, other, reverse=&PL_sv_undef) CORBA::LongLong self CORBA::LongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other % self; else RETVAL = self % other; OUTPUT: RETVAL CORBA::LongLong neg (self, other=0, reverse=&PL_sv_undef) CORBA::LongLong self CODE: RETVAL = -self; OUTPUT: RETVAL CORBA::LongLong abs (self, other=0, reverse=&PL_sv_undef) CORBA::LongLong self CODE: RETVAL = (self > 0) ? self : -self; OUTPUT: RETVAL int cmp (self, other, reverse=&PL_sv_undef) CORBA::LongLong self CORBA::LongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = (self == other) ? 0 : ((self > other) ? 1 : -1); else RETVAL = (other == self) ? 0 : ((other > self) ? 1 : -1); OUTPUT: RETVAL MODULE = CORBA::ORBit PACKAGE = CORBA::ULongLong CORBA::ULongLong new (Class, str) char *str CODE: RETVAL = porbit_ulonglong_from_string (str); OUTPUT: RETVAL SV * stringify (self, other=0, reverse=&PL_sv_undef) CORBA::ULongLong self CODE: { char *result = porbit_ulonglong_to_string (self); RETVAL = newSVpv (result, 0); Safefree (result); } OUTPUT: RETVAL CORBA::ULongLong add (self, other, reverse=&PL_sv_undef) CORBA::ULongLong self CORBA::ULongLong other CODE: RETVAL = self+other; OUTPUT: RETVAL CORBA::ULongLong subtract (self, other, reverse=&PL_sv_undef) CORBA::ULongLong self CORBA::ULongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other - self; else RETVAL = self - other; OUTPUT: RETVAL CORBA::ULongLong div (self, other, reverse=&PL_sv_undef) CORBA::ULongLong self CORBA::ULongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other / self; else RETVAL = self / other; OUTPUT: RETVAL CORBA::ULongLong mul (self, other, reverse=&PL_sv_undef) CORBA::ULongLong self CORBA::ULongLong other CODE: RETVAL = self*other; OUTPUT: RETVAL CORBA::ULongLong mod (self, other, reverse=&PL_sv_undef) CORBA::ULongLong self CORBA::ULongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other % self; else RETVAL = self % other; OUTPUT: RETVAL int cmp (self, other, reverse=&PL_sv_undef) CORBA::ULongLong self CORBA::ULongLong other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = (self == other) ? 0 : ((self > other) ? 1 : -1); else RETVAL = (other == self) ? 0 : ((other > self) ? 1 : -1); OUTPUT: RETVAL MODULE = CORBA::ORBit PACKAGE = CORBA::LongDouble CORBA::LongDouble new (Class, str) char *str CODE: RETVAL = porbit_longdouble_from_string (str); OUTPUT: RETVAL SV * stringify (self, other=0, reverse=&PL_sv_undef) CORBA::LongDouble self CODE: { char *result = porbit_longdouble_to_string (self); RETVAL = newSVpv (result, 0); Safefree (result); } OUTPUT: RETVAL CORBA::LongDouble add (self, other, reverse=&PL_sv_undef) CORBA::LongDouble self CORBA::LongDouble other CODE: RETVAL = self+other; OUTPUT: RETVAL CORBA::LongDouble subtract (self, other, reverse=&PL_sv_undef) CORBA::LongDouble self CORBA::LongDouble other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other - self; else RETVAL = self - other; OUTPUT: RETVAL CORBA::LongDouble div (self, other, reverse=&PL_sv_undef) CORBA::LongDouble self CORBA::LongDouble other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = other / self; else RETVAL = self / other; OUTPUT: RETVAL CORBA::LongDouble mul (self, other, reverse=&PL_sv_undef) CORBA::LongDouble self CORBA::LongDouble other CODE: RETVAL = self*other; OUTPUT: RETVAL CORBA::LongDouble neg (self, other=0, reverse=&PL_sv_undef) CORBA::LongDouble self CODE: RETVAL = -self; OUTPUT: RETVAL CORBA::LongDouble abs (self, other=0, reverse=&PL_sv_undef) CORBA::LongDouble self CODE: RETVAL = (self > 0) ? self : -self; OUTPUT: RETVAL int cmp (self, other, reverse=&PL_sv_undef) CORBA::LongDouble self CORBA::LongDouble other SV *reverse CODE: if (SvTRUE (reverse)) RETVAL = (self == other) ? 0 : ((self > other) ? 1 : -1); else RETVAL = (other == self) ? 0 : ((other > self) ? 1 : -1); OUTPUT: RETVAL MODULE = CORBA::ORBit PACKAGE = CORBA::TypeCode CORBA::TypeCode new (pkg, id) char *id CODE: RETVAL = porbit_find_typecode (id); if (!RETVAL) croak ("Cannot find typecode for '%s'", id); OUTPUT: RETVAL char * id (self) CORBA::TypeCode self CODE: RETVAL = (char *)self->repo_id; OUTPUT: RETVAL char * name (self) CORBA::TypeCode self CODE: RETVAL = (char *)self->name; OUTPUT: RETVAL MODULE = CORBA::ORBit PACKAGE = CORBA::ORBit char * find_interface (repoid) char *repoid CODE: { PORBitIfaceInfo *info = porbit_find_interface_description (repoid); RETVAL = info ? info->pkg : NULL; } OUTPUT: RETVAL char * load_interface (interface) CORBA::Object interface CODE: { PORBitIfaceInfo *info; DEFINE_EXCEPTION (ev); info = porbit_load_contained (interface, NULL, &ev); CHECK_EXCEPTION (ev); RETVAL = info ? info->pkg : NULL; } OUTPUT: RETVAL void debug_wait () CODE: { int wait = 1; fprintf(stderr, "%d: Waiting...\n", getpid()); while (wait) ; } void set_cookie (cookie) char *cookie CODE: porbit_set_cookie (cookie); void set_use_gmain (set) SV *set CODE: porbit_set_use_gmain (SvTRUE(set)); void set_check_cookies (set) SV *set CODE: porbit_set_check_cookies (SvTRUE (set)); MODULE = CORBA::ORBit PACKAGE = CORBA::ORBit::InstVars void DESTROY (self) SV *self; CODE: porbit_instvars_destroy ((PORBitInstVars *)SvPVX(SvRV(self))); MODULE = CORBA::ORBit PACKAGE = CORBA::ORBit::RootObject void DESTROY (self) CORBA::ORBit::RootObject self CODE: CORBA_Object_release ((CORBA_Object)self, NULL); MODULE = CORBA::ORBit PACKAGE = CORBA::ORBit::Source void DESTROY (self) CORBA::ORBit::Source self CODE: porbit_source_unref (self); void destroy (self) CORBA::ORBit::Source self CODE: g_source_remove (self->id); MODULE = CORBA::ORBit PACKAGE = PortableServer::POA CORBA_char * _get_the_name (self) PortableServer::POA self CODE: TRY(RETVAL = PortableServer_POA__get_the_name (self, &ev)); OUTPUT: RETVAL PortableServer::POA _get_the_parent (self) PortableServer::POA self CODE: TRY(RETVAL = PortableServer_POA__get_the_parent (self, &ev)); OUTPUT: RETVAL PortableServer::POAManager _get_the_POAManager (self) PortableServer::POA self CODE: TRY(RETVAL = PortableServer_POA__get_the_POAManager (self, &ev)); OUTPUT: RETVAL PortableServer::POA create_POA (self, adapter_name, mngr_sv, ...) PortableServer::POA self char *adapter_name SV *mngr_sv CODE: { CORBA_PolicyList policies; PortableServer_POAManager mngr; int npolicies, i; DEFINE_EXCEPTION (ev); if (items % 2 != 1) croak("PortableServer::POA::create_POA requires an even number of arguments\n"); if (SvOK (mngr_sv)) { if (sv_derived_from(mngr_sv, "PortableServer::POAManager")) mngr = (PortableServer_POAManager) SvIV((SV*)SvRV(mngr_sv)); else croak("mngr is not of type PortableServer::POAManager"); } else { mngr = CORBA_OBJECT_NIL; } npolicies = (items - 3) / 2; policies._length = npolicies; policies._buffer = g_new0 (CORBA_Policy, npolicies) ; policies._release = CORBA_TRUE; for (i = 0 ; i