OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef IPC_IPC_MESSAGE_PIPE_READER_H_ | |
6 #define IPC_IPC_MESSAGE_PIPE_READER_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/memory/scoped_ptr.h" | |
11 #include "mojo/public/c/environment/async_waiter.h" | |
12 #include "mojo/public/cpp/system/core.h" | |
13 | |
14 namespace IPC { | |
15 namespace internal { | |
16 | |
17 // A helper class to handle bytestream directly over mojo::MessagePipe | |
18 // in template-method pattern. MessagePipeReader manages the lifetime | |
19 // of given MessagePipe and participates the event loop, and | |
20 // read the stream and call the client when it is ready. | |
21 // | |
22 // Each client has to: | |
23 // | |
24 // * Provide a subclass implemenation of a specific use of a MessagePipe | |
25 // and implement callbacks. | |
26 // * SetPipe() to activate the reader. | |
27 // | |
28 // MessageReader has to be used in IO thread. It isn't thread-safe. | |
29 // | |
30 class MessagePipeReader { | |
31 public: | |
32 // Delay the object deletion using the current message loop. | |
33 // This is intended to used by MessagePipeReader owners. | |
34 class DelayedDeleter { | |
35 public: | |
36 typedef base::DefaultDeleter<MessagePipeReader> DefaultType; | |
37 | |
38 static void DeleteNow(MessagePipeReader* ptr) { delete ptr; } | |
39 | |
40 DelayedDeleter() {} | |
41 DelayedDeleter(const DefaultType&) {} | |
42 DelayedDeleter& operator=(const DefaultType&) { return *this; } | |
43 | |
44 void operator()(MessagePipeReader* ptr) const; | |
45 }; | |
46 | |
47 MessagePipeReader(); | |
48 virtual ~MessagePipeReader(); | |
49 | |
50 MojoHandle handle() const { return pipe_.get().value(); } | |
51 | |
52 // Returns received bytes. | |
53 const std::vector<char>& data_buffer() const { | |
54 return data_buffer_; | |
55 } | |
56 | |
57 // Returns received handles. The lifetime should be taken over by | |
viettrungluu
2014/07/17 15:11:54
If that's the case, maybe you should have a method
Hajime Morrita
2014/07/17 18:32:13
Done.
| |
58 // the client before next OnMessageArrived(). They will leak | |
59 // otherwise. | |
60 const std::vector<MojoHandle>& handle_buffer() const { | |
61 return handle_buffer_; | |
62 } | |
63 | |
64 // The the pipe and participate to current event loop with the pipe. | |
viettrungluu
2014/07/17 15:11:54
I can't make sense of this comment.
Hajime Morrita
2014/07/17 18:32:12
Turned out that this could be part of the construc
| |
65 void SetPipe(mojo::ScopedMessagePipeHandle handle); | |
66 | |
67 // Close and destroy the MessagePipe. | |
68 void Close(); | |
69 // Close the mesage pipe with notifying the client with the error. | |
70 void CloseWithError(MojoResult error); | |
71 // Return true if the MessagePipe is alive. | |
72 bool IsValid() { return pipe_.is_valid(); } | |
73 | |
74 // | |
75 // The client have to implment these callback to get the readiness | |
viettrungluu
2014/07/17 15:11:54
Why not just leave these be pure virtual?
Hajime Morrita
2014/07/17 18:32:12
Done.
| |
76 // event from the reader | |
77 // | |
78 virtual void OnMessageArrived() {} | |
viettrungluu
2014/07/17 15:11:54
May "received" is a better name than "arrived"?
Hajime Morrita
2014/07/17 18:32:12
Done.
| |
79 virtual void OnPipeClosed() {} | |
80 virtual void OnPipeError(MojoResult error) {} | |
81 | |
82 protected: | |
viettrungluu
2014/07/17 15:11:54
Why do you need protected members (which are frown
Hajime Morrita
2014/07/17 18:32:12
My bad :-( Fixed.
| |
83 std::vector<char> data_buffer_; | |
viettrungluu
2014/07/17 15:11:54
nit: extra space
Hajime Morrita
2014/07/17 18:32:13
Done.
| |
84 std::vector<MojoHandle> handle_buffer_; | |
85 | |
86 private: | |
87 static void InvokePipeIsReady(void* closure, MojoResult result); | |
88 | |
89 MojoResult ReadMessageBytes(); | |
90 void PipeIsReady(MojoResult wait_result); | |
91 void StartWaiting(); | |
92 void StopWaiting(); | |
93 | |
94 MojoAsyncWaitID pipe_wait_id_; | |
95 mojo::ScopedMessagePipeHandle pipe_; | |
96 }; | |
viettrungluu
2014/07/17 15:11:54
DISALLOW_COPY_AND_ASSIGN
Hajime Morrita
2014/07/17 18:32:12
Done.
| |
97 | |
98 } // namespace internal | |
99 } // namespace IPC | |
100 | |
101 #endif // IPC_IPC_MESSAGE_PIPE_READER_H_ | |
OLD | NEW |