OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE.md file. | |
4 | |
5 #include <assert.h> | |
6 #include <stdio.h> | |
7 #include <stdlib.h> | |
8 #include <string.h> | |
9 | |
10 #include "include/dart_api.h" | |
11 #include "include/dart_native_api.h" | |
12 | |
13 #include "mdns_extension.h" | |
14 | |
15 // Handle request send on the service port. | |
16 void HandleRequest(Dart_Port port_id, Dart_CObject* message) { | |
17 // Messages are expected to be three item lists: | |
18 // [0]: reply port | |
19 // [1]: request type | |
20 // [2]: request argument | |
21 if (message->type == Dart_CObject_kArray && | |
22 message->value.as_array.length == 3) { | |
23 Dart_CObject* reply_port = message->value.as_array.values[0]; | |
24 Dart_CObject* request_type = message->value.as_array.values[1]; | |
25 Dart_CObject* argument = message->value.as_array.values[2]; | |
26 if (reply_port->type == Dart_CObject_kSendPort) { | |
27 if (request_type->type == Dart_CObject_kInt32) { | |
28 switch (request_type->value.as_int32) { | |
29 case kEchoRequest: | |
30 HandleEcho(reply_port->value.as_send_port.id, argument); | |
31 return; | |
32 | |
33 case kLookupRequest: | |
34 HandleLookup(reply_port->value.as_send_port.id, | |
35 argument->value.as_string); | |
36 return; | |
37 | |
38 default: | |
39 break; | |
40 // Ignore invalid requests. | |
41 } | |
42 } | |
43 Dart_CObject result; | |
44 result.type = Dart_CObject_kNull; | |
45 Dart_PostCObject(reply_port->value.as_send_port.id, &result); | |
46 } | |
47 } | |
48 } | |
49 | |
50 // Handler for the echo request. Used for testing that the native extension | |
51 // can be loaded and called. | |
52 void HandleEcho(Dart_Port reply_port, Dart_CObject* argument) { | |
53 Dart_PostCObject(reply_port, argument); | |
54 } | |
55 | |
56 | |
57 Dart_Handle HandleError(Dart_Handle handle) { | |
58 if (Dart_IsError(handle)) Dart_PropagateError(handle); | |
59 return handle; | |
60 } | |
61 | |
62 | |
63 // Initialize a native port with a request handler. | |
64 void ServicePort(Dart_NativeArguments arguments) { | |
65 Dart_SetReturnValue(arguments, Dart_Null()); | |
66 Dart_Port service_port = | |
67 Dart_NewNativePort("MDnsService", HandleRequest, true); | |
68 if (service_port != ILLEGAL_PORT) { | |
69 Dart_Handle send_port = Dart_NewSendPort(service_port); | |
70 Dart_SetReturnValue(arguments, send_port); | |
71 } | |
72 } | |
73 | |
74 | |
75 // Resolver for the extension library. | |
76 Dart_NativeFunction ResolveName(Dart_Handle name, | |
77 int argc, | |
78 bool* auto_setup_scope) { | |
79 const char* c_name; | |
80 Dart_Handle check_error; | |
81 | |
82 check_error = Dart_StringToCString(name, &c_name); | |
83 if (Dart_IsError(check_error)) { | |
84 Dart_PropagateError(check_error); | |
85 } | |
86 if ((strcmp("MDnsExtension_ServicePort", c_name) == 0) && (argc == 0)) { | |
87 return ServicePort; | |
88 } | |
89 return NULL; | |
90 } | |
91 | |
92 | |
93 // Entry point for the extension library. | |
94 DART_EXPORT Dart_Handle mdns_extension_lib_Init(Dart_Handle parent_library) { | |
95 Dart_Handle result_code; | |
96 if (Dart_IsError(parent_library)) { | |
97 return parent_library; | |
98 } | |
99 | |
100 result_code = Dart_SetNativeResolver(parent_library, ResolveName, NULL); | |
101 if (Dart_IsError(result_code)) { | |
102 return result_code; | |
103 } | |
104 | |
105 return parent_library; | |
106 } | |
OLD | NEW |