1/* 2 * SPDX-FileCopyrightText: 2020 Weixuan XIAO <veyx.shaw@gmail.com> 3 * 4 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 5 */ 6 7#import <Foundation/Foundation.h> 8#import <AppKit/AppKit.h> 9 10#include <QFile> 11#include <QProcess> 12#include <QApplication> 13 14@interface KDEConnectSendFileService : NSObject 15- (void)sendViaKDEConnect:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; 16@end 17 18static KDEConnectSendFileService *sendFileService = nil; 19 20static void cleanup_service() 21{ 22 if (sendFileService != nil) 23 [sendFileService release]; 24 25 sendFileService = nil; 26} 27 28void registerServices() { 29 NSLog(@"Registering KDE Connect Send File Service"); 30 KDEConnectSendFileService *sendFileService = [[KDEConnectSendFileService alloc] init]; 31 qAddPostRoutine(cleanup_service); // Remove after quit 32 33 NSRegisterServicesProvider(sendFileService, @"SendViaKDEConnect"); 34 35 NSLog(@"KDE Connect Send File Service registered"); 36} 37 38@implementation KDEConnectSendFileService 39 40- (void)sendViaKDEConnect:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error { 41 Q_UNUSED(userData); 42 Q_UNUSED(error); 43 44 NSAlert *alert = nil; 45 // NSPasteboardTypeFileURL is first introduced in macOS 13, avoid to use it now 46 NSArray *filePathArray = [pboard propertyListForType:NSFilenamesPboardType]; 47 for (NSString *path in filePathArray) { 48 BOOL isDirectory = NO; 49 if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]) { 50 if (!isDirectory) { 51 if (QFile::exists(QCoreApplication::applicationDirPath() + QStringLiteral("/kdeconnect-handler"))) { 52 QProcess kdeconnect_handler; 53 kdeconnect_handler.setProgram(QCoreApplication::applicationDirPath() + QStringLiteral("/kdeconnect-handler")); 54 kdeconnect_handler.setArguments({QString::fromNSString(path)}); 55 kdeconnect_handler.startDetached(); 56 } else { 57 alert = [[NSAlert alloc] init]; 58 [alert setInformativeText:@"Cannot find kdeconnect-handler"]; 59 } 60 } else { 61 alert = [[NSAlert alloc] init]; 62 [alert setInformativeText:@"Cannot share a directory"]; 63 } 64 } 65 break; // Now we only support single file sharing 66 } 67 68 if ([filePathArray count] < 1) { 69 alert = [[NSAlert alloc] init]; 70 [alert setInformativeText:@"Cannot share selected item"]; 71 } 72 73 if (alert) { 74 [alert setMessageText:@"Share file failed"]; 75 [alert addButtonWithTitle:@"OK"]; 76 [alert setAlertStyle:NSAlertStyleCritical]; 77 [alert runModal]; 78 [alert release]; 79 } 80} 81 82@end