mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
53 lines
1.4 KiB
Dart
53 lines
1.4 KiB
Dart
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'dart:async';
|
|
|
|
import 'device.dart';
|
|
|
|
/// Discover service protocol ports on devices.
|
|
class ServiceProtocolDiscovery {
|
|
/// [logReader] A [DeviceLogReader] to look for Observatory messages in.
|
|
ServiceProtocolDiscovery(DeviceLogReader logReader)
|
|
: _logReader = logReader {
|
|
assert(_logReader != null);
|
|
if (!_logReader.isReading)
|
|
_logReader.start();
|
|
|
|
_logReader.lines.listen(_onLine);
|
|
}
|
|
|
|
final DeviceLogReader _logReader;
|
|
Completer _completer = new Completer();
|
|
|
|
/// The [Future] returned by this function will complete when the next
|
|
/// service protocol port is found.
|
|
Future<int> nextPort() {
|
|
return _completer.future;
|
|
}
|
|
|
|
void _onLine(String line) {
|
|
int portNumber = 0;
|
|
if (line.startsWith('Observatory listening on http://')) {
|
|
try {
|
|
RegExp portExp = new RegExp(r"\d+.\d+.\d+.\d+:(\d+)");
|
|
var port = portExp.firstMatch(line).group(1);
|
|
portNumber = int.parse(port);
|
|
} catch (_) {
|
|
// Ignore errors.
|
|
}
|
|
}
|
|
if (portNumber != 0) {
|
|
_located(portNumber);
|
|
}
|
|
}
|
|
|
|
void _located(int port) {
|
|
assert(_completer != null);
|
|
assert(!_completer.isCompleted);
|
|
_completer.complete(port);
|
|
_completer = new Completer();
|
|
}
|
|
}
|