Skip to content

Commit

Permalink
Move XTokenHandles
Browse files Browse the repository at this point in the history
  • Loading branch information
nielsenko committed Apr 25, 2024
1 parent 047771c commit 2e9ba60
Show file tree
Hide file tree
Showing 14 changed files with 124 additions and 124 deletions.
2 changes: 1 addition & 1 deletion packages/realm_dart/lib/src/list.dart
Expand Up @@ -338,7 +338,7 @@ class ListNotificationsController<T extends Object?> extends NotificationsContro
ListNotificationsController(this.list);

@override
RealmNotificationTokenHandle subscribe() {
NotificationTokenHandle subscribe() {
return list.handle.subscribeForNotifications(this);
}

Expand Down
2 changes: 1 addition & 1 deletion packages/realm_dart/lib/src/map.dart
Expand Up @@ -289,7 +289,7 @@ class MapNotificationsController<T extends Object?> extends NotificationsControl
MapNotificationsController(this.map);

@override
RealmNotificationTokenHandle subscribe() {
NotificationTokenHandle subscribe() {
return map.handle.subscribeForNotifications(this);
}

Expand Down
4 changes: 2 additions & 2 deletions packages/realm_dart/lib/src/native/list_handle.dart
Expand Up @@ -131,14 +131,14 @@ class ListHandle extends CollectionHandleBase<realm_list> {
});
}

RealmNotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
NotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
final ptr = invokeGetPointer(() => realmLib.realm_list_add_notification_callback(
pointer,
controller.toPersistentHandle(),
realmLib.addresses.realm_dart_delete_persistent_handle,
nullptr,
Pointer.fromFunction(collectionChangeCallback),
));
return RealmNotificationTokenHandle(ptr, root);
return NotificationTokenHandle(ptr, root);
}
}
4 changes: 2 additions & 2 deletions packages/realm_dart/lib/src/native/map_handle.dart
Expand Up @@ -164,15 +164,15 @@ class MapHandle extends CollectionHandleBase<realm_dictionary> {
});
}

RealmNotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
NotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
final ptr = invokeGetPointer(() => realmLib.realm_dictionary_add_notification_callback(
pointer,
controller.toPersistentHandle(),
realmLib.addresses.realm_dart_delete_persistent_handle,
nullptr,
Pointer.fromFunction(_mapChangeCallback),
));
return RealmNotificationTokenHandle(ptr, root);
return NotificationTokenHandle(ptr, root);
}
}

Expand Down
27 changes: 23 additions & 4 deletions packages/realm_dart/lib/src/native/object_handle.dart
@@ -1,13 +1,13 @@
// Copyright 2024 MongoDB, Inc.
// SPDX-License-Identifier: Apache-2.0


import 'dart:ffi';

import 'package:ffi/ffi.dart';

import '../realm_dart.dart'; // TODO: Remove this import
import 'error_handling.dart';
import 'handle_base.dart';
import 'list_handle.dart';
import 'map_handle.dart';
import 'realm_bindings.dart';
Expand Down Expand Up @@ -116,7 +116,7 @@ class ObjectHandle extends RootedHandleBase<realm_object> {
});
}

RealmNotificationTokenHandle subscribeForNotifications(NotificationsController controller, [List<String>? keyPaths]) {
NotificationTokenHandle subscribeForNotifications(NotificationsController controller, [List<String>? keyPaths]) {
return using((Arena arena) {
final kpNative = buildAndVerifyKeyPath(keyPaths);
final ptr = invokeGetPointer(() => realmLib.realm_object_add_notification_callback(
Expand All @@ -127,7 +127,7 @@ class ObjectHandle extends RootedHandleBase<realm_object> {
Pointer.fromFunction(_objectChangeCallback),
));

return RealmNotificationTokenHandle(ptr, root);
return NotificationTokenHandle(ptr, root);
});
}

Expand Down Expand Up @@ -165,9 +165,28 @@ void _objectChangeCallback(Pointer<Void> userdata, Pointer<realm_object_changes>
return;
}

final changesHandle = RealmObjectChangesHandle(clonedData.cast());
final changesHandle = ObjectChangesHandle(clonedData.cast());
controller.onChanges(changesHandle);
} catch (e) {
controller.onError(RealmError("Error handling change notifications. Error: $e"));
}
}

class ObjectChangesHandle extends HandleBase<realm_object_changes> {
ObjectChangesHandle(Pointer<realm_object_changes> pointer) : super(pointer, 256);

bool get isDeleted {
return realmLib.realm_object_changes_is_deleted(pointer);
}

List<int> get properties {
return using((arena) {
final count = realmLib.realm_object_changes_get_num_modified_properties(pointer);

final outModified = arena<realm_property_key_t>(count);
realmLib.realm_object_changes_get_modified_properties(pointer, outModified, count);

return outModified.asTypedList(count).toList();
});
}
}
109 changes: 13 additions & 96 deletions packages/realm_dart/lib/src/native/realm_core.dart
Expand Up @@ -146,31 +146,6 @@ Pointer<Void> createAsyncUserCallbackUserdata(Completer<void> completer) {
return userdata.cast();
}

