diff --git a/.gitignore b/.gitignore index 60073a0..1b645bb 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ Makefile.in /src/matrix-event-typing.c /src/matrix-event-room-aliases.c /src/matrix-event-receipt.c +/src/matrix-event-room-history-visibility.c diff --git a/src/Makefile.am b/src/Makefile.am index eec415e..9794f9e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,6 +33,7 @@ libmatrix_glib_0_0_la_VALA_SOURCES = \ matrix-event-typing.vala \ matrix-event-room-aliases.vala \ matrix-event-receipt.vala \ + matrix-event-room-history-visibility.vala \ $(NULL) AM_CPPFLAGS += \ diff --git a/src/matrix-enums.vala b/src/matrix-enums.vala index a9982b9..3d1f3e4 100644 --- a/src/matrix-enums.vala +++ b/src/matrix-enums.vala @@ -216,6 +216,14 @@ namespace Matrix { SENDER } + public enum HistoryVisibility { + UNKNOWN, + INVITED, + JOINED, + SHARE, + WORLD_READABLE; + } + private int? _g_enum_nick_to_value(Type enum_type, string nick) { diff --git a/src/matrix-event-room-history-visibility.vala b/src/matrix-event-room-history-visibility.vala new file mode 100644 index 0000000..082305f --- /dev/null +++ b/src/matrix-event-room-history-visibility.vala @@ -0,0 +1,77 @@ +/* + * This file is part of matrix-glib-sdk + * + * matrix-glib-sdk is free software: you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * matrix-glib-sdk is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with matrix-glib-sdk. If not, see + * . + */ + +/** + * Class to hold a m.room.history_visibility event. + * + * This event controls whether a user can see the events that happened + * in a room from before they joined. + */ +public class Matrix.Event.RoomHistoryVisibility : Matrix.Event.State { + /** + * Who can see the room history. + */ + public Matrix.HistoryVisibility visibility { + get; set; + + default = Matrix.HistoryVisibility.UNKNOWN; + } + + protected override void + from_json(Json.Node json_data) + throws Matrix.Error + { + var content_root = json_data.get_object() + .get_member("content").get_object(); + Json.Node? node; + + if ((node = content_root.get_member("history_visibility")) != null) { + Matrix.HistoryVisibility? vis = (Matrix.HistoryVisibility?)_g_enum_nick_to_value( + typeof(Matrix.HistoryVisibility), + node.get_string()); + + if (vis != null) { + _visibility = vis; + } else { + _visibility = Matrix.HistoryVisibility.UNKNOWN; + } + } + + base.from_json(json_data); + } + + protected override void + to_json(Json.Node json_data) + throws Matrix.Error + { + var content_root = json_data.get_object() + .get_member("content").get_object(); + + if (visibility == Matrix.HistoryVisibility.UNKNOWN) { + throw new Matrix.Error.UNKNOWN_VALUE( + "Won't send m.room.history_visibility event with unknown visibility value"); + } + + content_root.set_string_member("history_visibility", + _g_enum_value_to_nick( + typeof(Matrix.HistoryVisibility), + visibility)); + + base.to_json(json_data); + } +} diff --git a/src/matrix-event-types.c b/src/matrix-event-types.c index fc90c69..8d4b856 100644 --- a/src/matrix-event-types.c +++ b/src/matrix-event-types.c @@ -173,6 +173,9 @@ matrix_event_types_ctor(void) matrix_event_register_type("m.receipt", MATRIX_EVENT_TYPE_RECEIPT, NULL); + matrix_event_register_type("m.room.history_visibility", + MATRIX_EVENT_TYPE_ROOM_HISTORY_VISIBILITY, + NULL); } void