tcl_cmds.c

来自「Linux下的多协议即时通讯程序源代码」· C语言 代码 · 共 1,677 行 · 第 1/4 页

C
1,677
字号
			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		list = Tcl_NewListObj(0, NULL);		for (cur = purple_presence_get_statuses(presence); cur != NULL;		     cur = g_list_next(cur)) {			elem = purple_tcl_ref_new(PurpleTclRefStatus, cur->data);			Tcl_ListObjAppendElement(interp, list, elem);		}		Tcl_SetObjResult(interp, list);		break;	}	return TCL_OK;}int tcl_cmd_savedstatus(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	Tcl_Obj *result = Tcl_GetObjResult(interp);	const char *cmds[] = { "current", "handle", NULL };	enum { CMD_SAVEDSTATUS_CURRENT, CMD_SAVEDSTATUS_HANDLE } cmd;	int error;	PurpleSavedStatus *saved_status;	if (objc < 2) {		Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");		return TCL_ERROR;	}	if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)		return error;	switch (cmd) {	case CMD_SAVEDSTATUS_CURRENT:		if (objc != 2) {			Tcl_WrongNumArgs(interp, 2, objv, "");			return TCL_ERROR;		}		if ((saved_status = purple_savedstatus_get_current()) == NULL)			return TCL_ERROR;		Tcl_ListObjAppendElement(interp, result, Tcl_NewStringObj(purple_savedstatus_get_title(saved_status), -1));		Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj(purple_savedstatus_get_type(saved_status)));		Tcl_ListObjAppendElement(interp, result, Tcl_NewStringObj(purple_savedstatus_get_message(saved_status), -1));		break;	case CMD_SAVEDSTATUS_HANDLE:		if (objc != 2) {			Tcl_WrongNumArgs(interp, 2, objv, "");			return TCL_ERROR;		}		Tcl_SetIntObj(result, (int)purple_savedstatuses_get_handle());		break;	}	return TCL_OK;}int tcl_cmd_send_im(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	PurpleConnection *gc;	char *who, *text;	if (objc != 4) {		Tcl_WrongNumArgs(interp, 1, objv, "gc who text");		return TCL_ERROR;	}	if ((gc = tcl_validate_gc(objv[1], interp)) == NULL)		return TCL_ERROR;	who = Tcl_GetString(objv[2]);	text = Tcl_GetString(objv[3]);	serv_send_im(gc, who, text, 0);	return TCL_OK;}int tcl_cmd_signal(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	const char *cmds[] = { "connect", "disconnect", NULL };	enum { CMD_SIGNAL_CONNECT, CMD_SIGNAL_DISCONNECT } cmd;	struct tcl_signal_handler *handler;	Tcl_Obj *result = Tcl_GetObjResult(interp);	void *instance;	int error;	if (objc < 2) {		Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");		return TCL_ERROR;	}	if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)		return error;	switch (cmd) {	case CMD_SIGNAL_CONNECT:		if (objc != 6) {			Tcl_WrongNumArgs(interp, 2, objv, "instance signal args proc");			return TCL_ERROR;		}		handler = g_new0(struct tcl_signal_handler, 1);		if ((error = Tcl_GetIntFromObj(interp, objv[2], (int *)&handler->instance)) != TCL_OK) {			g_free(handler);			return error;		}		handler->signal = objv[3];		Tcl_IncrRefCount(handler->signal);		handler->args = objv[4];		handler->proc = objv[5];		handler->interp = interp;		if (!tcl_signal_connect(handler)) {			tcl_signal_handler_free(handler);			Tcl_SetIntObj(result, 1);		} else {			Tcl_SetIntObj(result, 0);		}		break;	case CMD_SIGNAL_DISCONNECT:		if (objc != 4) {			Tcl_WrongNumArgs(interp, 2, objv, "instance signal");			return TCL_ERROR;		}		if ((error = Tcl_GetIntFromObj(interp, objv[2], (int *)&instance)) != TCL_OK)			return error;		tcl_signal_disconnect(instance, Tcl_GetString(objv[3]), interp);		break;	}	return TCL_OK;}int tcl_cmd_status(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	const char *cmds[] = { "attr", "type", NULL };	enum { CMD_STATUS_ATTR, CMD_STATUS_TYPE } cmd;	Tcl_Obj *result = Tcl_GetObjResult(interp);	PurpleStatus *status;	PurpleStatusType *status_type;	PurpleValue *value;	const char *attr;	int error, v;	if (objc < 2) {		Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");		return TCL_ERROR;	}	if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)		return error;	switch (cmd) {	case CMD_STATUS_ATTR:		if (objc != 4 && objc != 5) {			Tcl_WrongNumArgs(interp, 2, objv, "status attr_id ?value?");			return TCL_ERROR;		}		if ((status = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatus)) == NULL)			return TCL_ERROR;		attr = Tcl_GetString(objv[3]);		value = purple_status_get_attr_value(status, attr);		if (value == NULL) {			Tcl_SetStringObj(result, "no such attribute", -1);			return TCL_ERROR;		}		switch (purple_value_get_type(value)) {		case PURPLE_TYPE_BOOLEAN:			if (objc == 4) {				Tcl_SetBooleanObj(result, purple_value_get_boolean(value));			} else {				if ((error = Tcl_GetBooleanFromObj(interp, objv[4], &v)) != TCL_OK)					return error;				purple_status_set_attr_boolean(status, attr, v);			}			break;		case PURPLE_TYPE_INT:			if (objc == 4) {				Tcl_SetIntObj(result, purple_value_get_int(value));			} else {				if ((error = Tcl_GetIntFromObj(interp, objv[4], &v)) != TCL_OK)					return error;				purple_status_set_attr_int(status, attr, v );			}			break;		case PURPLE_TYPE_STRING:			if (objc == 4)				Tcl_SetStringObj(result, purple_value_get_string(value), -1);			else				purple_status_set_attr_string(status, attr, Tcl_GetString(objv[4]));			break;		default:			Tcl_SetStringObj(result, "attribute has unknown type", -1);			return TCL_ERROR;		}		break;	case CMD_STATUS_TYPE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "status");			return TCL_ERROR;		}		if ((status = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatus)) == NULL)			return TCL_ERROR;		status_type = purple_status_get_type(status);		Tcl_SetObjResult(interp, purple_tcl_ref_new(PurpleTclRefStatusType,		                                          status_type));		break;	}	return TCL_OK;}int tcl_cmd_status_attr(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	const char *cmds[] = { "id", "name", NULL };	enum { CMD_STATUS_ATTR_ID, CMD_STATUS_ATTR_NAME } cmd;	Tcl_Obj *result = Tcl_GetObjResult(interp);	PurpleStatusAttr *attr;	int error;	if (objc < 2) {		Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");		return TCL_ERROR;	}	if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)		return error;	switch (cmd) {	case CMD_STATUS_ATTR_ID:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "attr");			return TCL_ERROR;		}		if ((attr = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusAttr)) == NULL)			return TCL_ERROR;		Tcl_SetStringObj(result, purple_status_attr_get_id(attr), -1);		break;	case CMD_STATUS_ATTR_NAME:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "attr");			return TCL_ERROR;		}		if ((attr = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusAttr)) == NULL)			return TCL_ERROR;		Tcl_SetStringObj(result, purple_status_attr_get_name(attr), -1);		break;	}	return TCL_OK;}int tcl_cmd_status_type(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	const char *cmds[] = { "attr", "attrs", "available", "exclusive", "id",	                       "independent", "name", "primary_attr",	                       "primitive", "saveable", "user_settable",	                       NULL };	enum { CMD_STATUS_TYPE_ATTR, CMD_STATUS_TYPE_ATTRS,	       CMD_STATUS_TYPE_AVAILABLE, CMD_STATUS_TYPE_EXCLUSIVE,	       CMD_STATUS_TYPE_ID, CMD_STATUS_TYPE_INDEPENDENT,	       CMD_STATUS_TYPE_NAME, CMD_STATUS_TYPE_PRIMARY_ATTR,	       CMD_STATUS_TYPE_PRIMITIVE, CMD_STATUS_TYPE_SAVEABLE,	       CMD_STATUS_TYPE_USER_SETTABLE } cmd;	Tcl_Obj *result = Tcl_GetObjResult(interp);	PurpleStatusType *status_type;	Tcl_Obj *list, *elem;	const GList *cur;	int error;	if (objc < 2) {		Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");		return TCL_ERROR;	}	if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)		return error;	switch (cmd) {	case CMD_STATUS_TYPE_AVAILABLE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetBooleanObj(result, purple_status_type_is_available(status_type));		break;	case CMD_STATUS_TYPE_ATTR:		if (objc != 4) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype attr");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetObjResult(interp,				 purple_tcl_ref_new(PurpleTclRefStatusAttr,						  purple_status_type_get_attr(status_type,									    Tcl_GetStringFromObj(objv[3], NULL))));		break;	case CMD_STATUS_TYPE_ATTRS:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		list = Tcl_NewListObj(0, NULL);		for (cur = purple_status_type_get_attrs(status_type);		     cur != NULL; cur = g_list_next(cur)) {			elem = purple_tcl_ref_new(PurpleTclRefStatusAttr, cur->data);			Tcl_ListObjAppendElement(interp, list, elem);		}		Tcl_SetObjResult(interp, list);		break;	case CMD_STATUS_TYPE_EXCLUSIVE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetBooleanObj(result, purple_status_type_is_exclusive(status_type));		break;	case CMD_STATUS_TYPE_ID:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetStringObj(result, purple_status_type_get_id(status_type), -1);		break;	case CMD_STATUS_TYPE_INDEPENDENT:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetBooleanObj(result, purple_status_type_is_independent(status_type));		break;	case CMD_STATUS_TYPE_NAME:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetStringObj(result, purple_status_type_get_name(status_type), -1);		break;	case CMD_STATUS_TYPE_PRIMITIVE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetStringObj(result, purple_primitive_get_id_from_type(purple_status_type_get_primitive(status_type)), -1);		break;	case CMD_STATUS_TYPE_PRIMARY_ATTR:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetStringObj(result, purple_status_type_get_primary_attr(status_type), -1);		break;	case CMD_STATUS_TYPE_SAVEABLE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetBooleanObj(result, purple_status_type_is_saveable(status_type));		break;	case CMD_STATUS_TYPE_USER_SETTABLE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "statustype");			return TCL_ERROR;		}		if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)			return TCL_ERROR;		Tcl_SetBooleanObj(result, purple_status_type_is_user_settable(status_type));		break;	}	return TCL_OK;}static gboolean unload_self(gpointer data){	PurplePlugin *plugin = data;	purple_plugin_unload(plugin);	return FALSE;}int tcl_cmd_unload(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	PurplePlugin *plugin;	if (objc != 1) {		Tcl_WrongNumArgs(interp, 1, objv, "");		return TCL_ERROR;	}	if ((plugin = tcl_interp_get_plugin(interp)) == NULL) {		/* This isn't exactly OK, but heh.  What do you do? */		return TCL_OK;	}	/* We can't unload immediately, but we can unload at the first 	 * known safe opportunity. */	g_idle_add(unload_self, (gpointer)plugin);	return TCL_OK;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?