void appApiKeyCompletionCallback(Pointer<Void> userdata, Pointer<realm_app_user_apikey> apiKey, Pointer<realm_app_error> error) {
final Completer<ApiKey> completer = userdata.toObject();
if (error != nullptr) {
completer.completeWithAppError(error);
return;
}
completer.complete(apiKey.ref.toDart());
}

void appApiKeyArrayCompletionCallback(Pointer<Void> userdata, Pointer<realm_app_user_apikey> apiKey, int size, Pointer<realm_app_error> error) {
final Completer<List<ApiKey>> completer = userdata.toObject();

if (error != nullptr) {
completer.completeWithAppError(error);
return;
}

final result = <ApiKey>[];
for (var i = 0; i < size; i++) {
result.add(apiKey[i].toDart());
}

completer.complete(result);
}

void appUserCompletionCallback(Pointer<Void> userdata, Pointer<realm_user> user, Pointer<realm_app_error> error) {
final Completer<UserHandle> completer = userdata.toObject();

Expand Down Expand Up @@ -215,41 +190,6 @@ Pointer<Void> createAsyncCallbackUserdata<T extends Function>(Completer<void> co
return userdata.cast();
}

Pointer<Void> createAsyncApikeyCallbackUserdata<T extends Function>(Completer<ApiKey> completer) {
final callback = Pointer.fromFunction<
Void Function(
Pointer<Void>,
Pointer<realm_app_user_apikey>,
Pointer<realm_app_error>,
)>(appApiKeyCompletionCallback);

final userdata = realmLib.realm_dart_userdata_async_new(
completer,
callback.cast(),
scheduler.handle.pointer,
);

return userdata.cast();
}

Pointer<Void> createAsyncApikeyListCallbackUserdata<T extends Function>(Completer<List<ApiKey>> completer) {
final callback = Pointer.fromFunction<
Void Function(
Pointer<Void>,
Pointer<realm_app_user_apikey>,
Size count,
Pointer<realm_app_error>,
)>(appApiKeyArrayCompletionCallback);

final userdata = realmLib.realm_dart_userdata_async_new(
completer,
callback.cast(),
scheduler.handle.pointer,
);

return userdata.cast();
}

void createCollection(Realm realm, RealmValue value, Pointer<realm_list> Function() createList, Pointer<realm_dictionary> Function() createMap) {
CollectionHandleBase? collectionHandle;
try {
Expand Down Expand Up @@ -355,13 +295,13 @@ class _RealmCore {
realmLib.realm_scheduler_perform_work(queuePointer);
}

RealmAsyncOpenTaskHandle createRealmAsyncOpenTask(FlexibleSyncConfiguration config) {
AsyncOpenTaskHandle createRealmAsyncOpenTask(FlexibleSyncConfiguration config) {
final configHandle = ConfigHandle.from(config);
final asyncOpenTaskPtr = invokeGetPointer(() => realmLib.realm_open_synchronized(configHandle.pointer), "Error opening realm at path ${config.path}");
return RealmAsyncOpenTaskHandle(asyncOpenTaskPtr);
return AsyncOpenTaskHandle(asyncOpenTaskPtr);
}

Future<RealmHandle> openRealmAsync(RealmAsyncOpenTaskHandle handle, CancellationToken? cancellationToken) {
Future<RealmHandle> openRealmAsync(AsyncOpenTaskHandle handle, CancellationToken? cancellationToken) {
final completer = CancellableCompleter<RealmHandle>(cancellationToken);
if (!completer.isCancelled) {
final callback =
Expand Down Expand Up @@ -395,12 +335,12 @@ class _RealmCore {
});
}

void cancelOpenRealmAsync(RealmAsyncOpenTaskHandle handle) {
void cancelOpenRealmAsync(AsyncOpenTaskHandle handle) {
realmLib.realm_async_open_task_cancel(handle.pointer);
}

RealmAsyncOpenTaskProgressNotificationTokenHandle realmAsyncOpenRegisterAsyncOpenProgressNotifier(
RealmAsyncOpenTaskHandle handle, RealmAsyncOpenProgressNotificationsController controller) {
AsyncOpenTaskProgressNotificationTokenHandle realmAsyncOpenRegisterAsyncOpenProgressNotifier(
AsyncOpenTaskHandle handle, RealmAsyncOpenProgressNotificationsController controller) {
final callback = Pointer.fromFunction<Void Function(Handle, Uint64, Uint64, Double)>(syncProgressCallback);
final userdata = realmLib.realm_dart_userdata_async_new(controller, callback.cast(), scheduler.handle.pointer);
final tokenPtr = invokeGetPointer(() => realmLib.realm_async_open_task_register_download_progress_notifier(
Expand All @@ -409,7 +349,7 @@ class _RealmCore {
userdata.cast(),
realmLib.addresses.realm_dart_userdata_async_free,
));
return RealmAsyncOpenTaskProgressNotificationTokenHandle(tokenPtr);
return AsyncOpenTaskProgressNotificationTokenHandle(tokenPtr);
}

RealmSchema readSchema(Realm realm) {
Expand Down Expand Up @@ -559,21 +499,6 @@ class _RealmCore {
return hashCode;
}

bool getObjectChangesIsDeleted(RealmObjectChangesHandle handle) {
return realmLib.realm_object_changes_is_deleted(handle.pointer);
}

List<int> getObjectChangesProperties(RealmObjectChangesHandle handle) {
return using((arena) {
final count = realmLib.realm_object_changes_get_num_modified_properties(handle.pointer);

final outModified = arena<realm_property_key_t>(count);
realmLib.realm_object_changes_get_modified_properties(handle.pointer, outModified, count);

return outModified.asTypedList(count).toList();
});
}

void logMessage(LogCategory category, LogLevel logLevel, String message) {
return using((arena) {
realmLib.realm_dart_log(logLevel.index, category.toString().toCharPtr(arena), message.toCharPtr(arena));
Expand Down Expand Up @@ -695,24 +620,16 @@ class _RealmLinkHandle {
classKey = link.target_table;
}

class CallbackTokenHandle extends RootedHandleBase<realm_callback_token> {
CallbackTokenHandle(Pointer<realm_callback_token> pointer, RealmHandle root) : super(root, pointer, 32);
}

class RealmNotificationTokenHandle extends RootedHandleBase<realm_notification_token> {
RealmNotificationTokenHandle(Pointer<realm_notification_token> pointer, RealmHandle root) : super(root, pointer, 32);
}

class RealmObjectChangesHandle extends HandleBase<realm_object_changes> {
RealmObjectChangesHandle(Pointer<realm_object_changes> pointer) : super(pointer, 256);
class NotificationTokenHandle extends RootedHandleBase<realm_notification_token> {
NotificationTokenHandle(Pointer<realm_notification_token> pointer, RealmHandle root) : super(root, pointer, 32);
}

class RealmAsyncOpenTaskHandle extends HandleBase<realm_async_open_task_t> {
RealmAsyncOpenTaskHandle(Pointer<realm_async_open_task_t> pointer) : super(pointer, 32);
class AsyncOpenTaskHandle extends HandleBase<realm_async_open_task_t> {
AsyncOpenTaskHandle(Pointer<realm_async_open_task_t> pointer) : super(pointer, 32);
}

class RealmAsyncOpenTaskProgressNotificationTokenHandle extends HandleBase<realm_async_open_task_progress_notification_token_t> {
RealmAsyncOpenTaskProgressNotificationTokenHandle(Pointer<realm_async_open_task_progress_notification_token_t> pointer) : super(pointer, 40);
class AsyncOpenTaskProgressNotificationTokenHandle extends HandleBase<realm_async_open_task_progress_notification_token_t> {
AsyncOpenTaskProgressNotificationTokenHandle(Pointer<realm_async_open_task_progress_notification_token_t> pointer) : super(pointer, 40);
}

extension ListEx on List<int> {
Expand Down
4 changes: 4 additions & 0 deletions packages/realm_dart/lib/src/native/realm_handle.dart
Expand Up @@ -323,6 +323,10 @@ class RealmHandle extends HandleBase<shared_realm> {
}
}

class CallbackTokenHandle extends RootedHandleBase<realm_callback_token> {
CallbackTokenHandle(Pointer<realm_callback_token> pointer, RealmHandle root) : super(root, pointer, 32);
}

void _schemaChangeCallback(Pointer<Void> userdata, Pointer<realm_schema> data) {
final Realm realm = userdata.toObject();
try {
Expand Down
4 changes: 2 additions & 2 deletions packages/realm_dart/lib/src/native/results_handle.dart
Expand Up @@ -105,7 +105,7 @@ class ResultsHandle extends RootedHandleBase<realm_results> {
});
}

RealmNotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
NotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
final ptr = invokeGetPointer(
() => realmLib.realm_results_add_notification_callback(
pointer,
Expand All @@ -115,6 +115,6 @@ class ResultsHandle extends RootedHandleBase<realm_results> {
Pointer.fromFunction(collectionChangeCallback),
),
);
return RealmNotificationTokenHandle(ptr, root);
return NotificationTokenHandle(ptr, root);
}
}
4 changes: 2 additions & 2 deletions packages/realm_dart/lib/src/native/set_handle.dart
Expand Up @@ -117,14 +117,14 @@ class SetHandle extends RootedHandleBase<realm_set> {
});
}

RealmNotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
NotificationTokenHandle subscribeForNotifications(NotificationsController controller) {
final ptr = invokeGetPointer(() => realmLib.realm_set_add_notification_callback(
pointer,
controller.toPersistentHandle(),
realmLib.addresses.realm_dart_delete_persistent_handle,
nullptr,
Pointer.fromFunction(collectionChangeCallback),
));
return RealmNotificationTokenHandle(ptr, root);
return NotificationTokenHandle(ptr, root);
}
}

0 comments on commit 2e9ba60

Please sign in to comment.