Bon, à nouveau ça marche plus dans bubble UPNP.

This commit is contained in:
2025-11-28 23:13:59 +01:00
parent 128fa823a9
commit 7562801989
9 changed files with 877 additions and 4 deletions

View File

@@ -29,6 +29,7 @@ impl UpnpInstance for ArgInstanceSet {
fn new(_: &ArgumentSet) -> Self {
Self {
objects: RwLock::new(HashMap::new()),
order: RwLock::new(Vec::new()),
}
}
}

View File

@@ -259,6 +259,7 @@ impl UpnpInstance for ActionInstanceSet {
fn new(_: &ActionSet) -> Self {
Self {
objects: RwLock::new(HashMap::new()),
order: RwLock::new(Vec::new()),
}
}
}

View File

@@ -32,6 +32,7 @@ pub struct UpnpObjectType {
#[derive(Debug)]
pub struct UpnpObjectSet<T: UpnpTypedObject> {
objects: RwLock<HashMap<String, Arc<T>>>,
order: RwLock<Vec<String>>,
}
#[derive(Debug)]

View File

@@ -12,6 +12,7 @@ use crate::{UpnpDeepClone, UpnpObjectSet, UpnpObjectSetError, UpnpTypedObject};
impl<T: UpnpTypedObject> UpnpDeepClone for UpnpObjectSet<T> {
fn deep_clone(&self) -> Self {
let guard = self.objects.read().unwrap();
let order_guard = self.order.read().unwrap();
let cloned_map: HashMap<String, Arc<T>> = guard
.iter()
@@ -20,6 +21,7 @@ impl<T: UpnpTypedObject> UpnpDeepClone for UpnpObjectSet<T> {
Self {
objects: RwLock::new(cloned_map),
order: RwLock::new(order_guard.clone()),
}
}
}
@@ -39,9 +41,11 @@ impl<T: UpnpTypedObject> UpnpDeepClone for UpnpObjectSet<T> {
impl<T: UpnpTypedObject> Clone for UpnpObjectSet<T> {
fn clone(&self) -> Self {
let guard = self.objects.read().unwrap();
let order_guard = self.order.read().unwrap();
Self {
objects: RwLock::new(guard.clone()),
order: RwLock::new(order_guard.clone()),
}
}
}
@@ -57,6 +61,7 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
pub fn new() -> Self {
Self {
objects: RwLock::new(HashMap::new()),
order: RwLock::new(Vec::new()),
}
}
@@ -80,13 +85,15 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
/// ```
pub fn insert(&mut self, object: Arc<T>) -> Result<(), UpnpObjectSetError> {
let mut guard = self.objects.write().unwrap();
let mut order_guard = self.order.write().unwrap();
let key = object.get_name().to_string();
if guard.contains_key(&key) {
return Err(UpnpObjectSetError::AlreadyExists(key));
}
guard.insert(key, object);
guard.insert(key.clone(), object);
order_guard.push(key);
Ok(())
}
@@ -110,8 +117,13 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
/// ```
pub fn insert_or_replace(&mut self, object: Arc<T>) {
let mut guard = self.objects.write().unwrap();
let mut order_guard = self.order.write().unwrap();
let key: String = object.get_name().to_string();
if !guard.contains_key(&key) {
order_guard.push(key.clone());
}
guard.insert(key, object);
}
@@ -192,6 +204,11 @@ impl<T: UpnpTypedObject> UpnpObjectSet<T> {
/// appeler cette méthode simultanément sans blocage.
pub fn all(&self) -> Vec<Arc<T>> {
let guard = self.objects.read().unwrap();
guard.values().cloned().collect()
let order_guard = self.order.read().unwrap();
order_guard
.iter()
.filter_map(|k| guard.get(k).cloned())
.collect()
}
}

View File

@@ -29,6 +29,7 @@ impl UpnpInstance for StateVarInstanceSet {
fn new(_: &StateVariableSet) -> Self {
Self {
objects: RwLock::new(HashMap::new()),
order: RwLock::new(Vec::new()),
}
}
}