changeset 13821:e5e07c996c56

[gaim-migrate @ 16254] Work proceeds apace on the Tcl status API, this time with GaimPresence committer: Tailor Script <tailor@pidgin.im>
author Ethan Blanton <elb@pidgin.im>
date Sun, 11 Jun 2006 06:05:09 +0000
parents 6fd7425133fc
children 5ef7dae8ab87
files plugins/tcl/tcl.c plugins/tcl/tcl_cmds.c plugins/tcl/tcl_gaim.h
diffstat 3 files changed, 226 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/tcl/tcl.c	Sun Jun 11 00:35:52 2006 +0000
+++ b/plugins/tcl/tcl.c	Sun Jun 11 06:05:09 2006 +0000
@@ -54,6 +54,7 @@
 GaimStringref *GaimTclRefConnection;
 GaimStringref *GaimTclRefConversation;
 GaimStringref *GaimTclRefPointer;
+GaimStringref *GaimTclRefPresence;
 GaimStringref *GaimTclRefStatus;
 GaimStringref *GaimTclRefStatusAttr;
 GaimStringref *GaimTclRefStatusType;
@@ -131,6 +132,7 @@
 	Tcl_CreateObjCommand(interp, "::gaim::debug", tcl_cmd_debug, (ClientData)NULL, NULL);
 	Tcl_CreateObjCommand(interp, "::gaim::notify", tcl_cmd_notify, (ClientData)NULL, NULL);
 	Tcl_CreateObjCommand(interp, "::gaim::prefs", tcl_cmd_prefs, (ClientData)NULL, NULL);
+	Tcl_CreateObjCommand(interp, "::gaim::presence", tcl_cmd_presence, (ClientData)NULL, NULL);
 	Tcl_CreateObjCommand(interp, "::gaim::send_im", tcl_cmd_send_im, (ClientData)NULL, NULL);
 	Tcl_CreateObjCommand(interp, "::gaim::signal", tcl_cmd_signal, (ClientData)NULL, NULL);
 	Tcl_CreateObjCommand(interp, "::gaim::status", tcl_cmd_status_type, (ClientData)NULL, NULL);
@@ -346,6 +348,7 @@
 	GaimTclRefConnection = gaim_stringref_new("Connection");
 	GaimTclRefConversation = gaim_stringref_new("Conversation");
 	GaimTclRefPointer = gaim_stringref_new("Pointer");
+	GaimTclRefPresence = gaim_stringref_new("Presence");
 	GaimTclRefStatus = gaim_stringref_new("Status");
 	GaimTclRefStatusAttr = gaim_stringref_new("StatusAttr");
 	GaimTclRefStatusType = gaim_stringref_new("StatusType");
@@ -368,6 +371,7 @@
 	gaim_stringref_unref(GaimTclRefConnection);
 	gaim_stringref_unref(GaimTclRefConversation);
 	gaim_stringref_unref(GaimTclRefPointer);
+	gaim_stringref_unref(GaimTclRefPresence);
 	gaim_stringref_unref(GaimTclRefStatus);
 	gaim_stringref_unref(GaimTclRefStatusAttr);
 	gaim_stringref_unref(GaimTclRefStatusType);
--- a/plugins/tcl/tcl_cmds.c	Sun Jun 11 00:35:52 2006 +0000
+++ b/plugins/tcl/tcl_cmds.c	Sun Jun 11 06:05:09 2006 +0000
@@ -99,12 +99,14 @@
 	Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem;
 	const char *cmds[] = { "active_status", "alias", "connect",
 	                       "connection", "disconnect", "enabled", "find",
-	                       "handle", "isconnected", "list", "protocol",
-	                       "status_type", "status_types", "username", NULL };
+	                       "handle", "isconnected", "list", "presence",
+	                       "protocol", "status_type", "status_types",
+	                       "username", NULL };
 	enum { CMD_ACCOUNT_ACTIVE_STATUS, CMD_ACCOUNT_ALIAS,
 	       CMD_ACCOUNT_CONNECT, CMD_ACCOUNT_CONNECTION,
 	       CMD_ACCOUNT_DISCONNECT, CMD_ACCOUNT_ENABLED, CMD_ACCOUNT_FIND,
 	       CMD_ACCOUNT_HANDLE, CMD_ACCOUNT_ISCONNECTED, CMD_ACCOUNT_LIST,
+	       CMD_ACCOUNT_PRESENCE,
 	       CMD_ACCOUNT_PROTOCOL, CMD_ACCOUNT_STATUS_TYPE,
 	       CMD_ACCOUNT_STATUS_TYPES, CMD_ACCOUNT_USERNAME } cmd;
 	const char *listopts[] = { "-all", "-online", NULL };
@@ -243,6 +245,16 @@
 		}
 		Tcl_SetObjResult(interp, list);
 		break;
