| Index: pkg/fletchc/lib/src/driver/developer.dart
|
| diff --git a/pkg/fletchc/lib/src/driver/developer.dart b/pkg/fletchc/lib/src/driver/developer.dart
|
| index 572547bdf0657ec44f57c52e2bd798ff4560d21e..50b2d5e7e63a743bf2f5a7b92ed7b3bfd15aa9ec 100644
|
| --- a/pkg/fletchc/lib/src/driver/developer.dart
|
| +++ b/pkg/fletchc/lib/src/driver/developer.dart
|
| @@ -32,6 +32,11 @@ import 'package:fletch_agent/messages.dart' show
|
| AGENT_DEFAULT_PORT,
|
| MessageDecodeException;
|
|
|
| +import 'package:mdns/mdns.dart' show
|
| + MDnsClient,
|
| + ResourceRecord,
|
| + RRType;
|
| +
|
| import '../../commands.dart' show
|
| CommandCode,
|
| HandShakeResult,
|
| @@ -334,8 +339,10 @@ Future<Settings> createSettings(
|
| Future<Address> readAddressFromUser(
|
| CommandSender commandSender,
|
| StreamIterator<Command> commandIterator) async {
|
| + String message =
|
| + "Please enter IP address of remote device (press enter for discovery): ";
|
| commandSender.sendEventLoopStarted();
|
| - commandSender.sendStdout("Please enter IP address of remote device: ");
|
| + commandSender.sendStdout(message);
|
| while (await commandIterator.moveNext()) {
|
| Command command = commandIterator.current;
|
| switch (command.code) {
|
| @@ -350,7 +357,13 @@ Future<Address> readAddressFromUser(
|
| // session because we use canonical input processing (Unix line
|
| // buffering), but it doesn't work in general. So we should fix that.
|
| String line = UTF8.decode(command.data).trim();
|
| - return parseAddress(line, defaultPort: AGENT_DEFAULT_PORT);
|
| + if (line.isEmpty) {
|
| + await discoverDevices();
|
| + commandSender.sendStdout(message);
|
| + } else {
|
| + return parseAddress(line, defaultPort: AGENT_DEFAULT_PORT);
|
| + }
|
| + break;
|
|
|
| case DriverCommand.Signal:
|
| // Send an empty line as the user didn't hit enter.
|
| @@ -750,6 +763,26 @@ Future<int> invokeCombinedTasks(
|
| return task2(commandSender, commandIterator);
|
| }
|
|
|
| +Future discoverDevices() async {
|
| + print('Looking for Fletch capable devices...');
|
| + MDnsClient client = new MDnsClient();
|
| + await client.start();
|
| + String name = '_fletch_agent._tcp.local';
|
| + await for (ResourceRecord ptr in client.lookup(RRType.PTR, name)) {
|
| + String domain = ptr.domainName;
|
| + await for (ResourceRecord srv in client.lookup(RRType.SRV, domain)) {
|
| + String target = srv.target;
|
| + await for (ResourceRecord a in client.lookup(RRType.A, target)) {
|
| + InternetAddress address = a.address;
|
| + if (!address.isLinkLocal) {
|
| + print('Found device $target on address ${address.address}.');
|
| + }
|
| + }
|
| + }
|
| + }
|
| + client.stop();
|
| +}
|
| +
|
| Address parseAddress(String address, {int defaultPort: 0}) {
|
| String host;
|
| int port;
|
|
|