This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
4.0 KiB
129 lines
4.0 KiB
/** |
|
* Copyright (c) 2015-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
*/ |
|
|
|
#import "RCTCxxUtils.h" |
|
|
|
#import <React/RCTFollyConvert.h> |
|
#import <React/RCTModuleData.h> |
|
#import <React/RCTUtils.h> |
|
#import <cxxreact/CxxNativeModule.h> |
|
#import <jschelpers/Value.h> |
|
|
|
#import "DispatchMessageQueueThread.h" |
|
#import "RCTCxxModule.h" |
|
#import "RCTNativeModule.h" |
|
|
|
namespace facebook { |
|
namespace react { |
|
|
|
std::vector<std::unique_ptr<NativeModule>> createNativeModules(NSArray<RCTModuleData *> *modules, RCTBridge *bridge, const std::shared_ptr<Instance> &instance) |
|
{ |
|
std::vector<std::unique_ptr<NativeModule>> nativeModules; |
|
for (RCTModuleData *moduleData in modules) { |
|
if ([moduleData.moduleClass isSubclassOfClass:[RCTCxxModule class]]) { |
|
nativeModules.emplace_back(std::make_unique<CxxNativeModule>( |
|
instance, |
|
[moduleData.name UTF8String], |
|
[moduleData] { return [(RCTCxxModule *)(moduleData.instance) createModule]; }, |
|
std::make_shared<DispatchMessageQueueThread>(moduleData))); |
|
} else { |
|
nativeModules.emplace_back(std::make_unique<RCTNativeModule>(bridge, moduleData)); |
|
} |
|
} |
|
return nativeModules; |
|
} |
|
|
|
JSContext *contextForGlobalContextRef(JSGlobalContextRef contextRef) |
|
{ |
|
static std::mutex s_mutex; |
|
static NSMapTable *s_contextCache; |
|
|
|
if (!contextRef) { |
|
return nil; |
|
} |
|
|
|
// Adding our own lock here, since JSC internal ones are insufficient |
|
std::lock_guard<std::mutex> lock(s_mutex); |
|
if (!s_contextCache) { |
|
NSPointerFunctionsOptions keyOptions = NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality; |
|
NSPointerFunctionsOptions valueOptions = NSPointerFunctionsWeakMemory | NSPointerFunctionsObjectPersonality; |
|
s_contextCache = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:valueOptions capacity:0]; |
|
} |
|
|
|
JSContext *ctx = [s_contextCache objectForKey:(__bridge id)contextRef]; |
|
if (!ctx) { |
|
ctx = [JSC_JSContext(contextRef) contextWithJSGlobalContextRef:contextRef]; |
|
[s_contextCache setObject:ctx forKey:(__bridge id)contextRef]; |
|
} |
|
return ctx; |
|
} |
|
|
|
static NSError *errorWithException(const std::exception &e) |
|
{ |
|
NSString *msg = @(e.what()); |
|
NSMutableDictionary *errorInfo = [NSMutableDictionary dictionary]; |
|
|
|
const JSException *jsException = dynamic_cast<const JSException*>(&e); |
|
if (jsException) { |
|
errorInfo[RCTJSRawStackTraceKey] = @(jsException->getStack().c_str()); |
|
msg = [@"Unhandled JS Exception: " stringByAppendingString:msg]; |
|
} |
|
|
|
NSError *nestedError; |
|
try { |
|
std::rethrow_if_nested(e); |
|
} catch(const std::exception &e) { |
|
nestedError = errorWithException(e); |
|
} catch(...) {} |
|
|
|
if (nestedError) { |
|
msg = [NSString stringWithFormat:@"%@\n\n%@", msg, [nestedError localizedDescription]]; |
|
} |
|
|
|
errorInfo[NSLocalizedDescriptionKey] = msg; |
|
return [NSError errorWithDomain:RCTErrorDomain code:1 userInfo:errorInfo]; |
|
} |
|
|
|
NSError *tryAndReturnError(const std::function<void()>& func) |
|
{ |
|
try { |
|
@try { |
|
func(); |
|
return nil; |
|
} |
|
@catch (NSException *exception) { |
|
NSString *message = |
|
[NSString stringWithFormat:@"Exception '%@' was thrown from JS thread", exception]; |
|
return RCTErrorWithMessage(message); |
|
} |
|
@catch (id exception) { |
|
// This will catch any other ObjC exception, but no C++ exceptions |
|
return RCTErrorWithMessage(@"non-std ObjC Exception"); |
|
} |
|
} catch (const std::exception &ex) { |
|
return errorWithException(ex); |
|
} catch (...) { |
|
// On a 64-bit platform, this would catch ObjC exceptions, too, but not on |
|
// 32-bit platforms, so we catch those with id exceptions above. |
|
return RCTErrorWithMessage(@"non-std C++ exception"); |
|
} |
|
} |
|
|
|
NSString *deriveSourceURL(NSURL *url) |
|
{ |
|
NSString *sourceUrl; |
|
if (url.isFileURL) { |
|
// Url will contain only path to resource (i.g. file:// will be removed) |
|
sourceUrl = url.path; |
|
} else { |
|
// Url will include protocol (e.g. http://) |
|
sourceUrl = url.absoluteString; |
|
} |
|
return sourceUrl ?: @""; |
|
} |
|
|
|
} }
|
|
|