[fractal] Fix case handling when not finding file uri



commit 830c46937b212a85775a9b420c50a3bccedecb23
Author: sonjita <sonjaleaheinze gmail com>
Date:   Tue Jan 28 19:28:18 2020 +0100

    Fix case handling when not finding file uri
    
    For files (pdf, image, audio, video) in the room history and media viewer,
    the backend is asked to provide the uri of that file. Before, when the
    backend failed to find out the uri, an empty string was sent back to the
    frontend. That triggered unexpected behaviour such as initializing an
    empty audio/video player or not opening the file chooser when hitting
    download or save as.
    
    With this commit, errors finding a file uri get handled separately.

 fractal-gtk/src/actions/room_history.rs  | 21 +++++++++++++++++----
 fractal-gtk/src/widgets/image.rs         | 13 +++++++++++--
 fractal-gtk/src/widgets/inline_player.rs | 12 ++++++++++--
 fractal-matrix-api/src/backend/media.rs  |  9 ++++-----
 fractal-matrix-api/src/backend/types.rs  |  4 ++--
 5 files changed, 44 insertions(+), 15 deletions(-)
---
diff --git a/fractal-gtk/src/actions/room_history.rs b/fractal-gtk/src/actions/room_history.rs
index e7232448..be96f2e3 100644
--- a/fractal-gtk/src/actions/room_history.rs
+++ b/fractal-gtk/src/actions/room_history.rs
@@ -1,11 +1,13 @@
 use fractal_api::clone;
 use fractal_api::r0::AccessToken;
+use log::error;
 use std::fs;
 use std::sync::mpsc::channel;
 use std::sync::mpsc::TryRecvError;
 use std::sync::mpsc::{Receiver, Sender};
 
 use crate::backend::BKCommand;
+use crate::error::Error;
 use crate::i18n::i18n;
 use crate::types::Message;
 use crate::uibuilder::UI;
@@ -104,7 +106,7 @@ pub fn new(
             let name = m.body;
             let url = m.url.unwrap_or_default();
 
-            let (tx, rx): (Sender<String>, Receiver<String>) = channel();
+            let (tx, rx): (Sender<Result<String, Error>>, Receiver<Result<String, Error>>) = channel();
             let _ = b.send(BKCommand::GetMediaAsync(server_url.clone(), url, tx));
 
             let parent_weak = parent_weak.clone();
@@ -118,7 +120,7 @@ pub fn new(
 
                         gtk::Continue(true)
                     },
-                    Ok(fname) => {
+                    Ok(Ok(fname)) => {
                         let window = upgrade_weak!(parent_weak, gtk::Continue(true));
                         if let Some(path) = save(&window, &name, &[]) {
                             // TODO use glib to copy file
@@ -128,6 +130,10 @@ pub fn new(
                         }
                         gtk::Continue(false)
                     }
+                    Ok(Err(err)) => {
+                        error!("Media path could not be found due to error: {:?}", err);
+                        gtk::Continue(false)
+                    }
                 }),
             );
         }
@@ -138,7 +144,10 @@ pub fn new(
         if let Some(m) = get_message(data) {
             let url = m.url.unwrap_or_default();
 
-            let (tx, rx): (Sender<String>, Receiver<String>) = channel();
+            let (tx, rx): (
+                Sender<Result<String, Error>>,
+                Receiver<Result<String, Error>>,
+            ) = channel();
 
             let _ = b.send(BKCommand::GetMediaAsync(server_url.clone(), url.clone(), tx));
 
@@ -150,7 +159,7 @@ pub fn new(
 
                     gtk::Continue(true)
                 }
-                Ok(fname) => {
+                Ok(Ok(fname)) => {
                     if let Ok(pixbuf) = gdk_pixbuf::Pixbuf::new_from_file(fname) {
                         let atom = gdk::Atom::intern("CLIPBOARD");
                         let clipboard = gtk::Clipboard::get(&atom);
@@ -160,6 +169,10 @@ pub fn new(
 
                     gtk::Continue(false)
                 }
+                Ok(Err(err)) => {
+                    error!("Image path could not be found due to error: {:?}", err);
+                    gtk::Continue(false)
+                }
             });
         }
     }));
diff --git a/fractal-gtk/src/widgets/image.rs b/fractal-gtk/src/widgets/image.rs
index cb59e33b..c9e004eb 100644
--- a/fractal-gtk/src/widgets/image.rs
+++ b/fractal-gtk/src/widgets/image.rs
@@ -8,6 +8,7 @@ use glib;
 use gtk;
 use gtk::prelude::*;
 use gtk::DrawingArea;
+use log::error;
 use std::path::Path;
 use std::sync::mpsc::channel;
 use std::sync::mpsc::{Receiver, Sender};
@@ -15,6 +16,7 @@ use std::sync::{Arc, Mutex};
 use url::Url;
 
 use crate::backend::BKCommand;
+use crate::error::Error;
 use std::sync::mpsc::TryRecvError;
 
 #[derive(Clone, Debug)]
