#if os(macOS) import Foundation import AppKit import VnidropCore /// macOS file system service. Mirrors the desktop JVM behavior: default Downloads /// receive folder, custom folders enabled via security-scoped bookmarks, reveal in /// Finder. The Rust core streams bytes; Swift passes filesystem paths. struct MacFileSystemService: FileSystemService { var supportsCustomReceiveFolders: Bool { true } func defaultReceiveFolder() -> ReceiveFolder { let url = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first ?? FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent("Downloads") return ReceiveFolder(kind: .fileSystemPath, value: url.path, displayName: url.lastPathComponent) } func validateReceiveFolder(_ folder: ReceiveFolder) async -> FolderAccessStatus { FileManager.default.isWritableFile(atPath: folder.value) ? .writable : .unavailable } func canRevealReceiveFolder(_ folder: ReceiveFolder) -> Bool { true } func revealReceiveFolder(_ folder: ReceiveFolder) async -> Result { let url = URL(fileURLWithPath: folder.value, isDirectory: true) NSWorkspace.shared.activateFileViewerSelecting([url]) return .success(()) } func discardPickedFiles(_ files: [PickedShareFile]) async { let paths = Set(files.filter { $0.isTemporaryCopy }.map { $0.value }) for path in paths { try? FileManager.default.removeItem(atPath: path) } } func sharePickedFiles( repository: CoreGateway, files: [PickedShareFile], transferName: String, senderName: String, accessPolicy: ShareAccessPolicy ) async -> Result { guard !files.isEmpty else { return .failure(InvitationError.message("Select at least one file to share")) } let sources = files.map { ShareSource(kind: .path, value: $0.value, displayName: $0.displayName, isDirectory: $0.isDirectory) } return await repository.shareSources( sources, transferName: transferName, senderName: senderName, accessPolicy: accessPolicy ) } } #endif