2021-06-24 23:10:45 +00:00
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:ffi';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:isolate';
|
|
|
|
import 'dart:io' show Platform;
|
|
|
|
import 'package:cwtch/cwtch/cwtchNotifier.dart';
|
|
|
|
import 'package:path/path.dart' as path;
|
|
|
|
|
|
|
|
import 'package:ffi/ffi.dart';
|
|
|
|
import 'package:cwtch/cwtch/cwtch.dart';
|
|
|
|
|
|
|
|
import '../config.dart';
|
|
|
|
|
2021-08-18 22:50:58 +00:00
|
|
|
import "package:path/path.dart" show dirname, join;
|
|
|
|
import 'dart:io' show Platform;
|
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
/////////////////////
|
|
|
|
/// Cwtch API ///
|
|
|
|
/////////////////////
|
|
|
|
|
|
|
|
typedef start_cwtch_function = Int8 Function(Pointer<Utf8> str, Int32 length, Pointer<Utf8> str2, Int32 length2);
|
|
|
|
typedef StartCwtchFn = int Function(Pointer<Utf8> dir, int len, Pointer<Utf8> tor, int torLen);
|
|
|
|
|
|
|
|
typedef void_from_void_funtion = Void Function();
|
|
|
|
typedef VoidFromVoidFunction = void Function();
|
|
|
|
|
2021-08-25 05:06:26 +00:00
|
|
|
typedef free_function = Void Function(Pointer<Utf8>);
|
|
|
|
typedef FreeFn = void Function(Pointer<Utf8>);
|
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
typedef void_from_string_string_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32);
|
|
|
|
typedef VoidFromStringStringFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int);
|
|
|
|
|
|
|
|
typedef void_from_string_string_string_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Pointer<Utf8>, Int32);
|
|
|
|
typedef VoidFromStringStringStringFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int, Pointer<Utf8>, int);
|
|
|
|
|
|
|
|
typedef void_from_string_string_string_string_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Pointer<Utf8>, Int32);
|
|
|
|
typedef VoidFromStringStringStringStringFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int, Pointer<Utf8>, int, Pointer<Utf8>, int);
|
|
|
|
|
2021-09-21 21:57:40 +00:00
|
|
|
typedef void_from_string_string_string_string_string_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Pointer<Utf8>, Int32);
|
|
|
|
typedef VoidFromStringStringStringStringStringFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int, Pointer<Utf8>, int, Pointer<Utf8>, int, Pointer<Utf8>, int);
|
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
typedef void_from_string_string_int_int_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Int64, Int64);
|
|
|
|
typedef VoidFromStringStringIntIntFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int, int, int);
|
|
|
|
|
2021-10-29 23:37:02 +00:00
|
|
|
typedef void_from_string_string_byte_function = Void Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Int8);
|
|
|
|
typedef VoidFromStringStringByteFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int, int);
|
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
typedef string_to_void_function = Void Function(Pointer<Utf8> str, Int32 length);
|
|
|
|
typedef StringFn = void Function(Pointer<Utf8> dir, int);
|
|
|
|
|
|
|
|
typedef string_string_to_void_function = Void Function(Pointer<Utf8> str, Int32 length, Pointer<Utf8> str2, Int32 length2);
|
|
|
|
typedef StringStringFn = void Function(Pointer<Utf8>, int, Pointer<Utf8>, int);
|
|
|
|
|
|
|
|
typedef get_json_blob_string_function = Pointer<Utf8> Function(Pointer<Utf8> str, Int32 length);
|
|
|
|
typedef GetJsonBlobStringFn = Pointer<Utf8> Function(Pointer<Utf8> str, int len);
|
|
|
|
|
|
|
|
//func GetMessage(profile_ptr *C.char, profile_len C.int, handle_ptr *C.char, handle_len C.int, message_index C.int) *C.char {
|
|
|
|
typedef get_json_blob_from_str_str_int_function = Pointer<Utf8> Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Int32);
|
|
|
|
typedef GetJsonBlobFromStrStrIntFn = Pointer<Utf8> Function(Pointer<Utf8>, int, Pointer<Utf8>, int, int);
|
|
|
|
|
2021-07-05 19:31:16 +00:00
|
|
|
// func c_GetMessagesByContentHash(profile_ptr *C.char, profile_len C.int, handle_ptr *C.char, handle_len C.int, contenthash_ptr *C.char, contenthash_len C.int) *C.char
|
|
|
|
typedef get_json_blob_from_str_str_str_function = Pointer<Utf8> Function(Pointer<Utf8>, Int32, Pointer<Utf8>, Int32, Pointer<Utf8>, Int32);
|
|
|
|
typedef GetJsonBlobFromStrStrStrFn = Pointer<Utf8> Function(Pointer<Utf8>, int, Pointer<Utf8>, int, Pointer<Utf8>, int);
|
2021-06-24 23:10:45 +00:00
|
|
|
|
|
|
|
typedef appbus_events_function = Pointer<Utf8> Function();
|
|
|
|
typedef AppbusEventsFn = Pointer<Utf8> Function();
|
|
|
|
|
2021-08-19 00:40:25 +00:00
|
|
|
const String UNSUPPORTED_OS = "unsupported-os";
|
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
class CwtchFfi implements Cwtch {
|
|
|
|
late DynamicLibrary library;
|
|
|
|
late CwtchNotifier cwtchNotifier;
|
|
|
|
late Isolate cwtchIsolate;
|
|
|
|
ReceivePort _receivePort = ReceivePort();
|
|
|
|
|
2021-08-19 00:40:25 +00:00
|
|
|
static String getLibraryPath() {
|
2021-06-24 23:10:45 +00:00
|
|
|
if (Platform.isWindows) {
|
2021-08-19 00:40:25 +00:00
|
|
|
return "libCwtch.dll";
|
2021-06-24 23:10:45 +00:00
|
|
|
} else if (Platform.isLinux) {
|
2021-08-19 00:40:25 +00:00
|
|
|
return "libCwtch.so";
|
2021-08-18 22:50:58 +00:00
|
|
|
} else if (Platform.isMacOS) {
|
|
|
|
print(dirname(Platform.script.path));
|
2021-08-19 00:40:25 +00:00
|
|
|
return "libCwtch.dylib";
|
2021-06-24 23:10:45 +00:00
|
|
|
} else {
|
2021-08-19 00:40:25 +00:00
|
|
|
return UNSUPPORTED_OS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CwtchFfi(CwtchNotifier _cwtchNotifier) {
|
|
|
|
String library_path = getLibraryPath();
|
|
|
|
if (library_path == UNSUPPORTED_OS) {
|
2021-06-24 23:10:45 +00:00
|
|
|
print("OS ${Platform.operatingSystem} not supported by cwtch/ffi");
|
|
|
|
// emergency, ideally the app stays on splash and just posts the error till user closes
|
|
|
|
exit(0);
|
|
|
|
}
|
2021-08-19 00:40:25 +00:00
|
|
|
library = DynamicLibrary.open(library_path);
|
2021-06-24 23:10:45 +00:00
|
|
|
cwtchNotifier = _cwtchNotifier;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
Future<void> Start() async {
|
|
|
|
String home = "";
|
|
|
|
String bundledTor = "";
|
|
|
|
Map<String, String> envVars = Platform.environment;
|
2021-08-28 17:23:37 +00:00
|
|
|
String cwtchDir = "";
|
2021-06-24 23:10:45 +00:00
|
|
|
if (Platform.isLinux) {
|
2021-09-17 20:38:10 +00:00
|
|
|
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, ".cwtch");
|
2021-07-06 16:24:42 +00:00
|
|
|
if (await File("linux/tor").exists()) {
|
|
|
|
bundledTor = "linux/tor";
|
|
|
|
} else if (await File("lib/tor").exists()) {
|
|
|
|
bundledTor = "lib/tor";
|
|
|
|
} else if (await File(path.join(home, ".local/lib/cwtch/tor")).exists()) {
|
|
|
|
bundledTor = path.join(home, ".local/lib/cwtch/tor");
|
|
|
|
} else if (await File("/usr/lib/cwtch/tor").exists()) {
|
|
|
|
bundledTor = "/usr/lib/cwtch/tor";
|
|
|
|
} else {
|
|
|
|
bundledTor = "tor";
|
|
|
|
}
|
2021-06-24 23:10:45 +00:00
|
|
|
} else if (Platform.isWindows) {
|
2021-08-28 17:23:37 +00:00
|
|
|
cwtchDir = envVars['CWTCH_DIR'] ?? path.join(envVars['UserProfile']!, ".cwtch");
|
2021-06-24 23:10:45 +00:00
|
|
|
bundledTor = "Tor\\Tor\\tor.exe";
|
2021-08-28 17:23:37 +00:00
|
|
|
} else if (Platform.isMacOS) {
|
|
|
|
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, "Library/Application Support/Cwtch");
|
2021-08-29 00:41:08 +00:00
|
|
|
if (await File("Cwtch.app/Contents/MacOS/Tor/tor.real").exists()) {
|
|
|
|
bundledTor = "Cwtch.app/Contents/MacOS/Tor/tor.real";
|
2021-09-04 17:48:49 +00:00
|
|
|
} else if (await File("/Applications/Cwtch.app/Contents/MacOS/Tor/tor.real").exists()) {
|
2021-09-04 10:42:13 +00:00
|
|
|
bundledTor = "/Applications/Cwtch.app/Contents/MacOS/Tor/tor.real";
|
2021-08-29 00:41:08 +00:00
|
|
|
} else if (await File("/Volumes/Cwtch/Cwtch.app/Contents/MacOS/Tor/tor.real").exists()) {
|
|
|
|
bundledTor = "/Volumes/Cwtch/Cwtch.app/Contents/MacOS/Tor/tor.real";
|
2021-09-04 13:41:01 +00:00
|
|
|
} else if (await File("/Applications/Tor Browser.app/Contents/MacOS/Tor/tor.real").exists()) {
|
|
|
|
bundledTor = "/Applications/Tor Browser.app/Contents/MacOS/Tor/tor.real";
|
|
|
|
print("We couldn't find Tor in the Cwtch app directory, however we can fall back to the Tor Browser binary");
|
2021-09-04 10:42:13 +00:00
|
|
|
} else {
|
|
|
|
var splitPath = path.split(dirname(Platform.script.path));
|
2021-09-17 20:38:10 +00:00
|
|
|
if (splitPath[0] == "/" && splitPath[1] == "Applications") {
|
2021-09-04 10:42:13 +00:00
|
|
|
var appName = splitPath[2];
|
|
|
|
print("We're running in /Applications in a non standard app name: $appName");
|
|
|
|
if (await File("/Applications/$appName/Contents/MacOS/Tor/tor.real").exists()) {
|
|
|
|
bundledTor = "/Applications/$appName/Contents/MacOS/Tor/tor.real";
|
|
|
|
}
|
|
|
|
}
|
2021-08-28 17:23:37 +00:00
|
|
|
}
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
2021-07-07 23:12:20 +00:00
|
|
|
|
2021-09-10 23:34:43 +00:00
|
|
|
// the first Cwtch MacOS release (1.2) accidently was a dev build
|
|
|
|
// we need to temporarily remedy this for a release or two then delete
|
2021-09-17 20:38:10 +00:00
|
|
|
// if macOs and release build and no profile and is dev profile
|
|
|
|
// copy dev profile to release profile
|
2021-09-10 23:34:43 +00:00
|
|
|
if (Platform.isMacOS && EnvironmentConfig.BUILD_VER != dev_version) {
|
|
|
|
var devProfileExists = await Directory(path.join(cwtchDir, "dev", "profiles")).exists();
|
|
|
|
var releaseProfileExists = await Directory(path.join(cwtchDir, "profiles")).exists();
|
|
|
|
if (devProfileExists && !releaseProfileExists) {
|
|
|
|
print("MacOS one time dev -> release profile migration...");
|
|
|
|
await Process.run("cp", ["-r", "-p", path.join(cwtchDir, "dev", "profiles"), cwtchDir]);
|
|
|
|
await Process.run("cp", ["-r", "-p", path.join(cwtchDir, "dev", "SALT"), cwtchDir]);
|
|
|
|
await Process.run("cp", ["-r", "-p", path.join(cwtchDir, "dev", "ui.globals"), cwtchDir]);
|
2021-08-28 17:23:37 +00:00
|
|
|
}
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
2021-07-07 23:12:20 +00:00
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
if (EnvironmentConfig.BUILD_VER == dev_version) {
|
|
|
|
cwtchDir = path.join(cwtchDir, "dev");
|
|
|
|
}
|
2021-08-28 17:23:37 +00:00
|
|
|
|
2021-07-06 16:24:42 +00:00
|
|
|
print("StartCwtch( cwtchdir: $cwtchDir, torPath: $bundledTor )");
|
2021-06-24 23:10:45 +00:00
|
|
|
|
|
|
|
var startCwtchC = library.lookup<NativeFunction<start_cwtch_function>>("c_StartCwtch");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final StartCwtch = startCwtchC.asFunction<StartCwtchFn>();
|
|
|
|
|
|
|
|
final ut8CwtchDir = cwtchDir.toNativeUtf8();
|
|
|
|
StartCwtch(ut8CwtchDir, ut8CwtchDir.length, bundledTor.toNativeUtf8(), bundledTor.length);
|
|
|
|
|
|
|
|
// Spawn an isolate to listen to events from libcwtch-go and then dispatch them when received on main thread to cwtchNotifier
|
|
|
|
cwtchIsolate = await Isolate.spawn(_checkAppbusEvents, _receivePort.sendPort);
|
|
|
|
_receivePort.listen((message) {
|
|
|
|
var env = jsonDecode(message);
|
|
|
|
cwtchNotifier.handleMessage(env["EventType"], env["Data"]);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
Future<void> ReconnectCwtchForeground() async {
|
|
|
|
var reconnectCwtch = library.lookup<NativeFunction<Void Function()>>("c_ReconnectCwtchForeground");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final ReconnectCwtchForeground = reconnectCwtch.asFunction<void Function()>();
|
|
|
|
ReconnectCwtchForeground();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Called on object being disposed to (presumably on app close) to close the isolate that's listening to libcwtch-go events
|
|
|
|
@override
|
|
|
|
void dispose() {
|
2021-08-25 05:06:26 +00:00
|
|
|
cwtchIsolate.kill(priority: Isolate.immediate);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Entry point for an isolate to listen to a stream of events pulled from libcwtch-go and return them on the sendPort
|
|
|
|
static void _checkAppbusEvents(SendPort sendPort) async {
|
|
|
|
var stream = pollAppbusEvents();
|
|
|
|
await for (var value in stream) {
|
|
|
|
sendPort.send(value);
|
|
|
|
}
|
|
|
|
print("checkAppBusEvents finished...");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Steam of appbus events. Call blocks in libcwtch-go GetAppbusEvent. Static so the isolate can use it
|
|
|
|
static Stream<String> pollAppbusEvents() async* {
|
2021-08-19 00:40:25 +00:00
|
|
|
late DynamicLibrary library = DynamicLibrary.open(getLibraryPath());
|
2021-06-24 23:10:45 +00:00
|
|
|
|
|
|
|
var getAppbusEventC = library.lookup<NativeFunction<appbus_events_function>>("c_GetAppBusEvent");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final GetAppbusEvent = getAppbusEventC.asFunction<AppbusEventsFn>();
|
|
|
|
|
2021-08-25 05:06:26 +00:00
|
|
|
// Embedded Version of _UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved
|
|
|
|
var free = library.lookup<NativeFunction<free_function>>("c_FreePointer");
|
|
|
|
final Free = free.asFunction<FreeFn>();
|
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final GetAppBusEvent = () {
|
|
|
|
// ignore: non_constant_identifier_names
|
2021-06-24 23:10:45 +00:00
|
|
|
Pointer<Utf8> result = GetAppbusEvent();
|
|
|
|
String event = result.toDartString();
|
2021-08-25 05:06:26 +00:00
|
|
|
Free(result);
|
|
|
|
return event;
|
|
|
|
};
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
final event = GetAppBusEvent();
|
2021-06-24 23:10:45 +00:00
|
|
|
|
|
|
|
if (event.startsWith("{\"EventType\":\"Shutdown\"")) {
|
|
|
|
print("Shutting down isolate thread: $event");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
yield event;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SelectProfile(String onion) async {
|
|
|
|
var selectProfileC = library.lookup<NativeFunction<get_json_blob_string_function>>("c_SelectProfile");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SelectProfile = selectProfileC.asFunction<GetJsonBlobStringFn>();
|
|
|
|
final ut8Onion = onion.toNativeUtf8();
|
|
|
|
SelectProfile(ut8Onion, ut8Onion.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(ut8Onion);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void CreateProfile(String nick, String pass) {
|
|
|
|
var createProfileC = library.lookup<NativeFunction<void_from_string_string_function>>("c_CreateProfile");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final CreateProfile = createProfileC.asFunction<VoidFromStringStringFn>();
|
|
|
|
final utf8nick = nick.toNativeUtf8();
|
|
|
|
final ut8pass = pass.toNativeUtf8();
|
|
|
|
CreateProfile(utf8nick, utf8nick.length, ut8pass, ut8pass.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(utf8nick);
|
|
|
|
malloc.free(ut8pass);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void LoadProfiles(String pass) {
|
|
|
|
var loadProfileC = library.lookup<NativeFunction<string_to_void_function>>("c_LoadProfiles");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final LoadProfiles = loadProfileC.asFunction<StringFn>();
|
|
|
|
final ut8pass = pass.toNativeUtf8();
|
|
|
|
LoadProfiles(ut8pass, ut8pass.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(ut8pass);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
Future<String> GetMessage(String profile, String handle, int index) async {
|
|
|
|
var getMessageC = library.lookup<NativeFunction<get_json_blob_from_str_str_int_function>>("c_GetMessage");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final GetMessage = getMessageC.asFunction<GetJsonBlobFromStrStrIntFn>();
|
|
|
|
final utf8profile = profile.toNativeUtf8();
|
|
|
|
final utf8handle = handle.toNativeUtf8();
|
|
|
|
Pointer<Utf8> jsonMessageBytes = GetMessage(utf8profile, utf8profile.length, utf8handle, utf8handle.length, index);
|
|
|
|
String jsonMessage = jsonMessageBytes.toDartString();
|
2021-08-25 05:06:26 +00:00
|
|
|
_UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved(jsonMessageBytes);
|
|
|
|
malloc.free(utf8profile);
|
|
|
|
malloc.free(utf8handle);
|
2021-06-24 23:10:45 +00:00
|
|
|
return jsonMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SendProfileEvent(String onion, String json) {
|
|
|
|
var sendAppBusEvent = library.lookup<NativeFunction<string_string_to_void_function>>("c_SendProfileEvent");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SendAppBusEvent = sendAppBusEvent.asFunction<StringStringFn>();
|
|
|
|
final utf8onion = onion.toNativeUtf8();
|
|
|
|
final utf8json = json.toNativeUtf8();
|
|
|
|
SendAppBusEvent(utf8onion, utf8onion.length, utf8json, utf8json.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(utf8onion);
|
|
|
|
malloc.free(utf8json);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SendAppEvent(String json) {
|
|
|
|
var sendAppBusEvent = library.lookup<NativeFunction<string_to_void_function>>("c_SendAppEvent");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SendAppBusEvent = sendAppBusEvent.asFunction<StringFn>();
|
|
|
|
final utf8json = json.toNativeUtf8();
|
|
|
|
SendAppBusEvent(utf8json, utf8json.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(utf8json);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void AcceptContact(String profileOnion, String contactHandle) {
|
|
|
|
var acceptContact = library.lookup<NativeFunction<string_string_to_void_function>>("c_AcceptContact");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final AcceptContact = acceptContact.asFunction<VoidFromStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = contactHandle.toNativeUtf8();
|
|
|
|
AcceptContact(u1, u1.length, u2, u2.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void BlockContact(String profileOnion, String contactHandle) {
|
|
|
|
var blockContact = library.lookup<NativeFunction<string_string_to_void_function>>("c_BlockContact");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final BlockContact = blockContact.asFunction<VoidFromStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = contactHandle.toNativeUtf8();
|
|
|
|
BlockContact(u1, u1.length, u2, u2.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SendMessage(String profileOnion, String contactHandle, String message) {
|
|
|
|
var sendMessage = library.lookup<NativeFunction<void_from_string_string_string_function>>("c_SendMessage");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SendMessage = sendMessage.asFunction<VoidFromStringStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = contactHandle.toNativeUtf8();
|
|
|
|
final u3 = message.toNativeUtf8();
|
|
|
|
SendMessage(u1, u1.length, u2, u2.length, u3, u3.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SendInvitation(String profileOnion, String contactHandle, String target) {
|
|
|
|
var sendInvitation = library.lookup<NativeFunction<void_from_string_string_string_function>>("c_SendInvitation");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SendInvitation = sendInvitation.asFunction<VoidFromStringStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = contactHandle.toNativeUtf8();
|
|
|
|
final u3 = target.toNativeUtf8();
|
|
|
|
SendInvitation(u1, u1.length, u2, u2.length, u3, u3.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
2021-09-21 21:57:40 +00:00
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void ShareFile(String profileOnion, String contactHandle, String filepath) {
|
|
|
|
var shareFile = library.lookup<NativeFunction<void_from_string_string_string_function>>("c_ShareFile");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final ShareFile = shareFile.asFunction<VoidFromStringStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = contactHandle.toNativeUtf8();
|
|
|
|
final u3 = filepath.toNativeUtf8();
|
|
|
|
ShareFile(u1, u1.length, u2, u2.length, u3, u3.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void DownloadFile(String profileOnion, String contactHandle, String filepath, String manifestpath, String filekey) {
|
|
|
|
var dlFile = library.lookup<NativeFunction<void_from_string_string_string_string_string_function>>("c_DownloadFile");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final DownloadFile = dlFile.asFunction<VoidFromStringStringStringStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = contactHandle.toNativeUtf8();
|
|
|
|
final u3 = filepath.toNativeUtf8();
|
|
|
|
final u4 = manifestpath.toNativeUtf8();
|
|
|
|
final u5 = filekey.toNativeUtf8();
|
|
|
|
DownloadFile(u1, u1.length, u2, u2.length, u3, u3.length, u4, u4.length, u5, u5.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
|
|
|
malloc.free(u4);
|
|
|
|
malloc.free(u5);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void CreateDownloadableFile(String profileOnion, String contactHandle, String filenameSuggestion, String filekey) {
|
|
|
|
// android only - do nothing
|
|
|
|
}
|
|
|
|
|
2021-09-29 20:31:01 +00:00
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void CheckDownloadStatus(String profileOnion, String fileKey) {
|
|
|
|
var checkDownloadStatus = library.lookup<NativeFunction<string_string_to_void_function>>("c_CheckDownloadStatus");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final CheckDownloadStatus = checkDownloadStatus.asFunction<VoidFromStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = fileKey.toNativeUtf8();
|
|
|
|
CheckDownloadStatus(u1, u1.length, u2, u2.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
}
|
|
|
|
|
2021-11-04 22:31:50 +00:00
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void VerifyOrResumeDownload(String profileOnion, String contactHandle, String filekey) {
|
|
|
|
var fn = library.lookup<NativeFunction<void_from_string_string_string_function>>("c_VerifyOrResumeDownload");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final VerifyOrResumeDownload = fn.asFunction<VoidFromStringStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = contactHandle.toNativeUtf8();
|
|
|
|
final u3 = filekey.toNativeUtf8();
|
|
|
|
VerifyOrResumeDownload(u1, u1.length, u2, u2.length, u3, u3.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void ResetTor() {
|
|
|
|
var resetTor = library.lookup<NativeFunction<Void Function()>>("c_ResetTor");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final ResetTor = resetTor.asFunction<void Function()>();
|
|
|
|
ResetTor();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void ImportBundle(String profileOnion, String bundle) {
|
|
|
|
var importBundle = library.lookup<NativeFunction<string_string_to_void_function>>("c_ImportBundle");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final ImportBundle = importBundle.asFunction<VoidFromStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = bundle.toNativeUtf8();
|
|
|
|
ImportBundle(u1, u1.length, u2, u2.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SetGroupAttribute(String profileOnion, String groupHandle, String key, String value) {
|
|
|
|
var setGroupAttribute = library.lookup<NativeFunction<void_from_string_string_string_string_function>>("c_SetGroupAttribute");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SetGroupAttribute = setGroupAttribute.asFunction<VoidFromStringStringStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = groupHandle.toNativeUtf8();
|
|
|
|
final u3 = key.toNativeUtf8();
|
|
|
|
final u4 = value.toNativeUtf8();
|
|
|
|
SetGroupAttribute(u1, u1.length, u2, u2.length, u3, u3.length, u4, u4.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
|
|
|
malloc.free(u4);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void RejectInvite(String profileOnion, String groupHandle) {
|
|
|
|
var rejectInvite = library.lookup<NativeFunction<string_string_to_void_function>>("c_RejectInvite");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final RejectInvite = rejectInvite.asFunction<VoidFromStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = groupHandle.toNativeUtf8();
|
|
|
|
RejectInvite(u1, u1.length, u2, u2.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
2021-08-25 05:06:26 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-06-24 23:10:45 +00:00
|
|
|
void CreateGroup(String profileOnion, String server, String groupName) {
|
|
|
|
var createGroup = library.lookup<NativeFunction<void_from_string_string_string_function>>("c_CreateGroup");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final CreateGroup = createGroup.asFunction<VoidFromStringStringStringFn>();
|
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = server.toNativeUtf8();
|
|
|
|
final u3 = groupName.toNativeUtf8();
|
|
|
|
CreateGroup(u1, u1.length, u2, u2.length, u3, u3.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
2021-08-27 20:46:13 +00:00
|
|
|
void ArchiveConversation(String profileOnion, String handle) {
|
|
|
|
var archiveConversation = library.lookup<NativeFunction<string_string_to_void_function>>("c_ArchiveConversation");
|
2021-06-24 23:10:45 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-08-27 20:46:13 +00:00
|
|
|
final ArchiveConversation = archiveConversation.asFunction<VoidFromStringStringFn>();
|
2021-06-24 23:10:45 +00:00
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
|
|
|
final u2 = handle.toNativeUtf8();
|
2021-08-27 20:46:13 +00:00
|
|
|
ArchiveConversation(u1, u1.length, u2, u2.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
2021-08-27 20:46:13 +00:00
|
|
|
void DeleteContact(String profileOnion, String handle) {
|
|
|
|
var deleteContact = library.lookup<NativeFunction<string_string_to_void_function>>("c_DeleteContact");
|
2021-06-24 23:10:45 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-08-27 20:46:13 +00:00
|
|
|
final DeleteContact = deleteContact.asFunction<VoidFromStringStringFn>();
|
2021-06-24 23:10:45 +00:00
|
|
|
final u1 = profileOnion.toNativeUtf8();
|
2021-08-27 20:46:13 +00:00
|
|
|
final u2 = handle.toNativeUtf8();
|
|
|
|
DeleteContact(u1, u1.length, u2, u2.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
2021-08-25 05:06:26 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-06-24 23:10:45 +00:00
|
|
|
void UpdateMessageFlags(String profile, String handle, int index, int flags) {
|
|
|
|
var updateMessageFlagsC = library.lookup<NativeFunction<void_from_string_string_int_int_function>>("c_UpdateMessageFlags");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final updateMessageFlags = updateMessageFlagsC.asFunction<VoidFromStringStringIntIntFn>();
|
|
|
|
final utf8profile = profile.toNativeUtf8();
|
|
|
|
final utf8handle = handle.toNativeUtf8();
|
|
|
|
updateMessageFlags(utf8profile, utf8profile.length, utf8handle, utf8handle.length, index, flags);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(utf8profile);
|
|
|
|
malloc.free(utf8handle);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void DeleteProfile(String onion, String currentPassword) {
|
|
|
|
var deleteprofile = library.lookup<NativeFunction<string_string_to_void_function>>("c_DeleteProfile");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final DeleteProfile = deleteprofile.asFunction<VoidFromStringStringFn>();
|
|
|
|
final u1 = onion.toNativeUtf8();
|
|
|
|
final u2 = currentPassword.toNativeUtf8();
|
|
|
|
DeleteProfile(u1, u1.length, u2, u2.length);
|
2021-08-25 05:06:26 +00:00
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|
|
|
|
|
2021-10-14 01:24:07 +00:00
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SetProfileAttribute(String profile, String key, String val) {
|
|
|
|
var setProfileAttribute = library.lookup<NativeFunction<void_from_string_string_string_function>>("c_SetProfileAttribute");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SetProfileAttribute = setProfileAttribute.asFunction<VoidFromStringStringStringFn>();
|
|
|
|
final u1 = profile.toNativeUtf8();
|
|
|
|
final u2 = key.toNativeUtf8();
|
|
|
|
final u3 = key.toNativeUtf8();
|
|
|
|
SetProfileAttribute(u1, u1.length, u2, u2.length, u3, u3.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SetContactAttribute(String profile, String contact, String key, String val) {
|
|
|
|
var setContactAttribute = library.lookup<NativeFunction<void_from_string_string_string_string_function>>("c_SetContactAttribute");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SetContactAttribute = setContactAttribute.asFunction<VoidFromStringStringStringStringFn>();
|
|
|
|
final u1 = profile.toNativeUtf8();
|
|
|
|
final u2 = contact.toNativeUtf8();
|
|
|
|
final u3 = key.toNativeUtf8();
|
|
|
|
final u4 = key.toNativeUtf8();
|
|
|
|
SetContactAttribute(u1, u1.length, u2, u2.length, u3, u3.length, u4, u4.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
|
|
|
malloc.free(u4);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void LoadServers(String password) {
|
|
|
|
var loadServers = library.lookup<NativeFunction<string_to_void_function>>("c_LoadServers");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final LoadServers = loadServers.asFunction<StringFn>();
|
|
|
|
final u1 = password.toNativeUtf8();
|
|
|
|
LoadServers(u1, u1.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
2021-10-29 23:37:02 +00:00
|
|
|
void CreateServer(String password, String description, bool autostart) {
|
|
|
|
var createServer = library.lookup<NativeFunction<void_from_string_string_byte_function>>("c_CreateServer");
|
2021-10-14 01:24:07 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-10-29 23:37:02 +00:00
|
|
|
final CreateServer = createServer.asFunction<VoidFromStringStringByteFn>();
|
2021-10-14 01:24:07 +00:00
|
|
|
final u1 = password.toNativeUtf8();
|
2021-10-29 23:37:02 +00:00
|
|
|
final u2 = description.toNativeUtf8();
|
|
|
|
CreateServer(u1, u1.length, u2, u2.length, autostart ? 1 : 0);
|
2021-10-14 01:24:07 +00:00
|
|
|
malloc.free(u1);
|
2021-10-29 23:37:02 +00:00
|
|
|
malloc.free(u2);
|
2021-10-14 01:24:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void DeleteServer(String serverOnion, String password) {
|
|
|
|
var deleteServer = library.lookup<NativeFunction<string_string_to_void_function>>("c_DeleteServer");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final DeleteServer = deleteServer.asFunction<VoidFromStringStringFn>();
|
|
|
|
final u1 = serverOnion.toNativeUtf8();
|
|
|
|
final u2 = password.toNativeUtf8();
|
|
|
|
DeleteServer(u1, u1.length, u2, u2.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void LaunchServers() {
|
|
|
|
var launchServers = library.lookup<NativeFunction<Void Function()>>("c_LaunchServers");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final LaunchServers = launchServers.asFunction<void Function()>();
|
|
|
|
LaunchServers();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void LaunchServer(String serverOnion) {
|
|
|
|
var launchServer = library.lookup<NativeFunction<string_to_void_function>>("c_LaunchServer");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final LaunchServer = launchServer.asFunction<StringFn>();
|
|
|
|
final u1 = serverOnion.toNativeUtf8();
|
|
|
|
LaunchServer(u1, u1.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
2021-11-02 02:29:58 +00:00
|
|
|
void StopServer(String serverOnion) {
|
|
|
|
var shutdownServer = library.lookup<NativeFunction<string_to_void_function>>("c_StopServer");
|
2021-10-14 01:24:07 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final ShutdownServer = shutdownServer.asFunction<StringFn>();
|
|
|
|
final u1 = serverOnion.toNativeUtf8();
|
|
|
|
ShutdownServer(u1, u1.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
2021-11-02 02:29:58 +00:00
|
|
|
void StopServers() {
|
|
|
|
var shutdownServers = library.lookup<NativeFunction<Void Function()>>("c_StopServers");
|
2021-10-14 01:24:07 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final ShutdownServers = shutdownServers.asFunction<void Function()>();
|
|
|
|
ShutdownServers();
|
|
|
|
}
|
|
|
|
|
2021-11-02 02:29:58 +00:00
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void DestroyServers() {
|
|
|
|
var destroyServers = library.lookup<NativeFunction<Void Function()>>("c_DestroyServers");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final DestroyServers = destroyServers.asFunction<void Function()>();
|
|
|
|
DestroyServers();
|
|
|
|
}
|
|
|
|
|
2021-10-29 23:37:02 +00:00
|
|
|
@override
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
void SetServerAttribute(String serverOnion, String key, String val) {
|
|
|
|
var setServerAttribute = library.lookup<NativeFunction<void_from_string_string_string_function>>("c_SetServerAttribute");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final SetServerAttribute = setServerAttribute.asFunction<VoidFromStringStringStringFn>();
|
|
|
|
final u1 = serverOnion.toNativeUtf8();
|
|
|
|
final u2 = key.toNativeUtf8();
|
|
|
|
final u3 = val.toNativeUtf8();
|
|
|
|
SetServerAttribute(u1, u1.length, u2, u2.length, u3, u3.length);
|
|
|
|
malloc.free(u1);
|
|
|
|
malloc.free(u2);
|
|
|
|
malloc.free(u3);
|
|
|
|
}
|
|
|
|
|
2021-06-24 23:10:45 +00:00
|
|
|
@override
|
2021-08-25 05:06:26 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-06-24 23:10:45 +00:00
|
|
|
Future<void> Shutdown() async {
|
|
|
|
var shutdown = library.lookup<NativeFunction<void_from_void_funtion>>("c_ShutdownCwtch");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
|
|
|
|
// Shutdown Cwtch + Tor...
|
2021-08-25 05:06:26 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-06-24 23:10:45 +00:00
|
|
|
final Shutdown = shutdown.asFunction<VoidFromVoidFunction>();
|
|
|
|
Shutdown();
|
|
|
|
|
|
|
|
// Kill our Isolate
|
|
|
|
cwtchIsolate.kill(priority: Isolate.immediate);
|
|
|
|
print("Isolate killed");
|
|
|
|
|
|
|
|
_receivePort.close();
|
|
|
|
print("Receive Port Closed");
|
|
|
|
}
|
2021-07-05 19:31:16 +00:00
|
|
|
|
|
|
|
@override
|
2021-08-25 05:06:26 +00:00
|
|
|
// ignore: non_constant_identifier_names
|
2021-07-05 19:31:16 +00:00
|
|
|
Future GetMessageByContentHash(String profile, String handle, String contentHash) async {
|
|
|
|
var getMessagesByContentHashC = library.lookup<NativeFunction<get_json_blob_from_str_str_str_function>>("c_GetMessagesByContentHash");
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
final GetMessagesByContentHash = getMessagesByContentHashC.asFunction<GetJsonBlobFromStrStrStrFn>();
|
|
|
|
final utf8profile = profile.toNativeUtf8();
|
|
|
|
final utf8handle = handle.toNativeUtf8();
|
|
|
|
final utf8contentHash = contentHash.toNativeUtf8();
|
|
|
|
Pointer<Utf8> jsonMessageBytes = GetMessagesByContentHash(utf8profile, utf8profile.length, utf8handle, utf8handle.length, utf8contentHash, utf8contentHash.length);
|
|
|
|
String jsonMessage = jsonMessageBytes.toDartString();
|
2021-08-25 05:06:26 +00:00
|
|
|
|
|
|
|
_UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved(jsonMessageBytes);
|
|
|
|
malloc.free(utf8profile);
|
|
|
|
malloc.free(utf8handle);
|
|
|
|
malloc.free(utf8contentHash);
|
2021-07-05 19:31:16 +00:00
|
|
|
return jsonMessage;
|
|
|
|
}
|
2021-08-25 05:06:26 +00:00
|
|
|
|
|
|
|
// ignore: non_constant_identifier_names
|
|
|
|
// Incredibly dangerous function which invokes a free in libCwtch, should only be used
|
|
|
|
// as documented in `MEMORY.md` in libCwtch repo.
|
|
|
|
void _UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved(Pointer<Utf8> ptr) {
|
|
|
|
var free = library.lookup<NativeFunction<free_function>>("c_FreePointer");
|
|
|
|
final Free = free.asFunction<FreeFn>();
|
|
|
|
Free(ptr);
|
|
|
|
}
|
2021-06-24 23:10:45 +00:00
|
|
|
}
|