import 'dart:ffi'; abstract class NativeHandler { bool onEvent(Map evt); } typedef OnSelectPeersCallback = Bool Function(Int returnCode, Pointer data, Uint64 dataLength, Pointer userData); typedef OnSelectPeersCallbackDart = bool Function( int returnCode, Pointer data, int dataLength, Pointer userData); class NativeUiHandler extends NativeHandler { NativeUiHandler._(); static NativeUiHandler instance = NativeUiHandler._(); @override bool onEvent(Map evt) { final name = evt['name']; final action = evt['action']; if (name != "native_ui") { return false; } switch (action) { case "select_peers": int cb = evt['cb']; int userData = evt['user_data'] ?? 0; final cbFuncNative = Pointer.fromAddress(cb) .cast>(); final cbFuncDart = cbFuncNative.asFunction(); onSelectPeers(cbFuncDart, userData); break; default: return false; } return true; } void onSelectPeers(OnSelectPeersCallbackDart cb, int userData) async { // TODO: design a UI interface to pick peers. cb(0, Pointer.fromAddress(0), 0, Pointer.fromAddress(userData)); } }