From af60c894fda1c6fd8b960465d86ca1f43c005edc Mon Sep 17 00:00:00 2001 From: "jh9216.park" Date: Thu, 16 Jul 2026 09:03:11 +0900 Subject: [PATCH 1/5] [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/5] [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; From 3863b41bf4685a852808d64b0bebee142006f45d Mon Sep 17 00:00:00 2001 From: "jh9216.park" Date: Mon, 20 Jul 2026 09:45:38 +0900 Subject: [PATCH 3/5] [tizen_rpc_port] Correct package formatting Run './tools/tools_runner.sh format' to properly format the package files according to the tizen_rpc_port package's language standards. This corrects indentation and layout in: - message_client.dart - message_server.dart - parcel.dart - proxy_base.dart - stub_base.dart 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 | 28 ++++++++++--------- .../tizen_rpc_port/lib/src/proxy_base.dart | 4 +-- .../tizen_rpc_port/lib/src/stub_base.dart | 4 +-- 5 files changed, 23 insertions(+), 21 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 3718c4ef4..af665625e 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 6b8ca88fb..20e94241b 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 e841b4278..185cb93d3 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() { @@ -554,12 +554,13 @@ class Parcel { final DynamicLibrary _libRpcPort = DynamicLibrary.open('librpc-port.so.1'); -final int Function(rpc_port_parcel_h, Pointer) -_rpcPortParcelGetReader = _libRpcPort - .lookup)>>( - 'rpc_port_parcel_get_reader', - ) - .asFunction(); +final int Function(rpc_port_parcel_h, Pointer) _rpcPortParcelGetReader = + _libRpcPort + .lookup< + NativeFunction)>>( + 'rpc_port_parcel_get_reader', + ) + .asFunction(); final int Function(rpc_port_parcel_h, int) _rpcPortParcelSetReader = _libRpcPort .lookup>( @@ -568,11 +569,12 @@ final int Function(rpc_port_parcel_h, int) _rpcPortParcelSetReader = _libRpcPort .asFunction(); final int Function(rpc_port_parcel_h, Pointer) -_rpcPortParcelGetDataSize = _libRpcPort - .lookup)>>( - 'rpc_port_parcel_get_data_size', - ) - .asFunction(); + _rpcPortParcelGetDataSize = _libRpcPort + .lookup< + NativeFunction)>>( + 'rpc_port_parcel_get_data_size', + ) + .asFunction(); final int Function(rpc_port_parcel_h, int) _rpcPortParcelSetDataSize = _libRpcPort diff --git a/packages/tizen_rpc_port/lib/src/proxy_base.dart b/packages/tizen_rpc_port/lib/src/proxy_base.dart index 079ab78d5..8d80d104b 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 430976cd4..987ef918d 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; From 9b1856c32f9999c3ad51f2c368a96f887f5025a9 Mon Sep 17 00:00:00 2001 From: "jh9216.park" Date: Mon, 20 Jul 2026 16:36:09 +0900 Subject: [PATCH 4/5] [tizen_rpc_port] Guard Parcel APIs for compatibility Safely load librpc-port.so.1 and its symbols dynamically to prevent crashes on older Tizen versions. Throw an UnsupportedError when these unsupported APIs (reader, dataSize, reserve) are invoked. Add integration tests to verify the compatibility behavior. Update the README with requirements, bump version to 0.1.7, and update CHANGELOG. Co-Authored-By: Gemini CLI Signed-off-by: jh9216.park --- packages/tizen_rpc_port/CHANGELOG.md | 6 + packages/tizen_rpc_port/README.md | 3 + .../integration_test/tizen_rpc_port_test.dart | 35 +++++ packages/tizen_rpc_port/lib/src/parcel.dart | 130 ++++++++++++++---- packages/tizen_rpc_port/pubspec.yaml | 2 +- 5 files changed, 147 insertions(+), 29 deletions(-) diff --git a/packages/tizen_rpc_port/CHANGELOG.md b/packages/tizen_rpc_port/CHANGELOG.md index 4c94f3df9..bcdd57233 100644 --- a/packages/tizen_rpc_port/CHANGELOG.md +++ b/packages/tizen_rpc_port/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.1.7 + +* Guard Tizen 10.0+ specific Parcel APIs (`reader`, `dataSize`, and `reserve`) to throw `UnsupportedError` on unsupported versions of Tizen instead of crashing. +* Add integration test cases for the guarded Tizen 10.0+ specific Parcel APIs. +* Update README to mention system requirements for these APIs. + ## 0.1.6 * Read byte values as unsigned (0-255) so `Parcel.readByte` is consistent diff --git a/packages/tizen_rpc_port/README.md b/packages/tizen_rpc_port/README.md index 072e656ed..0ab555006 100644 --- a/packages/tizen_rpc_port/README.md +++ b/packages/tizen_rpc_port/README.md @@ -47,3 +47,6 @@ The following privileges may be added to the client app's `tizen-manifest.xml` f ## Supported devices This plugin is supported on Tizen devices running Tizen 6.5 or above. + +> **Note** +> Some `Parcel` APIs (`reader`, `dataSize`, and `reserve`) are supported only on Tizen 10.0 or above. Calling these APIs on unsupported versions of Tizen will throw an `UnsupportedError`. diff --git a/packages/tizen_rpc_port/example/client/integration_test/tizen_rpc_port_test.dart b/packages/tizen_rpc_port/example/client/integration_test/tizen_rpc_port_test.dart index 4e1f00661..80564563c 100644 --- a/packages/tizen_rpc_port/example/client/integration_test/tizen_rpc_port_test.dart +++ b/packages/tizen_rpc_port/example/client/integration_test/tizen_rpc_port_test.dart @@ -283,4 +283,39 @@ void main() { expect(proxy.portName, 'TestPort'); }); }); + + // --------------------------------------------------------------------------- + // Tizen 10.0+ Parcel APIs (reader, dataSize, reserve) with safety guards + // --------------------------------------------------------------------------- + + group('Tizen 10.0+ Parcel APIs', () { + testWidgets('reader getter/setter', (WidgetTester _) async { + final Parcel parcel = Parcel(); + try { + parcel.reader = 10; + expect(parcel.reader, 10); + } on UnsupportedError catch (e) { + expect(e.message, contains('not supported on this version of Tizen')); + } + }); + + testWidgets('dataSize getter/setter', (WidgetTester _) async { + final Parcel parcel = Parcel(); + try { + parcel.dataSize = 20; + expect(parcel.dataSize, 20); + } on UnsupportedError catch (e) { + expect(e.message, contains('not supported on this version of Tizen')); + } + }); + + testWidgets('reserve', (WidgetTester _) async { + final Parcel parcel = Parcel(); + try { + parcel.reserve(100); + } on UnsupportedError catch (e) { + expect(e.message, contains('not supported on this version of Tizen')); + } + }); + }); } diff --git a/packages/tizen_rpc_port/lib/src/parcel.dart b/packages/tizen_rpc_port/lib/src/parcel.dart index 185cb93d3..abfb7f8ab 100644 --- a/packages/tizen_rpc_port/lib/src/parcel.dart +++ b/packages/tizen_rpc_port/lib/src/parcel.dart @@ -487,9 +487,17 @@ class Parcel { /// Gets the reader position of this parcel. int get reader { + _ensureFunctionsLoaded(); + final int Function(rpc_port_parcel_h, Pointer)? func = + _rpcPortParcelGetReader; + if (func == null) { + throw UnsupportedError( + 'The reader property is not supported on this version of Tizen.', + ); + } return using((Arena arena) { final Pointer pValue = arena(); - final int ret = _rpcPortParcelGetReader(_handle, pValue); + final int ret = func(_handle, pValue); if (ret != 0) { throw PlatformException( code: ret.toString(), @@ -503,7 +511,14 @@ class Parcel { /// Sets the reader position of this parcel. set reader(int value) { RangeError.checkNotNegative(value, 'value'); - final int ret = _rpcPortParcelSetReader(_handle, value); + _ensureFunctionsLoaded(); + final int Function(rpc_port_parcel_h, int)? func = _rpcPortParcelSetReader; + if (func == null) { + throw UnsupportedError( + 'The reader property is not supported on this version of Tizen.', + ); + } + final int ret = func(_handle, value); if (ret != 0) { throw PlatformException( code: ret.toString(), @@ -514,9 +529,17 @@ class Parcel { /// Gets the data size of this parcel. int get dataSize { + _ensureFunctionsLoaded(); + final int Function(rpc_port_parcel_h, Pointer)? func = + _rpcPortParcelGetDataSize; + if (func == null) { + throw UnsupportedError( + 'The dataSize property is not supported on this version of Tizen.', + ); + } return using((Arena arena) { final Pointer pValue = arena(); - final int ret = _rpcPortParcelGetDataSize(_handle, pValue); + final int ret = func(_handle, pValue); if (ret != 0) { throw PlatformException( code: ret.toString(), @@ -530,7 +553,15 @@ class Parcel { /// Sets the data size of this parcel. set dataSize(int value) { RangeError.checkNotNegative(value, 'value'); - final int ret = _rpcPortParcelSetDataSize(_handle, value); + _ensureFunctionsLoaded(); + final int Function(rpc_port_parcel_h, int)? func = + _rpcPortParcelSetDataSize; + if (func == null) { + throw UnsupportedError( + 'The dataSize property is not supported on this version of Tizen.', + ); + } + final int ret = func(_handle, value); if (ret != 0) { throw PlatformException( code: ret.toString(), @@ -542,7 +573,14 @@ class Parcel { /// Reserves the capacity of this parcel. void reserve(int size) { RangeError.checkNotNegative(size, 'size'); - final int ret = _rpcPortParcelReserve(_handle, size); + _ensureFunctionsLoaded(); + final int Function(rpc_port_parcel_h, int)? func = _rpcPortParcelReserve; + if (func == null) { + throw UnsupportedError( + 'The reserve method is not supported on this version of Tizen.', + ); + } + final int ret = func(_handle, size); if (ret != 0) { throw PlatformException( code: ret.toString(), @@ -552,39 +590,75 @@ class Parcel { } } -final DynamicLibrary _libRpcPort = DynamicLibrary.open('librpc-port.so.1'); +DynamicLibrary? _libRpcPort; +bool _libRpcPortLoaded = false; + +DynamicLibrary? _getLibRpcPort() { + if (!_libRpcPortLoaded) { + try { + _libRpcPort = DynamicLibrary.open('librpc-port.so.1'); + } catch (_) { + _libRpcPort = null; + } + _libRpcPortLoaded = true; + } + return _libRpcPort; +} + +int Function(rpc_port_parcel_h, Pointer)? _rpcPortParcelGetReader; +int Function(rpc_port_parcel_h, int)? _rpcPortParcelSetReader; +int Function(rpc_port_parcel_h, Pointer)? _rpcPortParcelGetDataSize; +int Function(rpc_port_parcel_h, int)? _rpcPortParcelSetDataSize; +int Function(rpc_port_parcel_h, int)? _rpcPortParcelReserve; -final int Function(rpc_port_parcel_h, Pointer) _rpcPortParcelGetReader = - _libRpcPort +bool _functionsLoaded = false; + +void _ensureFunctionsLoaded() { + if (_functionsLoaded) { + return; + } + _functionsLoaded = true; + final DynamicLibrary? lib = _getLibRpcPort(); + if (lib == null) { + return; + } + try { + _rpcPortParcelGetReader = lib .lookup< - NativeFunction)>>( + NativeFunction< + Int32 Function(rpc_port_parcel_h, Pointer)>>( '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 + } catch (_) {} + try { + _rpcPortParcelSetReader = lib + .lookup>( + 'rpc_port_parcel_set_reader', + ) + .asFunction(); + } catch (_) {} + try { + _rpcPortParcelGetDataSize = lib .lookup< - NativeFunction)>>( + NativeFunction< + Int32 Function(rpc_port_parcel_h, Pointer)>>( 'rpc_port_parcel_get_data_size', ) .asFunction(); - -final int Function(rpc_port_parcel_h, int) _rpcPortParcelSetDataSize = - _libRpcPort + } catch (_) {} + try { + _rpcPortParcelSetDataSize = lib .lookup>( 'rpc_port_parcel_set_data_size', ) .asFunction(); - -final int Function(rpc_port_parcel_h, int) _rpcPortParcelReserve = _libRpcPort - .lookup>( - 'rpc_port_parcel_reserve', - ) - .asFunction(); + } catch (_) {} + try { + _rpcPortParcelReserve = lib + .lookup>( + 'rpc_port_parcel_reserve', + ) + .asFunction(); + } catch (_) {} +} diff --git a/packages/tizen_rpc_port/pubspec.yaml b/packages/tizen_rpc_port/pubspec.yaml index 3d2e9905d..f5f031d8f 100644 --- a/packages/tizen_rpc_port/pubspec.yaml +++ b/packages/tizen_rpc_port/pubspec.yaml @@ -2,7 +2,7 @@ name: tizen_rpc_port description: Tizen RPC Port APIs. Used to make remote procedure calls between Tizen apps. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/tizen_rpc_port -version: 0.1.6 +version: 0.1.7 environment: sdk: ">=3.1.0 <4.0.0" From 6d031d4fcbca7700c84b584585a8535b2611354e Mon Sep 17 00:00:00 2001 From: "jh9216.park" Date: Tue, 21 Jul 2026 08:24:20 +0900 Subject: [PATCH 5/5] [tizen_rpc_port] Correct formatting of FFI lookups Run dart format to fix formatting violations in parcel.dart. This re-wraps the FFI lookup lines in _ensureFunctionsLoaded. Co-Authored-By: Gemini CLI Signed-off-by: jh9216.park --- packages/tizen_rpc_port/lib/src/parcel.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/tizen_rpc_port/lib/src/parcel.dart b/packages/tizen_rpc_port/lib/src/parcel.dart index abfb7f8ab..7c73cf864 100644 --- a/packages/tizen_rpc_port/lib/src/parcel.dart +++ b/packages/tizen_rpc_port/lib/src/parcel.dart @@ -625,8 +625,7 @@ void _ensureFunctionsLoaded() { try { _rpcPortParcelGetReader = lib .lookup< - NativeFunction< - Int32 Function(rpc_port_parcel_h, Pointer)>>( + NativeFunction)>>( 'rpc_port_parcel_get_reader', ) .asFunction(); @@ -641,8 +640,7 @@ void _ensureFunctionsLoaded() { try { _rpcPortParcelGetDataSize = lib .lookup< - NativeFunction< - Int32 Function(rpc_port_parcel_h, Pointer)>>( + NativeFunction)>>( 'rpc_port_parcel_get_data_size', ) .asFunction();