Skip to content

Commit 72364d3

Browse files
committed
Merge branch 'main' into interface-abstraction
2 parents 0968085 + 0e5c7b9 commit 72364d3

File tree

8 files changed

+70
-17
lines changed

8 files changed

+70
-17
lines changed

packages/sane/example/main.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'dart:typed_data';
55

66
import 'package:logging/logging.dart';
77
import 'package:sane/sane.dart';
8-
import 'package:sane/src/impl/sane_dev.dart';
8+
import 'package:sane/src/impl/sane_mock.dart';
99
import 'package:sane/src/impl/sane_native.dart';
1010

1111
void main(List<String> args) async {
@@ -79,4 +79,6 @@ void main(List<String> args) async {
7979
);
8080
final rawPixelData = mergeUint8Lists(rawPixelDataList);
8181
file.writeAsBytesSync(rawPixelData, mode: FileMode.append);
82+
83+
await sane.dispose();
8284
}

packages/sane/lib/src/extensions.dart

+14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:meta/meta.dart';
2+
import 'package:logging/logging.dart';
23
import 'package:sane/src/bindings.g.dart';
34
import 'package:sane/src/exceptions.dart';
45

@@ -12,3 +13,16 @@ extension SaneStatusExtension on SANE_Status {
1213
}
1314
}
1415
}
16+
17+
@internal
18+
extension LoggerExtension on Logger {
19+
void redirect(LogRecord record) {
20+
log(
21+
record.level,
22+
record.message,
23+
record.error,
24+
record.stackTrace,
25+
record.zone,
26+
);
27+
}
28+
}

packages/sane/lib/src/impl/sane_dev.dart renamed to packages/sane/lib/src/impl/sane_mock.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'dart:typed_data';
44
import 'package:logging/logging.dart';
55
import 'package:sane/sane.dart';
66

7-
final _logger = Logger('sane.dev');
7+
final _logger = Logger('sane.mock');
88

