view plugins/perl/common/Request.xs @ 12919:248b8b39c671

[gaim-migrate @ 15272] Replace GaimBlistNodeAction with the more generic GaimMenuAction, this is in preparation for letting the chat room user list have extensible menus like the blist entries do. (I know it's not exactly the prettiest, and the callback isn't exactly type-safe, when we eventually gobjectify everything we can get some safety back by using (GObject, gpointer) but that's for later.) I'm planning to look into merging GaimPluginActions into GaimMenuActions as well. committer: Tailor Script <tailor@pidgin.im>
author Etan Reisner <pidgin@unreliablesource.net>
date Tue, 17 Jan 2006 23:22:19 +0000
parents 3ab3e68df807
children
line wrap: on
line source

#include "module.h"

/* This breaks on faceprint's amd64 box
void *
gaim_request_action_varg(handle, title, primary, secondary, default_action, user_data, action_count, actions)
	void * handle
	const char *title
	const char *primary
	const char *secondary
	unsigned int default_action
	void *user_data
	size_t action_count
	va_list actions
	*/


typedef struct {
	char *cancel_cb;
	char *ok_cb;
} GaimPerlRequestData;

/********************************************************/
/*                                                      */
/* Callback function that calls a perl subroutine       */
/*                                                      */
/* The void * field data is being used as a way to hide */
/* the perl sub's name in a GaimPerlRequestData         */
/*                                                      */
/********************************************************/
static void
gaim_perl_request_ok_cb(void * data, GaimRequestFields *fields)
{
	GaimPerlRequestData *gpr = (GaimPerlRequestData *)data;

	dSP;
	ENTER;
	SAVETMPS;
	PUSHMARK(sp);

	XPUSHs(gaim_perl_bless_object(fields, "Gaim::Request::Fields"));
	PUTBACK;

	call_pv(gpr->ok_cb, G_EVAL | G_SCALAR);
	SPAGAIN;

	PUTBACK;
	FREETMPS;
	LEAVE;
}

static void
gaim_perl_request_cancel_cb(void * data, GaimRequestFields *fields)
{

	GaimPerlRequestData *gpr = (GaimPerlRequestData *)data;

	dSP;
	ENTER;
	SAVETMPS;
	PUSHMARK(sp);

	XPUSHs(gaim_perl_bless_object(fields, "Gaim::Request::Fields"));
	PUTBACK;
	call_pv(gpr->cancel_cb, G_EVAL | G_SCALAR);
	SPAGAIN;

	PUTBACK;
	FREETMPS;
	LEAVE;
}

MODULE = Gaim::Request  PACKAGE = Gaim::Request  PREFIX = gaim_request_
PROTOTYPES: ENABLE

void *
gaim_request_input(handle, title, primary, secondary, default_value, multiline, masked, hint, ok_text, ok_cb, cancel_text, cancel_cb)
	Gaim::Plugin handle
	const char * title
	const char * primary
	const char * secondary
	const char * default_value
	gboolean multiline
	gboolean masked
	gchar * hint
	const char * ok_text
	SV * ok_cb
	const char * cancel_text
	SV * cancel_cb
CODE:
	GaimPerlRequestData *gpr;
	STRLEN len;
	char *basename, *package;

	basename = g_path_get_basename(handle->path);
	gaim_perl_normalize_script_name(basename);
	package = g_strdup_printf("Gaim::Script::%s", basename);
	gpr = g_new(GaimPerlRequestData, 1);
	gpr->ok_cb = g_strdup_printf("%s::%s", package, SvPV(ok_cb, len));
	gpr->cancel_cb = g_strdup_printf("%s::%s", package, SvPV(cancel_cb, len));

	RETVAL = gaim_request_input(handle, title, primary, secondary, default_value, multiline, masked, hint, ok_text, G_CALLBACK(gaim_perl_request_ok_cb), cancel_text, G_CALLBACK(gaim_perl_request_cancel_cb), gpr);
OUTPUT:
	RETVAL

void *
gaim_request_file(handle, title, filename, savedialog, ok_cb, cancel_cb)
	Gaim::Plugin handle
	const char * title
	const char * filename
	gboolean savedialog
	SV * ok_cb
	SV * cancel_cb
CODE:
	GaimPerlRequestData *gpr;
	STRLEN len;
	char *basename, *package;

	basename = g_path_get_basename(handle->path);
	gaim_perl_normalize_script_name(basename);
	package = g_strdup_printf("Gaim::Script::%s", basename);
	gpr = g_new(GaimPerlRequestData, 1);
	gpr->ok_cb = g_strdup_printf("%s::%s", package, SvPV(ok_cb, len));
	gpr->cancel_cb = g_strdup_printf("%s::%s", package, SvPV(cancel_cb, len));

	RETVAL = gaim_request_file(handle, title, filename, savedialog, G_CALLBACK(gaim_perl_request_ok_cb), G_CALLBACK(gaim_perl_request_cancel_cb), gpr);
OUTPUT:
	RETVAL

void *
gaim_request_fields(handle, title, primary, secondary, fields, ok_text, ok_cb, cancel_text, cancel_cb)
	Gaim::Plugin handle
	const char * title
	const char * primary
	const char * secondary
	Gaim::Request::Fields fields
	const char * ok_text
	SV * ok_cb
	const char * cancel_text
	SV * cancel_cb
CODE:
	GaimPerlRequestData *gpr;
	STRLEN len;
	char *basename, *package;

	basename = g_path_get_basename(handle->path);
	gaim_perl_normalize_script_name(basename);
	package = g_strdup_printf("Gaim::Script::%s", basename);
	gpr = g_new(GaimPerlRequestData, 1);
	gpr->ok_cb = g_strdup_printf("%s::%s", package, SvPV(ok_cb, len));
	gpr->cancel_cb = g_strdup_printf("%s::%s", package, SvPV(cancel_cb, len));

	RETVAL = gaim_request_fields(handle, title, primary, secondary, fields, ok_text, G_CALLBACK(gaim_perl_request_ok_cb), cancel_text, G_CALLBACK(gaim_perl_request_cancel_cb), gpr);
OUTPUT:
	RETVAL

void
gaim_request_close(type, uihandle)
	Gaim::RequestType type
	void * uihandle

void
gaim_request_close_with_handle(handle)
	void * handle

MODULE = Gaim::Request  PACKAGE = Gaim::Request::Field  PREFIX = gaim_request_field_
PROTOTYPES: ENABLE

Gaim::Account
gaim_request_field_account_get_default_value(field)
	Gaim::Request::Field field

IV
gaim_request_field_account_get_filter(field)
	Gaim::Request::Field field
CODE:
	RETVAL = PTR2IV(gaim_request_field_account_get_filter(field));
OUTPUT:
	RETVAL

gboolean
gaim_request_field_account_get_show_all(field)
	Gaim::Request::Field field

Gaim::Account
gaim_request_field_account_get_value(field)
	Gaim::Request::Field field

Gaim::Request::Field
gaim_request_field_account_new(id, text, account = NULL)
	const char *id
	const char *text
	Gaim::Account account

void
gaim_request_field_account_set_default_value(field, default_value)
	Gaim::Request::Field field
	Gaim::Account default_value

void
gaim_request_field_account_set_show_all(field, show_all)
	Gaim::Request::Field field
	gboolean show_all

void
gaim_request_field_account_set_value(field, value)
	Gaim::Request::Field field
	Gaim::Account value

gboolean
gaim_request_field_bool_get_default_value(field)
	Gaim::Request::Field field

gboolean
gaim_request_field_bool_get_value(field)
	Gaim::Request::Field field

Gaim::Request::Field
gaim_request_field_bool_new(id, text, default_value = TRUE)
	const char *id
	const char *text
	gboolean default_value

void
gaim_request_field_bool_set_default_value(field, default_value)
	Gaim::Request::Field field
	gboolean default_value

void
gaim_request_field_bool_set_value(field, value)
	Gaim::Request::Field field
	gboolean value

void
gaim_request_field_choice_add(field, label)
	Gaim::Request::Field field
	const char *label

int
gaim_request_field_choice_get_default_value(field)
	Gaim::Request::Field field

void
gaim_request_field_choice_get_labels(field)
	Gaim::Request::Field field
PREINIT:
	GList *l;
PPCODE:
	for (l = gaim_request_field_choice_get_labels(field); l != NULL; l = l->next) {
		XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
	}

int
gaim_request_field_choice_get_value(field)
	Gaim::Request::Field field

Gaim::Request::Field
gaim_request_field_choice_new(id, text, default_value = 0)
	const char *id
	const char *text
	int default_value

void
gaim_request_field_choice_set_default_value(field, default_value)
	Gaim::Request::Field field
	int default_value

void
gaim_request_field_choice_set_value(field, value)
	Gaim::Request::Field field
	int value

void
gaim_request_field_destroy(field)
	Gaim::Request::Field field

const char *
gaim_request_field_get_id(field)
	Gaim::Request::Field field

const char *
gaim_request_field_get_label(field)
	Gaim::Request::Field field

Gaim::RequestFieldType
gaim_request_field_get_type(field)
	Gaim::Request::Field field

const char *
gaim_request_field_get_type_hint(field)
	Gaim::Request::Field field

int
gaim_request_field_int_get_default_value(field)
	Gaim::Request::Field field

int
gaim_request_field_int_get_value(field)
	Gaim::Request::Field field

Gaim::Request::Field
gaim_request_field_int_new(id, text, default_value = 0)
	const char *id
	const char *text
	int default_value

void
gaim_request_field_int_set_default_value(field, default_value)
	Gaim::Request::Field field
	int default_value

void
gaim_request_field_int_set_value(field, value)
	Gaim::Request::Field field
	int value

gboolean
gaim_request_field_is_required(field)
	Gaim::Request::Field field

gboolean
gaim_request_field_is_visible(field)
	Gaim::Request::Field field

Gaim::Request::Field
gaim_request_field_label_new(id, text)
	const char *id
	const char *text

void
gaim_request_field_list_add(field, item, data)
	Gaim::Request::Field field
	const char *item
	void * data

void
gaim_request_field_list_add_selected(field, item)
	Gaim::Request::Field field
	const char *item

void
gaim_request_field_list_clear_selected(field)
	Gaim::Request::Field field

void *
gaim_request_field_list_get_data(field, text)
	Gaim::Request::Field field
	const char *text

void
gaim_request_field_list_get_items(field)
	Gaim::Request::Field field
PREINIT:
	const GList *l;
PPCODE:
	for (l = gaim_request_field_list_get_items(field); l != NULL; l = l->next) {
		XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
	}

gboolean
gaim_request_field_list_get_multi_select(field)
	Gaim::Request::Field field

void
gaim_request_field_list_get_selected(field)
	Gaim::Request::Field field
PREINIT:
	const GList *l;
PPCODE:
	for (l = gaim_request_field_list_get_selected(field); l != NULL; l = l->next) {
		XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
	}

gboolean
gaim_request_field_list_is_selected(field, item)
	Gaim::Request::Field field
	const char *item

Gaim::Request::Field
gaim_request_field_list_new(id, text)
	const char *id
	const char *text

void
gaim_request_field_list_set_multi_select(field, multi_select)
	Gaim::Request::Field field
	gboolean multi_select

Gaim::Request::Field
gaim_request_field_new(id, text, type)
	const char *id
	const char *text
	Gaim::RequestFieldType type

void
gaim_request_field_set_label(field, label)
	Gaim::Request::Field field
	const char *label

void
gaim_request_field_set_required(field, required)
	Gaim::Request::Field field
	gboolean required

void
gaim_request_field_set_type_hint(field, type_hint)
	Gaim::Request::Field field
	const char *type_hint

void
gaim_request_field_set_visible(field, visible)
	Gaim::Request::Field field
	gboolean visible

const char *
gaim_request_field_string_get_default_value(field)
	Gaim::Request::Field field

const char *
gaim_request_field_string_get_value(field)
	Gaim::Request::Field field

gboolean
gaim_request_field_string_is_editable(field)
	Gaim::Request::Field field

gboolean
gaim_request_field_string_is_masked(field)
	Gaim::Request::Field field

gboolean
gaim_request_field_string_is_multiline(field)
	Gaim::Request::Field field

Gaim::Request::Field
gaim_request_field_string_new(id, text, default_value, multiline)
	const char *id
	const char *text
	const char *default_value
	gboolean multiline

void
gaim_request_field_string_set_default_value(field, default_value)
	Gaim::Request::Field field
	const char *default_value

void
gaim_request_field_string_set_editable(field, editable)
	Gaim::Request::Field field
	gboolean editable

void
gaim_request_field_string_set_masked(field, masked)
	Gaim::Request::Field field
	gboolean masked

void
gaim_request_field_string_set_value(field, value)
	Gaim::Request::Field field
	const char *value

Gaim::Request::UiOps
gaim_request_get_ui_ops()

void
gaim_request_set_ui_ops(ops)
	Gaim::Request::UiOps ops

MODULE = Gaim::Request  PACKAGE = Gaim::Request::Field::Group  PREFIX = gaim_request_field_group_
PROTOTYPES: ENABLE

void
gaim_request_field_group_add_field(group, field)
	Gaim::Request::Field::Group group
	Gaim::Request::Field field

void
gaim_request_field_group_destroy(group)
	Gaim::Request::Field::Group group

void
gaim_request_field_group_get_fields(group)
	Gaim::Request::Field::Group group
PREINIT:
	GList *l;
PPCODE:
	for (l = gaim_request_field_group_get_fields(group); l != NULL; l = l->next) {
		XPUSHs(sv_2mortal(gaim_perl_bless_object(l->data, "Gaim::Request::Field")));
	}

const char *
gaim_request_field_group_get_title(group)
	Gaim::Request::Field::Group group

Gaim::Request::Field::Group
gaim_request_field_group_new(title)
	const char *title

MODULE = Gaim::Request  PACKAGE = Gaim::Request::Fields  PREFIX = gaim_request_fields_
PROTOTYPES: ENABLE

void
gaim_request_fields_add_group(fields, group)
	Gaim::Request::Fields fields
	Gaim::Request::Field::Group group

gboolean
gaim_request_fields_all_required_filled(fields)
	Gaim::Request::Fields fields

void
gaim_request_fields_destroy(fields)
	Gaim::Request::Fields fields

gboolean
gaim_request_fields_exists(fields, id)
	Gaim::Request::Fields fields
	const char *id

Gaim::Account
gaim_request_fields_get_account(fields, id)
	Gaim::Request::Fields fields
	const char *id

gboolean
gaim_request_fields_get_bool(fields, id)
	Gaim::Request::Fields fields
	const char *id

int
gaim_request_fields_get_choice(fields, id)
	Gaim::Request::Fields fields
	const char *id

Gaim::Request::Field
gaim_request_fields_get_field(fields, id)
	Gaim::Request::Fields fields
	const char *id

void
gaim_request_fields_get_groups(fields)
	Gaim::Request::Fields fields
PREINIT:
	GList *l;
PPCODE:
	for (l = gaim_request_fields_get_groups(fields); l != NULL; l = l->next) {
		XPUSHs(sv_2mortal(gaim_perl_bless_object(l->data, "Gaim::Request::Field::Group")));
	}

int
gaim_request_fields_get_integer(fields, id)
	Gaim::Request::Fields fields
	const char *id

void
gaim_request_fields_get_required(fields)
	Gaim::Request::Fields fields
PREINIT:
	const GList *l;
PPCODE:
	for (l = gaim_request_fields_get_required(fields); l != NULL; l = l->next) {
		XPUSHs(sv_2mortal(gaim_perl_bless_object(l->data, "Gaim::Request::Field")));
	}

const char *
gaim_request_fields_get_string(fields, id)
	Gaim::Request::Fields fields
	const char *id

gboolean
gaim_request_fields_is_field_required(fields, id)
	Gaim::Request::Fields fields
	const char *id

Gaim::Request::Fields
gaim_request_fields_new()