From 2a973ff9402dab9d6c751a146a9f83617d0e5211 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 23 Oct 2020 10:25:08 +0200 Subject: Matrix: start on room tags, fix thread race condition on accessing room variables (name, avatar url, prev batch) --- plugins/Matrix.hpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'plugins/Matrix.hpp') diff --git a/plugins/Matrix.hpp b/plugins/Matrix.hpp index c3c5539..f0ca4f5 100644 --- a/plugins/Matrix.hpp +++ b/plugins/Matrix.hpp @@ -20,7 +20,7 @@ namespace QuickMedia { (void)result_tabs; return PluginResult::ERR; } - bool is_video_page() const override { return true; } + PageTypez get_type() const override { return PageTypez::VIDEO; } }; struct RoomData; @@ -90,10 +90,19 @@ namespace QuickMedia { const std::vector>& get_messages_thread_unsafe() const; const std::vector& get_pinned_events_unsafe() const; + bool has_prev_batch(); + void set_prev_batch(const std::string &new_prev_batch); + std::string get_prev_batch(); + + bool has_name(); + void set_name(const std::string &new_name); + std::string get_name(); + + bool has_avatar_url(); + void set_avatar_url(const std::string &new_avatar_url); + std::string get_avatar_url(); + std::string id; - std::string name; - std::string avatar_url; - std::string prev_batch; bool initial_fetch_finished = false; // These 4 variables are set by QuickMedia, not the matrix plugin @@ -106,9 +115,16 @@ namespace QuickMedia { // The value is nullptr if the message is fetched and cached but the event if referenced an invalid message. // TODO: Verify if replied to messages are also part of /sync; then this is not needed. std::unordered_map> fetched_messages_by_event_id; + + size_t index; private: std::mutex user_mutex; std::mutex room_mutex; + + std::string name; + std::string avatar_url; + std::string prev_batch; + // Each room has its own list of user data, even if multiple rooms has the same user // because users can have different display names and avatars in different rooms. std::unordered_map> user_info_by_user_id; @@ -194,6 +210,7 @@ namespace QuickMedia { void events_add_messages(const rapidjson::Value &events_json, RoomData *room_data, MessageDirection message_dir, RoomSyncData *room_sync_data, bool has_unread_notifications); void events_set_room_name(const rapidjson::Value &events_json, RoomData *room_data); void events_add_pinned_events(const rapidjson::Value &events_json, RoomData *room_data, RoomSyncData &room_sync_data); + void events_add_room_to_tags(const rapidjson::Value &events_json, RoomData *room_data); std::shared_ptr parse_message_event(const rapidjson::Value &event_item_json, RoomData *room_data); PluginResult upload_file(RoomData *room, const std::string &filepath, UploadInfo &file_info, UploadInfo &thumbnail_info, std::string &err_msg); @@ -205,6 +222,7 @@ namespace QuickMedia { private: std::vector> rooms; std::unordered_map room_data_by_id; // value is an index into |rooms| + std::map> rooms_by_tag_name; // value is an index into |rooms| size_t room_list_read_index = 0; std::mutex room_data_mutex; std::string user_id; -- cgit v1.2.3