tcl_cmds.c

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

C
1,677
字号
	case CMD_CORE_HANDLE:		if (objc != 2) {			Tcl_WrongNumArgs(interp, 2, objv, "");			return TCL_ERROR;		}		Tcl_SetIntObj(result, (int)purple_get_core());		break;	case CMD_CORE_QUIT:		if (objc != 2) {			Tcl_WrongNumArgs(interp, 2, objv, "");			return TCL_ERROR;		}		purple_core_quit();		break;	}	return TCL_OK;}int tcl_cmd_debug(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	char *category, *message;	int lev;	const char *levels[] = { "-misc", "-info", "-warning", "-error", NULL };	PurpleDebugLevel levelind[] = { PURPLE_DEBUG_MISC, PURPLE_DEBUG_INFO, PURPLE_DEBUG_WARNING, PURPLE_DEBUG_ERROR };	int error;	if (objc != 4) {		Tcl_WrongNumArgs(interp, 1, objv, "level category message");		return TCL_ERROR;	}	error = Tcl_GetIndexFromObj(interp, objv[1], levels, "debug level", 0, &lev);	if (error != TCL_OK)		return error;	category = Tcl_GetString(objv[2]);	message = Tcl_GetString(objv[3]);	purple_debug(levelind[lev], category, "%s\n", message);	return TCL_OK;}int tcl_cmd_notify(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	int error, type;	const char *opts[] = { "-error", "-warning", "-info", NULL };	PurpleNotifyMsgType optind[] = { PURPLE_NOTIFY_MSG_ERROR, PURPLE_NOTIFY_MSG_WARNING, PURPLE_NOTIFY_MSG_INFO };	char *title, *msg1, *msg2;	if (objc < 4 || objc > 5) {		Tcl_WrongNumArgs(interp, 1, objv, "?type? title primary secondary");		return TCL_ERROR;	}	if (objc == 4) {		type = 1;			/* Default to warning */		title = Tcl_GetString(objv[1]);		msg1 = Tcl_GetString(objv[2]);		msg2 = Tcl_GetString(objv[3]);	} else {		error = Tcl_GetIndexFromObj(interp, objv[1], opts, "message type", 0, &type);		if (error != TCL_OK)			return error;		title = Tcl_GetString(objv[2]);		msg1 = Tcl_GetString(objv[3]);		msg2 = Tcl_GetString(objv[4]);	}	purple_notify_message(_tcl_plugin, optind[type], title, msg1, msg2, NULL, NULL);	return TCL_OK;}int tcl_cmd_plugins(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	Tcl_Obj *result = Tcl_GetObjResult(interp);	const char *cmds[] = { "handle", NULL };	enum { CMD_PLUGINS_HANDLE } cmd;	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_PLUGINS_HANDLE:		if (objc != 2) {			Tcl_WrongNumArgs(interp, 2, objv, "");			return TCL_ERROR;		}		Tcl_SetIntObj(result, (int)purple_plugins_get_handle());		break;	}	return TCL_OK;}int tcl_cmd_prefs(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	Tcl_Obj *result, *list, *elem, **elems;	const char *cmds[] = { "get", "set", "type", NULL };	enum { CMD_PREFS_GET, CMD_PREFS_SET, CMD_PREFS_TYPE } cmd;	/* char *types[] = { "none", "boolean", "int", "string", "stringlist", NULL }; */	/* enum { TCL_PREFS_NONE, TCL_PREFS_BOOL, TCL_PREFS_INT, TCL_PREFS_STRING, TCL_PREFS_STRINGLIST } type; */	PurplePrefType preftype;	GList *cur;	int error, intval, nelem, i;	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;	result = Tcl_GetObjResult(interp);	switch (cmd) {	case CMD_PREFS_GET:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 1, objv, "path");			return TCL_ERROR;		}		preftype = purple_prefs_get_type(Tcl_GetString(objv[2]));		switch (preftype) {		case PURPLE_PREF_NONE:			Tcl_SetStringObj(result, "pref type none", -1);			return TCL_ERROR;			break;		case PURPLE_PREF_BOOLEAN:			Tcl_SetBooleanObj(result, purple_prefs_get_bool(Tcl_GetString(objv[2])));			break;		case PURPLE_PREF_INT:			Tcl_SetIntObj(result, purple_prefs_get_int(Tcl_GetString(objv[2])));			break;		case PURPLE_PREF_STRING:			Tcl_SetStringObj(result, (char *)purple_prefs_get_string(Tcl_GetString(objv[2])), -1);			break;		case PURPLE_PREF_STRING_LIST:			cur = purple_prefs_get_string_list(Tcl_GetString(objv[2]));			list = Tcl_NewListObj(0, NULL);			while (cur != NULL) {				elem = Tcl_NewStringObj((char *)cur->data, -1);				Tcl_ListObjAppendElement(interp, list, elem);				cur = g_list_next(cur);			}			Tcl_SetObjResult(interp, list);			break;		default:			purple_debug(PURPLE_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype);			Tcl_SetStringObj(result, "unknown pref type", -1);			return TCL_ERROR;		}		break;	case CMD_PREFS_SET:		if (objc != 4) {			Tcl_WrongNumArgs(interp, 1, objv, "path value");			return TCL_ERROR;		}		preftype = purple_prefs_get_type(Tcl_GetString(objv[2]));		switch (preftype) {		case PURPLE_PREF_NONE:			Tcl_SetStringObj(result, "bad path or pref type none", -1);			return TCL_ERROR;			break;		case PURPLE_PREF_BOOLEAN:			if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &intval)) != TCL_OK)				return error;			purple_prefs_set_bool(Tcl_GetString(objv[2]), intval);			break;		case PURPLE_PREF_INT:			if ((error = Tcl_GetIntFromObj(interp, objv[3], &intval)) != TCL_OK)				return error;			purple_prefs_set_int(Tcl_GetString(objv[2]), intval);			break;		case PURPLE_PREF_STRING:			purple_prefs_set_string(Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));			break;		case PURPLE_PREF_STRING_LIST:			if ((error = Tcl_ListObjGetElements(interp, objv[3], &nelem, &elems)) != TCL_OK)				return error;			cur = NULL;			for (i = 0; i < nelem; i++) {				cur = g_list_append(cur, (gpointer)Tcl_GetString(elems[i]));			}			purple_prefs_set_string_list(Tcl_GetString(objv[2]), cur);			g_list_free(cur);			break;		default:			purple_debug(PURPLE_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype);			return TCL_ERROR;		}		break;	case CMD_PREFS_TYPE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 1, objv, "path");			return TCL_ERROR;		}		preftype = purple_prefs_get_type(Tcl_GetString(objv[2]));		switch (preftype) {		case PURPLE_PREF_NONE:			Tcl_SetStringObj(result, "none", -1);			break;		case PURPLE_PREF_BOOLEAN:			Tcl_SetStringObj(result, "boolean", -1);			break;		case PURPLE_PREF_INT:			Tcl_SetStringObj(result, "int", -1);			break;		case PURPLE_PREF_STRING:			Tcl_SetStringObj(result, "string", -1);			break;		case PURPLE_PREF_STRING_LIST:			Tcl_SetStringObj(result, "stringlist", -1);			break;		default:			purple_debug(PURPLE_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype);			Tcl_SetStringObj(result, "unknown", -1);		}		break;	}	return TCL_OK;}int tcl_cmd_presence(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){	const char *cmds[] = { "account", "active_status", "available",			       "chat_user", "context", "conversation", "idle",			       "login", "online", "status", "statuses", NULL };	enum { CMD_PRESENCE_ACCOUNT, CMD_PRESENCE_ACTIVE_STATUS,	       CMD_PRESENCE_AVAILABLE, CMD_PRESENCE_CHAT_USER,	       CMD_PRESENCE_CONTEXT, CMD_PRESENCE_CONVERSATION,	       CMD_PRESENCE_IDLE, CMD_PRESENCE_LOGIN, CMD_PRESENCE_ONLINE,	       CMD_PRESENCE_STATUS, CMD_PRESENCE_STATUSES } cmd;	Tcl_Obj *result = Tcl_GetObjResult(interp);	Tcl_Obj *list, *elem;	PurplePresence *presence;	const GList *cur;	int error, idle, idle_time, login_time;	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_PRESENCE_ACCOUNT:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "presence");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		Tcl_SetObjResult(interp, purple_tcl_ref_new(PurpleTclRefAccount,		                                          purple_presence_get_account(presence)));		break;	case CMD_PRESENCE_ACTIVE_STATUS:		if (objc != 3 && objc != 4 && objc != 5) {			Tcl_WrongNumArgs(interp, 2, objv, "presence [?status_id? | ?-primitive primitive?]");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		if (objc == 3) {			Tcl_SetObjResult(interp,					 purple_tcl_ref_new(PurpleTclRefStatus,							  purple_presence_get_active_status(presence)));		} else if (objc == 4) {			Tcl_SetBooleanObj(result,					  purple_presence_is_status_active(presence,									 Tcl_GetString(objv[3])));		} else {			PurpleStatusPrimitive primitive;			if (strcmp(Tcl_GetString(objv[3]), "-primitive")) {				Tcl_SetStringObj(result, "bad option \"", -1);				Tcl_AppendObjToObj(result, objv[3]);				Tcl_AppendToObj(result,						"\": should be -primitive", -1);				return TCL_ERROR;			}			primitive = purple_primitive_get_type_from_id(Tcl_GetString(objv[4]));			if (primitive == PURPLE_STATUS_UNSET) {				Tcl_SetStringObj(result, "invalid primitive ", -1);				Tcl_AppendObjToObj(result, objv[4]);				return TCL_ERROR;			}			Tcl_SetBooleanObj(result, purple_presence_is_status_primitive_active(presence, primitive));			break;		}		break;	case CMD_PRESENCE_AVAILABLE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "presence");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		Tcl_SetBooleanObj(result, purple_presence_is_available(presence));		break;	case CMD_PRESENCE_CHAT_USER:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "presence");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		Tcl_SetStringObj(result, purple_presence_get_chat_user(presence), -1);		break;	case CMD_PRESENCE_CONTEXT:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "presence");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		switch (purple_presence_get_context(presence)) {		case PURPLE_PRESENCE_CONTEXT_UNSET:			Tcl_SetStringObj(result, "unset", -1);			break;		case PURPLE_PRESENCE_CONTEXT_ACCOUNT:			Tcl_SetStringObj(result, "account", -1);			break;		case PURPLE_PRESENCE_CONTEXT_CONV:			Tcl_SetStringObj(result, "conversation", -1);			break;		case PURPLE_PRESENCE_CONTEXT_BUDDY:			Tcl_SetStringObj(result, "buddy", -1);			break;		}		break;	case CMD_PRESENCE_CONVERSATION:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "presence");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		Tcl_SetObjResult(interp, purple_tcl_ref_new(PurpleTclRefConversation,		                                          purple_presence_get_conversation(presence)));		break;	case CMD_PRESENCE_IDLE:		if (objc < 3 || objc > 5) {			Tcl_WrongNumArgs(interp, 2, objv, "presence ?idle? ?time?");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		if (objc == 3) {			if (purple_presence_is_idle(presence)) {				idle_time = purple_presence_get_idle_time (presence);				Tcl_SetIntObj(result, idle_time);			} else {				result = Tcl_NewListObj(0, NULL);				Tcl_SetObjResult(interp, result);			}			break;		}		if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &idle)) != TCL_OK)			return TCL_ERROR;		if (objc == 4) {			purple_presence_set_idle(presence, idle, time(NULL));		} else if (objc == 5) {			if ((error = Tcl_GetIntFromObj(interp,		                                       objv[4],		                                       &idle_time)) != TCL_OK)				return TCL_ERROR;			purple_presence_set_idle(presence, idle, idle_time);		}		break;	case CMD_PRESENCE_LOGIN:		if (objc != 3 && objc != 4) {			Tcl_WrongNumArgs(interp, 2, objv, "presence ?time?");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		if (objc == 3) {			Tcl_SetIntObj(result, purple_presence_get_login_time(presence));		} else {			if ((error == Tcl_GetIntFromObj(interp,			                                objv[3],			                                &login_time)) != TCL_OK)				return TCL_ERROR;			purple_presence_set_login_time(presence, login_time);		}		break;	case CMD_PRESENCE_ONLINE:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "presence");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		Tcl_SetBooleanObj(result, purple_presence_is_online(presence));		break;	case CMD_PRESENCE_STATUS:		if (objc != 4) {			Tcl_WrongNumArgs(interp, 2, objv, "presence status_id");			return TCL_ERROR;		}		if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)			return TCL_ERROR;		Tcl_SetObjResult(interp,		                 purple_tcl_ref_new(PurpleTclRefStatus,		                                  purple_presence_get_status(presence,		                                                           Tcl_GetString(objv[3]))));		break;	case CMD_PRESENCE_STATUSES:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 2, objv, "presence");

⌨️ 快捷键说明

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