From 7b33e1fba83c73d46fab49de981a9026d596fb7d Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:18:44 +0400 Subject: [PATCH] core: update cancel file api (#2097) --- src/Simplex/Chat.hs | 26 ++++++++++++++++---------- src/Simplex/Chat/Controller.hs | 8 ++++---- src/Simplex/Chat/View.hs | 12 ++++++------ 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 0fc3693dc..1102a98b1 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -1390,8 +1390,9 @@ processChatCommand = \case CancelFile fileId -> withUser $ \user@User {userId} -> withChatLock "cancelFile" . procCmd $ withStore (\db -> getFileTransfer db user fileId) >>= \case - FTSnd ftm@FileTransferMeta {cancelled} fts -> do - unless cancelled $ do + FTSnd ftm@FileTransferMeta {cancelled} fts + | cancelled -> throwChatError $ CEFileAlreadyCancelled fileId + | otherwise -> do fileAgentConnIds <- cancelSndFile user ftm fts True deleteAgentConnectionsAsync user fileAgentConnIds sharedMsgId <- withStore $ \db -> getSharedMsgIdByFileId db userId fileId @@ -1403,12 +1404,14 @@ processChatCommand = \case Group gInfo ms <- withStore $ \db -> getGroup db user groupId void . sendGroupMessage user gInfo ms $ XFileCancel sharedMsgId _ -> throwChatError $ CEFileInternal "invalid chat ref for file transfer" - ci <- withStore $ \db -> getChatItemByFileId db user fileId - pure $ CRSndGroupFileCancelled user ci ftm fts - FTRcv ftr@RcvFileTransfer {cancelled} -> do - unless cancelled $ + ci <- withStore $ \db -> getChatItemByFileId db user fileId + pure $ CRSndFileCancelled user ci ftm fts + FTRcv ftr@RcvFileTransfer {cancelled} + | cancelled -> throwChatError $ CEFileAlreadyCancelled fileId + | otherwise -> do cancelRcvFileTransfer user ftr >>= mapM_ (deleteAgentConnectionAsync user) - pure $ CRRcvFileCancelled user ftr + ci <- withStore $ \db -> getChatItemByFileId db user fileId + pure $ CRRcvFileCancelled user ci ftr FileStatus fileId -> withUser $ \user -> do fileStatus <- withStore $ \db -> getFileTransferProgress db user fileId pure $ CRFileTransferStatus user fileStatus @@ -2819,7 +2822,8 @@ processAgentMessageConn user@User {userId} corrId agentConnId agentMessage = do FileChunkCancel -> unless cancelled $ do cancelRcvFileTransfer user ft >>= mapM_ (deleteAgentConnectionAsync user) - toView $ CRRcvFileSndCancelled user ft + ci <- withStore $ \db -> getChatItemByFileId db user fileId + toView $ CRRcvFileSndCancelled user ci ft FileChunk {chunkNo, chunkBytes = chunk} -> do case integrity of MsgOk -> pure () @@ -3238,7 +3242,8 @@ processAgentMessageConn user@User {userId} corrId agentConnId agentMessage = do ft@RcvFileTransfer {cancelled} <- withStore (\db -> getRcvFileTransfer db user fileId) unless cancelled $ do cancelRcvFileTransfer user ft >>= mapM_ (deleteAgentConnectionAsync user) - toView $ CRRcvFileSndCancelled user ft + ci <- withStore $ \db -> getChatItemByFileId db user fileId + toView $ CRRcvFileSndCancelled user ci ft xFileAcptInv :: Contact -> SharedMsgId -> Maybe ConnReqInvitation -> String -> MsgMeta -> m () xFileAcptInv ct sharedMsgId fileConnReq_ fName msgMeta = do @@ -3314,7 +3319,8 @@ processAgentMessageConn user@User {userId} corrId agentConnId agentMessage = do ft@RcvFileTransfer {cancelled} <- withStore (\db -> getRcvFileTransfer db user fileId) unless cancelled $ do cancelRcvFileTransfer user ft >>= mapM_ (deleteAgentConnectionAsync user) - toView $ CRRcvFileSndCancelled user ft + ci <- withStore $ \db -> getChatItemByFileId db user fileId + toView $ CRRcvFileSndCancelled user ci ft else messageError "x.file.cancel: group member attempted to cancel file of another member" -- shouldn't happen now that query includes group member id (SMDSnd, _) -> messageError "x.file.cancel: group member attempted invalid file cancel" diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 1b13fc34f..7bd7d6fd4 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -445,13 +445,12 @@ data ChatResponse | CRRcvFileStart {user :: User, chatItem :: AChatItem} | CRRcvFileProgressXFTP {user :: User, chatItem :: AChatItem, receivedSize :: Int64, totalSize :: Int64} | CRRcvFileComplete {user :: User, chatItem :: AChatItem} - | CRRcvFileCancelled {user :: User, rcvFileTransfer :: RcvFileTransfer} - | CRRcvFileSndCancelled {user :: User, rcvFileTransfer :: RcvFileTransfer} + | CRRcvFileCancelled {user :: User, chatItem :: AChatItem, rcvFileTransfer :: RcvFileTransfer} + | CRRcvFileSndCancelled {user :: User, chatItem :: AChatItem, rcvFileTransfer :: RcvFileTransfer} | CRSndFileStart {user :: User, chatItem :: AChatItem, sndFileTransfer :: SndFileTransfer} | CRSndFileComplete {user :: User, chatItem :: AChatItem, sndFileTransfer :: SndFileTransfer} - | CRSndFileCancelled {chatItem :: AChatItem, sndFileTransfer :: SndFileTransfer} | CRSndFileRcvCancelled {user :: User, chatItem :: AChatItem, sndFileTransfer :: SndFileTransfer} - | CRSndGroupFileCancelled {user :: User, chatItem :: AChatItem, fileTransferMeta :: FileTransferMeta, sndFileTransfers :: [SndFileTransfer]} + | CRSndFileCancelled {user :: User, chatItem :: AChatItem, fileTransferMeta :: FileTransferMeta, sndFileTransfers :: [SndFileTransfer]} | CRSndFileStartXFTP {user :: User, chatItem :: AChatItem, fileTransferMeta :: FileTransferMeta} | CRSndFileProgressXFTP {user :: User, chatItem :: AChatItem, fileTransferMeta :: FileTransferMeta, sentSize :: Int64, totalSize :: Int64} | CRSndFileCompleteXFTP {user :: User, chatItem :: AChatItem, fileTransferMeta :: FileTransferMeta} @@ -771,6 +770,7 @@ data ChatErrorType | CEFileNotFound {message :: String} | CEFileAlreadyReceiving {message :: String} | CEFileCancelled {message :: String} + | CEFileAlreadyCancelled {fileId :: FileTransferId} | CEFileAlreadyExists {filePath :: FilePath} | CEFileRead {filePath :: FilePath, message :: String} | CEFileWrite {filePath :: FilePath, message :: String} diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index a989a09bc..2352b1e94 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -137,8 +137,8 @@ responseToView user_ ChatConfig {logLevel, testView} liveItems ts = \case CRRcvFileProgressXFTP _ _ _ _ -> [] CRRcvFileAccepted u ci -> ttyUser u $ savingFile' ci CRRcvFileAcceptedSndCancelled u ft -> ttyUser u $ viewRcvFileSndCancelled ft - CRSndGroupFileCancelled u _ ftm fts -> ttyUser u $ viewSndGroupFileCancelled ftm fts - CRRcvFileCancelled u ft -> ttyUser u $ receivingFile_ "cancelled" ft + CRSndFileCancelled u _ ftm fts -> ttyUser u $ viewSndFileCancelled ftm fts + CRRcvFileCancelled u _ ft -> ttyUser u $ receivingFile_ "cancelled" ft CRUserProfileUpdated u p p' -> ttyUser u $ viewUserProfileUpdated p p' CRContactPrefsUpdated {user = u, fromContact, toContact} -> ttyUser u $ viewUserContactPrefsUpdated u fromContact toContact CRContactAliasUpdated u c -> ttyUser u $ viewContactAliasUpdated c @@ -148,10 +148,9 @@ responseToView user_ ChatConfig {logLevel, testView} liveItems ts = \case CRReceivedContactRequest u UserContactRequest {localDisplayName = c, profile} -> ttyUser u $ viewReceivedContactRequest c profile CRRcvFileStart u ci -> ttyUser u $ receivingFile_' "started" ci CRRcvFileComplete u ci -> ttyUser u $ receivingFile_' "completed" ci - CRRcvFileSndCancelled u ft -> ttyUser u $ viewRcvFileSndCancelled ft + CRRcvFileSndCancelled u _ ft -> ttyUser u $ viewRcvFileSndCancelled ft CRSndFileStart u _ ft -> ttyUser u $ sendingFile_ "started" ft CRSndFileComplete u _ ft -> ttyUser u $ sendingFile_ "completed" ft - CRSndFileCancelled _ ft -> sendingFile_ "cancelled" ft CRSndFileStartXFTP _ _ _ -> [] CRSndFileProgressXFTP _ _ _ _ _ -> [] CRSndFileCompleteXFTP _ _ _ -> [] @@ -1054,8 +1053,8 @@ viewRcvFileSndCancelled :: RcvFileTransfer -> [StyledString] viewRcvFileSndCancelled ft@RcvFileTransfer {senderDisplayName = c} = [ttyContact c <> " cancelled sending " <> rcvFile ft] -viewSndGroupFileCancelled :: FileTransferMeta -> [SndFileTransfer] -> [StyledString] -viewSndGroupFileCancelled FileTransferMeta {fileId, fileName} fts = +viewSndFileCancelled :: FileTransferMeta -> [SndFileTransfer] -> [StyledString] +viewSndFileCancelled FileTransferMeta {fileId, fileName} fts = case filter (\SndFileTransfer {fileStatus = s} -> s /= FSCancelled && s /= FSComplete) fts of [] -> ["cancelled sending " <> fileTransferStr fileId fileName] ts -> ["cancelled sending " <> fileTransferStr fileId fileName <> " to " <> listRecipients ts] @@ -1274,6 +1273,7 @@ viewChatError logLevel = \case CEFileNotFound f -> ["file not found: " <> plain f] CEFileAlreadyReceiving f -> ["file is already being received: " <> plain f] CEFileCancelled f -> ["file cancelled: " <> plain f] + CEFileAlreadyCancelled fileId -> ["file already cancelled: " <> sShow fileId] CEFileAlreadyExists f -> ["file already exists: " <> plain f] CEFileRead f e -> ["cannot read file " <> plain f, sShow e] CEFileWrite f e -> ["cannot write file " <> plain f, sShow e]