/soc/2013/ankitkv/gobjectification: a84a6709c72a: Merged soc.201...

Ankit Vani a at nevitus.org
Tue Sep 17 12:52:51 EDT 2013


Changeset: a84a6709c72a2d3ba14c99555765836f411ac9e1
Author:	 Ankit Vani <a at nevitus.org>
Date:	 2013-09-17 22:22 +0530
Branch:	 soc.2013.gobjectification.plugins
URL: https://hg.pidgin.im/soc/2013/ankitkv/gobjectification/rev/a84a6709c72a

Description:

Merged soc.2013.gobjectification branch

diffstat:

 finch/gntrequest.c                 |    3 +-
 libpurple/protocols/gg/gg.c        |    8 ++
 libpurple/protocols/gg/tcpsocket.c |    8 +-
 libpurple/request.c                |  122 ++++++++++++++++++++++++++++++++++++-
 libpurple/request.h                |   64 ++++++++++++++++++-
 pidgin/gtkrequest.c                |   55 ++++++++++++++--
 6 files changed, 245 insertions(+), 15 deletions(-)

diffs (truncated from 503 to 300 lines):

diff --git a/finch/gntrequest.c b/finch/gntrequest.c
--- a/finch/gntrequest.c
+++ b/finch/gntrequest.c
@@ -814,10 +814,11 @@ static PurpleRequestUiOps uiops =
 	finch_request_input,
 	finch_request_choice,
 	finch_request_action,
+	NULL,
 	finch_request_fields,
 	finch_request_file,
+	finch_request_folder,
 	finch_close_request,
-	finch_request_folder,
 	NULL,
 	NULL,
 	NULL,
diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c
--- a/libpurple/protocols/gg/gg.c
+++ b/libpurple/protocols/gg/gg.c
@@ -418,6 +418,9 @@ void ggp_async_login_handler(gpointer _g
 			info->session->check, info->session->state);
 
 	switch (info->session->state) {
+		case GG_STATE_ERROR:
+			purple_debug_info("gg", "GG_STATE_ERROR\n");
+			break;
 		case GG_STATE_RESOLVING:
 			purple_debug_info("gg", "GG_STATE_RESOLVING\n");
 			break;
@@ -554,6 +557,11 @@ void ggp_async_login_handler(gpointer _g
 						_("Error connecting to master "
 						"server"));
 					break;
+				case GG_FAILURE_INTERNAL:
+					purple_connection_error(gc,
+						PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+						_("Internal error"));
+					break;
 				default:
 					purple_connection_error(gc,
 						PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
diff --git a/libpurple/protocols/gg/tcpsocket.c b/libpurple/protocols/gg/tcpsocket.c
--- a/libpurple/protocols/gg/tcpsocket.c
+++ b/libpurple/protocols/gg/tcpsocket.c
@@ -20,13 +20,15 @@ ggp_tcpsocket_connected(PurpleSocket *ps
 	if (!gg_socket_manager_connected(ps, priv_gg, fd)) {
 		purple_debug_error("gg", "socket not handled");
 		purple_socket_destroy(ps);
-		return;
 	}
 
 	if (info->inpa > 0)
 		purple_input_remove(info->inpa);
-	info->inpa = purple_input_add(fd, ggp_tcpsocket_inputcond_gg_to_purple(
-		info->session->check), ggp_async_login_handler, gc);
+	if (info->session->fd < 0)
+		return;
+	info->inpa = purple_input_add(info->session->fd,
+		ggp_tcpsocket_inputcond_gg_to_purple(info->session->check),
+		ggp_async_login_handler, gc);
 }
 
 static void*
diff --git a/libpurple/request.c b/libpurple/request.c
--- a/libpurple/request.c
+++ b/libpurple/request.c
@@ -173,6 +173,8 @@ struct _PurpleRequestCommonParameters
 
 	PurpleRequestHelpCb help_cb;
 	gpointer help_data;
+
+	GSList *extra_actions;
 };
 
 PurpleRequestCommonParameters *
@@ -236,6 +238,7 @@ purple_request_cpar_unref(PurpleRequestC
 	if (--cpar->ref_count > 0)
 		return cpar;
 
+	purple_request_cpar_set_extra_actions(cpar, NULL);
 	g_free(cpar);
 	return NULL;
 }
@@ -289,7 +292,7 @@ PurpleRequestIconType
 purple_request_cpar_get_icon(PurpleRequestCommonParameters *cpar)
 {
 	if (cpar == NULL)
-		return PURPLE_REQUEST_ICON_REQUEST;
+		return PURPLE_REQUEST_ICON_DEFAULT;
 
 	return cpar->icon_type;
 }
@@ -378,6 +381,49 @@ purple_request_cpar_get_help_cb(PurpleRe
 	return cpar->help_cb;
 }
 
+void
+purple_request_cpar_set_extra_actions(PurpleRequestCommonParameters *cpar, ...)
+{
+	va_list args;
+	GSList *extra = NULL, *it;
+
+	it = cpar->extra_actions;
+	while (it != NULL) {
+		gchar *label = it->data;
+
+		g_free(label);
+		it = g_slist_next(it);
+		if (it == NULL)
+			break;
+		it = g_slist_next(it);
+	}
+
+	va_start(args, cpar);
+
+	while (TRUE) {
+		const gchar *label;
+		PurpleRequestFieldsCb cb;
+
+		label = va_arg(args, const gchar*);
+		if (label == NULL)
+			break;
+		cb = va_arg(args, PurpleRequestFieldsCb);
+
+		extra = g_slist_append(extra, g_strdup(label));
+		extra = g_slist_append(extra, cb);
+	}
+
+	va_end(args);
+
+	cpar->extra_actions = extra;
+}
+
+GSList *
+purple_request_cpar_get_extra_actions(PurpleRequestCommonParameters *cpar)
+{
+	return cpar->extra_actions;
+}
+
 PurpleRequestFields *
 purple_request_fields_new(void)
 {
@@ -2011,6 +2057,74 @@ purple_request_action_varg(void *handle,
 }
 
 void *
+purple_request_wait(void *handle, const char *title, const char *primary,
+	const char *secondary, GCallback cancel_cb,
+	PurpleRequestCommonParameters *cpar, void *user_data)
+{
+	PurpleRequestUiOps *ops;
+
+	if (title == NULL)
+		title = _("Please wait");
+	if (primary == NULL)
+		primary = _("Please wait...");
+
+	ops = purple_request_get_ui_ops();
+
+	if (ops != NULL && ops->request_wait != NULL) {
+		PurpleRequestInfo *info;
+		gchar **tmp;
+
+		tmp = purple_request_strip_html(cpar, &primary, &secondary);
+
+		info            = g_new0(PurpleRequestInfo, 1);
+		info->type      = PURPLE_REQUEST_WAIT;
+		info->handle    = handle;
+		info->ui_handle = ops->request_wait(title, primary, secondary,
+			cancel_cb, cpar, user_data);
+
+		handles = g_list_append(handles, info);
+
+		g_strfreev(tmp);
+		purple_request_cpar_unref(cpar);
+		return info->ui_handle;
+	}
+
+	if (cpar == NULL)
+		cpar = purple_request_cpar_new();
+	if (purple_request_cpar_get_icon(cpar) == PURPLE_REQUEST_ICON_DEFAULT)
+		purple_request_cpar_set_icon(cpar, PURPLE_REQUEST_ICON_WAIT);
+
+	return purple_request_action(handle, title, primary, secondary,
+		PURPLE_DEFAULT_ACTION_NONE, cpar, user_data,
+		cancel_cb ? 1 : 0, _("Cancel"), cancel_cb);
+}
+
+static void
+purple_request_fields_strip_html(PurpleRequestFields *fields)
+{
+	GList *itg;
+
+	for (itg = fields->groups; itg != NULL; itg = g_list_next(itg)) {
+		PurpleRequestFieldGroup *group = itg->data;
+		GList *itf;
+
+		for (itf = group->fields; itf != NULL; itf = g_list_next(itf)) {
+			PurpleRequestField *field = itf->data;
+			gchar *new_label;
+
+			new_label = purple_request_strip_html_custom(
+				field->label);
+			if (g_strcmp0(new_label, field->label) == 0) {
+				g_free(new_label);
+				continue;
+			}
+			g_free(field->label);
+			field->label = new_label;
+		}
+	}
+}
+
+void *
 purple_request_fields(void *handle, const char *title, const char *primary,
 	const char *secondary, PurpleRequestFields *fields, const char *ok_text,
 	GCallback ok_cb, const char *cancel_text, GCallback cancel_cb,
@@ -2031,6 +2145,12 @@ purple_request_fields(void *handle, cons
 
 	ops = purple_request_get_ui_ops();
 
+	if (purple_request_cpar_is_html(cpar) &&
+		!((ops->features & PURPLE_REQUEST_FEATURE_HTML)))
+	{
+		purple_request_fields_strip_html(fields);
+	}
+
 	if (ops != NULL && ops->request_fields != NULL) {
 		PurpleRequestInfo *info;
 		gchar **tmp;
diff --git a/libpurple/request.h b/libpurple/request.h
--- a/libpurple/request.h
+++ b/libpurple/request.h
@@ -64,6 +64,7 @@ typedef enum
 	PURPLE_REQUEST_INPUT = 0,  /**< Text input request.        */
 	PURPLE_REQUEST_CHOICE,     /**< Multiple-choice request.   */
 	PURPLE_REQUEST_ACTION,     /**< Action request.            */
+	PURPLE_REQUEST_WAIT,       /**< Please wait dialog.        */
 	PURPLE_REQUEST_FIELDS,     /**< Multiple fields request.   */
 	PURPLE_REQUEST_FILE,       /**< File open or save request. */
 	PURPLE_REQUEST_FOLDER      /**< Folder selection request.  */
@@ -95,8 +96,10 @@ typedef enum
 
 typedef enum
 {
-	PURPLE_REQUEST_ICON_REQUEST = 0,
+	PURPLE_REQUEST_ICON_DEFAULT = 0,
+	PURPLE_REQUEST_ICON_REQUEST,
 	PURPLE_REQUEST_ICON_DIALOG,
+	PURPLE_REQUEST_ICON_WAIT,
 	PURPLE_REQUEST_ICON_INFO,
 	PURPLE_REQUEST_ICON_WARNING,
 	PURPLE_REQUEST_ICON_ERROR
@@ -130,6 +133,11 @@ typedef struct
 		PurpleRequestCommonParameters *cpar, void *user_data,
 		size_t action_count, va_list actions);
 
+	/** @see purple_request_wait(). */
+	void *(*request_wait)(const char *title, const char *primary,
+		const char *secondary, GCallback cancel_cb,
+		PurpleRequestCommonParameters *cpar, void *user_data);
+
 	/** @see purple_request_fields(). */
 	void *(*request_fields)(const char *title, const char *primary,
 		const char *secondary, PurpleRequestFields *fields,
@@ -142,13 +150,13 @@ typedef struct
 		gboolean savedialog, GCallback ok_cb, GCallback cancel_cb,
 		PurpleRequestCommonParameters *cpar, void *user_data);
 
-	void (*close_request)(PurpleRequestType type, void *ui_handle);
-
 	/** @see purple_request_folder(). */
 	void *(*request_folder)(const char *title, const char *dirname,
 		GCallback ok_cb, GCallback cancel_cb,
 		PurpleRequestCommonParameters *cpar, void *user_data);
 
+	void (*close_request)(PurpleRequestType type, void *ui_handle);
+
 	void (*_purple_reserved1)(void);
 	void (*_purple_reserved2)(void);
 	void (*_purple_reserved3)(void);
@@ -374,11 +382,37 @@ purple_request_cpar_set_help_cb(PurpleRe
  * @param cpar      The parameters set (may be @c NULL).
  * @param user_data The pointer to the variable, where user data (to be passed
  *                  to callback function) should be stored.
+ *
+ * @return The callback.
  */
 PurpleRequestHelpCb
 purple_request_cpar_get_help_cb(PurpleRequestCommonParameters *cpar,
 	gpointer *user_data);
 
+/**
+ * Sets extra actions for the PurpleRequestFields dialog.
+ *
+ * @param cpar The parameters set.
+ * @param ...  A list of actions. These are pairs of arguments. The first of
+ *             each pair is the <tt>char *</tt> label that appears on the
+ *             button. It should have an underscore before the letter you want
+ *             to use as the accelerator key for the button. The second of each



More information about the Commits mailing list