/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
#include <config.h>
#include <libbonobo.h>
#include <string.h>
#include "bonobo/bonobo-marshal.h"
#define TEST_MESSAGE "test-message"
#define CLOSURE_MESSAGE "closure-message"
static gboolean
quit_after_timeout (gpointer data)
{
bonobo_main_quit ();
return FALSE;
}
static GValue *
message_quit_cb (BonoboAppClient *app_client, const gchar *message, GValueArray *args)
{
g_timeout_add (1000, quit_after_timeout, NULL);
return NULL;
}
static GValue *
message_cb (BonoboAppClient *app_client, const gchar *message, GValueArray *args)
{
GValue *retval;
g_return_val_if_fail (strcmp (message, TEST_MESSAGE) == 0, NULL);
g_return_val_if_fail (args->n_values == 2, NULL);
g_return_val_if_fail (G_VALUE_HOLDS_DOUBLE (&args->values[0]), NULL);
g_return_val_if_fail (G_VALUE_HOLDS_STRING (&args->values[1]), NULL);
g_message ("message_cb: %s(%f, \"%s\")", message,
g_value_get_double (&args->values[0]),
g_value_get_string (&args->values[1]));
retval = g_new0 (GValue, 1);
g_value_init (retval, G_TYPE_DOUBLE);
g_value_set_double (retval, 2 * g_value_get_double (&args->values[0]));
return retval;
}
static void
test_app_hook (BonoboApplication *app, gpointer data)
{
g_message ("App '%s' created; data == %p", app->name, data);
}
static gint
new_instance_cb (BonoboApplication *app, gint argc, char *argv[])
{
int i;
g_message ("new-instance received. argc = %i; argv follows:", argc);
for (i = 0; i < argc; ++i)
g_message ("argv[%i] = \"%s\"", i, argv[i]);
g_message ("new-instance: returning argc (%i)", argc);
return argc;
}
static gdouble
closure_message_cb (BonoboApplication *app, gint arg_1, gdouble arg_2, gpointer data2)
{
g_message("closure_message_cb: %p, %i, %f, %p",
app, arg_1, arg_2, data2);
return arg_1 * arg_2;
}
int
main (int argc, char *argv [])
{
BonoboApplication *app;
gchar *serverinfo;
Bonobo_RegistrationResult reg_res;
BonoboAppClient *client;
double msg_arg = 3.141592654;
GClosure *closure;
gchar const *envp[] = { "LANG", NULL };
if (bonobo_init (&argc, argv) == FALSE)
g_error ("Can not bonobo_init");
bonobo_activate ();
bonobo_application_add_hook (test_app_hook, (gpointer) 0xdeadbeef);
app = bonobo_application_new ("Libbonobo-Test-Uniqapp");
closure = g_cclosure_new (G_CALLBACK (closure_message_cb),
(gpointer) 0xdeadbeef, NULL);
g_closure_set_marshal (closure, bonobo_marshal_DOUBLE__LONG_DOUBLE);
bonobo_application_register_message (app, CLOSURE_MESSAGE,
"This is a test message",
closure,
G_TYPE_DOUBLE, G_TYPE_LONG,
G_TYPE_DOUBLE, G_TYPE_NONE);
serverinfo = bonobo_application_create_serverinfo (app, envp);
reg_res = bonobo_application_register_unique (app, serverinfo, &client);
g_free (serverinfo);
switch (reg_res)
{
case Bonobo_ACTIVATION_REG_ALREADY_ACTIVE: {
BonoboAppClientMsgDesc const *msgdescs;
GValue *retval;
int i;
g_message ("I am an application client.");
bonobo_object_unref (BONOBO_OBJECT (app));
app = NULL;
msgdescs = bonobo_app_client_msg_list (client);
g_assert (msgdescs);
for (i = 0; msgdescs[i].name; ++i)
g_message ("Application supports message '%s'", msgdescs[i].name);
g_message ("Sending message string '%s' with argument %f",
TEST_MESSAGE, msg_arg);
retval = bonobo_app_client_msg_send (client, TEST_MESSAGE, NULL,
G_TYPE_DOUBLE, msg_arg,
G_TYPE_STRING, "this is a string",
G_TYPE_NONE);
g_message ("Return value: %f", g_value_get_double (retval));
if (retval) {
g_value_unset (retval);
g_free (retval);
}
g_message ("Sending message string '%s' with arguments %i and %f",
CLOSURE_MESSAGE, 10, 3.141592654);
retval = bonobo_app_client_msg_send (client, CLOSURE_MESSAGE,
NULL,
G_TYPE_LONG, 10,
G_TYPE_DOUBLE, 3.141592654,
G_TYPE_NONE);
g_message ("Return value: %f", g_value_get_double (retval));
if (retval) {
g_value_unset (retval);
g_free (retval);
}
g_message ("Sending new-instance, with argc/argv");
i = bonobo_app_client_new_instance (client, argc, argv, NULL);
g_message ("new-instance returned %i", i);
g_message ("Asking the server to quit");
retval = bonobo_app_client_msg_send (client, "quit", NULL, G_TYPE_NONE);
if (retval) {
g_value_unset (retval);
g_free (retval);
}
g_object_unref (client);
return bonobo_debug_shutdown ();
}
case Bonobo_ACTIVATION_REG_SUCCESS:
g_message ("I am an application server");
g_signal_connect (app, "message::test-message",
G_CALLBACK (message_cb), NULL);
g_signal_connect (app, "new-instance",
G_CALLBACK (new_instance_cb), NULL);
bonobo_application_new_instance (app, argc, argv);
g_signal_connect (app, "message::quit",
G_CALLBACK (message_quit_cb), NULL);
break;
case Bonobo_ACTIVATION_REG_ERROR:
default:
g_error("bonobo activation error when registering unique application");
}
bonobo_main ();
if (app) bonobo_object_unref (BONOBO_OBJECT (app));
return bonobo_debug_shutdown ();
}
syntax highlighted by Code2HTML, v. 0.9.1