[fractal/fractal-next] Use Arc<UserId> instead of Box<UserId>
- From: Julian Sparber <jsparber src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal/fractal-next] Use Arc<UserId> instead of Box<UserId>
- Date: Mon, 17 Jan 2022 20:53:06 +0000 (UTC)
commit 659f060dca09cfecb3557df048b2679d29d1a7fc
Author: Julian Sparber <julian sparber net>
Date: Mon Jan 17 21:37:38 2022 +0100
Use Arc<UserId> instead of Box<UserId>
.../room_details/invite_subpage/invitee_list.rs | 11 ++++---
src/session/mod.rs | 4 +--
src/session/room/event.rs | 9 +++---
src/session/room/item.rs | 3 +-
src/session/room/member.rs | 4 +--
src/session/room/member_list.rs | 18 +++++------
src/session/room/mod.rs | 6 ++--
src/session/room/timeline.rs | 20 ++++++------
src/session/user.rs | 16 +++++-----
src/session/verification/identity_verification.rs | 2 +-
src/session/verification/verification_list.rs | 36 ++++++++++------------
11 files changed, 65 insertions(+), 64 deletions(-)
---
diff --git a/src/session/content/room_details/invite_subpage/invitee_list.rs
b/src/session/content/room_details/invite_subpage/invitee_list.rs
index ccc31e5b..ac6f4195 100644
--- a/src/session/content/room_details/invite_subpage/invitee_list.rs
+++ b/src/session/content/room_details/invite_subpage/invitee_list.rs
@@ -2,6 +2,7 @@ use gtk::{gio, glib, glib::clone, prelude::*, subclass::prelude::*};
use log::error;
use matrix_sdk::ruma::{api::client::r0::user_directory::search_users, identifiers::UserId};
use matrix_sdk::HttpError;
+use std::sync::Arc;
use crate::session::user::UserExt;
use crate::{session::Room, spawn, spawn_tokio};
@@ -40,7 +41,7 @@ mod imp {
pub room: OnceCell<Room>,
pub state: Cell<InviteeListState>,
pub search_term: RefCell<Option<String>>,
- pub invitee_list: RefCell<HashMap<Box<UserId>, Invitee>>,
+ pub invitee_list: RefCell<HashMap<Arc<UserId>, Invitee>>,
pub abort_handle: RefCell<Option<AbortHandle>>,
}
@@ -244,7 +245,7 @@ impl InviteeList {
.filter_map(|item| {
// Skip over users that are already in the room
if member_list.contains(&item.user_id) {
- self.remove_invitee(&item.user_id);
+ self.remove_invitee(item.user_id.into());
None
} else if let Some(user) = self.get_invitee(&item.user_id) {
// The avatar or the display name may have changed in the mean time
@@ -333,7 +334,7 @@ impl InviteeList {
priv_
.invitee_list
.borrow_mut()
- .insert(user.user_id().to_owned(), user.clone());
+ .insert(user.user_id(), user.clone());
self.emit_by_name("invitee-added", &[&user]).unwrap();
self.notify("has-selected");
}
@@ -348,9 +349,9 @@ impl InviteeList {
.collect()
}
- fn remove_invitee(&self, user_id: &UserId) {
+ fn remove_invitee(&self, user_id: Arc<UserId>) {
let priv_ = imp::InviteeList::from_instance(self);
- let removed = priv_.invitee_list.borrow_mut().remove(user_id);
+ let removed = priv_.invitee_list.borrow_mut().remove(&user_id);
if let Some(user) = removed {
user.set_invited(false);
self.emit_by_name("invitee-removed", &[&user]).unwrap();
diff --git a/src/session/mod.rs b/src/session/mod.rs
index 1304430e..32e6ba06 100644
--- a/src/session/mod.rs
+++ b/src/session/mod.rs
@@ -397,7 +397,7 @@ impl Session {
match handle.await.unwrap() {
Ok((display_name, avatar_url)) => {
user.set_display_name(display_name);
- user.set_avatar_url(avatar_url)
+ user.set_avatar_url(avatar_url);
}
Err(error) => error!("Couldn’t fetch account metadata: {}", error),
}
@@ -500,7 +500,7 @@ impl Session {
fn mark_ready(&self) {
let priv_ = imp::Session::from_instance(self);
let client = self.client();
- let user_id = self.user().unwrap().user_id().to_owned();
+ let user_id = self.user().unwrap().user_id();
priv_.is_ready.set(true);
diff --git a/src/session/room/event.rs b/src/session/room/event.rs
index df466648..105f46df 100644
--- a/src/session/room/event.rs
+++ b/src/session/room/event.rs
@@ -15,6 +15,7 @@ use matrix_sdk::{
},
Error as MatrixError,
};
+use std::sync::Arc;
use crate::{
session::{room::Member, Room},
@@ -174,7 +175,7 @@ impl Event {
}
pub fn sender(&self) -> Member {
- self.room().members().member_by_id(&self.matrix_sender())
+ self.room().members().member_by_id(self.matrix_sender())
}
pub fn room(&self) -> Room {
@@ -210,11 +211,11 @@ impl Event {
self.notify("can-view-media");
}
- pub fn matrix_sender(&self) -> Box<UserId> {
+ pub fn matrix_sender(&self) -> Arc<UserId> {
let priv_ = imp::Event::from_instance(self);
if let Some(event) = priv_.event.borrow().as_ref() {
- event.sender().to_owned()
+ event.sender().into()
} else {
priv_
.pure_event
@@ -222,7 +223,7 @@ impl Event {
.as_ref()
.unwrap()
.event
- .get_field::<Box<UserId>>("sender")
+ .get_field::<Arc<UserId>>("sender")
.unwrap()
.unwrap()
}
diff --git a/src/session/room/item.rs b/src/session/room/item.rs
index 9359c715..46ca8449 100644
--- a/src/session/room/item.rs
+++ b/src/session/room/item.rs
@@ -3,6 +3,7 @@ use matrix_sdk::ruma::{
events::AnySyncRoomEvent,
identifiers::{EventId, UserId},
};
+use std::sync::Arc;
use crate::session::room::Event;
@@ -182,7 +183,7 @@ impl Item {
}
}
- pub fn matrix_sender(&self) -> Option<Box<UserId>> {
+ pub fn matrix_sender(&self) -> Option<Arc<UserId>> {
let priv_ = imp::Item::from_instance(self);
if let ItemType::Event(event) = priv_.type_.get().unwrap() {
Some(event.matrix_sender())
diff --git a/src/session/room/member.rs b/src/session/room/member.rs
index dfc3f73a..1af7a0f8 100644
--- a/src/session/room/member.rs
+++ b/src/session/room/member.rs
@@ -98,7 +98,7 @@ impl Member {
/// Update the user based on the the room member state event
pub fn update_from_room_member(&self, member: &RoomMember) {
- if member.user_id() != self.user_id() {
+ if member.user_id() != &*self.user_id() {
log::error!("Tried Member update from RoomMember with wrong user ID.");
return;
};
@@ -111,7 +111,7 @@ impl Member {
/// Update the user based on the the room member state event
pub fn update_from_member_event(&self, event: &impl MemberEvent) {
- if event.sender() != self.user_id() {
+ if event.sender() != &*self.user_id() {
log::error!("Tried Member update from MemberEvent with wrong user ID.");
return;
};
diff --git a/src/session/room/member_list.rs b/src/session/room/member_list.rs
index 5158eb1a..756d9f3f 100644
--- a/src/session/room/member_list.rs
+++ b/src/session/room/member_list.rs
@@ -1,7 +1,7 @@
+use crate::session::room::{Member, Room, UserId};
use gtk::{gio, glib, prelude::*, subclass::prelude::*};
use indexmap::IndexMap;
-
-use crate::session::room::{Member, Room, UserId};
+use std::sync::Arc;
use matrix_sdk::ruma::events::{room::member::RoomMemberEventContent, SyncStateEvent};
@@ -13,7 +13,7 @@ mod imp {
#[derive(Debug, Default)]
pub struct MemberList {
- pub members: RefCell<IndexMap<Box<UserId>, Member>>,
+ pub members: RefCell<IndexMap<Arc<UserId>, Member>>,
pub room: OnceCell<WeakRef<Room>>,
}
@@ -108,8 +108,8 @@ impl MemberList {
let prev_len = members.len();
for member in new_members {
members
- .entry(member.user_id().to_owned())
- .or_insert_with(|| Member::new(&self.room(), member.user_id()))
+ .entry(member.user_id().into())
+ .or_insert_with_key(|user_id| Member::new(&self.room(), user_id))
.update_from_room_member(&member);
}
let num_members_added = members.len().saturating_sub(prev_len);
@@ -126,13 +126,13 @@ impl MemberList {
/// Returns the member with the given ID.
///
/// Creates a new member first if there is no member with the given ID.
- pub fn member_by_id(&self, user_id: &UserId) -> Member {
+ pub fn member_by_id(&self, user_id: Arc<UserId>) -> Member {
let mut members = imp::MemberList::from_instance(self).members.borrow_mut();
let mut was_member_added = false;
let prev_len = members.len();
let member = members
- .entry(user_id.to_owned())
- .or_insert_with(|| {
+ .entry(user_id)
+ .or_insert_with_key(|user_id| {
was_member_added = true;
Member::new(&self.room(), user_id)
})
@@ -153,7 +153,7 @@ impl MemberList {
///
/// Creates a new member first if there is no member matching the given event.
pub fn update_member_for_member_event(&self, event: &SyncStateEvent<RoomMemberEventContent>) {
- self.member_by_id(&event.sender)
+ self.member_by_id(event.sender.clone().into())
.update_from_member_event(event);
}
diff --git a/src/session/room/mod.rs b/src/session/room/mod.rs
index 3dd37614..a17b3e8d 100644
--- a/src/session/room/mod.rs
+++ b/src/session/room/mod.rs
@@ -51,6 +51,7 @@ use serde_json::value::RawValue;
use std::cell::RefCell;
use std::convert::TryInto;
use std::path::PathBuf;
+use std::sync::Arc;
use crate::components::{LabelWithWidgets, Pill};
use crate::prelude::*;
@@ -851,7 +852,7 @@ impl Room {
let event = AnySyncMessageEvent::RoomMessage(SyncMessageEvent {
content: content.clone(),
event_id: EventId::parse(format!("${}:fractal.gnome.org", txn_id).as_str()).unwrap(),
- sender: self.session().user().unwrap().user_id().to_owned(),
+ sender: self.session().user().unwrap().user_id().as_ref().to_owned(),
origin_server_ts: MilliSecondsSinceUnixEpoch::now(),
unsigned: Unsigned::default(),
});
@@ -1075,8 +1076,7 @@ impl Room {
pub async fn invite(&self, users: &[User]) {
let matrix_room = self.matrix_room();
- let user_ids: Vec<Box<UserId>> =
- users.iter().map(|user| user.user_id().to_owned()).collect();
+ let user_ids: Vec<Arc<UserId>> = users.iter().map(|user| user.user_id()).collect();
if let MatrixRoom::Joined(matrix_room) = matrix_room {
let handle = spawn_tokio!(async move {
diff --git a/src/session/room/timeline.rs b/src/session/room/timeline.rs
index 67ffada1..7c757995 100644
--- a/src/session/room/timeline.rs
+++ b/src/session/room/timeline.rs
@@ -714,12 +714,12 @@ impl Timeline {
let user = session.user().unwrap();
- let user_to_verify = if &request.to == user.user_id() {
+ let user_to_verify = if &*request.to == &*user.user_id() {
// The request was sent by another user to verify us
event.sender()
- } else if &message.sender == user.user_id() {
+ } else if &*message.sender == &*user.user_id() {
// The request was sent by us to verify another user
- self.room().members().member_by_id(&request.to)
+ self.room().members().member_by_id(request.to.into())
} else {
// Ignore the request when it doesn't verify us or wasn't set by us
return;
@@ -745,25 +745,25 @@ impl Timeline {
return;
}
AnySyncMessageEvent::KeyVerificationReady(e) => {
- FlowId::new(e.sender, e.content.relates_to.event_id.to_string())
+ FlowId::new(e.sender.into(), e.content.relates_to.event_id.to_string())
}
AnySyncMessageEvent::KeyVerificationStart(e) => {
- FlowId::new(e.sender, e.content.relates_to.event_id.to_string())
+ FlowId::new(e.sender.into(), e.content.relates_to.event_id.to_string())
}
AnySyncMessageEvent::KeyVerificationCancel(e) => {
- FlowId::new(e.sender, e.content.relates_to.event_id.to_string())
+ FlowId::new(e.sender.into(), e.content.relates_to.event_id.to_string())
}
AnySyncMessageEvent::KeyVerificationAccept(e) => {
- FlowId::new(e.sender, e.content.relates_to.event_id.to_string())
+ FlowId::new(e.sender.into(), e.content.relates_to.event_id.to_string())
}
AnySyncMessageEvent::KeyVerificationKey(e) => {
- FlowId::new(e.sender, e.content.relates_to.event_id.to_string())
+ FlowId::new(e.sender.into(), e.content.relates_to.event_id.to_string())
}
AnySyncMessageEvent::KeyVerificationMac(e) => {
- FlowId::new(e.sender, e.content.relates_to.event_id.to_string())
+ FlowId::new(e.sender.into(), e.content.relates_to.event_id.to_string())
}
AnySyncMessageEvent::KeyVerificationDone(e) => {
- FlowId::new(e.sender, e.content.relates_to.event_id.to_string())
+ FlowId::new(e.sender.into(), e.content.relates_to.event_id.to_string())
}
_ => {
return;
diff --git a/src/session/user.rs b/src/session/user.rs
index 94aaae0a..1a53bb3e 100644
--- a/src/session/user.rs
+++ b/src/session/user.rs
@@ -4,6 +4,7 @@ use matrix_sdk::ruma::identifiers::{MxcUri, UserId};
use crate::session::{Avatar, Session};
use crate::spawn_tokio;
use matrix_sdk::encryption::identities::UserIdentity;
+use std::sync::Arc;
use log::error;
@@ -11,11 +12,11 @@ mod imp {
use super::*;
use glib::object::WeakRef;
use once_cell::{sync::Lazy, unsync::OnceCell};
- use std::{cell::RefCell, convert::TryInto};
+ use std::cell::RefCell;
#[derive(Debug, Default)]
pub struct User {
- pub user_id: OnceCell<Box<UserId>>,
+ pub user_id: OnceCell<Arc<UserId>>,
pub display_name: RefCell<Option<String>>,
pub session: OnceCell<WeakRef<Session>>,
pub avatar: OnceCell<Avatar>,
@@ -75,8 +76,9 @@ mod imp {
) {
match pspec.name() {
"user-id" => {
- let user_id = value.get::<&str>().unwrap().try_into().unwrap();
- self.user_id.set(user_id).unwrap();
+ self.user_id
+ .set(UserId::parse_arc(value.get::<&str>().unwrap()).unwrap())
+ .unwrap();
}
"display-name" => {
obj.set_display_name(value.get::<Option<String>>().unwrap());
@@ -126,7 +128,7 @@ impl User {
pub async fn crypto_identity(&self) -> Option<UserIdentity> {
let client = self.session().client();
- let user_id = self.user_id().to_owned();
+ let user_id = self.user_id();
let handle = spawn_tokio!(async move { client.get_user_identity(&user_id).await });
match handle.await.unwrap() {
@@ -145,9 +147,9 @@ pub trait UserExt: IsA<User> {
priv_.session.get().unwrap().upgrade().unwrap()
}
- fn user_id(&self) -> &UserId {
+ fn user_id(&self) -> Arc<UserId> {
let priv_ = imp::User::from_instance(self.upcast_ref());
- priv_.user_id.get().unwrap()
+ priv_.user_id.get().unwrap().clone()
}
fn display_name(&self) -> String {
diff --git a/src/session/verification/identity_verification.rs
b/src/session/verification/identity_verification.rs
index d74a7c65..e188ee91 100644
--- a/src/session/verification/identity_verification.rs
+++ b/src/session/verification/identity_verification.rs
@@ -400,7 +400,7 @@ impl IdentityVerification {
};
let client = self.session().client();
- let user_id = self.user().user_id().to_owned();
+ let user_id = self.user().user_id();
let flow_id = self.flow_id().to_owned();
let (sync_sender, sync_receiver) = mpsc::channel(100);
diff --git a/src/session/verification/verification_list.rs b/src/session/verification/verification_list.rs
index ce07d0a7..22984e2a 100644
--- a/src/session/verification/verification_list.rs
+++ b/src/session/verification/verification_list.rs
@@ -8,15 +8,16 @@ use log::{debug, warn};
use matrix_sdk::ruma::{
api::client::r0::sync::sync_events::ToDevice, events::AnyToDeviceEvent, identifiers::UserId,
};
+use std::sync::Arc;
#[derive(Hash, PartialEq, Eq, Debug)]
pub struct FlowId {
- user_id: Box<UserId>,
+ user_id: Arc<UserId>,
flow_id: String,
}
impl FlowId {
- pub fn new(user_id: Box<UserId>, flow_id: String) -> Self {
+ pub fn new(user_id: Arc<UserId>, flow_id: String) -> Self {
Self { user_id, flow_id }
}
}
@@ -118,14 +119,14 @@ impl VerificationList {
debug!("Received verification event: {:?}", event);
let request = match event {
AnyToDeviceEvent::KeyVerificationRequest(e) => {
- let flow_id = FlowId::new(e.sender, e.content.transaction_id);
+ let flow_id = FlowId::new(e.sender.into(), e.content.transaction_id);
if let Some(request) = self.get_by_id(&flow_id) {
Some(request)
} else {
let session = self.session();
let user = session.user().unwrap();
// ToDevice verifications can only be send by us
- if &flow_id.user_id != user.user_id() {
+ if flow_id.user_id != user.user_id() {
warn!("Received a device verification event from a different user, which isn't
allowed");
continue;
}
@@ -168,25 +169,25 @@ impl VerificationList {
}
}
AnyToDeviceEvent::KeyVerificationReady(e) => {
- self.get_by_id(&FlowId::new(e.sender, e.content.transaction_id))
+ self.get_by_id(&FlowId::new(e.sender.into(), e.content.transaction_id))
}
AnyToDeviceEvent::KeyVerificationStart(e) => {
- self.get_by_id(&FlowId::new(e.sender, e.content.transaction_id))
+ self.get_by_id(&FlowId::new(e.sender.into(), e.content.transaction_id))
}
AnyToDeviceEvent::KeyVerificationCancel(e) => {
- self.get_by_id(&FlowId::new(e.sender, e.content.transaction_id))
+ self.get_by_id(&FlowId::new(e.sender.into(), e.content.transaction_id))
}
AnyToDeviceEvent::KeyVerificationAccept(e) => {
- self.get_by_id(&FlowId::new(e.sender, e.content.transaction_id))
+ self.get_by_id(&FlowId::new(e.sender.into(), e.content.transaction_id))
}
AnyToDeviceEvent::KeyVerificationMac(e) => {
- self.get_by_id(&FlowId::new(e.sender, e.content.transaction_id))
+ self.get_by_id(&FlowId::new(e.sender.into(), e.content.transaction_id))
}
AnyToDeviceEvent::KeyVerificationKey(e) => {
- self.get_by_id(&FlowId::new(e.sender, e.content.transaction_id))
+ self.get_by_id(&FlowId::new(e.sender.into(), e.content.transaction_id))
}
AnyToDeviceEvent::KeyVerificationDone(e) => {
- self.get_by_id(&FlowId::new(e.sender, e.content.transaction_id))
+ self.get_by_id(&FlowId::new(e.sender.into(), e.content.transaction_id))
}
_ => continue,
};
@@ -220,10 +221,7 @@ impl VerificationList {
);
list.insert(
- FlowId::new(
- request.user().user_id().to_owned(),
- request.flow_id().to_owned(),
- ),
+ FlowId::new(request.user().user_id(), request.flow_id().to_owned()),
request,
);
length as u32
@@ -234,11 +232,9 @@ impl VerificationList {
pub fn remove(&self, request: &IdentityVerification) {
let priv_ = imp::VerificationList::from_instance(self);
- let position = if let Some((position, _, _)) =
- priv_.list.borrow_mut().shift_remove_full(&FlowId::new(
- request.user().user_id().to_owned(),
- request.flow_id().to_owned(),
- )) {
+ let position = if let Some((position, _, _)) = priv_.list.borrow_mut().shift_remove_full(
+ &FlowId::new(request.user().user_id(), request.flow_id().to_owned()),
+ ) {
position
} else {
return;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]