OLD | NEW |
---|---|
1 // Copyright (c) 2015, the Fletch project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Fletch project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
5 library fletchc.driver.developer; | 5 library fletchc.driver.developer; |
6 | 6 |
7 import 'dart:async' show | 7 import 'dart:async' show |
8 Future, | 8 Future, |
9 Timer; | 9 Timer; |
10 | 10 |
(...skipping 14 matching lines...) Expand all Loading... | |
25 | 25 |
26 import 'package:fletch_agent/agent_connection.dart' show | 26 import 'package:fletch_agent/agent_connection.dart' show |
27 AgentConnection, | 27 AgentConnection, |
28 AgentException, | 28 AgentException, |
29 VmData; | 29 VmData; |
30 | 30 |
31 import 'package:fletch_agent/messages.dart' show | 31 import 'package:fletch_agent/messages.dart' show |
32 AGENT_DEFAULT_PORT, | 32 AGENT_DEFAULT_PORT, |
33 MessageDecodeException; | 33 MessageDecodeException; |
34 | 34 |
35 import 'package:mdns/mdns.dart' show | |
36 MDnsClient, | |
37 ResourceRecord, | |
38 RRType; | |
39 | |
35 import '../../commands.dart' show | 40 import '../../commands.dart' show |
36 CommandCode, | 41 CommandCode, |
37 HandShakeResult, | 42 HandShakeResult, |
38 ProcessBacktrace, | 43 ProcessBacktrace, |
39 ProcessBacktraceRequest, | 44 ProcessBacktraceRequest, |
40 ProcessRun, | 45 ProcessRun, |
41 ProcessSpawnForMain, | 46 ProcessSpawnForMain, |
42 SessionEnd, | 47 SessionEnd, |
43 WriteSnapshotResult; | 48 WriteSnapshotResult; |
44 | 49 |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
327 settings = settings.copyWith(packages: packagesUri, deviceAddress: address); | 332 settings = settings.copyWith(packages: packagesUri, deviceAddress: address); |
328 print("Created settings file '$uri'"); | 333 print("Created settings file '$uri'"); |
329 await new File.fromUri(uri).writeAsString( | 334 await new File.fromUri(uri).writeAsString( |
330 "${const JsonEncoder.withIndent(' ').convert(settings)}\n"); | 335 "${const JsonEncoder.withIndent(' ').convert(settings)}\n"); |
331 return settings; | 336 return settings; |
332 } | 337 } |
333 | 338 |
334 Future<Address> readAddressFromUser( | 339 Future<Address> readAddressFromUser( |
335 CommandSender commandSender, | 340 CommandSender commandSender, |
336 StreamIterator<Command> commandIterator) async { | 341 StreamIterator<Command> commandIterator) async { |
342 String message = | |
343 "Please enter IP address of remote device (press enter for discovery): "; | |
337 commandSender.sendEventLoopStarted(); | 344 commandSender.sendEventLoopStarted(); |
338 commandSender.sendStdout("Please enter IP address of remote device: "); | 345 commandSender.sendStdout(message); |
339 while (await commandIterator.moveNext()) { | 346 while (await commandIterator.moveNext()) { |
340 Command command = commandIterator.current; | 347 Command command = commandIterator.current; |
341 switch (command.code) { | 348 switch (command.code) { |
342 case DriverCommand.Stdin: | 349 case DriverCommand.Stdin: |
343 if (command.data.length == 0) { | 350 if (command.data.length == 0) { |
344 // TODO(ahe): It may be safe to return null here, but we need to | 351 // TODO(ahe): It may be safe to return null here, but we need to |
345 // check how this interacts with the debugger's InputHandler. | 352 // check how this interacts with the debugger's InputHandler. |
346 throwInternalError("Unexpected end of input"); | 353 throwInternalError("Unexpected end of input"); |
347 } | 354 } |
348 // TODO(ahe): This assumes that the user's input arrives as one | 355 // TODO(ahe): This assumes that the user's input arrives as one |
349 // message. It is relatively safe to assume this for a normal terminal | 356 // message. It is relatively safe to assume this for a normal terminal |
350 // session because we use canonical input processing (Unix line | 357 // session because we use canonical input processing (Unix line |
351 // buffering), but it doesn't work in general. So we should fix that. | 358 // buffering), but it doesn't work in general. So we should fix that. |
352 String line = UTF8.decode(command.data).trim(); | 359 String line = UTF8.decode(command.data).trim(); |
353 return parseAddress(line, defaultPort: AGENT_DEFAULT_PORT); | 360 if (line.isEmpty) { |
wibling
2015/11/10 12:46:34
NIT: Perhaps trim the line to deal with a space be
Søren Gjesse
2015/11/10 15:55:11
It is already trimmed above.
| |
361 await discoverDevices(); | |
362 commandSender.sendStdout(message); | |
363 } else { | |
364 return parseAddress(line, defaultPort: AGENT_DEFAULT_PORT); | |
365 } | |
366 break; | |
354 | 367 |
355 case DriverCommand.Signal: | 368 case DriverCommand.Signal: |
356 // Send an empty line as the user didn't hit enter. | 369 // Send an empty line as the user didn't hit enter. |
357 commandSender.sendStdout("\n"); | 370 commandSender.sendStdout("\n"); |
358 // Assume user aborted data entry. | 371 // Assume user aborted data entry. |
359 return null; | 372 return null; |
360 | 373 |
361 default: | 374 default: |
362 throwInternalError("Unexpected ${command.code}"); | 375 throwInternalError("Unexpected ${command.code}"); |
363 return null; | 376 return null; |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
743 | 756 |
744 Future<int> invokeCombinedTasks( | 757 Future<int> invokeCombinedTasks( |
745 CommandSender commandSender, | 758 CommandSender commandSender, |
746 StreamIterator<Command> commandIterator, | 759 StreamIterator<Command> commandIterator, |
747 SharedTask task1, | 760 SharedTask task1, |
748 SharedTask task2) async { | 761 SharedTask task2) async { |
749 await task1(commandSender, commandIterator); | 762 await task1(commandSender, commandIterator); |
750 return task2(commandSender, commandIterator); | 763 return task2(commandSender, commandIterator); |
751 } | 764 } |
752 | 765 |
766 Future discoverDevices() async { | |
767 print('Looking for Fletch capable devices...'); | |
768 MDnsClient client = new MDnsClient(); | |
769 await client.start(); | |
770 String name = '_fletch_agent._tcp.local'; | |
771 await for (ResourceRecord ptr in client.lookup(RRType.PTR, name)) { | |
772 String domain = ptr.domainName; | |
773 await for (ResourceRecord srv in client.lookup(RRType.SRV, domain)) { | |
774 String target = srv.target; | |
775 await for (ResourceRecord a in client.lookup(RRType.A, target)) { | |
776 InternetAddress address = a.address; | |
777 if (!address.isLinkLocal) { | |
778 print('Found device $target on address ${address.address}.'); | |
779 } | |
780 } | |
781 } | |
782 } | |
783 client.stop(); | |
784 } | |
785 | |
753 Address parseAddress(String address, {int defaultPort: 0}) { | 786 Address parseAddress(String address, {int defaultPort: 0}) { |
754 String host; | 787 String host; |
755 int port; | 788 int port; |
756 List<String> parts = address.split(":"); | 789 List<String> parts = address.split(":"); |
757 if (parts.length == 1) { | 790 if (parts.length == 1) { |
758 host = InternetAddress.LOOPBACK_IP_V4.address; | 791 host = InternetAddress.LOOPBACK_IP_V4.address; |
759 port = int.parse( | 792 port = int.parse( |
760 parts[0], | 793 parts[0], |
761 onError: (String source) { | 794 onError: (String source) { |
762 host = source; | 795 host = source; |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
967 "packages": packages == null ? null : "$packages", | 1000 "packages": packages == null ? null : "$packages", |
968 "options": options, | 1001 "options": options, |
969 "constants": constants, | 1002 "constants": constants, |
970 "device_address": deviceAddress, | 1003 "device_address": deviceAddress, |
971 "device_type": (deviceType == null) | 1004 "device_type": (deviceType == null) |
972 ? null | 1005 ? null |
973 : unParseDeviceType(deviceType), | 1006 : unParseDeviceType(deviceType), |
974 }; | 1007 }; |
975 } | 1008 } |
976 } | 1009 } |
OLD | NEW |