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 + -
显示快捷键?