1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
3
* bonobo-activation-server: CORBA activation dameon.
5
* Copyright (C) 1999, 2000 Red Hat, Inc.
6
* Copyright (C) 1999, 2000 Eazel, Inc.
7
* Copyright (C) 1999, 2003 Ximian, Inc.
9
* This library is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU General Public License as
11
* published by the Free Software Foundation; either version 2 of the
12
* License, or (at your option) any later version.
14
* This library is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
* General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this library; if not, write to the Free Software
21
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23
* Authors: Elliot Lee <sopwith@redhat.com>,
37
#include "activation-context.h"
38
#include "bonobo-activation-id.h"
39
#include "activation-context-query.h"
40
#include "activation-server-corba-extensions.h"
41
#include <libbonobo.h>
45
#define Bonobo_LINK_TIME_TO_LIVE 256
47
static GObjectClass *parent_class = NULL;
50
directory_info_free (ActivationContext *actx, CORBA_Environment *ev)
52
CORBA_Object_release (actx->obj, ev);
53
actx->obj = CORBA_OBJECT_NIL;
56
g_hash_table_destroy (actx->by_iid);
61
CORBA_sequence_set_release (actx->list, CORBA_TRUE);
62
CORBA_free (actx->list);
66
if (actx->active_servers)
67
g_hash_table_destroy (actx->active_servers);
68
CORBA_free (actx->active_server_list);
69
actx->active_server_list = NULL;
73
ac_update_active (ActivationContext *actx, CORBA_Environment *ev)
76
Bonobo_ServerStateCache *cache;
78
cache = Bonobo_ObjectDirectory_get_active_servers (
79
actx->obj, actx->time_active_pulled, ev);
81
if (ev->_major != CORBA_NO_EXCEPTION) {
82
CORBA_Object_release (actx->obj, ev);
83
actx->obj = CORBA_OBJECT_NIL;
87
if (actx->active_servers) {
88
g_hash_table_destroy (actx->active_servers);
89
CORBA_free (actx->active_server_list);
92
actx->active_server_list = cache;
94
actx->time_active_pulled = time (NULL);
95
actx->active_servers =
96
g_hash_table_new (g_str_hash, g_str_equal);
97
for (i = 0; i < cache->_u.active_servers._length; i++)
98
g_hash_table_insert (actx->active_servers,
100
active_servers._buffer[i],
101
GINT_TO_POINTER (1));
107
ac_CORBA_Context_get_value (CORBA_Context ctx,
108
const char *propname,
109
CORBA_Environment *ev)
111
return activation_server_CORBA_Context_get_value (
113
ex_Bonobo_Activation_IncompleteContext, ev);
117
ac_update_list (ActivationContext *actx, CORBA_Environment *ev)
120
Bonobo_ServerInfoListCache *cache;
122
cache = Bonobo_ObjectDirectory_get_servers (
123
actx->obj, actx->time_list_pulled, ev);
125
if (ev->_major != CORBA_NO_EXCEPTION) {
127
CORBA_Object_release (actx->obj, ev);
128
actx->obj = CORBA_OBJECT_NIL;
134
g_hash_table_destroy (actx->by_iid);
136
CORBA_sequence_set_release (actx->list, CORBA_TRUE);
137
CORBA_free (actx->list);
141
actx->list = ORBit_copy_value (&cache->_u.server_list,
142
TC_Bonobo_ServerInfoList);
144
actx->time_list_pulled = time (NULL);
145
actx->by_iid = g_hash_table_new (g_str_hash, g_str_equal);
146
for (i = 0; i < actx->list->_length; i++)
147
g_hash_table_insert (actx->by_iid,
148
actx->list->_buffer[i].iid,
149
&(actx->list->_buffer[i]));
155
static QueryExprConst
156
ac_query_get_var (Bonobo_ServerInfo *si, const char *id, QueryContext *qctx)
158
QueryExprConst retval;
159
ActivationContext *actx = qctx->user_data;
161
retval.value_known = FALSE;
162
retval.needs_free = FALSE;
164
if (!strcasecmp (id, "_active")) {
165
CORBA_Environment ev;
167
CORBA_exception_init (&ev);
168
ac_update_active (actx, &ev);
169
CORBA_exception_free (&ev);
171
retval.value_known = TRUE;
172
retval.type = CONST_BOOLEAN;
174
g_hash_table_lookup (actx->active_servers,
175
si->iid) ? TRUE : FALSE;
181
/* This function should only be called by
182
* impl_Bonobo_ActivationContext_query and
183
* impl_Bonobo_ActivationContext_activateMatching - hairy implicit preconditions
186
ac_query_run (ActivationContext *actx,
187
const CORBA_char *requirements,
188
const Bonobo_StringList *selection_order,
190
Bonobo_ServerInfo **items,
191
CORBA_Environment *ev)
196
Bonobo_ServerInfo **orig_items;
197
int item_count, orig_item_count;
199
Bonobo_Activation_ParseFailed *ex;
201
QueryExpr *qexp_requirements;
202
QueryExpr **qexp_sort_items;
204
/* First, parse the query */
205
errstr = (char *) qexp_parse (requirements, &qexp_requirements);
210
ex = Bonobo_Activation_ParseFailed__alloc ();
211
ex->description = CORBA_string_dup (errstr);
212
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
213
ex_Bonobo_Activation_ParseFailed,
219
g_alloca (selection_order->_length * sizeof (QueryExpr *));
220
for (i = 0; i < selection_order->_length; i++) {
222
(char *) qexp_parse (selection_order->_buffer[i],
223
&qexp_sort_items[i]);
226
qexp_free (qexp_requirements);
227
for (i--; i >= 0; i--)
228
qexp_free (qexp_sort_items[i]);
231
ex = Bonobo_Activation_ParseFailed__alloc ();
232
ex->description = CORBA_string_dup (errstr);
234
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
235
ex_Bonobo_Activation_ParseFailed,
241
total = actx->total_servers;
242
orig_items = g_alloca (total * sizeof (Bonobo_ServerInfo *));
249
if (actx->obj != CORBA_OBJECT_NIL)
250
for (i = 0; i < actx->list->_length; i++, item_count++)
251
items[item_count] = &actx->list->_buffer[i];
254
memcpy (orig_items, items, item_count * sizeof (Bonobo_ServerInfo *));
255
orig_item_count = item_count;
257
qctx.sil = orig_items;
258
qctx.nservers = orig_item_count;
260
qctx.id_evaluator = ac_query_get_var;
261
qctx.user_data = actx;
263
for (i = 0; i < item_count; i++) {
264
if (!qexp_matches (items[i], qexp_requirements, &qctx))
268
qexp_sort (items, item_count, qexp_sort_items,
269
selection_order->_length, &qctx);
271
qexp_free (qexp_requirements);
272
for (i = 0; i < selection_order->_length; i++)
273
qexp_free (qexp_sort_items[i]);
277
ac_update_lists (ActivationContext *actx,
278
CORBA_Environment *ev)
282
if (actx->refs > 0) {
283
/* FIXME: what happens on re-enterency here ?
284
* looks like this could get seriously out of date */
289
prev = actx->list->_length;
293
ac_update_list (actx, ev);
296
new = actx->list->_length;
300
actx->total_servers += (new - prev);
303
static GList *clients = NULL;
306
activation_clients_cache_notify (void)
309
GSList *notify = NULL, *l2;
310
CORBA_Environment ev;
312
CORBA_exception_init (&ev);
314
for (l = clients; l; l = l->next)
315
notify = g_slist_prepend (notify, CORBA_Object_duplicate (l->data, &ev));
317
for (l2 = notify; l2; l2 = l2->next) {
318
Bonobo_ActivationClient_resetCache (l2->data, &ev);
319
if (ev._major != CORBA_NO_EXCEPTION)
320
clients = g_list_remove (clients, l2->data);
322
CORBA_Object_release (l2->data, &ev);
323
CORBA_exception_free (&ev);
328
activation_clients_is_empty_scan (void)
332
for (l = clients; l; l = next) {
334
if (ORBit_small_get_connection_status (l->data) ==
335
ORBIT_CONNECTION_DISCONNECTED) {
336
CORBA_Object_release (l->data, NULL);
337
clients = g_list_delete_link (clients, l);
341
return clients == NULL;
345
active_client_cnx_broken (ORBitConnection *cnx,
348
if (activation_clients_is_empty_scan ()) {
349
#ifdef BONOBO_ACTIVATION_DEBUG
350
g_warning ("All clients dead");
358
impl_Bonobo_ActivationContext_addClient (PortableServer_Servant servant,
359
const Bonobo_ActivationClient client,
360
const CORBA_char *locales,
361
CORBA_Environment *ev)
365
ORBitConnection *cnx;
367
new_locale = register_interest_in_locales (locales);
369
cnx = ORBit_small_get_connection (client);
370
for (l = clients; l; l = l->next)
371
if (cnx == ORBit_small_get_connection (l->data))
374
clients = g_list_prepend (
375
clients, CORBA_Object_duplicate (client, ev));
380
G_CALLBACK (active_client_cnx_broken),
386
bonobo_object_directory_reload ();
389
static Bonobo_ObjectDirectoryList *
390
impl_Bonobo_ActivationContext__get_directories (PortableServer_Servant servant,
391
CORBA_Environment *ev)
393
ActivationContext *actx = ACTIVATION_CONTEXT (servant);
394
Bonobo_ObjectDirectoryList *retval;
396
retval = Bonobo_ObjectDirectoryList__alloc ();
397
if (actx->obj != CORBA_OBJECT_NIL) {
400
CORBA_sequence_Bonobo_ObjectDirectory_allocbuf (1);
401
retval->_buffer[0] = CORBA_Object_duplicate (actx->obj, ev);
406
CORBA_sequence_set_release (retval, CORBA_TRUE);
412
impl_Bonobo_ActivationContext_addDirectory (PortableServer_Servant servant,
413
Bonobo_ObjectDirectory dir,
414
CORBA_Environment *ev)
416
ActivationContext *actx = ACTIVATION_CONTEXT (servant);
418
if (actx->obj == dir)
419
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
420
ex_Bonobo_Activation_AlreadyListed,
423
CORBA_Object_release (actx->obj, ev);
424
actx->obj = CORBA_Object_duplicate (dir, ev);
429
impl_Bonobo_ActivationContext_removeDirectory (PortableServer_Servant servant,
430
Bonobo_ObjectDirectory dir,
431
CORBA_Environment *ev)
433
ActivationContext *actx = ACTIVATION_CONTEXT (servant);
435
if (dir != actx->obj)
436
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
437
ex_Bonobo_Activation_NotListed,
441
CORBA_Object_release (actx->obj, ev);
442
actx->obj = CORBA_OBJECT_NIL;
444
directory_info_free (actx, ev);
449
ac_do_activation (ActivationContext *actx,
450
Bonobo_ServerInfo *server,
451
const Bonobo_ActivationEnvironment *environment,
452
Bonobo_ActivationResult *out,
453
Bonobo_ActivationFlags flags,
454
const char *hostname,
455
Bonobo_ActivationClient client,
457
CORBA_Environment *ev)
460
Bonobo_ServerInfo *activatable;
462
/* When doing checks for shlib loadability, we
463
* have to find the info on the factory object in case
464
* a factory is inside a shlib
466
if (!actx->obj || ev->_major != CORBA_NO_EXCEPTION) {
467
Bonobo_GeneralError *errval = Bonobo_GeneralError__alloc ();
468
errval->description =
470
(_("Couldn't find which child the server was listed in"));
471
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
472
ex_Bonobo_GeneralError, errval);
476
for (num_layers = 0, activatable = server;
477
activatable && activatable->server_type &&
478
!strcmp (activatable->server_type, "factory") &&
479
num_layers < Bonobo_LINK_TIME_TO_LIVE; num_layers++) {
481
activatable = g_hash_table_lookup (actx->by_iid, activatable->location_info);
484
if (activatable == NULL) {
485
Bonobo_GeneralError *errval = Bonobo_GeneralError__alloc ();
486
errval->description = CORBA_string_dup ("Couldn't find the factory server");
487
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
488
ex_Bonobo_GeneralError, errval);
491
else if (num_layers == Bonobo_LINK_TIME_TO_LIVE) {
492
Bonobo_GeneralError *errval = Bonobo_GeneralError__alloc ();
493
errval->description = CORBA_string_dup ("Location loop");
494
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
495
ex_Bonobo_GeneralError, errval);
499
/* A shared library must be on the same host as the activator in
500
* order for loading to work properly (no, we're not going to
501
* bother with loading a remote shlib into a process - it gets far too complicated
502
* far too quickly :-) */
504
if (activatable && !strcmp (activatable->server_type, "shlib")
505
&& !(flags & Bonobo_ACTIVATION_FLAG_NO_LOCAL)
506
&& (hostname && !strcmp (activatable->hostname, hostname))) {
510
out->res._d = Bonobo_ACTIVATION_RESULT_SHLIB;
512
/* Here is an explanation as to why we add 2 to num_layers.
513
* At the end of the string list, after all the factory iids are added
514
* to the string list, we then add the iid of the shaed library and the
515
* location info. This data is later used in oaf_server_activate_shlib
516
* to activate the component
518
out->res._u.res_shlib._length = num_layers + 2;
519
out->res._u.res_shlib._buffer = CORBA_sequence_CORBA_string_allocbuf (num_layers + 2);
521
/* Copy over factory info */
522
for (j = 0, activatable = server; activatable
523
&& !strcmp (activatable->server_type, "factory"); j++) {
524
out->res._u.res_shlib._buffer[j] = CORBA_string_dup (activatable->iid);
525
activatable = g_hash_table_lookup (actx->by_iid,
526
activatable->location_info);
529
/* Copy shlib iid into buffer */
530
out->res._u.res_shlib._buffer[j] = CORBA_string_dup (activatable->iid);
532
/* Copy location into last buffer slot for use in later activation */
533
out->res._u.res_shlib._buffer[j+1] = CORBA_string_dup (activatable->location_info);
535
g_snprintf (tbuf, sizeof (tbuf), "OAFAID:[%s,%s,%s]",
537
activatable->username,
538
activatable->hostname);
539
out->aid = CORBA_string_dup (tbuf);
543
retval = Bonobo_ObjectDirectory_activate (
544
actx->obj, server->iid, BONOBO_OBJREF (actx),
545
environment, flags, client, ctx, ev);
547
if (ev->_major == CORBA_NO_EXCEPTION) {
549
out->res._d = Bonobo_ACTIVATION_RESULT_OBJECT;
550
out->res._u.res_object = retval;
551
g_snprintf (tbuf, sizeof (tbuf),
552
"OAFAID:[%s,%s,%s]", activatable->iid,
553
activatable->username,
554
activatable->hostname);
555
out->aid = CORBA_string_dup (tbuf);
557
#ifdef BONOBO_ACTIVATION_DEBUG
559
g_warning ("Activation of '%s' failed with exception '%s'",
560
activatable->iid, ev->_id);
566
static Bonobo_ActivationResult *
567
impl_Bonobo_ActivationContext_activateMatchingFull (
568
PortableServer_Servant servant,
569
const CORBA_char *requirements,
570
const Bonobo_StringList *selection_order,
571
const Bonobo_ActivationEnvironment *environment,
572
const Bonobo_ActivationFlags flags,
573
Bonobo_ActivationClient client,
575
CORBA_Environment *ev)
577
ActivationContext *actx = ACTIVATION_CONTEXT (servant);
578
Bonobo_ActivationResult *retval = NULL;
579
Bonobo_ServerInfo **items, *curitem;
583
ac_update_lists (actx, ev);
587
items = g_alloca (actx->total_servers *
588
sizeof (Bonobo_ServerInfo *));
589
ac_query_run (actx, requirements, selection_order, ctx, items, ev);
591
if (ev->_major != CORBA_NO_EXCEPTION)
594
hostname = ac_CORBA_Context_get_value (ctx, "hostname", ev);
596
retval = Bonobo_ActivationResult__alloc ();
597
retval->res._d = Bonobo_ACTIVATION_RESULT_NONE;
599
for (i = 0; (retval->res._d == Bonobo_ACTIVATION_RESULT_NONE) && items[i]
600
&& (i < actx->total_servers); i++) {
603
ac_do_activation (actx, curitem, environment,
604
retval, flags, hostname, client, ctx, ev);
607
if (retval->res._d == Bonobo_ACTIVATION_RESULT_NONE)
608
retval->aid = CORBA_string_dup ("");
613
if (ev->_major != CORBA_NO_EXCEPTION) {
623
static Bonobo_ActivationResult *
624
impl_Bonobo_ActivationContext_activateMatching (
625
PortableServer_Servant servant,
626
const CORBA_char *requirements,
627
const Bonobo_StringList *selection_order,
628
const Bonobo_ActivationEnvironment *environment,
629
const Bonobo_ActivationFlags flags,
631
CORBA_Environment *ev)
633
return impl_Bonobo_ActivationContext_activateMatchingFull
634
(servant, requirements, selection_order,
635
environment, flags, CORBA_OBJECT_NIL, ctx, ev);
638
static Bonobo_ServerInfoList *
639
impl_Bonobo_ActivationContext_query (PortableServer_Servant servant,
640
const CORBA_char * requirements,
641
const Bonobo_StringList * selection_order,
642
CORBA_Context ctx, CORBA_Environment * ev)
644
ActivationContext *actx = ACTIVATION_CONTEXT (servant);
645
Bonobo_ServerInfoList *retval;
646
Bonobo_ServerInfo **items;
650
retval = Bonobo_ServerInfoList__alloc ();
652
retval->_buffer = NULL;
653
CORBA_sequence_set_release (retval, CORBA_TRUE);
655
/* Pull in new lists from OD servers */
656
ac_update_lists (actx, ev);
659
items = g_alloca (actx->total_servers *
660
sizeof (Bonobo_ServerInfo *));
661
item_count = actx->total_servers;
663
ac_query_run (actx, requirements, selection_order, ctx, items, ev);
665
if (ev->_major == CORBA_NO_EXCEPTION) {
666
for (total = i = 0; i < item_count; i++) {
671
retval->_length = total;
673
CORBA_sequence_Bonobo_ServerInfo_allocbuf (total);
675
for (i = j = 0; i < item_count; i++) {
679
Bonobo_ServerInfo_copy (&retval->_buffer[j], items[i]);
691
ac_aid_to_query_string (const CORBA_char *aid)
694
char *iid_requirement;
695
char *username_requirement;
696
char *hostname_requirement;
697
BonoboActivationInfo *ainfo;
699
ainfo = bonobo_activation_id_parse (aid);
703
iid_requirement = g_strconcat ("iid == \'", ainfo->iid, "\' ", NULL);
706
username_requirement = g_strconcat ("AND username == \'", ainfo->user, "\'", NULL);
708
username_requirement = g_strdup ("");
712
hostname_requirement = g_strconcat ("AND hostname == \'", ainfo->host, "\'", NULL);
714
hostname_requirement = g_strdup ("");
717
requirements = g_strconcat (iid_requirement, username_requirement,
718
hostname_requirement, NULL);
720
g_free (iid_requirement);
721
g_free (username_requirement);
722
g_free (hostname_requirement);
723
bonobo_activation_info_free (ainfo);
729
ac_context_to_string_array (CORBA_Context context, char **sort_criteria,
730
CORBA_Environment *ev)
732
char *context_username;
733
char *context_hostname;
735
context_username = ac_CORBA_Context_get_value (context, "username", ev);
736
context_hostname = ac_CORBA_Context_get_value (context, "hostname", ev);
737
if (ev->_major != CORBA_NO_EXCEPTION)
740
sort_criteria[0] = g_strconcat ("username == \'", context_username, "\'", NULL);
741
sort_criteria[1] = g_strconcat ("hostname == \'", context_hostname, "\'", NULL);
742
sort_criteria[2] = NULL;
744
g_free (context_username);
745
g_free (context_hostname);
748
#define PARSE_ERROR_NOT_AN_AID (_("Not a valid Activation ID"))
750
static Bonobo_ActivationResult *
751
impl_Bonobo_ActivationContext_activateFromAidFull (PortableServer_Servant servant,
752
const CORBA_char *aid,
753
Bonobo_ActivationFlags flags,
754
Bonobo_ActivationClient client,
756
CORBA_Environment *ev)
758
ActivationContext *actx = ACTIVATION_CONTEXT (servant);
759
Bonobo_ActivationResult *retval;
761
char *sort_criteria[3];
762
Bonobo_StringList selection_order;
763
Bonobo_ActivationEnvironment environment;
765
if (strncmp ("OAFAID:", aid, 7) != 0) {
766
Bonobo_Activation_ParseFailed *ex;
768
ex = Bonobo_Activation_ParseFailed__alloc ();
769
ex->description = CORBA_string_dup (PARSE_ERROR_NOT_AN_AID);
771
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
772
ex_Bonobo_Activation_ParseFailed,
777
ac_update_lists (actx, ev);
778
if (ev->_major != CORBA_NO_EXCEPTION)
783
requirements = ac_aid_to_query_string (aid);
784
if (requirements == NULL) {
789
ac_context_to_string_array (ctx, sort_criteria, ev);
790
if (ev->_major != CORBA_NO_EXCEPTION) {
792
g_free (requirements);
796
selection_order._length = 2;
797
selection_order._buffer = sort_criteria;
798
CORBA_sequence_set_release (&selection_order, CORBA_FALSE);
800
memset (&environment, 0, sizeof (Bonobo_ActivationEnvironment));
802
retval = impl_Bonobo_ActivationContext_activateMatchingFull (
803
actx, requirements, &selection_order, &environment,
804
flags, client, ctx, ev);
806
g_free (sort_criteria[0]);
807
g_free (sort_criteria[1]);
808
g_free (requirements);
815
static Bonobo_ActivationResult *
816
impl_Bonobo_ActivationContext_activateFromAid (PortableServer_Servant servant,
817
const CORBA_char *aid,
818
Bonobo_ActivationFlags flags,
820
CORBA_Environment *ev)
822
return impl_Bonobo_ActivationContext_activateFromAidFull
823
(servant, aid, flags, CORBA_OBJECT_NIL, ctx, ev);
827
impl_Bonobo_ActivationContext_getVersion (PortableServer_Servant servant,
828
CORBA_Environment *ev)
830
return (BONOBO_ACTIVATION_MAJOR_VERSION*10000 +
831
BONOBO_ACTIVATION_MINOR_VERSION*100 +
832
BONOBO_ACTIVATION_MICRO_VERSION);
835
static ActivationContext *main_ac = NULL;
838
activation_context_setup (PortableServer_POA poa,
839
Bonobo_ObjectDirectory dir,
840
CORBA_Environment *ev)
842
main_ac = g_object_new (activation_context_get_type (), NULL);
844
impl_Bonobo_ActivationContext_addDirectory
845
(BONOBO_OBJECT (main_ac), dir, ev);
849
activation_context_shutdown (void)
852
bonobo_object_set_immortal (BONOBO_OBJECT (main_ac), FALSE);
853
bonobo_object_unref (BONOBO_OBJECT (main_ac));
858
Bonobo_ActivationContext
859
activation_context_get (void)
862
return CORBA_OBJECT_NIL;
864
return BONOBO_OBJREF (main_ac);
868
activation_context_finalize (GObject *object)
870
CORBA_Environment ev[1];
871
ActivationContext *actx = (ActivationContext *) object;
873
CORBA_exception_init (ev);
875
directory_info_free (actx, ev);
877
CORBA_exception_free (ev);
879
parent_class->finalize (object);
883
activation_context_class_init (ActivationContextClass *klass)
885
GObjectClass *object_class = (GObjectClass *) klass;
886
POA_Bonobo_ActivationContext__epv *epv = &klass->epv;
888
parent_class = g_type_class_peek_parent (klass);
889
object_class->finalize = activation_context_finalize;
891
epv->_get_directories = impl_Bonobo_ActivationContext__get_directories;
892
epv->addClient = impl_Bonobo_ActivationContext_addClient;
893
epv->addDirectory = impl_Bonobo_ActivationContext_addDirectory;
894
epv->removeDirectory = impl_Bonobo_ActivationContext_removeDirectory;
895
epv->query = impl_Bonobo_ActivationContext_query;
896
epv->activateMatching = impl_Bonobo_ActivationContext_activateMatching;
897
epv->activateFromAid = impl_Bonobo_ActivationContext_activateFromAid;
898
epv->getVersion = impl_Bonobo_ActivationContext_getVersion;
899
epv->activateMatchingFull = impl_Bonobo_ActivationContext_activateMatchingFull;
900
epv->activateFromAidFull = impl_Bonobo_ActivationContext_activateFromAidFull;
904
activation_context_init (ActivationContext *actx)
906
bonobo_object_set_immortal (BONOBO_OBJECT (actx), TRUE);
909
BONOBO_TYPE_FUNC_FULL (ActivationContext,
910
Bonobo_ActivationContext,