forked from I2P_Developers/i2p.i2p
Mac OSX Launcher: A lot of bugfixes, refactoring and cleanup.
This commit is contained in:
@@ -13,18 +13,19 @@ import Cocoa
|
|||||||
|
|
||||||
//let statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength )
|
//let statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength )
|
||||||
let statusBarController = StatusBarController()
|
let statusBarController = StatusBarController()
|
||||||
let javaDetector = DetectJava()
|
static let javaDetector = DetectJava()
|
||||||
static let objCBridge = SBridge()
|
static let objCBridge = SBridge()
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
super.init()
|
super.init()
|
||||||
|
if (!SwiftMainDelegate.javaDetector.isJavaFound()) {
|
||||||
self.javaDetector.findIt()
|
SwiftMainDelegate.javaDetector.findIt()
|
||||||
if (!javaDetector.isJavaFound()) {
|
if (!SwiftMainDelegate.javaDetector.isJavaFound()) {
|
||||||
print("Could not find java....")
|
print("Could not find java....")
|
||||||
terminate("No java..")
|
terminate("No java..")
|
||||||
}
|
}
|
||||||
let javaBinPath = self.javaDetector.javaHome
|
}
|
||||||
|
let javaBinPath = SwiftMainDelegate.javaDetector.javaHome
|
||||||
RouterProcessStatus.knownJavaBinPath = javaBinPath
|
RouterProcessStatus.knownJavaBinPath = javaBinPath
|
||||||
print("Found java home = ", javaBinPath)
|
print("Found java home = ", javaBinPath)
|
||||||
|
|
||||||
@@ -77,8 +78,6 @@ import Cocoa
|
|||||||
var i2pPath = NSHomeDirectory()
|
var i2pPath = NSHomeDirectory()
|
||||||
i2pPath += "/Library/I2P"
|
i2pPath += "/Library/I2P"
|
||||||
|
|
||||||
//let javaBinPath = self.javaDetector.javaHome.replace(target: " ", withString: "\\ ")
|
|
||||||
|
|
||||||
let fileManager = FileManager()
|
let fileManager = FileManager()
|
||||||
var ok = ObjCBool(true)
|
var ok = ObjCBool(true)
|
||||||
let doesI2PDirExists = fileManager.fileExists(atPath: i2pPath, isDirectory: &ok)
|
let doesI2PDirExists = fileManager.fileExists(atPath: i2pPath, isDirectory: &ok)
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ import Foundation
|
|||||||
|
|
||||||
@objc class DetectJava : NSObject {
|
@objc class DetectJava : NSObject {
|
||||||
|
|
||||||
var hasJRE : Bool = false
|
static var hasJRE : Bool = false
|
||||||
var userWantJRE : Bool = false
|
static var userWantJRE : Bool = false
|
||||||
var userAcceptOracleEULA : Bool = false
|
static var userAcceptOracleEULA : Bool = false
|
||||||
|
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
@@ -29,8 +29,9 @@ import Foundation
|
|||||||
|
|
||||||
//Called after the change
|
//Called after the change
|
||||||
didSet{
|
didSet{
|
||||||
hasJRE = true
|
DetectJava.hasJRE = true
|
||||||
print("DetectJava.javaHome did change from "+oldValue+" to "+self.javaHome)
|
self.javaHome = self.javaHome.replace(target: "\n", withString: "").replace(target: "Internet Plug-Ins", withString: "Internet\\ Plug-Ins")
|
||||||
|
print("DetectJava.javaHome did change to "+self.javaHome)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
private var testedEnv : Bool = false
|
private var testedEnv : Bool = false
|
||||||
@@ -50,25 +51,28 @@ import Foundation
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
@objc func findIt() {
|
@objc func findIt() {
|
||||||
|
if (DetectJava.hasJRE) {
|
||||||
|
return
|
||||||
|
}
|
||||||
print("Start with checking environment variable")
|
print("Start with checking environment variable")
|
||||||
self.checkJavaEnvironmentVariable()
|
self.checkJavaEnvironmentVariable()
|
||||||
if !(self.javaHome.isEmpty) {
|
if !(self.javaHome.isEmpty) {
|
||||||
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
||||||
hasJRE = true
|
DetectJava.hasJRE = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
print("Checking with the java_home util")
|
print("Checking with the java_home util")
|
||||||
self.runJavaHomeCmd()
|
self.runJavaHomeCmd()
|
||||||
if !(self.javaHome.isEmpty) {
|
if !(self.javaHome.isEmpty) {
|
||||||
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
||||||
hasJRE = true
|
DetectJava.hasJRE = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
print("Checking default JRE install path")
|
print("Checking default JRE install path")
|
||||||
self.checkDefaultJREPath()
|
self.checkDefaultJREPath()
|
||||||
if !(self.javaHome.isEmpty) {
|
if !(self.javaHome.isEmpty) {
|
||||||
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
RouterProcessStatus.knownJavaBinPath = Optional.some(self.javaHome)
|
||||||
hasJRE = true
|
DetectJava.hasJRE = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import AppKit
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc func getRouterIsRunning() -> Bool {
|
@objc func getRouterIsRunning() -> Bool {
|
||||||
if (RouterProcessStatus.isRouterRunning == Optional.none) {
|
if (RouterProcessStatus.isRouterRunning) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
let running: Bool = RouterProcessStatus.isRouterRunning
|
let running: Bool = RouterProcessStatus.isRouterRunning
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class PopoverViewController: NSViewController {
|
|||||||
|
|
||||||
override func viewWillDraw() {
|
override func viewWillDraw() {
|
||||||
super.viewWillDraw()
|
super.viewWillDraw()
|
||||||
if (RouterStatusView.instance == Optional.none) {
|
if (RouterStatusView.instance != nil) {
|
||||||
RouterStatusView.instance = self
|
RouterStatusView.instance = self
|
||||||
}
|
}
|
||||||
self.setRouterStatusLabelText()
|
self.setRouterStatusLabelText()
|
||||||
@@ -78,16 +78,13 @@ class PopoverViewController: NSViewController {
|
|||||||
routerStartStopButton?.target = self
|
routerStartStopButton?.target = self
|
||||||
quickControlView?.needsDisplay = true
|
quickControlView?.needsDisplay = true
|
||||||
|
|
||||||
if (RouterProcessStatus.routerVersion == Optional.none) {
|
if let version = RouterProcessStatus.routerVersion {
|
||||||
routerVersionLabel?.cell?.stringValue = "Router version: Still unknown"
|
routerVersionLabel?.cell?.stringValue = "Router version: " + version
|
||||||
// trigger a read to ensure values
|
|
||||||
let tmp = SwiftMainDelegate()
|
|
||||||
tmp.findInstalledI2PVersion()
|
|
||||||
} else {
|
} else {
|
||||||
routerVersionLabel?.cell?.stringValue = "Router version: " + RouterProcessStatus.routerVersion!
|
routerVersionLabel?.cell?.stringValue = "Router version: Still unknown"
|
||||||
}
|
}
|
||||||
if (RouterProcessStatus.routerStartedAt != Optional.none) {
|
if let routerStartTime = RouterProcessStatus.routerStartedAt {
|
||||||
routerUptimeLabel?.cell?.stringValue = "Router has runned for " + DateTimeUtils.timeAgoSinceDate(date: NSDate(date: RouterProcessStatus.routerStartedAt!), numericDates: false)
|
routerUptimeLabel?.cell?.stringValue = "Router has runned for " + DateTimeUtils.timeAgoSinceDate(date: NSDate(date: routerStartTime), numericDates: false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Public Domain</string>
|
<string>Public Domain</string>
|
||||||
<key>CFBundleGetInfoString</key>
|
<key>CFBundleGetInfoString</key>
|
||||||
<string>0.9.35-experimental</string>
|
<string>0.9.36-experimental</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>images/AppIcon.icns</string>
|
<string>images/AppIcon.icns</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
|
|||||||
@@ -16,7 +16,21 @@ class JavaRunner;
|
|||||||
typedef std::function<void(void)> fp_t;
|
typedef std::function<void(void)> fp_t;
|
||||||
typedef std::function<void(JavaRunner *ptr)> fp_proc_t;
|
typedef std::function<void(JavaRunner *ptr)> fp_proc_t;
|
||||||
|
|
||||||
|
const std::vector<NSString*> defaultStartupFlags {
|
||||||
|
@"-Xmx512M",
|
||||||
|
@"-Xms128m",
|
||||||
|
@"-Djava.awt.headless=true",
|
||||||
|
@"-Dwrapper.logfile=/tmp/router.log",
|
||||||
|
@"-Dwrapper.logfile.loglevel=DEBUG",
|
||||||
|
@"-Dwrapper.java.pidfile=/tmp/routerjvm.pid",
|
||||||
|
@"-Dwrapper.console.loglevel=DEBUG"
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::vector<std::string> defaultFlagsForExtractorJob {
|
||||||
|
"-Xmx512M",
|
||||||
|
"-Xms128m",
|
||||||
|
"-Djava.awt.headless=true"
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -30,9 +44,6 @@ public:
|
|||||||
JavaRunner(std::string& javaBin, std::string& arguments, std::string& i2pBaseDir, const fp_proc_t& executingFn, const fp_t& cb);
|
JavaRunner(std::string& javaBin, std::string& arguments, std::string& i2pBaseDir, const fp_proc_t& executingFn, const fp_t& cb);
|
||||||
~JavaRunner() = default;
|
~JavaRunner() = default;
|
||||||
|
|
||||||
static const std::vector<NSString*> defaultStartupFlags;
|
|
||||||
static const std::vector<std::string> defaultFlagsForExtractorJob;
|
|
||||||
|
|
||||||
void requestRouterShutdown();
|
void requestRouterShutdown();
|
||||||
|
|
||||||
std::future<int> execute();
|
std::future<int> execute();
|
||||||
|
|||||||
@@ -112,23 +112,6 @@
|
|||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
|
||||||
const std::vector<NSString*> JavaRunner::defaultStartupFlags {
|
|
||||||
@"-Xmx512M",
|
|
||||||
@"-Xms128m",
|
|
||||||
@"-Djava.awt.headless=true",
|
|
||||||
@"-Dwrapper.logfile=/tmp/router.log",
|
|
||||||
@"-Dwrapper.logfile.loglevel=DEBUG",
|
|
||||||
@"-Dwrapper.java.pidfile=/tmp/routerjvm.pid",
|
|
||||||
@"-Dwrapper.console.loglevel=DEBUG"
|
|
||||||
};
|
|
||||||
|
|
||||||
const std::vector<std::string> JavaRunner::defaultFlagsForExtractorJob {
|
|
||||||
"-Xmx512M",
|
|
||||||
"-Xms128m",
|
|
||||||
"-Djava.awt.headless=true"
|
|
||||||
};
|
|
||||||
|
|
||||||
JavaRunner::JavaRunner(std::string& javaBin, std::string& arguments, std::string& i2pBaseDir, const fp_proc_t& execFn, const fp_t& cb)
|
JavaRunner::JavaRunner(std::string& javaBin, std::string& arguments, std::string& i2pBaseDir, const fp_proc_t& execFn, const fp_t& cb)
|
||||||
: javaBinaryPath(javaBin), javaRouterArgs(arguments), _i2pBaseDir(i2pBaseDir), executingFn(execFn), exitCallbackFn(cb)
|
: javaBinaryPath(javaBin), javaRouterArgs(arguments), _i2pBaseDir(i2pBaseDir), executingFn(execFn), exitCallbackFn(cb)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -98,10 +98,10 @@ static inline std::string trim_copy(std::string s) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CPP17
|
#if __cplusplus > 201402L
|
||||||
|
|
||||||
|
|
||||||
using std::experimental::optional;
|
using std::optional;
|
||||||
|
|
||||||
// Use CFStringRef instead of NSString*, otherwise disable ARC
|
// Use CFStringRef instead of NSString*, otherwise disable ARC
|
||||||
inline optional<CFStringRef> optionalString(bool val) {
|
inline optional<CFStringRef> optionalString(bool val) {
|
||||||
|
|||||||
@@ -33,46 +33,16 @@
|
|||||||
#include "JavaHelper.h"
|
#include "JavaHelper.h"
|
||||||
#include "include/fn.h"
|
#include "include/fn.h"
|
||||||
#include "include/portcheck.h"
|
#include "include/portcheck.h"
|
||||||
|
#import "SBridge.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#import "SBridge.h"
|
#include <string>
|
||||||
|
|
||||||
#include "include/subprocess.hpp"
|
#include "include/subprocess.hpp"
|
||||||
#include "include/strutil.hpp"
|
#include "include/strutil.hpp"
|
||||||
|
|
||||||
using namespace subprocess;
|
using namespace subprocess;
|
||||||
|
|
||||||
JvmListSharedPtr gRawJvmList = nullptr;
|
|
||||||
|
|
||||||
maybeAnRouterRunner getGlobalRouterObject()
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(globalRouterStatusMutex);
|
|
||||||
return globalRouterStatus; // Remember this might be nullptr now.
|
|
||||||
}
|
|
||||||
|
|
||||||
void setGlobalRouterObject(I2PRouterTask* newRouter)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(globalRouterStatusMutex);
|
|
||||||
globalRouterStatus = newRouter;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_t mutex;
|
|
||||||
|
|
||||||
bool getGlobalRouterIsRunning()
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&mutex);
|
|
||||||
bool current = isRuterRunning;
|
|
||||||
pthread_mutex_unlock(&mutex);
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
void setGlobalRouterIsRunning(bool running)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&mutex);
|
|
||||||
isRuterRunning = running;
|
|
||||||
pthread_mutex_unlock(&mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define debug(format, ...) CFShow([NSString stringWithFormat:format, ## __VA_ARGS__]);
|
#define debug(format, ...) CFShow([NSString stringWithFormat:format, ## __VA_ARGS__]);
|
||||||
@@ -90,6 +60,12 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
- (void) awakeFromNib {
|
- (void) awakeFromNib {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center
|
||||||
|
shouldPresentNotification:(NSUserNotification *)notification {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
- (void)extractI2PBaseDir:(void(^)(BOOL success, NSError *error))completion
|
- (void)extractI2PBaseDir:(void(^)(BOOL success, NSError *error))completion
|
||||||
@@ -125,7 +101,7 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
// Create directory
|
// Create directory
|
||||||
mkdir(basePath.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
|
mkdir(basePath.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
|
||||||
|
|
||||||
auto cli = JavaRunner::defaultFlagsForExtractorJob;
|
auto cli = defaultFlagsForExtractorJob;
|
||||||
setenv("I2PBASE", basePath.c_str(), true);
|
setenv("I2PBASE", basePath.c_str(), true);
|
||||||
setenv("ZIPPATH", zippath.c_str(), true);
|
setenv("ZIPPATH", zippath.c_str(), true);
|
||||||
//setenv("DYLD_LIBRARY_PATH",".:/usr/lib:/lib:/usr/local/lib", true);
|
//setenv("DYLD_LIBRARY_PATH",".:/usr/lib:/lib:/usr/local/lib", true);
|
||||||
@@ -143,20 +119,9 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
NSString* newString = [NSString stringWithFormat:@"file://%@", rs.getJavaHome];
|
NSString* newString = [NSString stringWithFormat:@"file://%@", rs.getJavaHome];
|
||||||
NSURL *baseURL = [NSURL fileURLWithPath:newString];
|
NSURL *baseURL = [NSURL fileURLWithPath:newString];
|
||||||
|
|
||||||
NSLog(@"MEEH URL PATH: %s", [baseURL fileSystemRepresentation]);
|
|
||||||
|
|
||||||
auto charCli = map(cli, [](std::string str){ return str.c_str(); });
|
|
||||||
std::string execStr = std::string([rs.getJavaHome UTF8String]);
|
std::string execStr = std::string([rs.getJavaHome UTF8String]);
|
||||||
// TODO: Cheap hack, make it better.
|
|
||||||
replace(execStr, "Internet Plug-Ins", "Internet\\ Plug-Ins");
|
|
||||||
replace(execStr, "\n", "");
|
|
||||||
NSLog(@"Java path1 = %s", execStr.c_str());
|
|
||||||
[rs setJavaHome: [NSString stringWithFormat:@"%s", execStr.c_str()]];
|
|
||||||
for_each(cli, [&execStr](std::string str){ execStr += std::string(" ") + str; });
|
for_each(cli, [&execStr](std::string str){ execStr += std::string(" ") + str; });
|
||||||
|
|
||||||
//execStr = replace(execStr, "\\\\ ", "\\ ");
|
|
||||||
//NSLog(@"Java path2 = %s", execStr.c_str());
|
|
||||||
|
|
||||||
NSLog(@"Trying cmd: %@", [NSString stringWithUTF8String:execStr.c_str()]);
|
NSLog(@"Trying cmd: %@", [NSString stringWithUTF8String:execStr.c_str()]);
|
||||||
try {
|
try {
|
||||||
sendUserNotification(APP_IDSTR, @"Please hold on while we extract I2P. You'll get a new message once done!");
|
sendUserNotification(APP_IDSTR, @"Please hold on while we extract I2P. You'll get a new message once done!");
|
||||||
@@ -197,15 +162,6 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center
|
|
||||||
shouldPresentNotification:(NSUserNotification *)notification {
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
- (NSString *)userSelectJavaHome:(JvmListPtr)rawJvmList
|
- (NSString *)userSelectJavaHome:(JvmListPtr)rawJvmList
|
||||||
{
|
{
|
||||||
@@ -227,33 +183,19 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
return userResult;
|
return userResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)userChooseJavaHome {
|
|
||||||
listAllJavaInstallsAvailable();
|
|
||||||
std::shared_ptr<JvmHomeContext> appContext = std::shared_ptr<JvmHomeContext>( new JvmHomeContext() );
|
|
||||||
for (auto item : *appContext->getJvmList()) {
|
|
||||||
printf("JVM %s (Version: %s, Directory: %s)\n", item->JVMName.c_str(), item->JVMPlatformVersion.c_str(), item->JVMHomePath.c_str());
|
|
||||||
}
|
|
||||||
JvmListPtr rawJvmList = appContext->getJvmList();
|
|
||||||
NSString * userJavaHome = [self userSelectJavaHome: rawJvmList];
|
|
||||||
// TODO: Add logic so user can set preferred JVM
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- (void)setApplicationDefaultPreferences {
|
- (void)setApplicationDefaultPreferences {
|
||||||
auto defaultJVMHome = check_output({"/usr/libexec/java_home","-v",DEF_MIN_JVM_VER});
|
auto defaultJVMHome = check_output({"/usr/libexec/java_home","-v",DEF_MIN_JVM_VER});
|
||||||
auto tmpStdStr = std::string(defaultJVMHome.buf.data());
|
auto tmpStdStr = std::string(defaultJVMHome.buf.data());
|
||||||
trim(tmpStdStr);
|
trim(tmpStdStr);
|
||||||
auto cfDefaultHome = CFStringCreateWithCString(NULL, const_cast<const char *>(tmpStdStr.c_str()), kCFStringEncodingUTF8);
|
auto cfDefaultHome = CFStringCreateWithCString(NULL, const_cast<const char *>(tmpStdStr.c_str()), kCFStringEncodingUTF8);
|
||||||
/*[self.userPreferences registerDefaults:@{
|
[self.userPreferences registerDefaults:@{
|
||||||
@"javaHome" : (NSString *)cfDefaultHome,
|
@"javaHome" : (NSString *)cfDefaultHome,
|
||||||
@"lastI2PVersion" : (NSString *)CFSTR(DEF_I2P_VERSION),
|
@"lastI2PVersion" : (NSString *)CFSTR(DEF_I2P_VERSION),
|
||||||
@"enableLogging": @YES,
|
@"enableLogging": @YES,
|
||||||
@"enableVerboseLogging": @YES,
|
@"enableVerboseLogging": @YES,
|
||||||
@"autoStartRouter": @YES,
|
@"autoStartRouter": @YES,
|
||||||
@"i2pBaseDirectory": (NSString *)CFStringCreateWithCString(NULL, const_cast<const char *>(getDefaultBaseDir().c_str()), kCFStringEncodingUTF8)
|
@"i2pBaseDirectory": (NSString *)CFStringCreateWithCString(NULL, const_cast<const char *>(getDefaultBaseDir().c_str()), kCFStringEncodingUTF8)
|
||||||
}];*/
|
}];
|
||||||
if (self.enableVerboseLogging) NSLog(@"Default JVM home preference set to: %@", cfDefaultHome);
|
if (self.enableVerboseLogging) NSLog(@"Default JVM home preference set to: %@", cfDefaultHome);
|
||||||
|
|
||||||
auto dict = [self.userPreferences dictionaryRepresentation];
|
auto dict = [self.userPreferences dictionaryRepresentation];
|
||||||
@@ -263,53 +205,40 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
|
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
|
||||||
|
|
||||||
if (self.enableVerboseLogging) NSLog(@"Default preferences stored!");
|
if (self.enableVerboseLogging) NSLog(@"Default preferences stored!");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||||
// Init application here
|
// Init application here
|
||||||
|
|
||||||
self.swiftRuntime = [[SwiftMainDelegate alloc] init];
|
self.swiftRuntime = [[SwiftMainDelegate alloc] init];
|
||||||
|
|
||||||
|
// This setup allows the application to send notifications
|
||||||
[[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
|
[[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
|
||||||
|
|
||||||
|
|
||||||
// Start with user preferences
|
// Start with user preferences
|
||||||
self.userPreferences = [NSUserDefaults standardUserDefaults];
|
self.userPreferences = [NSUserDefaults standardUserDefaults];
|
||||||
[self setApplicationDefaultPreferences];
|
[self setApplicationDefaultPreferences];
|
||||||
self.enableLogging = [self.userPreferences boolForKey:@"enableLogging"];
|
self.enableLogging = [self.userPreferences boolForKey:@"enableLogging"];
|
||||||
self.enableVerboseLogging = [self.userPreferences boolForKey:@"enableVerboseLogging"];
|
self.enableVerboseLogging = [self.userPreferences boolForKey:@"enableVerboseLogging"];
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
gRawJvmList = std::make_shared<std::list<JvmVersionPtr> >(std::list<JvmVersionPtr>());
|
|
||||||
#endif
|
|
||||||
// In case we are unbundled, make us a proper UI application
|
// In case we are unbundled, make us a proper UI application
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];
|
[NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];
|
||||||
[NSApp activateIgnoringOtherApps:YES];
|
[NSApp activateIgnoringOtherApps:YES];
|
||||||
|
|
||||||
// TODO: Also check for new installations from time to time.
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
auto javaHomePref = [self.userPreferences stringForKey:@"javaHome"];
|
//gRawJvmList = std::make_shared<std::list<JvmVersionPtr> >(std::list<JvmVersionPtr>());
|
||||||
if (self.enableVerboseLogging)
|
|
||||||
{
|
|
||||||
NSLog(@"Java home from preferences: %@", javaHomePref);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.enableVerboseLogging)
|
|
||||||
{
|
|
||||||
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
|
|
||||||
NSLog(@"Appdomain is: %@", appDomain);
|
|
||||||
}
|
|
||||||
|
|
||||||
NSLog(@"We should have started the statusbar object by now...");
|
|
||||||
RouterProcessStatus* routerStatus = [[RouterProcessStatus alloc] init];
|
RouterProcessStatus* routerStatus = [[RouterProcessStatus alloc] init];
|
||||||
|
|
||||||
std::string i2pBaseDir(getDefaultBaseDir());
|
std::string i2pBaseDir(getDefaultBaseDir());
|
||||||
|
NSLog(@"i2pBaseDir = %s", i2pBaseDir.c_str());
|
||||||
auto pref = self.userPreferences;
|
|
||||||
|
|
||||||
bool shouldAutoStartRouter = false;
|
bool shouldAutoStartRouter = false;
|
||||||
|
|
||||||
|
// TODO: Make the port a setting which defaults to 7657
|
||||||
if (port_check(7657) != 0)
|
if (port_check(7657) != 0)
|
||||||
{
|
{
|
||||||
NSLog(@"Seems i2p is already running - I will not start the router (port 7657 is in use..)");
|
NSLog(@"Seems i2p is already running - I will not start the router (port 7657 is in use..)");
|
||||||
@@ -324,44 +253,26 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
|
|
||||||
if (self.enableVerboseLogging) NSLog(@"processinfo %@", [[NSProcessInfo processInfo] arguments]);
|
if (self.enableVerboseLogging) NSLog(@"processinfo %@", [[NSProcessInfo processInfo] arguments]);
|
||||||
|
|
||||||
auto getJavaBin = [&pref,&self]() -> std::string {
|
|
||||||
// Get Java home
|
|
||||||
/*NSString* val = @"";
|
|
||||||
val = [pref stringForKey:@"javaHome"];
|
|
||||||
if (val == NULL) val = @"";
|
|
||||||
if (self.enableVerboseLogging) NSLog(@"Javahome: %@", val);
|
|
||||||
auto javaHome = std::string([val UTF8String]);
|
|
||||||
//trim(javaHome); // Trim to remove endline
|
|
||||||
auto javaBin = std::string(javaHome);
|
|
||||||
javaBin += "/bin/java"; // Append java binary to path.
|
|
||||||
return javaBin;*/
|
|
||||||
DetectJava *dt = [[DetectJava alloc] init];
|
|
||||||
[dt findIt];
|
|
||||||
if ([dt isJavaFound]) {
|
|
||||||
return [dt.javaHome UTF8String];
|
|
||||||
} else {
|
|
||||||
throw new std::runtime_error("Java home fatal error");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
NSBundle *launcherBundle = [NSBundle mainBundle];
|
NSBundle *launcherBundle = [NSBundle mainBundle];
|
||||||
|
|
||||||
auto jarResPath = [launcherBundle pathForResource:@"launcher" ofType:@"jar"];
|
// Helper object to hold statefull path information
|
||||||
NSLog(@"Trying to load launcher.jar from url = %@", jarResPath);
|
|
||||||
|
|
||||||
self.metaInfo = [[ExtractMetaInfo alloc] init];
|
self.metaInfo = [[ExtractMetaInfo alloc] init];
|
||||||
//self.metaInfo.i2pBase = [NSString stringWithUTF8String:i2pBaseDir.c_str()];
|
self.metaInfo.i2pBase = [NSString stringWithUTF8String:i2pBaseDir.c_str()];
|
||||||
self.metaInfo.javaBinary = [NSString stringWithUTF8String:getJavaBin().c_str()];
|
self.metaInfo.javaBinary = [routerStatus getJavaHome];
|
||||||
self.metaInfo.jarFile = [launcherBundle pathForResource:@"launcher" ofType:@"jar"];
|
self.metaInfo.jarFile = [launcherBundle pathForResource:@"launcher" ofType:@"jar"];
|
||||||
self.metaInfo.zipFile = [launcherBundle pathForResource:@"base" ofType:@"zip"];
|
self.metaInfo.zipFile = [launcherBundle pathForResource:@"base" ofType:@"zip"];
|
||||||
|
|
||||||
std::string basearg("-Di2p.dir.base=");
|
std::string basearg("-Di2p.dir.base=");
|
||||||
//basearg += i2pBaseDir;
|
basearg += i2pBaseDir;
|
||||||
|
|
||||||
std::string jarfile("-cp ");
|
std::string jarfile("-cp ");
|
||||||
jarfile += [self.metaInfo.zipFile UTF8String];
|
jarfile += [self.metaInfo.zipFile UTF8String];
|
||||||
|
|
||||||
|
auto sBridge = [[SBridge alloc] init];
|
||||||
|
|
||||||
|
// Initialize the Swift environment (the UI components)
|
||||||
|
[self.swiftRuntime applicationDidFinishLaunching];
|
||||||
|
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
if ( !(stat(i2pBaseDir.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)) )
|
if ( !(stat(i2pBaseDir.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)) )
|
||||||
@@ -369,17 +280,25 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
// I2P is not extracted.
|
// I2P is not extracted.
|
||||||
if (self.enableVerboseLogging) NSLog(@"I2P Directory don't exists!");
|
if (self.enableVerboseLogging) NSLog(@"I2P Directory don't exists!");
|
||||||
|
|
||||||
|
// Might be hard to read if you're not used to Objective-C
|
||||||
|
// But this is a "function call" that contains a "callback function"
|
||||||
[self extractI2PBaseDir:^(BOOL success, NSError *error) {
|
[self extractI2PBaseDir:^(BOOL success, NSError *error) {
|
||||||
sendUserNotification(@"I2P is done extracting", @"I2P is now installed and ready to run!");
|
sendUserNotification(@"I2P is done extracting", @"I2P is now installed and ready to run!");
|
||||||
[self.swiftRuntime applicationDidFinishLaunching];
|
|
||||||
NSLog(@"Done extracting I2P");
|
NSLog(@"Done extracting I2P");
|
||||||
if (shouldAutoStartRouter) [self startupI2PRouter];
|
|
||||||
|
if (shouldAutoStartRouter) {
|
||||||
|
[sBridge startupI2PRouter:self.metaInfo.i2pBase javaBinPath:self.metaInfo.javaBinary];
|
||||||
|
[routerStatus setRouterRanByUs: true];
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (self.enableVerboseLogging) NSLog(@"I2P directory found!");
|
// I2P was already found extracted
|
||||||
if (shouldAutoStartRouter) [self startupI2PRouter];
|
|
||||||
[self.swiftRuntime applicationDidFinishLaunching];
|
if (shouldAutoStartRouter) {
|
||||||
|
[sBridge startupI2PRouter:self.metaInfo.i2pBase javaBinPath:self.metaInfo.javaBinary];
|
||||||
|
[routerStatus setRouterRanByUs: true];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -411,15 +330,20 @@ void setGlobalRouterIsRunning(bool running)
|
|||||||
int main(int argc, const char **argv)
|
int main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
NSApplication *app = [NSApplication sharedApplication];
|
NSApplication *app = [NSApplication sharedApplication];
|
||||||
//NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
|
|
||||||
|
|
||||||
AppDelegate *appDelegate = [[AppDelegate alloc] initWithArgc:argc argv:argv];
|
AppDelegate *appDelegate = [[AppDelegate alloc] initWithArgc:argc argv:argv];
|
||||||
app.delegate = appDelegate;
|
app.delegate = appDelegate;
|
||||||
|
auto mainBundle = [NSBundle mainBundle];
|
||||||
|
NSString* stringNameBundle = [mainBundle objectForInfoDictionaryKey:(NSString *)kCFBundleNameKey];
|
||||||
|
if ([[NSRunningApplication runningApplicationsWithBundleIdentifier:[mainBundle bundleIdentifier]] count] > 1) {
|
||||||
|
[[NSAlert alertWithMessageText:[NSString stringWithFormat:@"Another copy of %@ is already running.",stringNameBundle]
|
||||||
|
defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:@"This copy will now quit."] runModal];
|
||||||
|
|
||||||
|
[NSApp terminate:nil];
|
||||||
|
}
|
||||||
[NSBundle loadNibNamed:@"I2Launcher" owner:NSApp];
|
[NSBundle loadNibNamed:@"I2Launcher" owner:NSApp];
|
||||||
|
|
||||||
[NSApp run];
|
[NSApp run];
|
||||||
// Handle any errors
|
|
||||||
//[pool drain];
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user