From 5acba553db91065e0e21f9227e925c9d7ae1cedc Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 19 Sep 2022 10:09:44 +0200
Subject: [PATCH] WIP

---
 .../Functions/MessengerSendFile.swift         | 82 +++++++++++++++++++
 .../Messenger/MessengerEnvironment.swift      |  9 ++
 2 files changed, 91 insertions(+)
 create mode 100644 Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift

diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
new file mode 100644
index 00000000..f665ace4
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerSendFile.swift
@@ -0,0 +1,82 @@
+import Foundation
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerSendFile {
+  public struct CallbackData {
+    public init(
+      transferId: Data,
+      result: Result<FileTransferProgressCallback.Callback, NSError>
+    ) {
+      self.transferId = transferId
+      self.result = result
+    }
+
+    public var transferId: Data
+    public var result: Result<FileTransferProgressCallback.Callback, NSError>
+  }
+
+  public typealias Callback = (CallbackData) -> Void
+
+  public enum Error: Swift.Error, Equatable {
+    case notConnected
+  }
+
+  public var run: (FileTransferSend.Params, @escaping Callback) throws -> Void
+
+  public func callAsFunction(
+    params: FileTransferSend.Params,
+    callback: @escaping Callback
+  ) throws -> Void {
+    try run(params, callback)
+  }
+}
+
+extension MessengerSendFile {
+  public static func live(_ env: MessengerEnvironment) -> MessengerSendFile {
+    MessengerSendFile { params, callback in
+      guard let e2e = env.e2e() else {
+        throw Error.notConnected
+      }
+      let fileTransfer = try env.initFileTransfer(
+        params: InitFileTransfer.Params(
+          e2eId: e2e.getId(),
+          e2eFileTransferParamsJSON: env.getE2EFileTransferParams(),
+          fileTransferParamsJSON: env.getFileTransferParams()
+        ),
+        callback: .unimplemented
+      )
+      let semaphore = DispatchSemaphore(value: 0)
+      var transferId: Data! = nil
+      transferId = try fileTransfer.send(
+        params: params,
+        callback: FileTransferProgressCallback { result in
+          callback(CallbackData(
+            transferId: transferId,
+            result: result
+          ))
+          switch result {
+          case .failure(_):
+
+            semaphore.signal()
+          case .success(let callback):
+            if callback.progress.error != nil {
+
+            }
+            if callback.progress.completed {
+              semaphore.signal()
+            }
+          }
+        }
+      )
+      semaphore.wait()
+      try? fileTransfer.closeSend(transferId: transferId)
+    }
+  }
+}
+
+extension MessengerSendFile {
+  public static let unimplemented = MessengerSendFile(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
index f125c1ef..4c136806 100644
--- a/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
+++ b/Sources/XXMessengerClient/Messenger/MessengerEnvironment.swift
@@ -10,8 +10,11 @@ public struct MessengerEnvironment {
   public var fileManager: MessengerFileManager
   public var generateSecret: GenerateSecret
   public var getCMixParams: GetCMixParams
+  public var getE2EFileTransferParams: GetE2EFileTransferParams
   public var getE2EParams: GetE2EParams
+  public var getFileTransferParams: GetFileTransferParams
   public var getSingleUseParams: GetSingleUseParams
+  public var initFileTransfer: InitFileTransfer
   public var isRegisteredWithUD: IsRegisteredWithUD
   public var loadCMix: LoadCMix
   public var login: Login
@@ -48,8 +51,11 @@ extension MessengerEnvironment {
       fileManager: .live(),
       generateSecret: .live,
       getCMixParams: .liveDefault,
+      getE2EFileTransferParams: .liveDefault,
       getE2EParams: .liveDefault,
+      getFileTransferParams: .liveDefault,
       getSingleUseParams: .liveDefault,
+      initFileTransfer: .live,
       isRegisteredWithUD: .live,
       loadCMix: .live,
       login: .live,
@@ -81,8 +87,11 @@ extension MessengerEnvironment {
     fileManager: .unimplemented,
     generateSecret: .unimplemented,
     getCMixParams: .unimplemented,
+    getE2EFileTransferParams: .unimplemented,
     getE2EParams: .unimplemented,
+    getFileTransferParams: .unimplemented,
     getSingleUseParams: .unimplemented,
+    initFileTransfer: .unimplemented,
     isRegisteredWithUD: .unimplemented,
     loadCMix: .unimplemented,
     login: .unimplemented,
-- 
GitLab