Implement begin_polling and stop_polling
This commit is contained in:
parent
9badfa6f28
commit
abfbd7e53b
@ -40,6 +40,11 @@
|
||||
* Class definition for #MatrixHTTPClient.
|
||||
*/
|
||||
|
||||
typedef struct _MatrixHTTPClientPrivate {
|
||||
gboolean polling;
|
||||
guint event_timeout;
|
||||
} MatrixHTTPClientPrivate;
|
||||
|
||||
enum {
|
||||
PROP_BASE_URL = 1,
|
||||
PROP_VALIDATE_CERTIFICATE,
|
||||
@ -49,8 +54,10 @@ enum {
|
||||
static GParamSpec *obj_properties[N_PROPERTIES] = {NULL,};
|
||||
|
||||
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_ADD_PRIVATE(MatrixHTTPClient)
|
||||
G_IMPLEMENT_INTERFACE(MATRIX_TYPE_CLIENT,
|
||||
matrix_http_client_matrix_client_init));
|
||||
|
||||
@ -126,19 +133,110 @@ i_logout(MatrixClient *client, GError **error)
|
||||
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
|
||||
matrix_http_client_matrix_client_init(MatrixClientInterface *iface)
|
||||
{
|
||||
iface->login_with_password = i_login_with_password;
|
||||
iface->register_with_password = i_register_with_password;
|
||||
iface->logout = i_logout;
|
||||
iface->begin_polling = NULL;
|
||||
iface->stop_polling = NULL;
|
||||
iface->begin_polling = i_begin_polling;
|
||||
iface->stop_polling = i_stop_polling;
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_http_client_init(MatrixHTTPClient *client)
|
||||
{}
|
||||
{
|
||||
MatrixHTTPClientPrivate *priv = matrix_http_client_get_instance_private(
|
||||
client);
|
||||
|
||||
priv->polling = FALSE;
|
||||
priv->event_timeout = 30000;
|
||||
}
|
||||
|
||||
static void
|
||||
matrix_http_client_class_init(MatrixHTTPClientClass *klass)
|
||||
|
Loading…
Reference in New Issue
Block a user