Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Unified Diff: pkg/mdns/lib/src/lookup_resolver.dart

Issue 1412063015: Improve resource record implementation in the mdns package. (Closed) Base URL: https://github.com/dart-lang/fletch.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/mdns/lib/src/lookup_resolver.dart
diff --git a/pkg/mdns/lib/src/lookup_resolver.dart b/pkg/mdns/lib/src/lookup_resolver.dart
index 0667a16a4c80ebb9367b9596e0f4736c878b3cdb..2d86a5015a86db92685159aeb466a31cd0d7d471 100644
--- a/pkg/mdns/lib/src/lookup_resolver.dart
+++ b/pkg/mdns/lib/src/lookup_resolver.dart
@@ -10,40 +10,47 @@ import 'dart:collection';
import 'package:mdns/src/packet.dart';
class PendingRequest extends LinkedListEntry {
- final String hostname;
- final Completer completer;
- PendingRequest(this.hostname, this.completer);
+ final int type;
+ final String name;
+ final StreamController controller;
+
+ PendingRequest(this.type, this.name, this.controller);
}
/// Class for keeping track of pending lookups and process incoming
/// query responses.
-///
-/// Currently the responses are no cached.
class LookupResolver {
LinkedList pendingRequests = new LinkedList();
- Future addPendingRequest(String hostname, Duration timeout) {
- var completer = new Completer();
- var request = new PendingRequest(hostname, completer);
+ Stream<ResourceRecord> addPendingRequest(
+ int type,
+ String name,
+ Duration timeout) {
+ StreamController controller = new StreamController();
+ PendingRequest request = new PendingRequest(type, name, controller);
pendingRequests.add(request);
- return completer.future.timeout(timeout, onTimeout: () {
+ Timer timer = new Timer(timeout, () {
request.unlink();
- return null;
+ controller.close();
});
+ return controller.stream;
}
- void handleResponse(List<DecodeResult> response) {
- for (var r in response) {
- var name = r.name.toLowerCase();
+ void handleResponse(List<ResourceRecord> response) {
+ for (ResourceRecord r in response) {
+ int type = r.type;
+ String name = r.name.toLowerCase();
if (name.endsWith('.')) name = name.substring(0, name.length - 1);
- pendingRequests
- .where((pendingRequest) {
- return pendingRequest.hostname.toLowerCase() == name;
- })
- .forEach((pendingRequest) {
- pendingRequest.completer.complete(r.address);
- pendingRequest.unlink();
- });
+
+ bool responseMatches(PendingRequest request) {
+ return request.name.toLowerCase() == name &&
+ request.type == type;
+ }
+
+ pendingRequests.where(responseMatches).forEach((pendingRequest) {
+ if (pendingRequest.controller.isClosed) return;
+ pendingRequest.controller.add(r);
+ });
}
}
}

Powered by Google App Engine
This is Rietveld 408576698