add chatWriteImage

This commit is contained in:
IC Rainbow
2024-11-01 23:06:28 +02:00
parent 7fee8b0dd5
commit 7fbf37e523
13 changed files with 123 additions and 91 deletions
+2 -2
View File
@@ -30,7 +30,7 @@ import Data.Word (Word8)
import Database.SQLite.Simple (SQLError (..))
import qualified Database.SQLite.Simple as DB
import Foreign.C.String
import Foreign.C.Types (CInt (..), CLong (..))
import Foreign.C.Types (CBool (..), CInt (..), CLong (..))
import Foreign.Ptr
import Foreign.StablePtr
import Foreign.Storable (poke)
@@ -105,7 +105,7 @@ foreign export ccall "chat_decrypt_media" cChatDecryptMedia :: CString -> Ptr Wo
foreign export ccall "chat_write_file" cChatWriteFile :: StablePtr ChatController -> CString -> Ptr Word8 -> CInt -> IO CJSONString
foreign export ccall "chat_write_image" cChatWriteImage :: StablePtr ChatController -> CLong -> CString -> Ptr Word8 -> CInt -> IO CJSONString
foreign export ccall "chat_write_image" cChatWriteImage :: StablePtr ChatController -> CLong -> CString -> Ptr Word8 -> CInt -> CBool -> IO CJSONString
foreign export ccall "chat_read_file" cChatReadFile :: CString -> CString -> CString -> IO (Ptr Word8)
+18 -13
View File
@@ -48,7 +48,7 @@ import Simplex.Messaging.Util (catchAll)
import UnliftIO (Handle, IOMode (..), atomically, withFile)
data WriteFileResult
= WFResult {cryptoArgs :: CryptoFileArgs}
= WFResult {cryptoArgs :: Maybe CryptoFileArgs}
| WFError {writeError :: String}
$(JQ.deriveToJSON (sumTypeJSON $ dropPrefix "WF") ''WriteFileResult)
@@ -61,28 +61,33 @@ cChatWriteFile cc cPath ptr len = do
r <- chatWriteFile c path s
newCStringFromLazyBS $ J.encode r
cChatWriteImage :: StablePtr ChatController -> CLong -> CString -> Ptr Word8 -> CInt -> IO CJSONString
cChatWriteImage cc maxSize cPath ptr len = do
chatWriteFile :: ChatController -> FilePath -> ByteString -> IO WriteFileResult
chatWriteFile ChatController {random} path s = do
cfArgs <- atomically $ CF.randomArgs random
chatWriteFile_ (Just cfArgs) path s
chatWriteFile_ :: Maybe CryptoFileArgs -> FilePath -> ByteString -> IO WriteFileResult
chatWriteFile_ cfArgs_ path s = do
let file = CryptoFile path cfArgs_
either WFError (\_ -> WFResult cfArgs_)
<$> runCatchExceptT (withExceptT show $ CF.writeFile file $ LB.fromStrict s)
cChatWriteImage :: StablePtr ChatController -> CLong -> CString -> Ptr Word8 -> CInt -> CBool -> IO CJSONString
cChatWriteImage cc maxSize cPath ptr len encrypt = do
c <- deRefStablePtr cc
path <- peekCString cPath
src <- getByteString ptr len
cfArgs_ <- if encrypt /= 0 then Just <$> atomically (CF.randomArgs $ random c) else pure Nothing
r <-
case Picture.decodeResizeable src of
Left e -> pure $ WFError e
Right (ri, _metadata) -> do
let resized = resizeImageToSize True (fromIntegral maxSize) ri
let resized = resizeImageToSize False (fromIntegral maxSize) ri
if LB.length resized > fromIntegral maxSize
then pure $ WFError "unable to fit"
else chatWriteFile c path (LB.toStrict resized)
else chatWriteFile_ cfArgs_ path (LB.toStrict resized)
newCStringFromLazyBS $ J.encode r
chatWriteFile :: ChatController -> FilePath -> ByteString -> IO WriteFileResult
chatWriteFile ChatController {random} path s = do
cfArgs <- atomically $ CF.randomArgs random
let file = CryptoFile path $ Just cfArgs
either WFError (\_ -> WFResult cfArgs)
<$> runCatchExceptT (withExceptT show $ CF.writeFile file $ LB.fromStrict s)
data ReadFileResult
= RFResult {fileSize :: Int}
| RFError {readError :: String}
@@ -124,7 +129,7 @@ chatEncryptFile ChatController {random} fromPath toPath =
encrypt = do
cfArgs <- atomically $ CF.randomArgs random
encryptFile fromPath toPath cfArgs
pure cfArgs
pure $ Just cfArgs
cChatDecryptFile :: CString -> CString -> CString -> CString -> IO CString
cChatDecryptFile cFromPath cKey cNonce cToPath = do