@@ -263,7 +265,10 @@ impl Image {
     pub fn load_async(&self) {
         if self.path.starts_with("mxc:") {
             // asyn load
-            let (tx, rx): (Sender<String>, Receiver<String>) = channel();
+            let (tx, rx): (
+                Sender<Result<String, Error>>,
+                Receiver<Result<String, Error>>,
+            ) = channel();
             let command = if self.thumb {
                 BKCommand::GetThumbAsync(self.server_url.clone(), self.path.to_string(), tx)
             } else {
@@ -279,12 +284,16 @@ impl Image {
             gtk::timeout_add(50, move || match rx.try_recv() {
                 Err(TryRecvError::Empty) => gtk::Continue(true),
                 Err(TryRecvError::Disconnected) => gtk::Continue(false),
-                Ok(fname) => {
+                Ok(Ok(fname)) => {
                     *local_path.lock().unwrap() = Some(fname.clone());
                     load_pixbuf(pix.clone(), scaled.clone(), da.clone(), &fname);
                     da.get_style_context().remove_class("image-spinner");
                     gtk::Continue(false)
                 }
+                Ok(Err(err)) => {
+                    error!("Image path could not be found due to error: {:?}", err);
+                    gtk::Continue(false)
+                }
             });
         } else {
             load_pixbuf(
diff --git a/fractal-gtk/src/widgets/inline_player.rs b/fractal-gtk/src/widgets/inline_player.rs
index d69a5e6f..418eef87 100644
--- a/fractal-gtk/src/widgets/inline_player.rs
+++ b/fractal-gtk/src/widgets/inline_player.rs
@@ -46,6 +46,7 @@ use url::Url;
 
 use crate::app::App;
 use crate::backend::BKCommand;
+use crate::error::Error;
 use crate::i18n::i18n;
 
 pub trait PlayerExt {
@@ -481,7 +482,10 @@ impl<T: MediaPlayer + 'static> PlayerExt for T {
         start_playing: bool,
     ) {
         bx.set_opacity(0.3);
-        let (tx, rx): (Sender<String>, Receiver<String>) = channel();
+        let (tx, rx): (
+            Sender<Result<String, Error>>,
+            Receiver<Result<String, Error>>,
+        ) = channel();
         backend
             .send(BKCommand::GetMediaAsync(
                 server_url.clone(),
@@ -501,7 +505,7 @@ impl<T: MediaPlayer + 'static> PlayerExt for T {
                         APPOP!(show_error, (msg));
                         gtk::Continue(true)
                     },
-                    Ok(path) => {
+                    Ok(Ok(path)) => {
                         info!("MEDIA PATH: {}", &path);
                         *local_path.borrow_mut() = Some(path.clone());
                         if ! start_playing {
@@ -522,6 +526,10 @@ impl<T: MediaPlayer + 'static> PlayerExt for T {
                         }
                         gtk::Continue(false)
                     }
+                    Ok(Err(err)) => {
+                        error!("Media path could not be found due to error: {:?}", err);
+                        gtk::Continue(false)
+                    }
                 }
             }),
         );
diff --git a/fractal-matrix-api/src/backend/media.rs b/fractal-matrix-api/src/backend/media.rs
index aa0982a0..8a5f56b5 100644
--- a/fractal-matrix-api/src/backend/media.rs
+++ b/fractal-matrix-api/src/backend/media.rs
@@ -21,17 +21,16 @@ use crate::util::ResultExpectLog;
 use crate::r0::filter::RoomEventFilter;
 use crate::types::Message;
 
-pub fn get_thumb_async(bk: &Backend, baseu: Url, media: String, tx: Sender<String>) {
+pub fn get_thumb_async(bk: &Backend, baseu: Url, media: String, tx: Sender<Result<String, Error>>) {
     semaphore(bk.limit_threads.clone(), move || {
-        let fname =
-            dw_media(&baseu, &media, ContentType::default_thumbnail(), None).unwrap_or_default();
+        let fname = dw_media(&baseu, &media, ContentType::default_thumbnail(), None);
         tx.send(fname).expect_log("Connection closed");
     });
 }
 
-pub fn get_media_async(bk: &Backend, baseu: Url, media: String, tx: Sender<String>) {
+pub fn get_media_async(bk: &Backend, baseu: Url, media: String, tx: Sender<Result<String, Error>>) {
     semaphore(bk.limit_threads.clone(), move || {
-        let fname = dw_media(&baseu, &media, ContentType::Download, None).unwrap_or_default();
+        let fname = dw_media(&baseu, &media, ContentType::Download, None);
         tx.send(fname).expect_log("Connection closed");
     });
 }
diff --git a/fractal-matrix-api/src/backend/types.rs b/fractal-matrix-api/src/backend/types.rs
index 6e7ee575..9c700553 100644
--- a/fractal-matrix-api/src/backend/types.rs
+++ b/fractal-matrix-api/src/backend/types.rs
@@ -42,8 +42,8 @@ pub enum BKCommand {
     GetRoomMessagesFromMsg(Url, AccessToken, String, Message),
     GetMessageContext(Url, AccessToken, Message),
     GetRoomAvatar(Url, AccessToken, String),
-    GetThumbAsync(Url, String, Sender<String>),
-    GetMediaAsync(Url, String, Sender<String>),
+    GetThumbAsync(Url, String, Sender<Result<String, Error>>),
+    GetMediaAsync(Url, String, Sender<Result<String, Error>>),
     GetMediaListAsync(
         Url,
         AccessToken,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]