ClashX/ProxyConfigHelper/ProxyConfigHelper.m

122 lines
3.6 KiB
Objective-C

//
// ProxyConfigHelper.m
// com.west2online.ClashX.ProxyConfigHelper
//
// Created by yichengchen on 2019/8/17.
// Copyright © 2019 west2online. All rights reserved.
//
#import "ProxyConfigHelper.h"
#import <AppKit/AppKit.h>
#import "ProxyConfigRemoteProcessProtocol.h"
#import "ProxySettingTool.h"
@interface ProxyConfigHelper()
<
NSXPCListenerDelegate,
ProxyConfigRemoteProcessProtocol
>
@property (nonatomic, strong) NSXPCListener *listener;
@property (nonatomic, strong) NSMutableSet<NSXPCConnection *> *connections;
@property (nonatomic, strong) NSTimer *checkTimer;
@property (nonatomic, assign) BOOL shouldQuit;
@end
@implementation ProxyConfigHelper
- (instancetype)init {
if (self = [super init]) {
self.connections = [NSMutableSet new];
self.shouldQuit = NO;
self.listener = [[NSXPCListener alloc] initWithMachServiceName:@"com.west2online.ClashX.ProxyConfigHelper"];
self.listener.delegate = self;
}
return self;
}
- (void)run {
[self.listener resume];
self.checkTimer =
[NSTimer timerWithTimeInterval:5.f target:self selector:@selector(connectionCheckOnLaunch) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:self.checkTimer forMode:NSDefaultRunLoopMode];
while (!self.shouldQuit) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
}
}
- (void)connectionCheckOnLaunch {
if (self.connections.count == 0) {
self.shouldQuit = YES;
}
}
- (BOOL)connectionIsVaild: (NSXPCConnection *)connection {
NSRunningApplication *remoteApp =
[NSRunningApplication runningApplicationWithProcessIdentifier:connection.processIdentifier];
return remoteApp != nil;
}
// MARK: - NSXPCListenerDelegate
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
// if (![self connectionIsVaild:newConnection]) {
// return NO;
// }
newConnection.exportedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(ProxyConfigRemoteProcessProtocol)];
newConnection.exportedObject = self;
__weak NSXPCConnection *weakConnection = newConnection;
__weak ProxyConfigHelper *weakSelf = self;
newConnection.invalidationHandler = ^{
[weakSelf.connections removeObject:weakConnection];
if (weakSelf.connections.count == 0) {
weakSelf.shouldQuit = YES;
}
};
[self.connections addObject:newConnection];
[newConnection resume];
return YES;
}
// MARK: - ProxyConfigRemoteProcessProtocol
- (void)getVersion:(stringReplyBlock)reply {
NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
if (version == nil) {
version = @"unknown";
}
reply(version);
}
- (void)enableProxyWithPort:(int)port
socksPort:(int)socksPort
error:(stringReplyBlock)reply {
ProxySettingTool *tool = [ProxySettingTool new];
[tool enableProxyWithport:port socksPort:socksPort];
reply(nil);
}
- (void)disableProxy:(stringReplyBlock)reply {
ProxySettingTool *tool = [ProxySettingTool new];
[tool disableProxy];
reply(nil);
}
- (void)restoreProxyWithCurrentPort:(int)port
socksPort:(int)socksPort
info:(NSDictionary *)dict
error:(stringReplyBlock)reply {
ProxySettingTool *tool = [ProxySettingTool new];
[tool restoreProxySettint:dict currentPort:port currentSocksPort:socksPort];
reply(nil);
}
- (void)getCurrentProxySetting:(dictReplyBlock)reply {
NSDictionary *info = [ProxySettingTool currentProxySettings];
reply(info);
}
@end