Files
gimp/libgimpbase/gimpprotocol.c
Michael Natterer 2d6f808ff8 pdb: add a new PDB group "item" and move lots of functions to it
The item groups has all the duplicated functionality from drawable
and vectors (name, visible, linked etc).

Hijack the unused GIMP_PDB_REGION and turn it into GIMP_PDB_ITEM;
change all protocol aware files accordingly and bump the protocol
version number. Change script-fu to handle the new type.
2010-07-09 09:34:44 +02:00

1866 lines
58 KiB
C

/* LIBGIMP - The GIMP Library
* Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <glib-object.h>
#include "gimpbasetypes.h"
#include "gimpparasite.h"
#include "gimpprotocol.h"
#include "gimpwire.h"
static void _gp_quit_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_quit_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_quit_destroy (GimpWireMessage *msg);
static void _gp_config_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_config_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_config_destroy (GimpWireMessage *msg);
static void _gp_tile_req_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_tile_req_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_tile_req_destroy (GimpWireMessage *msg);
static void _gp_tile_ack_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_tile_ack_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_tile_ack_destroy (GimpWireMessage *msg);
static void _gp_tile_data_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_tile_data_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_tile_data_destroy (GimpWireMessage *msg);
static void _gp_proc_run_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_run_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_run_destroy (GimpWireMessage *msg);
static void _gp_proc_return_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_return_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_return_destroy (GimpWireMessage *msg);
static void _gp_temp_proc_run_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_temp_proc_run_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_temp_proc_run_destroy (GimpWireMessage *msg);
static void _gp_temp_proc_return_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_temp_proc_return_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_temp_proc_return_destroy (GimpWireMessage *msg);
static void _gp_proc_install_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_install_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_install_destroy (GimpWireMessage *msg);
static void _gp_proc_uninstall_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_uninstall_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_proc_uninstall_destroy (GimpWireMessage *msg);
static void _gp_extension_ack_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_extension_ack_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_extension_ack_destroy (GimpWireMessage *msg);
static void _gp_params_read (GIOChannel *channel,
GPParam **params,
guint *nparams,
gpointer user_data);
static void _gp_params_write (GIOChannel *channel,
GPParam *params,
gint nparams,
gpointer user_data);
static void _gp_has_init_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_has_init_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data);
static void _gp_has_init_destroy (GimpWireMessage *msg);
void
gp_init (void)
{
gimp_wire_register (GP_QUIT,
_gp_quit_read,
_gp_quit_write,
_gp_quit_destroy);
gimp_wire_register (GP_CONFIG,
_gp_config_read,
_gp_config_write,
_gp_config_destroy);
gimp_wire_register (GP_TILE_REQ,
_gp_tile_req_read,
_gp_tile_req_write,
_gp_tile_req_destroy);
gimp_wire_register (GP_TILE_ACK,
_gp_tile_ack_read,
_gp_tile_ack_write,
_gp_tile_ack_destroy);
gimp_wire_register (GP_TILE_DATA,
_gp_tile_data_read,
_gp_tile_data_write,
_gp_tile_data_destroy);
gimp_wire_register (GP_PROC_RUN,
_gp_proc_run_read,
_gp_proc_run_write,
_gp_proc_run_destroy);
gimp_wire_register (GP_PROC_RETURN,
_gp_proc_return_read,
_gp_proc_return_write,
_gp_proc_return_destroy);
gimp_wire_register (GP_TEMP_PROC_RUN,
_gp_temp_proc_run_read,
_gp_temp_proc_run_write,
_gp_temp_proc_run_destroy);
gimp_wire_register (GP_TEMP_PROC_RETURN,
_gp_temp_proc_return_read,
_gp_temp_proc_return_write,
_gp_temp_proc_return_destroy);
gimp_wire_register (GP_PROC_INSTALL,
_gp_proc_install_read,
_gp_proc_install_write,
_gp_proc_install_destroy);
gimp_wire_register (GP_PROC_UNINSTALL,
_gp_proc_uninstall_read,
_gp_proc_uninstall_write,
_gp_proc_uninstall_destroy);
gimp_wire_register (GP_EXTENSION_ACK,
_gp_extension_ack_read,
_gp_extension_ack_write,
_gp_extension_ack_destroy);
gimp_wire_register (GP_HAS_INIT,
_gp_has_init_read,
_gp_has_init_write,
_gp_has_init_destroy);
}
gboolean
gp_quit_write (GIOChannel *channel,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_QUIT;
msg.data = NULL;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_config_write (GIOChannel *channel,
GPConfig *config,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_CONFIG;
msg.data = config;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_tile_req_write (GIOChannel *channel,
GPTileReq *tile_req,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_TILE_REQ;
msg.data = tile_req;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_tile_ack_write (GIOChannel *channel,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_TILE_ACK;
msg.data = NULL;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_tile_data_write (GIOChannel *channel,
GPTileData *tile_data,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_TILE_DATA;
msg.data = tile_data;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_proc_run_write (GIOChannel *channel,
GPProcRun *proc_run,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_PROC_RUN;
msg.data = proc_run;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_proc_return_write (GIOChannel *channel,
GPProcReturn *proc_return,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_PROC_RETURN;
msg.data = proc_return;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_temp_proc_run_write (GIOChannel *channel,
GPProcRun *proc_run,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_TEMP_PROC_RUN;
msg.data = proc_run;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_temp_proc_return_write (GIOChannel *channel,
GPProcReturn *proc_return,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_TEMP_PROC_RETURN;
msg.data = proc_return;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_proc_install_write (GIOChannel *channel,
GPProcInstall *proc_install,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_PROC_INSTALL;
msg.data = proc_install;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_proc_uninstall_write (GIOChannel *channel,
GPProcUninstall *proc_uninstall,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_PROC_UNINSTALL;
msg.data = proc_uninstall;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_extension_ack_write (GIOChannel *channel,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_EXTENSION_ACK;
msg.data = NULL;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
gboolean
gp_has_init_write (GIOChannel *channel,
gpointer user_data)
{
GimpWireMessage msg;
msg.type = GP_HAS_INIT;
msg.data = NULL;
if (! gimp_wire_write_msg (channel, &msg, user_data))
return FALSE;
if (! gimp_wire_flush (channel, user_data))
return FALSE;
return TRUE;
}
/* quit */
static void
_gp_quit_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_quit_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_quit_destroy (GimpWireMessage *msg)
{
}
/* config */
static void
_gp_config_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPConfig *config = g_slice_new0 (GPConfig);
if (! _gimp_wire_read_int32 (channel,
&config->version, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&config->tile_width, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&config->tile_height, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &config->shm_ID, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->check_size, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->check_type, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->show_help_button, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->use_cpu_accel, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->gimp_reserved_5, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->gimp_reserved_6, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->gimp_reserved_7, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->gimp_reserved_8, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->install_cmap, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int8 (channel,
(guint8 *) &config->show_tooltips, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &config->min_colors, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &config->gdisp_ID, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&config->app_name, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&config->wm_class, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&config->display_name, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &config->monitor_number, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&config->timestamp, 1, user_data))
goto cleanup;
msg->data = config;
return;
cleanup:
g_free (config->app_name);
g_free (config->wm_class);
g_free (config->display_name);
g_slice_free (GPConfig, config);
}
static void
_gp_config_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPConfig *config = msg->data;
if (! _gimp_wire_write_int32 (channel,
&config->version, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&config->tile_width, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&config->tile_height, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &config->shm_ID, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->check_size, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->check_type, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->show_help_button, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->use_cpu_accel, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->gimp_reserved_5, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->gimp_reserved_6, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->gimp_reserved_7, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->gimp_reserved_8, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->install_cmap, 1,
user_data))
return;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &config->show_tooltips, 1,
user_data))
return;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &config->min_colors, 1,
user_data))
return;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &config->gdisp_ID, 1,
user_data))
return;
if (! _gimp_wire_write_string (channel,
&config->app_name, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&config->wm_class, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&config->display_name, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &config->monitor_number, 1,
user_data))
return;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &config->timestamp, 1,
user_data))
return;
}
static void
_gp_config_destroy (GimpWireMessage *msg)
{
GPConfig *config = msg->data;
if (config)
{
g_free (config->app_name);
g_free (config->wm_class);
g_free (config->display_name);
g_slice_free (GPConfig, config);
}
}
/* tile_req */
static void
_gp_tile_req_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPTileReq *tile_req = g_slice_new0 (GPTileReq);
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &tile_req->drawable_ID, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_req->tile_num, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_req->shadow, 1, user_data))
goto cleanup;
msg->data = tile_req;
return;
cleanup:
g_slice_free (GPTileReq, tile_req);
msg->data = NULL;
}
static void
_gp_tile_req_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPTileReq *tile_req = msg->data;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &tile_req->drawable_ID, 1,
user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_req->tile_num, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_req->shadow, 1, user_data))
return;
}
static void
_gp_tile_req_destroy (GimpWireMessage *msg)
{
GPTileReq *tile_req = msg->data;
if (tile_req)
g_slice_free (GPTileReq, msg->data);
}
/* tile_ack */
static void
_gp_tile_ack_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_tile_ack_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_tile_ack_destroy (GimpWireMessage *msg)
{
}
/* tile_data */
static void
_gp_tile_data_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPTileData *tile_data = g_slice_new0 (GPTileData);
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &tile_data->drawable_ID, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_data->tile_num, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_data->shadow, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_data->bpp, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_data->width, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_data->height, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&tile_data->use_shm, 1, user_data))
goto cleanup;
if (!tile_data->use_shm)
{
guint length = tile_data->width * tile_data->height * tile_data->bpp;
tile_data->data = g_new (guchar, length);
if (! _gimp_wire_read_int8 (channel,
(guint8 *) tile_data->data, length,
user_data))
goto cleanup;
}
msg->data = tile_data;
return;
cleanup:
g_free (tile_data->data);
g_slice_free (GPTileData, tile_data);
msg->data = NULL;
}
static void
_gp_tile_data_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPTileData *tile_data = msg->data;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &tile_data->drawable_ID, 1,
user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_data->tile_num, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_data->shadow, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_data->bpp, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_data->width, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_data->height, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&tile_data->use_shm, 1, user_data))
return;
if (!tile_data->use_shm)
{
guint length = tile_data->width * tile_data->height * tile_data->bpp;
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) tile_data->data, length,
user_data))
return;
}
}
static void
_gp_tile_data_destroy (GimpWireMessage *msg)
{
GPTileData *tile_data = msg->data;
if (tile_data)
{
g_free (tile_data->data);
g_slice_free (GPTileData, tile_data);
}
}
/* proc_run */
static void
_gp_proc_run_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcRun *proc_run = g_slice_new0 (GPProcRun);
if (! _gimp_wire_read_string (channel, &proc_run->name, 1, user_data))
goto cleanup;
_gp_params_read (channel,
&proc_run->params, (guint *) &proc_run->nparams,
user_data);
msg->data = proc_run;
return;
cleanup:
g_slice_free (GPProcRun, proc_run);
msg->data = NULL;
}
static void
_gp_proc_run_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcRun *proc_run = msg->data;
if (! _gimp_wire_write_string (channel, &proc_run->name, 1, user_data))
return;
_gp_params_write (channel, proc_run->params, proc_run->nparams, user_data);
}
static void
_gp_proc_run_destroy (GimpWireMessage *msg)
{
GPProcRun *proc_run = msg->data;
if (proc_run)
{
gp_params_destroy (proc_run->params, proc_run->nparams);
g_free (proc_run->name);
g_slice_free (GPProcRun, proc_run);
}
}
/* proc_return */
static void
_gp_proc_return_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcReturn *proc_return = g_slice_new0 (GPProcReturn);
if (! _gimp_wire_read_string (channel, &proc_return->name, 1, user_data))
goto cleanup;
_gp_params_read (channel,
&proc_return->params, (guint *) &proc_return->nparams,
user_data);
msg->data = proc_return;
return;
cleanup:
g_slice_free (GPProcReturn, proc_return);
msg->data = NULL;
}
static void
_gp_proc_return_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcReturn *proc_return = msg->data;
if (! _gimp_wire_write_string (channel, &proc_return->name, 1, user_data))
return;
_gp_params_write (channel,
proc_return->params, proc_return->nparams, user_data);
}
static void
_gp_proc_return_destroy (GimpWireMessage *msg)
{
GPProcReturn *proc_return = msg->data;
if (proc_return)
{
gp_params_destroy (proc_return->params, proc_return->nparams);
g_free (proc_return->name);
g_slice_free (GPProcReturn, proc_return);
}
}
/* temp_proc_run */
static void
_gp_temp_proc_run_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
_gp_proc_run_read (channel, msg, user_data);
}
static void
_gp_temp_proc_run_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
_gp_proc_run_write (channel, msg, user_data);
}
static void
_gp_temp_proc_run_destroy (GimpWireMessage *msg)
{
_gp_proc_run_destroy (msg);
}
/* temp_proc_return */
static void
_gp_temp_proc_return_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
_gp_proc_return_read (channel, msg, user_data);
}
static void
_gp_temp_proc_return_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
_gp_proc_return_write (channel, msg, user_data);
}
static void
_gp_temp_proc_return_destroy (GimpWireMessage *msg)
{
_gp_proc_return_destroy (msg);
}
/* proc_install */
static void
_gp_proc_install_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcInstall *proc_install = g_slice_new0 (GPProcInstall);
gint i;
if (! _gimp_wire_read_string (channel,
&proc_install->name, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->blurb, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->help, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->author, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->copyright, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->date, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->menu_path, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->image_types, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&proc_install->type, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&proc_install->nparams, 1, user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&proc_install->nreturn_vals, 1, user_data))
goto cleanup;
proc_install->params = g_new0 (GPParamDef, proc_install->nparams);
for (i = 0; i < proc_install->nparams; i++)
{
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &proc_install->params[i].type, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->params[i].name, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->params[i].description, 1,
user_data))
goto cleanup;
}
proc_install->return_vals = g_new0 (GPParamDef, proc_install->nreturn_vals);
for (i = 0; i < proc_install->nreturn_vals; i++)
{
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &proc_install->return_vals[i].type, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->return_vals[i].name, 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_string (channel,
&proc_install->return_vals[i].description, 1,
user_data))
goto cleanup;
}
msg->data = proc_install;
return;
cleanup:
g_free (proc_install->name);
g_free (proc_install->blurb);
g_free (proc_install->help);
g_free (proc_install->author);
g_free (proc_install->copyright);
g_free (proc_install->date);
g_free (proc_install->menu_path);
g_free (proc_install->image_types);
if (proc_install->params)
{
for (i = 0; i < proc_install->nparams; i++)
{
if (!proc_install->params[i].name)
break;
g_free (proc_install->params[i].name);
g_free (proc_install->params[i].description);
}
g_free (proc_install->params);
}
if (proc_install->return_vals)
{
for (i = 0; i < proc_install->nreturn_vals; i++)
{
if (!proc_install->return_vals[i].name)
break;
g_free (proc_install->return_vals[i].name);
g_free (proc_install->return_vals[i].description);
}
g_free (proc_install->return_vals);
}
g_slice_free (GPProcInstall, proc_install);
msg->data = NULL;
}
static void
_gp_proc_install_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcInstall *proc_install = msg->data;
gint i;
if (! _gimp_wire_write_string (channel,
&proc_install->name, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->blurb, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->help, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->author, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->copyright, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->date, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->menu_path, 1, user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->image_types, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&proc_install->type, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&proc_install->nparams, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel,
&proc_install->nreturn_vals, 1, user_data))
return;
for (i = 0; i < proc_install->nparams; i++)
{
if (! _gimp_wire_write_int32 (channel,
(guint32 *) &proc_install->params[i].type, 1,
user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->params[i].name, 1,
user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->params[i].description, 1,
user_data))
return;
}
for (i = 0; i < proc_install->nreturn_vals; i++)
{
if (! _gimp_wire_write_int32 (channel,
(guint32 *) &proc_install->return_vals[i].type, 1,
user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->return_vals[i].name, 1,
user_data))
return;
if (! _gimp_wire_write_string (channel,
&proc_install->return_vals[i].description, 1,
user_data))
return;
}
}
static void
_gp_proc_install_destroy (GimpWireMessage *msg)
{
GPProcInstall *proc_install = msg->data;
if (proc_install)
{
gint i;
g_free (proc_install->name);
g_free (proc_install->blurb);
g_free (proc_install->help);
g_free (proc_install->author);
g_free (proc_install->copyright);
g_free (proc_install->date);
g_free (proc_install->menu_path);
g_free (proc_install->image_types);
for (i = 0; i < proc_install->nparams; i++)
{
g_free (proc_install->params[i].name);
g_free (proc_install->params[i].description);
}
for (i = 0; i < proc_install->nreturn_vals; i++)
{
g_free (proc_install->return_vals[i].name);
g_free (proc_install->return_vals[i].description);
}
g_free (proc_install->params);
g_free (proc_install->return_vals);
g_slice_free (GPProcInstall, proc_install);
}
}
/* proc_uninstall */
static void
_gp_proc_uninstall_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcUninstall *proc_uninstall = g_slice_new0 (GPProcUninstall);
if (! _gimp_wire_read_string (channel, &proc_uninstall->name, 1, user_data))
goto cleanup;
msg->data = proc_uninstall;
return;
cleanup:
g_slice_free (GPProcUninstall, proc_uninstall);
}
static void
_gp_proc_uninstall_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
GPProcUninstall *proc_uninstall = msg->data;
if (! _gimp_wire_write_string (channel, &proc_uninstall->name, 1, user_data))
return;
}
static void
_gp_proc_uninstall_destroy (GimpWireMessage *msg)
{
GPProcUninstall *proc_uninstall = msg->data;
if (proc_uninstall)
{
g_free (proc_uninstall->name);
g_slice_free (GPProcUninstall, proc_uninstall);
}
}
/* extension_ack */
static void
_gp_extension_ack_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_extension_ack_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_extension_ack_destroy (GimpWireMessage *msg)
{
}
/* params */
static void
_gp_params_read (GIOChannel *channel,
GPParam **params,
guint *nparams,
gpointer user_data)
{
gint i, j;
if (! _gimp_wire_read_int32 (channel, (guint32 *) nparams, 1, user_data))
return;
if (*nparams == 0)
{
*params = NULL;
return;
}
*params = g_new0 (GPParam, *nparams);
for (i = 0; i < *nparams; i++)
{
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].type, 1,
user_data))
goto cleanup;
switch ((*params)[i].type)
{
case GIMP_PDB_INT32:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_int32, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_INT16:
if (! _gimp_wire_read_int16 (channel,
(guint16 *) &(*params)[i].data.d_int16, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_INT8:
if (! _gimp_wire_read_int8 (channel,
&(*params)[i].data.d_int8, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_FLOAT:
if (! _gimp_wire_read_double (channel,
&(*params)[i].data.d_float, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_STRING:
if (! _gimp_wire_read_string (channel,
&(*params)[i].data.d_string, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_INT32ARRAY:
(*params)[i-1].data.d_int32 = MAX (0, (*params)[i-1].data.d_int32);
(*params)[i].data.d_int32array = g_new (gint32,
(*params)[i-1].data.d_int32);
if (! _gimp_wire_read_int32 (channel,
(guint32 *) (*params)[i].data.d_int32array,
(*params)[i-1].data.d_int32,
user_data))
{
g_free ((*params)[i].data.d_int32array);
goto cleanup;
}
break;
case GIMP_PDB_INT16ARRAY:
(*params)[i-1].data.d_int32 = MAX (0, (*params)[i-1].data.d_int32);
(*params)[i].data.d_int16array = g_new (gint16,
(*params)[i-1].data.d_int32);
if (! _gimp_wire_read_int16 (channel,
(guint16 *) (*params)[i].data.d_int16array,
(*params)[i-1].data.d_int32,
user_data))
{
g_free ((*params)[i].data.d_int16array);
goto cleanup;
}
break;
case GIMP_PDB_INT8ARRAY:
(*params)[i-1].data.d_int32 = MAX (0, (*params)[i-1].data.d_int32);
(*params)[i].data.d_int8array = g_new (guint8,
(*params)[i-1].data.d_int32);
if (! _gimp_wire_read_int8 (channel,
(*params)[i].data.d_int8array,
(*params)[i-1].data.d_int32,
user_data))
{
g_free ((*params)[i].data.d_int8array);
goto cleanup;
}
break;
case GIMP_PDB_FLOATARRAY:
(*params)[i-1].data.d_int32 = MAX (0, (*params)[i-1].data.d_int32);
(*params)[i].data.d_floatarray = g_new (gdouble,
(*params)[i-1].data.d_int32);
if (! _gimp_wire_read_double (channel,
(*params)[i].data.d_floatarray,
(*params)[i-1].data.d_int32,
user_data))
{
g_free ((*params)[i].data.d_floatarray);
goto cleanup;
}
break;
case GIMP_PDB_STRINGARRAY:
(*params)[i-1].data.d_int32 = MAX (0, (*params)[i-1].data.d_int32);
(*params)[i].data.d_stringarray = g_new0 (gchar *,
(*params)[i-1].data.d_int32);
if (! _gimp_wire_read_string (channel,
(*params)[i].data.d_stringarray,
(*params)[i-1].data.d_int32,
user_data))
{
for (j = 0; j < (*params)[i-1].data.d_int32; j++)
g_free (((*params)[i].data.d_stringarray)[j]);
g_free ((*params)[i].data.d_stringarray);
goto cleanup;
}
break;
case GIMP_PDB_COLOR:
if (! _gimp_wire_read_color (channel,
&(*params)[i].data.d_color, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_ITEM:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_item, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_DISPLAY:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_display, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_IMAGE:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_image, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_LAYER:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_layer, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_CHANNEL:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_channel, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_DRAWABLE:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_drawable, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_SELECTION:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_selection, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_COLORARRAY:
(*params)[i].data.d_colorarray = g_new (GimpRGB,
(*params)[i-1].data.d_int32);
if (! _gimp_wire_read_color (channel,
(*params)[i].data.d_colorarray,
(*params)[i-1].data.d_int32,
user_data))
{
g_free ((*params)[i].data.d_colorarray);
goto cleanup;
}
break;
case GIMP_PDB_VECTORS:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_vectors, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_PARASITE:
if (! _gimp_wire_read_string (channel,
&(*params)[i].data.d_parasite.name, 1,
user_data))
goto cleanup;
if ((*params)[i].data.d_parasite.name == NULL)
{
/* we have a null parasite */
(*params)[i].data.d_parasite.data = NULL;
break;
}
if (! _gimp_wire_read_int32 (channel,
&((*params)[i].data.d_parasite.flags), 1,
user_data))
goto cleanup;
if (! _gimp_wire_read_int32 (channel,
&((*params)[i].data.d_parasite.size), 1,
user_data))
goto cleanup;
if ((*params)[i].data.d_parasite.size > 0)
{
(*params)[i].data.d_parasite.data =
g_malloc ((*params)[i].data.d_parasite.size);
if (! _gimp_wire_read_int8 (channel,
(*params)[i].data.d_parasite.data,
(*params)[i].data.d_parasite.size,
user_data))
{
g_free ((*params)[i].data.d_parasite.data);
goto cleanup;
}
}
else
(*params)[i].data.d_parasite.data = NULL;
break;
case GIMP_PDB_STATUS:
if (! _gimp_wire_read_int32 (channel,
(guint32 *) &(*params)[i].data.d_status, 1,
user_data))
goto cleanup;
break;
case GIMP_PDB_END:
break;
}
}
return;
cleanup:
*nparams = 0;
g_free (*params);
*params = NULL;
}
static void
_gp_params_write (GIOChannel *channel,
GPParam *params,
gint nparams,
gpointer user_data)
{
gint i;
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &nparams, 1, user_data))
return;
for (i = 0; i < nparams; i++)
{
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].type, 1,
user_data))
return;
switch (params[i].type)
{
case GIMP_PDB_INT32:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_int32, 1,
user_data))
return;
break;
case GIMP_PDB_INT16:
if (! _gimp_wire_write_int16 (channel,
(const guint16 *) &params[i].data.d_int16, 1,
user_data))
return;
break;
case GIMP_PDB_INT8:
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) &params[i].data.d_int8, 1,
user_data))
return;
break;
case GIMP_PDB_FLOAT:
if (! _gimp_wire_write_double (channel,
&params[i].data.d_float, 1,
user_data))
return;
break;
case GIMP_PDB_STRING:
if (! _gimp_wire_write_string (channel,
&params[i].data.d_string, 1,
user_data))
return;
break;
case GIMP_PDB_INT32ARRAY:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) params[i].data.d_int32array,
params[i-1].data.d_int32,
user_data))
return;
break;
case GIMP_PDB_INT16ARRAY:
if (! _gimp_wire_write_int16 (channel,
(const guint16 *) params[i].data.d_int16array,
params[i-1].data.d_int32,
user_data))
return;
break;
case GIMP_PDB_INT8ARRAY:
if (! _gimp_wire_write_int8 (channel,
(const guint8 *) params[i].data.d_int8array,
params[i-1].data.d_int32,
user_data))
return;
break;
case GIMP_PDB_FLOATARRAY:
if (! _gimp_wire_write_double (channel,
params[i].data.d_floatarray,
params[i-1].data.d_int32,
user_data))
return;
break;
case GIMP_PDB_STRINGARRAY:
if (! _gimp_wire_write_string (channel,
params[i].data.d_stringarray,
params[i-1].data.d_int32,
user_data))
return;
break;
case GIMP_PDB_COLOR:
if (! _gimp_wire_write_color (channel,
&params[i].data.d_color, 1, user_data))
return;
break;
case GIMP_PDB_ITEM:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_item, 1,
user_data))
return;
break;
case GIMP_PDB_DISPLAY:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_display, 1,
user_data))
return;
break;
case GIMP_PDB_IMAGE:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_image, 1,
user_data))
return;
break;
case GIMP_PDB_LAYER:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_layer, 1,
user_data))
return;
break;
case GIMP_PDB_CHANNEL:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_channel, 1,
user_data))
return;
break;
case GIMP_PDB_DRAWABLE:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_drawable, 1,
user_data))
return;
break;
case GIMP_PDB_SELECTION:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_selection, 1,
user_data))
return;
break;
case GIMP_PDB_COLORARRAY:
if (! _gimp_wire_write_color (channel,
params[i].data.d_colorarray,
params[i-1].data.d_int32,
user_data))
return;
break;
case GIMP_PDB_VECTORS:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_vectors, 1,
user_data))
return;
break;
case GIMP_PDB_PARASITE:
{
GimpParasite *p = &params[i].data.d_parasite;
if (p->name == NULL)
{
/* write a null string to signal a null parasite */
_gimp_wire_write_string (channel, &p->name, 1, user_data);
break;
}
if (! _gimp_wire_write_string (channel, &p->name, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel, &p->flags, 1, user_data))
return;
if (! _gimp_wire_write_int32 (channel, &p->size, 1, user_data))
return;
if (p->size > 0)
{
if (! _gimp_wire_write_int8 (channel,
p->data, p->size, user_data))
return;
}
}
break;
case GIMP_PDB_STATUS:
if (! _gimp_wire_write_int32 (channel,
(const guint32 *) &params[i].data.d_status, 1,
user_data))
return;
break;
case GIMP_PDB_END:
break;
}
}
}
void
gp_params_destroy (GPParam *params,
gint nparams)
{
gint i;
for (i = 0; i < nparams; i++)
{
switch (params[i].type)
{
case GIMP_PDB_INT32:
case GIMP_PDB_INT16:
case GIMP_PDB_INT8:
case GIMP_PDB_FLOAT:
case GIMP_PDB_COLOR:
case GIMP_PDB_ITEM:
case GIMP_PDB_DISPLAY:
case GIMP_PDB_IMAGE:
case GIMP_PDB_LAYER:
case GIMP_PDB_CHANNEL:
case GIMP_PDB_DRAWABLE:
case GIMP_PDB_SELECTION:
case GIMP_PDB_VECTORS:
case GIMP_PDB_STATUS:
break;
case GIMP_PDB_STRING:
g_free (params[i].data.d_string);
break;
case GIMP_PDB_INT32ARRAY:
g_free (params[i].data.d_int32array);
break;
case GIMP_PDB_INT16ARRAY:
g_free (params[i].data.d_int16array);
break;
case GIMP_PDB_INT8ARRAY:
g_free (params[i].data.d_int8array);
break;
case GIMP_PDB_FLOATARRAY:
g_free (params[i].data.d_floatarray);
break;
case GIMP_PDB_STRINGARRAY:
if ((i > 0) && (params[i-1].type == GIMP_PDB_INT32))
{
gint count = params[i-1].data.d_int32;
gint j;
for (j = 0; j < count; j++)
g_free (params[i].data.d_stringarray[j]);
g_free (params[i].data.d_stringarray);
}
break;
case GIMP_PDB_COLORARRAY:
g_free (params[i].data.d_colorarray);
break;
case GIMP_PDB_PARASITE:
if (params[i].data.d_parasite.name)
g_free (params[i].data.d_parasite.name);
if (params[i].data.d_parasite.data)
g_free (params[i].data.d_parasite.data);
break;
case GIMP_PDB_END:
break;
}
}
g_free (params);
}
/* has_init */
static void
_gp_has_init_read (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_has_init_write (GIOChannel *channel,
GimpWireMessage *msg,
gpointer user_data)
{
}
static void
_gp_has_init_destroy (GimpWireMessage *msg)
{
}