Introduce travel album entry with Sony PTP tethering pipeline, profile space settings page, home routing updates, Launch Screen storyboard, and related tests/docs. Co-authored-by: Cursor <cursoragent@cursor.com>
57 lines
1.4 KiB
Swift
57 lines
1.4 KiB
Swift
//
|
||
// CameraTransferTask.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/6/29.
|
||
//
|
||
|
||
import Foundation
|
||
|
||
/// 相机传输任务状态。
|
||
enum CameraTransferStatus: String, Codable, Equatable {
|
||
case pending
|
||
case downloading
|
||
case downloaded
|
||
case uploading
|
||
case uploaded
|
||
case failed
|
||
}
|
||
|
||
/// 相机传输任务,表示从相机下载到上传登记的单条记录。
|
||
struct CameraTransferTask: Identifiable, Equatable, Codable {
|
||
let id: UUID
|
||
let assetID: String
|
||
let filename: String
|
||
var localPath: String?
|
||
var remoteURL: String?
|
||
var status: CameraTransferStatus
|
||
var progress: Int
|
||
var errorMessage: String?
|
||
|
||
init(
|
||
id: UUID = UUID(),
|
||
assetID: String,
|
||
filename: String,
|
||
localPath: String? = nil,
|
||
remoteURL: String? = nil,
|
||
status: CameraTransferStatus = .pending,
|
||
progress: Int = 0,
|
||
errorMessage: String? = nil
|
||
) {
|
||
self.id = id
|
||
self.assetID = assetID
|
||
self.filename = filename
|
||
self.localPath = localPath
|
||
self.remoteURL = remoteURL
|
||
self.status = status
|
||
self.progress = progress
|
||
self.errorMessage = errorMessage
|
||
}
|
||
|
||
/// 本地文件 URL,仅在路径有效时返回。
|
||
var localURL: URL? {
|
||
guard let localPath, !localPath.isEmpty else { return nil }
|
||
return URL(fileURLWithPath: localPath)
|
||
}
|
||
}
|