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