+	case CMD_ACCOUNT_PRESENCE:
+		if (objc != 3) {
+			Tcl_WrongNumArgs(interp, 2, objv, "account");
+			return TCL_ERROR;
+		}
+		if ((account = tcl_validate_account(objv[2], interp)) == NULL)
+			return TCL_ERROR;
+		Tcl_SetObjResult(result, gaim_tcl_ref_new(GaimTclRefPresence,
+							  gaim_account_get_presence(account)));
+		break;
 	case CMD_ACCOUNT_PROTOCOL:
 		if (objc != 3) {
 			Tcl_WrongNumArgs(interp, 2, objv, "account");
@@ -882,6 +894,212 @@
 	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;
+	GaimPresence *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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefAccount,
+		                                          gaim_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		if (objc == 3) {
+			Tcl_SetObjResult(interp,
+					 gaim_tcl_ref_new(GaimTclRefStatus,
+							  gaim_presence_get_active_status(presence)));
+		} else if (objc == 4) {
+			Tcl_SetBooleanObj(result,
+					  gaim_presence_is_status_active(presence,
+									 Tcl_GetString(objv[3])));
+		} else {
+			GaimStatusPrimitive 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 = gaim_primitive_get_type_from_id(Tcl_GetString(objv[4]));
+			if (primitive == GAIM_STATUS_UNSET) {
+				Tcl_SetStringObj(result, "invalid primitive ", -1);
+				Tcl_AppendObjToObj(result, objv[4]);
+				return TCL_ERROR;
+			}
+			Tcl_SetBooleanObj(result, gaim_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		Tcl_SetBooleanObj(result, gaim_presence_is_available(presence));
+		break;
+	case CMD_PRESENCE_CHAT_USER:
+		if (objc != 3) {
+			Tcl_WrongNumArgs(interp, 2, objv, "presence");
+			return TCL_ERROR;
+		}
+		if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		Tcl_SetStringObj(result, gaim_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		switch (gaim_presence_get_context(presence)) {
+		case GAIM_PRESENCE_CONTEXT_UNSET:
+			Tcl_SetStringObj(result, "unset", -1);
+			break;
+		case GAIM_PRESENCE_CONTEXT_ACCOUNT:
+			Tcl_SetStringObj(result, "account", -1);
+			break;
+		case GAIM_PRESENCE_CONTEXT_CONV:
+			Tcl_SetStringObj(result, "conversation", -1);
+			break;
+		case GAIM_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefConversation,
+		                                          gaim_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		if (objc == 3) {
+			if (gaim_presence_is_idle(presence)) {
+				idle_time = gaim_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) {
+			gaim_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;
+			gaim_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		if (objc == 3) {
+			Tcl_SetIntObj(result, gaim_presence_get_login_time(presence));
+		} else {
+			if ((error == Tcl_GetIntFromObj(interp,
+			                                objv[3],
+			                                &login_time)) != TCL_OK)
+				return TCL_ERROR;
+			gaim_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		Tcl_SetBooleanObj(result, gaim_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 = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		Tcl_SetObjResult(interp,
+		                 gaim_tcl_ref_new(GaimTclRefStatus,
+		                                  gaim_presence_get_status(presence,
+		                                                           Tcl_GetString(objv[3]))));
+		break;
+	case CMD_PRESENCE_STATUSES:
+		if (objc != 3) {
+			Tcl_WrongNumArgs(interp, 2, objv, "presence");
+			return TCL_ERROR;
+		}
+		if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL)
+			return TCL_ERROR;
+		list = Tcl_NewListObj(0, NULL);
+		for (cur = gaim_presence_get_statuses(presence); cur != NULL;
+		     cur = g_list_next(cur)) {
+			elem = gaim_tcl_ref_new(GaimTclRefStatus, cur->data);
+			Tcl_ListObjAppendElement(interp, list, elem);
+		}
+		Tcl_SetObjResult(interp, list);
+		break;
+	}
+
+	return TCL_OK;
+}
+
 int tcl_cmd_send_im(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
 {
 	GaimConnection *gc;
--- a/plugins/tcl/tcl_gaim.h	Sun Jun 11 00:35:52 2006 +0000
+++ b/plugins/tcl/tcl_gaim.h	Sun Jun 11 06:05:09 2006 +0000
@@ -52,6 +52,7 @@
 extern GaimStringref *GaimTclRefConnection;
 extern GaimStringref *GaimTclRefConversation;
 extern GaimStringref *GaimTclRefPointer;
+extern GaimStringref *GaimTclRefPresence;
 extern GaimStringref *GaimTclRefStatus;
 extern GaimStringref *GaimTclRefStatusAttr;
 extern GaimStringref *GaimTclRefStatusType;
@@ -77,6 +78,7 @@
 Tcl_ObjCmdProc tcl_cmd_debug;
 Tcl_ObjCmdProc tcl_cmd_notify;
 Tcl_ObjCmdProc tcl_cmd_prefs;
+Tcl_ObjCmdProc tcl_cmd_presence;
 Tcl_ObjCmdProc tcl_cmd_send_im;
 Tcl_ObjCmdProc tcl_cmd_signal;
 Tcl_ObjCmdProc tcl_cmd_status;