1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_IPC_CLIENT_IMPL_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_IPC_CLIENT_IMPL_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <list> 21*6dbdd20aSAndroid Build Coastguard Worker #include <map> 22*6dbdd20aSAndroid Build Coastguard Worker #include <memory> 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/task_runner.h" 25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_file.h" 26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/unix_socket.h" 27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/ipc/client.h" 28*6dbdd20aSAndroid Build Coastguard Worker #include "src/ipc/buffered_frame_deserializer.h" 29*6dbdd20aSAndroid Build Coastguard Worker 30*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 31*6dbdd20aSAndroid Build Coastguard Worker 32*6dbdd20aSAndroid Build Coastguard Worker namespace protos { 33*6dbdd20aSAndroid Build Coastguard Worker namespace gen { 34*6dbdd20aSAndroid Build Coastguard Worker class IPCFrame_BindServiceReply; 35*6dbdd20aSAndroid Build Coastguard Worker class IPCFrame_InvokeMethodReply; 36*6dbdd20aSAndroid Build Coastguard Worker } // namespace gen 37*6dbdd20aSAndroid Build Coastguard Worker } // namespace protos 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker namespace base { 40*6dbdd20aSAndroid Build Coastguard Worker class TaskRunner; 41*6dbdd20aSAndroid Build Coastguard Worker } // namespace base 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Worker namespace ipc { 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard Worker class ServiceDescriptor; 46*6dbdd20aSAndroid Build Coastguard Worker 47*6dbdd20aSAndroid Build Coastguard Worker class ClientImpl : public Client, public base::UnixSocket::EventListener { 48*6dbdd20aSAndroid Build Coastguard Worker public: 49*6dbdd20aSAndroid Build Coastguard Worker ClientImpl(ConnArgs, base::TaskRunner*); 50*6dbdd20aSAndroid Build Coastguard Worker ~ClientImpl() override; 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker // Client implementation. 53*6dbdd20aSAndroid Build Coastguard Worker void BindService(base::WeakPtr<ServiceProxy>) override; 54*6dbdd20aSAndroid Build Coastguard Worker void UnbindService(ServiceID) override; 55*6dbdd20aSAndroid Build Coastguard Worker base::ScopedFile TakeReceivedFD() override; 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard Worker // base::UnixSocket::EventListener implementation. 58*6dbdd20aSAndroid Build Coastguard Worker void OnConnect(base::UnixSocket*, bool connected) override; 59*6dbdd20aSAndroid Build Coastguard Worker void OnDisconnect(base::UnixSocket*) override; 60*6dbdd20aSAndroid Build Coastguard Worker void OnDataAvailable(base::UnixSocket*) override; 61*6dbdd20aSAndroid Build Coastguard Worker 62*6dbdd20aSAndroid Build Coastguard Worker RequestID BeginInvoke(ServiceID, 63*6dbdd20aSAndroid Build Coastguard Worker const std::string& method_name, 64*6dbdd20aSAndroid Build Coastguard Worker MethodID remote_method_id, 65*6dbdd20aSAndroid Build Coastguard Worker const ProtoMessage& method_args, 66*6dbdd20aSAndroid Build Coastguard Worker bool drop_reply, 67*6dbdd20aSAndroid Build Coastguard Worker base::WeakPtr<ServiceProxy>, 68*6dbdd20aSAndroid Build Coastguard Worker int fd = -1); 69*6dbdd20aSAndroid Build Coastguard Worker GetUnixSocketForTesting()70*6dbdd20aSAndroid Build Coastguard Worker base::UnixSocket* GetUnixSocketForTesting() { return sock_.get(); } 71*6dbdd20aSAndroid Build Coastguard Worker 72*6dbdd20aSAndroid Build Coastguard Worker private: 73*6dbdd20aSAndroid Build Coastguard Worker struct QueuedRequest { 74*6dbdd20aSAndroid Build Coastguard Worker QueuedRequest(); 75*6dbdd20aSAndroid Build Coastguard Worker int type = 0; // From Frame::msg_case(), see wire_protocol.proto. 76*6dbdd20aSAndroid Build Coastguard Worker RequestID request_id = 0; 77*6dbdd20aSAndroid Build Coastguard Worker base::WeakPtr<ServiceProxy> service_proxy; 78*6dbdd20aSAndroid Build Coastguard Worker 79*6dbdd20aSAndroid Build Coastguard Worker // Only for type == kMsgInvokeMethod. 80*6dbdd20aSAndroid Build Coastguard Worker std::string method_name; 81*6dbdd20aSAndroid Build Coastguard Worker }; 82*6dbdd20aSAndroid Build Coastguard Worker 83*6dbdd20aSAndroid Build Coastguard Worker ClientImpl(const ClientImpl&) = delete; 84*6dbdd20aSAndroid Build Coastguard Worker ClientImpl& operator=(const ClientImpl&) = delete; 85*6dbdd20aSAndroid Build Coastguard Worker 86*6dbdd20aSAndroid Build Coastguard Worker void TryConnect(); 87*6dbdd20aSAndroid Build Coastguard Worker bool SendFrame(const Frame&, int fd = -1); 88*6dbdd20aSAndroid Build Coastguard Worker void OnFrameReceived(const Frame&); 89*6dbdd20aSAndroid Build Coastguard Worker void OnBindServiceReply(QueuedRequest, 90*6dbdd20aSAndroid Build Coastguard Worker const protos::gen::IPCFrame_BindServiceReply&); 91*6dbdd20aSAndroid Build Coastguard Worker void OnInvokeMethodReply(QueuedRequest, 92*6dbdd20aSAndroid Build Coastguard Worker const protos::gen::IPCFrame_InvokeMethodReply&); 93*6dbdd20aSAndroid Build Coastguard Worker 94*6dbdd20aSAndroid Build Coastguard Worker bool invoking_method_reply_ = false; 95*6dbdd20aSAndroid Build Coastguard Worker const char* socket_name_ = nullptr; 96*6dbdd20aSAndroid Build Coastguard Worker bool socket_retry_ = false; 97*6dbdd20aSAndroid Build Coastguard Worker uint32_t socket_backoff_ms_ = 0; 98*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<base::UnixSocket> sock_; 99*6dbdd20aSAndroid Build Coastguard Worker base::TaskRunner* const task_runner_; 100*6dbdd20aSAndroid Build Coastguard Worker RequestID last_request_id_ = 0; 101*6dbdd20aSAndroid Build Coastguard Worker BufferedFrameDeserializer frame_deserializer_; 102*6dbdd20aSAndroid Build Coastguard Worker base::ScopedFile received_fd_; 103*6dbdd20aSAndroid Build Coastguard Worker std::map<RequestID, QueuedRequest> queued_requests_; 104*6dbdd20aSAndroid Build Coastguard Worker std::map<ServiceID, base::WeakPtr<ServiceProxy>> service_bindings_; 105*6dbdd20aSAndroid Build Coastguard Worker 106*6dbdd20aSAndroid Build Coastguard Worker // Queue of calls to BindService() that happened before the socket connected. 107*6dbdd20aSAndroid Build Coastguard Worker std::list<base::WeakPtr<ServiceProxy>> queued_bindings_; 108*6dbdd20aSAndroid Build Coastguard Worker 109*6dbdd20aSAndroid Build Coastguard Worker base::WeakPtrFactory<Client> weak_ptr_factory_; // Keep last. 110*6dbdd20aSAndroid Build Coastguard Worker }; 111*6dbdd20aSAndroid Build Coastguard Worker 112*6dbdd20aSAndroid Build Coastguard Worker } // namespace ipc 113*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 114*6dbdd20aSAndroid Build Coastguard Worker 115*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_IPC_CLIENT_IMPL_H_ 116