summaryrefslogtreecommitdiffstats
path: root/mojo/public/dart/src/client.dart
blob: f8ec73c00fcac32b75f151f63030b1c352669bbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2014 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.

part of bindings;

abstract class Client extends core.MojoEventStreamListener {
  Map<int, Completer> _completerMap;
  int _nextId = 0;

  Client(core.MojoMessagePipeEndpoint endpoint) :
      _completerMap = {},
      super(endpoint);

  Client.fromHandle(core.MojoHandle handle) :
      _completerMap = {},
      super.fromHandle(handle);

  Client.unbound() :
      _completerMap = {},
      super.unbound();

  void handleResponse(ServiceMessage reader);

  void handleRead() {
    // Query how many bytes are available.
    var result = endpoint.query();
    assert(result.status.isOk || result.status.isResourceExhausted);

    // Read the data.
    var bytes = new ByteData(result.bytesRead);
    var handles = new List<core.MojoHandle>(result.handlesRead);
    result = endpoint.read(bytes, result.bytesRead, handles);
    assert(result.status.isOk || result.status.isResourceExhausted);
    var message = new ServiceMessage.fromMessage(new Message(bytes, handles));
    handleResponse(message);
  }

  void handleWrite() {
    throw 'Unexpected write signal in client.';
  }

  void sendMessage(Struct message, int name) {
    if (!isOpen) {
      listen();
    }
    var header = new MessageHeader(name);
    var serviceMessage = message.serializeWithHeader(header);
    endpoint.write(serviceMessage.buffer,
                    serviceMessage.buffer.lengthInBytes,
                    serviceMessage.handles);
    if (!endpoint.status.isOk) {
      throw "message pipe write failed";
    }
  }

  Future sendMessageWithRequestId(
      Struct message, int name, int id, int flags) {
    if (!isOpen) {
      listen();
    }
    if (id == -1) {
      id = _nextId++;
    }

    var header = new MessageHeader.withRequestId(name, flags, id);
    var serviceMessage = message.serializeWithHeader(header);
    endpoint.write(serviceMessage.buffer,
                    serviceMessage.buffer.lengthInBytes,
                    serviceMessage.handles);
    if (!endpoint.status.isOk) {
      throw "message pipe write failed";
    }

    var completer = new Completer();
    _completerMap[id] = completer;
    return completer.future;
  }

  // Need a getter for this for access in subclasses.
  Map<int, Completer> get completerMap => _completerMap;
}