comparison plugins/tcl/tcl_cmds.c @ 13826:475aed3aacfc

[gaim-migrate @ 16270] Allow account status to be set (since setting status attrs does nothing) committer: Tailor Script <tailor@pidgin.im>
author Ethan Blanton <elb@pidgin.im>
date Fri, 16 Jun 2006 16:17:20 +0000
parents 3b8dc44ff25f
children 597beb5c9de1
comparison
equal deleted inserted replaced
13825:140ffd4934a0 13826:475aed3aacfc
95 } 95 }
96 96
97 int tcl_cmd_account(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 97 int tcl_cmd_account(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
98 { 98 {
99 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem; 99 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem;
100 const char *cmds[] = { "active_status", "alias", "connect", 100 const char *cmds[] = { "alias", "connect", "connection", "disconnect",
101 "connection", "disconnect", "enabled", "find", 101 "enabled", "find", "handle", "isconnected",
102 "handle", "isconnected", "list", "presence", 102 "list", "presence", "protocol", "status",
103 "protocol", "status_type", "status_types", 103 "status_type", "status_types", "username",
104 "username", NULL }; 104 NULL };
105 enum { CMD_ACCOUNT_ACTIVE_STATUS, CMD_ACCOUNT_ALIAS, 105 enum { CMD_ACCOUNT_ALIAS,
106 CMD_ACCOUNT_CONNECT, CMD_ACCOUNT_CONNECTION, 106 CMD_ACCOUNT_CONNECT, CMD_ACCOUNT_CONNECTION,
107 CMD_ACCOUNT_DISCONNECT, CMD_ACCOUNT_ENABLED, CMD_ACCOUNT_FIND, 107 CMD_ACCOUNT_DISCONNECT, CMD_ACCOUNT_ENABLED, CMD_ACCOUNT_FIND,
108 CMD_ACCOUNT_HANDLE, CMD_ACCOUNT_ISCONNECTED, CMD_ACCOUNT_LIST, 108 CMD_ACCOUNT_HANDLE, CMD_ACCOUNT_ISCONNECTED, CMD_ACCOUNT_LIST,
109 CMD_ACCOUNT_PRESENCE, 109 CMD_ACCOUNT_PRESENCE, CMD_ACCOUNT_PROTOCOL, CMD_ACCOUNT_STATUS,
110 CMD_ACCOUNT_PROTOCOL, CMD_ACCOUNT_STATUS_TYPE, 110 CMD_ACCOUNT_STATUS_TYPE, CMD_ACCOUNT_STATUS_TYPES,
111 CMD_ACCOUNT_STATUS_TYPES, CMD_ACCOUNT_USERNAME } cmd; 111 CMD_ACCOUNT_USERNAME } cmd;
112 const char *listopts[] = { "-all", "-online", NULL }; 112 const char *listopts[] = { "-all", "-online", NULL };
113 enum { CMD_ACCOUNTLIST_ALL, CMD_ACCOUNTLIST_ONLINE } listopt; 113 enum { CMD_ACCOUNTLIST_ALL, CMD_ACCOUNTLIST_ONLINE } listopt;
114 const char *alias; 114 const char *alias;
115 const GList *cur; 115 const GList *cur;
116 GaimAccount *account; 116 GaimAccount *account;
117 GaimStatus *status;
117 GaimStatusType *status_type; 118 GaimStatusType *status_type;
119 GaimValue *value;
120 char *attr_id;
118 int error; 121 int error;
119 int b; 122 int b, i;
120 123
121 if (objc < 2) { 124 if (objc < 2) {
122 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); 125 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");
123 return TCL_ERROR; 126 return TCL_ERROR;
124 } 127 }
125 128
126 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) 129 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)
127 return error; 130 return error;
128 131
129 switch (cmd) { 132 switch (cmd) {
130 case CMD_ACCOUNT_ACTIVE_STATUS:
131 if (objc != 3) {
132 Tcl_WrongNumArgs(interp, 2, objv, "account");
133 return TCL_ERROR;
134 }
135 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
136 return TCL_ERROR;
137 Tcl_SetObjResult(interp,
138 gaim_tcl_ref_new(GaimTclRefStatus,
139 gaim_account_get_active_status(account)));
140 break;
141 case CMD_ACCOUNT_ALIAS: 133 case CMD_ACCOUNT_ALIAS:
142 if (objc != 3) { 134 if (objc != 3) {
143 Tcl_WrongNumArgs(interp, 2, objv, "account"); 135 Tcl_WrongNumArgs(interp, 2, objv, "account");
144 return TCL_ERROR; 136 return TCL_ERROR;
145 } 137 }
261 return TCL_ERROR; 253 return TCL_ERROR;
262 } 254 }
263 if ((account = tcl_validate_account(objv[2], interp)) == NULL) 255 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
264 return TCL_ERROR; 256 return TCL_ERROR;
265 Tcl_SetStringObj(result, (char *)gaim_account_get_protocol_id(account), -1); 257 Tcl_SetStringObj(result, (char *)gaim_account_get_protocol_id(account), -1);
258 break;
259 case CMD_ACCOUNT_STATUS:
260 if (objc < 3) {
261 Tcl_WrongNumArgs(interp, 2, objv, "account ?status_id name value ...?");
262 return TCL_ERROR;
263 }
264 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
265 return TCL_ERROR;
266 if (objc == 3) {
267 Tcl_SetObjResult(interp,
268 gaim_tcl_ref_new(GaimTclRefStatus,
269 gaim_account_get_active_status(account)));
270 } else {
271 GList *l = NULL;
272 if (objc % 2) {
273 Tcl_SetStringObj(result, "name without value setting status", -1);
274 return TCL_ERROR;
275 }
276 status = gaim_account_get_status(account, Tcl_GetString(objv[3]));
277 if (status == NULL) {
278 Tcl_SetStringObj(result, "invalid status for account", -1);
279 return TCL_ERROR;
280 }
281 for (i = 4; i < objc; i += 2) {
282 attr_id = Tcl_GetString(objv[i]);
283 value = gaim_status_get_attr_value(status, attr_id);
284 if (value == NULL) {
285 Tcl_SetStringObj(result, "invalid attribute for account", -1);
286 return TCL_ERROR;
287 }
288 switch (gaim_value_get_type(value)) {
289 case GAIM_TYPE_BOOLEAN:
290 error = Tcl_GetBooleanFromObj(interp, objv[i + 1], &b);
291 if (error != TCL_OK)
292 return error;
293 l = g_list_append(l, attr_id);
294 l = g_list_append(l, GINT_TO_POINTER(b));
295 break;
296 case GAIM_TYPE_INT:
297 error = Tcl_GetIntFromObj(interp, objv[i + 1], &b);
298 if (error != TCL_OK)
299 return error;
300 l = g_list_append(l, attr_id);
301 l = g_list_append(l, GINT_TO_POINTER(b));
302 break;
303 case GAIM_TYPE_STRING:
304 l = g_list_append(l, attr_id);
305 l = g_list_append(l, Tcl_GetString(objv[i + 1]));
306 break;
307 default:
308 Tcl_SetStringObj(result, "unknown GaimValue type", -1);
309 return TCL_ERROR;
310 }
311 }
312 gaim_account_set_status_list(account, Tcl_GetString(objv[3]), TRUE, l);
313 g_list_free(l);
314 }
266 break; 315 break;
267 case CMD_ACCOUNT_STATUS_TYPE: 316 case CMD_ACCOUNT_STATUS_TYPE:
268 if (objc != 4 && objc != 5) { 317 if (objc != 4 && objc != 5) {
269 Tcl_WrongNumArgs(interp, 2, objv, "account ?statustype? ?-primitive primitive?"); 318 Tcl_WrongNumArgs(interp, 2, objv, "account ?statustype? ?-primitive primitive?");
270 return TCL_ERROR; 319 return TCL_ERROR;
1175 return TCL_OK; 1224 return TCL_OK;
1176 } 1225 }
1177 1226
1178 int tcl_cmd_status(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 1227 int tcl_cmd_status(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
1179 { 1228 {
1180 const char *cmds[] = { "attr", "type" }; 1229 const char *cmds[] = { "attr", "type", NULL };
1181 enum { CMD_STATUS_ATTR, CMD_STATUS_TYPE } cmd; 1230 enum { CMD_STATUS_ATTR, CMD_STATUS_TYPE } cmd;
1182 Tcl_Obj *result = Tcl_GetObjResult(interp); 1231 Tcl_Obj *result = Tcl_GetObjResult(interp);
1183 GaimStatus *status; 1232 GaimStatus *status;
1184 GaimStatusType *status_type; 1233 GaimStatusType *status_type;
1185 GaimValue *value; 1234 GaimValue *value;