99
class MockSane implements Sane {
1010
@override

packages/sane/lib/src/impl/sane_native.dart

+8-6
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,19 @@ class NativeSane implements Sane {
8181
Future<void> dispose({bool force = false}) async {
8282
final isolate = _isolate;
8383

84-
if (force) {
85-
isolate?.kill();
86-
return;
87-
}
88-
8984
if (_disposed) return;
9085

9186
_disposed = true;
9287
_instance = null;
9388

94-
await isolate?.sendMessage(ExitMessage());
89+
if (isolate == null) return;
90+
91+
if (force) {
92+
isolate.killImmediately();
93+
} else {
94+
await isolate.sendMessage(ExitMessage());
95+
isolate.kill();
96+
}
9597

9698
_isolate = null;
9799
}

packages/sane/lib/src/isolate.dart

+27-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import 'dart:async';
22
import 'dart:isolate';
33

4+
import 'package:logging/logging.dart';
5+
import 'package:meta/meta.dart';
46
import 'package:sane/src/exceptions.dart';
7+
import 'package:sane/src/extensions.dart';
58
import 'package:sane/src/isolate_messages/exception.dart';
69
import 'package:sane/src/isolate_messages/interface.dart';
710
import 'package:sane/src/sane.dart';
811

12+
final _logger = Logger('sane.isolate');
13+
14+
@internal
915
class SaneIsolate {
1016
SaneIsolate._(
1117
this._isolate,
@@ -36,14 +42,28 @@ class SaneIsolate {
3642
onExit: exitReceivePort.sendPort,
3743
);
3844

39-
final sendPort = await receivePort.first as SendPort;
45+
final sendPortCompleter = Completer<SendPort>();
46+
receivePort.listen((message) {
47+
switch (message) {
48+
case SendPort():
49+
sendPortCompleter.complete(message);
50+
case LogRecord():
51+
_logger.redirect(message);
52+
}
53+
});
54+
55+
final sendPort = await sendPortCompleter.future;
4056
return SaneIsolate._(isolate, sendPort, exitReceivePort);
4157
}
4258

43-
void kill() {
59+
void killImmediately() {
4460
_isolate.kill(priority: Isolate.immediate);
4561
}
4662

63+
void kill() {
64+
_isolate.kill(priority: Isolate.beforeNextEvent);
65+
}
66+
4767
Future<T> sendMessage<T extends IsolateResponse>(
4868
IsolateMessage<T> message,
4969
) async {
@@ -75,6 +95,9 @@ typedef _EntryPointArgs = (SendPort sendPort, Sane sane);
7595
void _entryPoint(_EntryPointArgs args) {
7696
final (sendPort, sane) = args;
7797

98+
Logger.root.level = Level.ALL;
99+
Logger.root.onRecord.forEach(sendPort.send);
100+
78101
final receivePort = ReceivePort();
79102
sendPort.send(receivePort.sendPort);
80103

@@ -108,8 +131,10 @@ class _IsolateMessageEnvelope {
108131

109132
late Map<String, SaneDevice> _devices;
110133

134+
@internal
111135
SaneDevice getDevice(String name) => _devices[name]!;
112136

137+
@internal
113138
void setDevices(Iterable<SaneDevice> devices) {
114139
_devices = {
115140
for (final device in devices) device.name: device,
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:sane/src/isolate.dart';
12
import 'package:sane/src/isolate_messages/interface.dart';
23
import 'package:sane/src/sane.dart';
34

@@ -8,14 +9,14 @@ class GetDevicesMessage implements IsolateMessage<GetDevicesResponse> {
89

910
@override
1011
Future<GetDevicesResponse> handle(Sane sane) async {
11-
return GetDevicesResponse(
12-
devices: await sane.getDevices(localOnly: localOnly),
13-
);
12+
final devices = await sane.getDevices(localOnly: localOnly);
13+
setDevices(devices);
14+
return GetDevicesResponse(devices);
1415
}
1516
}
1617

1718
class GetDevicesResponse implements IsolateResponse {
18-
GetDevicesResponse({required this.devices});
19+
GetDevicesResponse(this.devices);
1920

2021
final List<SaneDevice> devices;
2122
}

packages/sane/lib/src/sane.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'dart:typed_data';
33

44
import 'package:meta/meta.dart';
55
import 'package:sane/sane.dart';
6-
import 'package:sane/src/impl/sane_dev.dart';
6+
import 'package:sane/src/impl/sane_mock.dart';
77
import 'package:sane/src/impl/sane_native.dart';
88
import 'package:sane/src/impl/sane_sync.dart';
99

@@ -15,7 +15,7 @@ abstract interface class Sane {
1515
/// See also:
1616
///
1717
/// - [Sane.sync]
18-
factory Sane() => NativeSane();
18+
factory Sane([Sane? backingSane]) => NativeSane(backingSane);
1919

2020
/// Instantiates a new synchronous SANE instance.
2121
factory Sane.sync() => SyncSane();

packages/sane/test/sane_singleton_test.dart

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1+
import 'package:logging/logging.dart';
12
import 'package:sane/sane.dart';
23
import 'package:test/test.dart';
34

45
void main() {
56
late Sane sane;
67

8+
setUp(() {
9+
Logger.root.level = Level.ALL;
10+
Logger.root.onRecord.listen((record) {
11+
// ignore: avoid_print
12+
print('${record.level.name}: ${record.time}: ${record.message}');
13+
});
14+
});
15+
716
test('can instantiate', () {
817
sane = Sane();
918
});
@@ -25,7 +34,7 @@ void main() {
2534
});
2635

2736
test('can reinstiate with new instance', () {
28-
final newSane = Sane();
37+
final newSane = Sane(Sane.mock());
2938
expect(sane, isNot(newSane));
3039
sane = newSane;
3140
});

0 commit comments

Comments
 (0)