91 lines
3.3 KiB
Swift
91 lines
3.3 KiB
Swift
//
|
|
// Copyright 2020 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import MultipeerConnectivity
|
|
import SignalServiceKit
|
|
|
|
extension DeviceTransferService {
|
|
enum Error: Swift.Error {
|
|
case assertion
|
|
case cancel
|
|
case backgroundedDevice
|
|
case certificateMismatch
|
|
case modeMismatch
|
|
case notEnoughSpace
|
|
case unsupportedVersion
|
|
}
|
|
|
|
enum TransferState {
|
|
case idle
|
|
case incoming(
|
|
oldDevicePeerId: MCPeerID,
|
|
manifest: DeviceTransferProtoManifest,
|
|
receivedFileIds: [String],
|
|
skippedFileIds: [String],
|
|
progress: Progress
|
|
)
|
|
case outgoing(
|
|
newDevicePeerId: MCPeerID,
|
|
newDeviceCertificateHash: Data,
|
|
manifest: DeviceTransferProtoManifest,
|
|
transferredFileIds: [String],
|
|
progress: Progress
|
|
)
|
|
|
|
func appendingFileId(_ fileId: String) -> TransferState {
|
|
switch self {
|
|
case .incoming(let oldDevicePeerId, let manifest, let receivedFileIds, let skippedFileIds, let progress):
|
|
return .incoming(
|
|
oldDevicePeerId: oldDevicePeerId,
|
|
manifest: manifest,
|
|
receivedFileIds: receivedFileIds + [fileId],
|
|
skippedFileIds: skippedFileIds,
|
|
progress: progress
|
|
)
|
|
case .outgoing(let newDevicePeerId, let newDeviceCertificateHash, let manifest, let transferredFileIds, let progress):
|
|
return .outgoing(
|
|
newDevicePeerId: newDevicePeerId,
|
|
newDeviceCertificateHash: newDeviceCertificateHash,
|
|
manifest: manifest,
|
|
transferredFileIds: transferredFileIds + [fileId],
|
|
progress: progress
|
|
)
|
|
case .idle:
|
|
owsFailDebug("unexpectedly tried to append file while idle")
|
|
return .idle
|
|
}
|
|
}
|
|
|
|
func appendingSkippedFileId(_ fileId: String) -> TransferState {
|
|
switch self {
|
|
case .incoming(let oldDevicePeerId, let manifest, let receivedFileIds, let skippedFileIds, let progress):
|
|
return .incoming(
|
|
oldDevicePeerId: oldDevicePeerId,
|
|
manifest: manifest,
|
|
receivedFileIds: receivedFileIds,
|
|
skippedFileIds: skippedFileIds + [fileId],
|
|
progress: progress
|
|
)
|
|
case .outgoing(let newDevicePeerId, let newDeviceCertificateHash, let manifest, let transferredFileIds, let progress):
|
|
owsFailDebug("unexpectedly tried to append a skipped file on outgoing")
|
|
return .outgoing(
|
|
newDevicePeerId: newDevicePeerId,
|
|
newDeviceCertificateHash: newDeviceCertificateHash,
|
|
manifest: manifest,
|
|
transferredFileIds: transferredFileIds,
|
|
progress: progress
|
|
)
|
|
case .idle:
|
|
owsFailDebug("unexpectedly tried to append a skipped file while idle")
|
|
return .idle
|
|
}
|
|
}
|
|
}
|
|
|
|
enum TransferMode: String {
|
|
case linked
|
|
case primary
|
|
}
|
|
}
|