Implement begin_polling and stop_polling
This commit is contained in:
		| @@ -40,6 +40,11 @@ | |||||||
|  * Class definition for #MatrixHTTPClient. |  * Class definition for #MatrixHTTPClient. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | typedef struct _MatrixHTTPClientPrivate { | ||||||
|  |     gboolean polling; | ||||||
|  |     guint event_timeout; | ||||||
|  | } MatrixHTTPClientPrivate; | ||||||
|  |  | ||||||
| enum { | enum { | ||||||
|     PROP_BASE_URL = 1, |     PROP_BASE_URL = 1, | ||||||
|     PROP_VALIDATE_CERTIFICATE, |     PROP_VALIDATE_CERTIFICATE, | ||||||
| @@ -49,8 +54,10 @@ enum { | |||||||
| static GParamSpec *obj_properties[N_PROPERTIES] = {NULL,}; | static GParamSpec *obj_properties[N_PROPERTIES] = {NULL,}; | ||||||
|  |  | ||||||
| static void matrix_http_client_matrix_client_init(MatrixClientInterface *iface); | static void matrix_http_client_matrix_client_init(MatrixClientInterface *iface); | ||||||
|  | static void i_begin_polling(MatrixClient *client, GError **error); | ||||||
|  |  | ||||||
| G_DEFINE_TYPE_WITH_CODE(MatrixHTTPClient, matrix_http_client, MATRIX_TYPE_HTTP_API, | G_DEFINE_TYPE_WITH_CODE(MatrixHTTPClient, matrix_http_client, MATRIX_TYPE_HTTP_API, | ||||||
|  |                         G_ADD_PRIVATE(MatrixHTTPClient) | ||||||
|                         G_IMPLEMENT_INTERFACE(MATRIX_TYPE_CLIENT, |                         G_IMPLEMENT_INTERFACE(MATRIX_TYPE_CLIENT, | ||||||
|                                               matrix_http_client_matrix_client_init)); |                                               matrix_http_client_matrix_client_init)); | ||||||
|  |  | ||||||
| @@ -126,19 +133,110 @@ i_logout(MatrixClient *client, GError **error) | |||||||
|     matrix_api_abort_pending(MATRIX_API(client)); |     matrix_api_abort_pending(MATRIX_API(client)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | process_event(JsonArray *array, | ||||||
|  |               guint idx, | ||||||
|  |               JsonNode *event, | ||||||
|  |               MatrixClient *client) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | cb_event_stream(MatrixAPI *api, | ||||||
|  |                 const gchar *content_type, | ||||||
|  |                 JsonNode *json_content, | ||||||
|  |                 GByteArray *raw_content, | ||||||
|  |                 gpointer user_data, | ||||||
|  |                 GError *error) | ||||||
|  | { | ||||||
|  |     MatrixHTTPClientPrivate *priv = matrix_http_client_get_instance_private( | ||||||
|  |             MATRIX_HTTP_CLIENT(api)); | ||||||
|  |     const gchar *end_token = NULL; | ||||||
|  |  | ||||||
|  |     if (!error) { | ||||||
|  |         JsonObject *root_obj; | ||||||
|  |         JsonNode *node; | ||||||
|  |  | ||||||
|  |         root_obj = json_node_get_object(json_content); | ||||||
|  |  | ||||||
|  |         if ((node = json_object_get_member(root_obj, "chunk")) != NULL) { | ||||||
|  |             JsonArray *chunks = json_node_get_array(node); | ||||||
|  |  | ||||||
|  |             json_array_foreach_element(chunks, | ||||||
|  |                                        (JsonArrayForeach)process_event, | ||||||
|  |                                        api); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if ((node = json_object_get_member(root_obj, "end")) != NULL) { | ||||||
|  |             end_token = json_node_get_string(node); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Only continue polling if polling is still enabled, and there | ||||||
|  |     // was no communication error during the last call | ||||||
|  |     if (priv->polling | ||||||
|  |         && (!error || error->code <= MATRIX_ERROR_MISSING_TOKEN)) { | ||||||
|  |         priv->polling = FALSE; | ||||||
|  |  | ||||||
|  |         matrix_api_event_stream(api, | ||||||
|  |                                 cb_event_stream, NULL, | ||||||
|  |                                 end_token, priv->event_timeout, | ||||||
|  |                                 NULL); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | i_begin_polling(MatrixClient *client, GError **error) | ||||||
|  | { | ||||||
|  |     MatrixHTTPClientPrivate *priv = matrix_http_client_get_instance_private( | ||||||
|  |             MATRIX_HTTP_CLIENT(client)); | ||||||
|  |     GError *err = NULL; | ||||||
|  |  | ||||||
|  |     matrix_api_event_stream(MATRIX_API(client), | ||||||
|  |                             cb_event_stream, NULL, | ||||||
|  |                             NULL, priv->event_timeout, | ||||||
|  |                             &err); | ||||||
|  |  | ||||||
|  |     if (err) { | ||||||
|  |         g_propagate_error(error, err); | ||||||
|  |  | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     priv->polling = TRUE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | i_stop_polling(MatrixClient *client, gboolean cancel_ongoing, GError **error) | ||||||
|  | { | ||||||
|  |     MatrixHTTPClientPrivate *priv = matrix_http_client_get_instance_private( | ||||||
|  |             MATRIX_HTTP_CLIENT(client)); | ||||||
|  |  | ||||||
|  |     priv->polling = FALSE; | ||||||
|  |  | ||||||
|  |     if (cancel_ongoing) { | ||||||
|  |         matrix_api_abort_pending(MATRIX_API(client)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| matrix_http_client_matrix_client_init(MatrixClientInterface *iface) | matrix_http_client_matrix_client_init(MatrixClientInterface *iface) | ||||||
| { | { | ||||||
|     iface->login_with_password = i_login_with_password; |     iface->login_with_password = i_login_with_password; | ||||||
|     iface->register_with_password = i_register_with_password; |     iface->register_with_password = i_register_with_password; | ||||||
|     iface->logout = i_logout; |     iface->logout = i_logout; | ||||||
|     iface->begin_polling = NULL; |     iface->begin_polling = i_begin_polling; | ||||||
|     iface->stop_polling = NULL; |     iface->stop_polling = i_stop_polling; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| matrix_http_client_init(MatrixHTTPClient *client) | matrix_http_client_init(MatrixHTTPClient *client) | ||||||
| {} | { | ||||||
|  |     MatrixHTTPClientPrivate *priv = matrix_http_client_get_instance_private( | ||||||
|  |             client); | ||||||
|  |  | ||||||
|  |     priv->polling = FALSE; | ||||||
|  |     priv->event_timeout = 30000; | ||||||
|  | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| matrix_http_client_class_init(MatrixHTTPClientClass *klass) | matrix_http_client_class_init(MatrixHTTPClientClass *klass) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user