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

Side by Side Diff: pkg/mdns/lib/src/native_extension_client.dart

Issue 1412063015: Improve resource record implementation in the mdns package. (Closed) Base URL: https://github.com/dart-lang/fletch.git@master
Patch Set: Fix typo. 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 unified diff | Download patch
OLDNEW
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 mdns.src.native_extension_client; 5 library mdns.src.native_extension_client;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:io'; 8 import 'dart:io';
9 import 'dart:isolate'; 9 import 'dart:isolate';
10 10
11 import 'package:mdns/mdns.dart'; 11 import 'package:mdns/mdns.dart';
12 import 'package:mdns/src/lookup_resolver.dart'; 12 import 'package:mdns/src/lookup_resolver.dart';
13 import 'package:mdns/src/native_extension_api.dart' 13 import 'package:mdns/src/native_extension_api.dart'
14 deferred as native_extension_api; 14 deferred as native_extension_api;
15 import 'package:mdns/src/packet.dart'; 15 import 'package:mdns/src/packet.dart';
16 import 'package:mdns/src/constants.dart';
16 17
17 // Requests Ids. This should be aligned with the C code. 18 // Requests Ids. This should be aligned with the C code.
18 enum RequestType { 19 enum RequestType {
19 echoRequest, // 0 20 echoRequest, // 0
20 lookupRequest, // 1 21 lookupRequest, // 1
21 } 22 }
22 23
23 // Implementation of mDNS client using a native extension. 24 // Implementation of mDNS client using a native extension.
24 class NativeExtensionMDnsClient implements MDnsClient { 25 class NativeExtensionMDnsClient implements MDnsClient {
25 bool _starting = false; 26 bool _starting = false;
(...skipping 22 matching lines...) Expand all
48 if (!_started) return; 49 if (!_started) return;
49 if (_starting) { 50 if (_starting) {
50 throw new StateError('Cannot stop mDNS client wile it is starting'); 51 throw new StateError('Cannot stop mDNS client wile it is starting');
51 } 52 }
52 53
53 _incoming.close(); 54 _incoming.close();
54 55
55 _started = false; 56 _started = false;
56 } 57 }
57 58
58 Future<InternetAddress> lookup( 59 Future<InternetAddress> lookup(
Søren Gjesse 2015/11/06 08:44:48 This should be a Stream of ResourceRecord now.
karlklose 2015/11/06 12:20:00 Done.
59 String hostname, {Duration timeout: const Duration(seconds: 5)}) { 60 int type,
61 String name,
62 {Duration timeout: const Duration(seconds: 5)}) {
60 if (!_started) { 63 if (!_started) {
61 throw new StateError('mDNS client is not started'); 64 throw new StateError('mDNS client is not started');
62 } 65 }
63 66
67 if (type != RRType.A) {
68 // TODO(karlklose): add support.
69 throw 'RR type $type not supported.';
70 }
71
64 // Add the pending request before sending the query. 72 // Add the pending request before sending the query.
65 var future = _resolver.addPendingRequest(hostname, timeout); 73 var future = _resolver.addPendingRequest(type, name, timeout);
66 74
67 // Send the request. 75 // Send the request.
68 _service.send([_incoming.sendPort, 76 _service.send([_incoming.sendPort,
69 RequestType.lookupRequest.index, 77 RequestType.lookupRequest.index,
70 hostname]); 78 name]);
71 79
72 return future; 80 return future;
73 } 81 }
74 82
75 // Process incoming responses. 83 // Process incoming responses.
76 _handleIncoming(response) { 84 _handleIncoming(response) {
77 // Right not the only response we can get is the response to a 85 // Right now the only response we can get is the response to a
78 // lookupRequest where the response looks like this: 86 // lookupRequest where the response looks like this:
79 // 87 //
80 // response[0]: hostname (String) 88 // response[0]: hostname (String)
81 // response[1]: IPv4 address (Uint8List) 89 // response[1]: IPv4 address (Uint8List)
82 if (response is List && response.length == 2) { 90 if (response is List && response.length == 2) {
83 if (response[0] is String && 91 if (response[0] is String &&
84 response[1] is List && response[1].length == 4) { 92 response[1] is List && response[1].length == 4) {
85 response = new DecodeResult(response[0], 93 response = new ResourceRecord(
86 new InternetAddress(response[1].join('.'))); 94 RRType.A,
95 response[0],
96 response[1].codeUnits,
97 new DateTime.now().millisecondsSinceEpoch + 2000);
87 _resolver.handleResponse([response]); 98 _resolver.handleResponse([response]);
88 } else { 99 } else {
89 // TODO(sgjesse): Improve the error handling. 100 // TODO(sgjesse): Improve the error handling.
90 print('mDNS Response not understood'); 101 print('mDNS Response not understood');
91 } 102 }
92 } 103 }
93 } 104 }
94 } 105 }
95 106
96 Future nativeExtensionEchoTest(dynamic message) async { 107 Future nativeExtensionEchoTest(dynamic message) async {
97 await native_extension_api.loadLibrary(); 108 await native_extension_api.loadLibrary();
98 SendPort service = native_extension_api.servicePort(); 109 SendPort service = native_extension_api.servicePort();
99 ReceivePort port = new ReceivePort(); 110 ReceivePort port = new ReceivePort();
100 try { 111 try {
101 service.send([port.sendPort, RequestType.echoRequest.index, message]); 112 service.send([port.sendPort, RequestType.echoRequest.index, message]);
102 return await port.first; 113 return await port.first;
103 } finally { 114 } finally {
104 port.close(); 115 port.close();
105 } 116 }
106 } 117 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698