1// Copyright (c) 2013, the Dart 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 file.
4
5#if defined(DART_IO_SECURE_SOCKET_DISABLED)
6
7#include "bin/io_service_no_ssl.h"
8
9#include "bin/dartutils.h"
10#include "bin/directory.h"
11#include "bin/file.h"
12#include "bin/io_buffer.h"
13#include "bin/socket.h"
14#include "bin/utils.h"
15
16#include "include/dart_api.h"
17
18#include "platform/globals.h"
19#include "platform/utils.h"
20
21namespace dart {
22namespace bin {
23
24#define CASE_REQUEST(type, method, id) \
25 case IOService::k##type##method##Request: \
26 response = type::method##Request(data); \
27 break;
28
29void IOServiceCallback(Dart_Port dest_port_id, Dart_CObject* message) {
30 Dart_Port reply_port_id = ILLEGAL_PORT;
31 CObject* response = CObject::IllegalArgumentError();
32 CObjectArray request(message);
33 if ((message->type == Dart_CObject_kArray) && (request.Length() == 4) &&
34 request[0]->IsInt32() && request[1]->IsSendPort() &&
35 request[2]->IsInt32() && request[3]->IsArray()) {
36 CObjectInt32 message_id(request[0]);
37 CObjectSendPort reply_port(request[1]);
38 CObjectInt32 request_id(request[2]);
39 CObjectArray data(request[3]);
40 reply_port_id = reply_port.Value();
41 switch (request_id.Value()) {
42 IO_SERVICE_REQUEST_LIST(CASE_REQUEST);
43 default:
44 UNREACHABLE();
45 }
46 }
47
48 CObjectArray result(CObject::NewArray(2));
49 result.SetAt(0, request[0]);
50 result.SetAt(1, response);
51 ASSERT(reply_port_id != ILLEGAL_PORT);
52 Dart_PostCObject(reply_port_id, result.AsApiCObject());
53}
54
55Dart_Port IOService::GetServicePort() {
56 return Dart_NewNativePort("IOService", IOServiceCallback, true);
57}
58
59void FUNCTION_NAME(IOService_NewServicePort)(Dart_NativeArguments args) {
60 Dart_SetReturnValue(args, Dart_Null());
61 Dart_Port service_port = IOService::GetServicePort();
62 if (service_port != ILLEGAL_PORT) {
63 // Return a send port for the service port.
64 Dart_Handle send_port = Dart_NewSendPort(service_port);
65 Dart_SetReturnValue(args, send_port);
66 }
67}
68
69} // namespace bin
70} // namespace dart
71
72#endif // defined(DART_IO_SECURE_SOCKET_DISABLED)
73