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