From af60c894fda1c6fd8b960465d86ca1f43c005edc Mon Sep 17 00:00:00 2001 From: "jh9216.park" Date: Thu, 16 Jul 2026 09:03:11 +0900 Subject: [PATCH 1/2] [tizen_rpc_port] Support Dart protocol version 2 Add low level Parcel primitives to support the Dart protocol version 2 generator under packages/tizen_rpc_port. Implement the dataSize, reserve, and reader getter/setter properties in the Parcel class using Dart FFI to map them to the native C APIs: - rpc_port_parcel_get_reader - rpc_port_parcel_set_reader - rpc_port_parcel_get_data_size - rpc_port_parcel_set_data_size - rpc_port_parcel_reserve Co-Authored-By: Gemini CLI Signed-off-by: jh9216.park --- packages/tizen_rpc_port/lib/src/parcel.dart | 90 +++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/packages/tizen_rpc_port/lib/src/parcel.dart b/packages/tizen_rpc_port/lib/src/parcel.dart index 2ec3c61d2..332c81e52 100644 --- a/packages/tizen_rpc_port/lib/src/parcel.dart +++ b/packages/tizen_rpc_port/lib/src/parcel.dart @@ -484,4 +484,94 @@ class Parcel { return ParcelHeader._fromHandle(pHeader.value); }); } + + /// Gets the reader position of this parcel. + int get reader { + return using((Arena arena) { + final Pointer pValue = arena(); + final int ret = _rpcPortParcelGetReader(_handle, pValue); + if (ret != 0) { + throw PlatformException( + code: ret.toString(), + message: tizen.get_error_message(ret).toDartString(), + ); + } + return pValue.value; + }); + } + + /// Sets the reader position of this parcel. + set reader(int value) { + final int ret = _rpcPortParcelSetReader(_handle, value); + if (ret != 0) { + throw PlatformException( + code: ret.toString(), + message: tizen.get_error_message(ret).toDartString(), + ); + } + } + + /// Gets the data size of this parcel. + int get dataSize { + return using((Arena arena) { + final Pointer pValue = arena(); + final int ret = _rpcPortParcelGetDataSize(_handle, pValue); + if (ret != 0) { + throw PlatformException( + code: ret.toString(), + message: tizen.get_error_message(ret).toDartString(), + ); + } + return pValue.value; + }); + } + + /// Sets the data size of this parcel. + set dataSize(int value) { + final int ret = _rpcPortParcelSetDataSize(_handle, value); + if (ret != 0) { + throw PlatformException( + code: ret.toString(), + message: tizen.get_error_message(ret).toDartString(), + ); + } + } + + /// Reserves the capacity of this parcel. + void reserve(int size) { + final int ret = _rpcPortParcelReserve(_handle, size); + if (ret != 0) { + throw PlatformException( + code: ret.toString(), + message: tizen.get_error_message(ret).toDartString(), + ); + } + } } + +final DynamicLibrary _libRpcPort = DynamicLibrary.open('librpc-port.so.1'); + +final int Function(Pointer, Pointer) _rpcPortParcelGetReader = + _libRpcPort + .lookup, Pointer)>>('rpc_port_parcel_get_reader') + .asFunction(); + +final int Function(Pointer, int) _rpcPortParcelSetReader = + _libRpcPort + .lookup, Uint32)>>('rpc_port_parcel_set_reader') + .asFunction(); + +final int Function(Pointer, Pointer) _rpcPortParcelGetDataSize = + _libRpcPort + .lookup, Pointer)>>('rpc_port_parcel_get_data_size') + .asFunction(); + +final int Function(Pointer, int) _rpcPortParcelSetDataSize = + _libRpcPort + .lookup, Uint32)>>('rpc_port_parcel_set_data_size') + .asFunction(); + +final int Function(Pointer, int) _rpcPortParcelReserve = + _libRpcPort + .lookup, Uint32)>>('rpc_port_parcel_reserve') + .asFunction(); From 35249790a05d3682b07490ad0f11d3b5534e7432 Mon Sep 17 00:00:00 2001 From: "jh9216.park" Date: Thu, 16 Jul 2026 10:57:04 +0900 Subject: [PATCH 2/2] [tizen_rpc_port] Apply validation and formatting Add RangeError.checkNotNegative checks to Parcel setters and methods to prevent negative values from being passed to native unsigned APIs. Use rpc_port_parcel_h handle type instead of Pointer in the FFI signatures to improve type safety and consistency. Run dart format on all specified package files to adhere to formatting standards. Co-Authored-By: Gemini CLI Signed-off-by: jh9216.park --- .../example/client/lib/message_client.dart | 2 +- .../example/server/lib/message_server.dart | 6 +- packages/tizen_rpc_port/lib/src/parcel.dart | 57 +++++++++++-------- .../tizen_rpc_port/lib/src/proxy_base.dart | 4 +- .../tizen_rpc_port/lib/src/stub_base.dart | 4 +- 5 files changed, 42 insertions(+), 31 deletions(-) diff --git a/packages/tizen_rpc_port/example/client/lib/message_client.dart b/packages/tizen_rpc_port/example/client/lib/message_client.dart index af665625e..3718c4ef4 100644 --- a/packages/tizen_rpc_port/example/client/lib/message_client.dart +++ b/packages/tizen_rpc_port/example/client/lib/message_client.dart @@ -58,7 +58,7 @@ typedef NotifyCallback = void Function(String, String); class _NotifyCallback extends _Delegate { _NotifyCallback(NotifyCallback callback, {bool once = false}) - : super(_DelegateId.notifyCallback.id, once, callback); + : super(_DelegateId.notifyCallback.id, once, callback); @override Future onReceivedEvent(Parcel parcel) async { diff --git a/packages/tizen_rpc_port/example/server/lib/message_server.dart b/packages/tizen_rpc_port/example/server/lib/message_server.dart index 20e94241b..6b8ca88fb 100644 --- a/packages/tizen_rpc_port/example/server/lib/message_server.dart +++ b/packages/tizen_rpc_port/example/server/lib/message_server.dart @@ -73,7 +73,7 @@ abstract class ServiceBase { class NotifyCallback extends _Delegate { NotifyCallback(this._port, this.service, {bool once = false}) - : super(_DelegateId.notifyCallback.id, once); + : super(_DelegateId.notifyCallback.id, once); final Port? _port; @@ -110,8 +110,8 @@ typedef _MethodHandler = Future Function(ServiceBase, Port, Parcel); class Message extends StubBase { Message({required ServiceBuilder serviceBuilder}) - : _serviceBuilder = serviceBuilder, - super('Message') { + : _serviceBuilder = serviceBuilder, + super('Message') { _methodHandlers[_MethodId.register.id] = _onRegisterMethod; _methodHandlers[_MethodId.unregister.id] = _onUnregisterMethod; _methodHandlers[_MethodId.send.id] = _onSendMethod; diff --git a/packages/tizen_rpc_port/lib/src/parcel.dart b/packages/tizen_rpc_port/lib/src/parcel.dart index 332c81e52..e841b4278 100644 --- a/packages/tizen_rpc_port/lib/src/parcel.dart +++ b/packages/tizen_rpc_port/lib/src/parcel.dart @@ -157,8 +157,8 @@ class Parcel { static final Finalizer _finalizer = Finalizer((rpc_port_parcel_h handle) { - tizen.rpc_port_parcel_destroy(handle); - }); + tizen.rpc_port_parcel_destroy(handle); + }); /// Gets a byte array backed by the raw data of this parcel. Uint8List asRaw() { @@ -502,6 +502,7 @@ class Parcel { /// Sets the reader position of this parcel. set reader(int value) { + RangeError.checkNotNegative(value, 'value'); final int ret = _rpcPortParcelSetReader(_handle, value); if (ret != 0) { throw PlatformException( @@ -528,6 +529,7 @@ class Parcel { /// Sets the data size of this parcel. set dataSize(int value) { + RangeError.checkNotNegative(value, 'value'); final int ret = _rpcPortParcelSetDataSize(_handle, value); if (ret != 0) { throw PlatformException( @@ -539,6 +541,7 @@ class Parcel { /// Reserves the capacity of this parcel. void reserve(int size) { + RangeError.checkNotNegative(size, 'size'); final int ret = _rpcPortParcelReserve(_handle, size); if (ret != 0) { throw PlatformException( @@ -551,27 +554,35 @@ class Parcel { final DynamicLibrary _libRpcPort = DynamicLibrary.open('librpc-port.so.1'); -final int Function(Pointer, Pointer) _rpcPortParcelGetReader = +final int Function(rpc_port_parcel_h, Pointer) +_rpcPortParcelGetReader = _libRpcPort + .lookup)>>( + 'rpc_port_parcel_get_reader', + ) + .asFunction(); + +final int Function(rpc_port_parcel_h, int) _rpcPortParcelSetReader = _libRpcPort + .lookup>( + 'rpc_port_parcel_set_reader', + ) + .asFunction(); + +final int Function(rpc_port_parcel_h, Pointer) +_rpcPortParcelGetDataSize = _libRpcPort + .lookup)>>( + 'rpc_port_parcel_get_data_size', + ) + .asFunction(); + +final int Function(rpc_port_parcel_h, int) _rpcPortParcelSetDataSize = _libRpcPort - .lookup, Pointer)>>('rpc_port_parcel_get_reader') + .lookup>( + 'rpc_port_parcel_set_data_size', + ) .asFunction(); -final int Function(Pointer, int) _rpcPortParcelSetReader = - _libRpcPort - .lookup, Uint32)>>('rpc_port_parcel_set_reader') - .asFunction(); - -final int Function(Pointer, Pointer) _rpcPortParcelGetDataSize = - _libRpcPort - .lookup, Pointer)>>('rpc_port_parcel_get_data_size') - .asFunction(); - -final int Function(Pointer, int) _rpcPortParcelSetDataSize = - _libRpcPort - .lookup, Uint32)>>('rpc_port_parcel_set_data_size') - .asFunction(); - -final int Function(Pointer, int) _rpcPortParcelReserve = - _libRpcPort - .lookup, Uint32)>>('rpc_port_parcel_reserve') - .asFunction(); +final int Function(rpc_port_parcel_h, int) _rpcPortParcelReserve = _libRpcPort + .lookup>( + 'rpc_port_parcel_reserve', + ) + .asFunction(); diff --git a/packages/tizen_rpc_port/lib/src/proxy_base.dart b/packages/tizen_rpc_port/lib/src/proxy_base.dart index 8d80d104b..079ab78d5 100644 --- a/packages/tizen_rpc_port/lib/src/proxy_base.dart +++ b/packages/tizen_rpc_port/lib/src/proxy_base.dart @@ -107,8 +107,8 @@ abstract class ProxyBase { _activeConnections.add(_handle.address); _streamSubscription = _stream!.listen((dynamic data) async { - final Map map = - (data as Map).cast(); + final Map map = (data as Map) + .cast(); final int handle = map['handle'] as int; if (handle != _handle.address) { return; diff --git a/packages/tizen_rpc_port/lib/src/stub_base.dart b/packages/tizen_rpc_port/lib/src/stub_base.dart index 987ef918d..430976cd4 100644 --- a/packages/tizen_rpc_port/lib/src/stub_base.dart +++ b/packages/tizen_rpc_port/lib/src/stub_base.dart @@ -87,8 +87,8 @@ abstract class StubBase { {'handle': _handle.address}, ); _streamSubscription = stream.listen((dynamic data) async { - final Map map = - (data as Map).cast(); + final Map map = (data as Map) + .cast(); final int handle = map['handle'] as int; if (handle != _handle.address) { return;