diff --git a/lib/controllers/client.dart b/lib/controllers/client.dart index 3d2de6f..4770470 100644 --- a/lib/controllers/client.dart +++ b/lib/controllers/client.dart @@ -79,34 +79,26 @@ class ClientController(final String? accountId) extends AsyncNotifier { final environment = await _environment(account); debugPrint("Setting Gomuks env for $account..."); - for (final MapEntry(:key, :value) in environment.entries) { - final keyPtr = key.toNativeUtf8().cast(); - final valuePtr = value.toNativeUtf8().cast(); - try { - GomuksSetEnv(keyPtr, valuePtr); - } finally { - calloc - ..free(keyPtr) - ..free(valuePtr); + using((arena) { + for (final MapEntry(:key, :value) in environment.entries) { + GomuksSetEnv( + key.toNativeUtf8(allocator: arena).cast(), + value.toNativeUtf8(allocator: arena).cast(), + ); } - } + }, malloc); debugPrint("Initializing Gomuks..."); - final bufferPointer = GomuksConfig( + final config = GomuksConfig( matrix: .new( initialDeviceDisplayName: "Nexus on ${toBeginningOfSentenceCase(Platform.operatingSystem)}", ), - ).toJson().toGomuksBufferPtr(); - - final int handle; - try { - handle = GomuksInit(bufferPointer.ref); - } finally { - calloc - ..free(bufferPointer.ref.base) - ..free(bufferPointer); - } + ).toJson(); + final handle = using( + (arena) => GomuksInit(config.toGomuksBufferPtr(arena).ref), + malloc, + ); if (!ref.mounted) { GomuksDestroy(handle); @@ -233,13 +225,16 @@ class ClientController(final String? accountId) extends AsyncNotifier { String command, [ Map data = const {}, ]) => callGomuksMethod(data, (handle, data, callback) { - final commandPointer = command.toNativeUtf8().cast(); - try { - GomuksSubmitCommandAsync(handle, commandPointer, data, callback); - } finally { - // gomuks copies the command name before returning - calloc.free(commandPointer); - } + // gomuks copies the command name before returning + using( + (arena) => GomuksSubmitCommandAsync( + handle, + command.toNativeUtf8(allocator: arena).cast(), + data, + callback, + ), + malloc, + ); }); Future redactEvent(RedactEventRequest report) => diff --git a/lib/helpers/extensions/gomuks_buffer.dart b/lib/helpers/extensions/gomuks_buffer.dart index 9ab1307..14404b4 100644 --- a/lib/helpers/extensions/gomuks_buffer.dart +++ b/lib/helpers/extensions/gomuks_buffer.dart @@ -2,7 +2,6 @@ import "dart:convert"; import "dart:ffi"; import "dart:typed_data"; -import "package:ffi/ffi.dart"; import "package:nexus/src/third_party/gomuks.g.dart"; extension GomuksOwnedBufferToX on GomuksOwnedBuffer { @@ -29,13 +28,13 @@ extension JsonToGomuksBuffer on Map { return buffer; } - Pointer toGomuksBufferPtr() { + Pointer toGomuksBufferPtr(Allocator allocator) { final bytes = utf8.encode(json.encode(this)); - final dataPtr = calloc(bytes.length); + final dataPtr = allocator(bytes.length); dataPtr.asTypedList(bytes.length).setAll(0, bytes); - return calloc() + return allocator() ..ref.base = dataPtr ..ref.length = bytes.length; }