Add the MatrixClient::event signal
This commit is contained in:
parent
0c90d8b00c
commit
d79bb0d9ec
@ -35,6 +35,7 @@ matrix_event_get_type
|
|||||||
MatrixClient
|
MatrixClient
|
||||||
MatrixClientInterface
|
MatrixClientInterface
|
||||||
matrix_client_login_finished
|
matrix_client_login_finished
|
||||||
|
matrix_client_incoming_event
|
||||||
matrix_client_register_with_password
|
matrix_client_register_with_password
|
||||||
matrix_client_login_with_password
|
matrix_client_login_with_password
|
||||||
matrix_client_logout
|
matrix_client_logout
|
||||||
|
@ -81,11 +81,14 @@ INST_H_SRC_FILES = \
|
|||||||
|
|
||||||
INST_H_BUILT_FILES = \
|
INST_H_BUILT_FILES = \
|
||||||
matrix-version.h \
|
matrix-version.h \
|
||||||
|
matrix-marshalers.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
libmatrix_glib_0_0_la_SOURCES = \
|
libmatrix_glib_0_0_la_SOURCES = \
|
||||||
$(INST_H_BUILT_FILES) \
|
$(INST_H_BUILT_FILES) \
|
||||||
|
matrix-marshalers.c \
|
||||||
$(libmatrix_glib_0_0_la_VALA_SOURCES:.vala=.c) \
|
$(libmatrix_glib_0_0_la_VALA_SOURCES:.vala=.c) \
|
||||||
|
matrix-event-types.c \
|
||||||
matrix-version.c \
|
matrix-version.c \
|
||||||
$(INST_H_SRC_FILES) \
|
$(INST_H_SRC_FILES) \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
@ -119,6 +122,8 @@ dist_vapi_DATA = \
|
|||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
BUILT_SOURCES += \
|
BUILT_SOURCES += \
|
||||||
|
matrix-marshalers.c \
|
||||||
|
matrix-marshalers.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
test_api_client_SOURCES = test-api-client.c
|
test_api_client_SOURCES = test-api-client.c
|
||||||
@ -130,9 +135,35 @@ test_api_client_LDADD = \
|
|||||||
|
|
||||||
CLEANFILES += $(BUILT_SOURCES)
|
CLEANFILES += $(BUILT_SOURCES)
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
|
matrix-marshalers.list \
|
||||||
$(INST_H_SRC_FILES) \
|
$(INST_H_SRC_FILES) \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
matrix-marshalers.h: stamp-matrix-marshalers
|
||||||
|
@true
|
||||||
|
|
||||||
|
stamp-matrix-marshalers: matrix-marshalers.list
|
||||||
|
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_matrix_marshal \
|
||||||
|
$(srcdir)/matrix-marshalers.list \
|
||||||
|
--header \
|
||||||
|
--valist-marshallers >> xgen-gmlh \
|
||||||
|
&& (cmp -s xgen-gmlh matrix-marshalers.h \
|
||||||
|
|| cp xgen-gmlh matrix-marshalers.h) \
|
||||||
|
&& rm -f xgen-gmlh \
|
||||||
|
&& echo timestamp > $(@F)
|
||||||
|
|
||||||
|
matrix-marshalers.c: matrix-marshalers.h
|
||||||
|
$(AM_V_GEN) (echo "#include \"matrix-marshalers.h\""; \
|
||||||
|
echo "#undef G_ENABLE_DEBUG"; \
|
||||||
|
$(GLIB_GENMARSHAL) --prefix=_matrix_marshal \
|
||||||
|
$(srcdir)/matrix-marshalers.list \
|
||||||
|
--body \
|
||||||
|
--valist-marshallers) >> xgen-gmlc \
|
||||||
|
&& cp xgen-gmlc matrix-marshalers.c \
|
||||||
|
&& rm -f xgen-gmlc
|
||||||
|
|
||||||
|
CLEANFILES += stamp-matrix-marshalers
|
||||||
|
|
||||||
include $(INTROSPECTION_MAKEFILE)
|
include $(INTROSPECTION_MAKEFILE)
|
||||||
Matrix-0.0.gir: libmatrix-glib-$(MATRIX_GLIB_API_VERSION).la
|
Matrix-0.0.gir: libmatrix-glib-$(MATRIX_GLIB_API_VERSION).la
|
||||||
|
|
||||||
|
@ -33,6 +33,36 @@ public interface Matrix.Client : GLib.Object {
|
|||||||
login_finished(bool success)
|
login_finished(bool success)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This signal is a sign of an incoming event. It gets emitted for
|
||||||
|
* every signal, regardless if it is handled by other event
|
||||||
|
* signals, before other signals.
|
||||||
|
*
|
||||||
|
* Implementations are responsible for emitting this signal when
|
||||||
|
* any kind of event arrives from the event stream or the history.
|
||||||
|
*
|
||||||
|
* @param room_id the ID of the room associated with this event
|
||||||
|
* @param raw_event the raw event as a JSON object
|
||||||
|
* @param matrix_event the event as a {@link Matrix.Event}
|
||||||
|
*/
|
||||||
|
[Signal (detailed=true)]
|
||||||
|
public virtual signal void
|
||||||
|
@event(string? room_id, Json.Node raw_event, Matrix.Event matrix_event)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback function delegate for the event signal.
|
||||||
|
*
|
||||||
|
* @param room_id the room the event associated with
|
||||||
|
* @param raw_event the event as a raw JSON object
|
||||||
|
* @param matrix_event the event as a Matrix.Event object
|
||||||
|
*/
|
||||||
|
public delegate void
|
||||||
|
EventCallback(Matrix.Client client,
|
||||||
|
string? room_id,
|
||||||
|
Json.Node raw_event,
|
||||||
|
Matrix.Event matrix_event);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Authenticate with the Matrix.org server with a username and
|
* Authenticate with the Matrix.org server with a username and
|
||||||
* password.
|
* password.
|
||||||
@ -103,4 +133,37 @@ public interface Matrix.Client : GLib.Object {
|
|||||||
{
|
{
|
||||||
login_finished(success);
|
login_finished(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emits the #MatrixClient::event signal.
|
||||||
|
*
|
||||||
|
* @param room_id the room this event is associated with
|
||||||
|
* @param raw_event the raw event
|
||||||
|
* @param matrix_event the event as a Matrix.Event
|
||||||
|
*/
|
||||||
|
public void
|
||||||
|
incoming_event(string? room_id,
|
||||||
|
Json.Node raw_event,
|
||||||
|
Matrix.Event matrix_event)
|
||||||
|
{
|
||||||
|
Quark equark = matrix_event.get_type().qname();
|
||||||
|
|
||||||
|
this.@event[equark.to_string()](room_id, raw_event, matrix_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect a handler for events. If @param event_gtype is
|
||||||
|
* Matrix.Event, all events will be sent to the callback function,
|
||||||
|
* otherwise only events that match the specified event type.
|
||||||
|
*
|
||||||
|
* If @event_gtype is not derived from
|
||||||
|
* {@link Matrix.Event}, @param callback won’t get connected.
|
||||||
|
*
|
||||||
|
* @param event_gtype the {@link GLib.Type} of a
|
||||||
|
* {@link Matrix.Event} derivative
|
||||||
|
* @param callback the allback function to connect
|
||||||
|
*/
|
||||||
|
public extern void
|
||||||
|
connect_event(GLib.Type event_gtype,
|
||||||
|
owned EventCallback event_callback);
|
||||||
}
|
}
|
||||||
|
@ -153,3 +153,39 @@ static void
|
|||||||
matrix_event_types_ctor(void)
|
matrix_event_types_ctor(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
matrix_client_connect_event(MatrixClient *client,
|
||||||
|
GType event_gtype,
|
||||||
|
MatrixClientEventCallback callback,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify destroy_notify)
|
||||||
|
{
|
||||||
|
GClosure *closure;
|
||||||
|
GQuark equark;
|
||||||
|
MatrixEventClass *event_class = MATRIX_EVENT_CLASS(
|
||||||
|
g_type_class_ref(event_gtype));
|
||||||
|
guint event_signal_id = g_signal_lookup("event", MATRIX_TYPE_CLIENT);
|
||||||
|
|
||||||
|
if (!MATRIX_IS_EVENT_CLASS(event_class)) {
|
||||||
|
g_warning("Trying to connect to a type that is not derived from MatrixEvent");
|
||||||
|
g_type_class_unref(event_class);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_type_class_unref(event_class);
|
||||||
|
equark = g_type_qname(event_gtype);
|
||||||
|
|
||||||
|
closure = g_closure_ref(g_cclosure_new(G_CALLBACK(callback),
|
||||||
|
user_data,
|
||||||
|
(GClosureNotify)destroy_notify));
|
||||||
|
g_closure_set_marshal(closure,
|
||||||
|
_matrix_marshal_VOID__STRING_BOXED_OBJECT);
|
||||||
|
g_closure_sink(closure);
|
||||||
|
|
||||||
|
g_signal_connect_closure_by_id(client,
|
||||||
|
event_signal_id, equark,
|
||||||
|
closure, FALSE);
|
||||||
|
|
||||||
|
}
|
||||||
|
1
src/matrix-marshalers.list
Normal file
1
src/matrix-marshalers.list
Normal file
@ -0,0 +1 @@
|
|||||||
|
VOID:STRING,BOXED,OBJECT
|
Loading…
Reference in New Issue
Block a user