aboutsummaryrefslogtreecommitdiff
path: root/include/perfetto/ipc/service_proxy.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/perfetto/ipc/service_proxy.h')
-rw-r--r--include/perfetto/ipc/service_proxy.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/include/perfetto/ipc/service_proxy.h b/include/perfetto/ipc/service_proxy.h
new file mode 100644
index 000000000..a0107dae9
--- /dev/null
+++ b/include/perfetto/ipc/service_proxy.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INCLUDE_PERFETTO_IPC_SERVICE_PROXY_H_
+#define INCLUDE_PERFETTO_IPC_SERVICE_PROXY_H_
+
+#include "perfetto/ipc/basic_types.h"
+
+#include <assert.h>
+
+#include <functional>
+#include <map>
+#include <memory>
+#include <string>
+
+#include "perfetto/base/weak_ptr.h"
+#include "perfetto/ipc/deferred.h"
+
+namespace perfetto {
+namespace ipc {
+
+class Client;
+class ServiceDescriptor;
+
+// The base class for the client-side autogenerated stubs that forward method
+// invocations to the host. All the methods of this class are meant to be called
+// only by the autogenerated code.
+class ServiceProxy {
+ public:
+ class EventListener {
+ public:
+ virtual ~EventListener();
+
+ // Called once after Client::BindService() if the ServiceProxy has been
+ // successfully bound to the host. It is possible to start sending IPC
+ // requests soon after this.
+ virtual void OnConnect() {}
+
+ // Called if the connection fails to be established or drops after having
+ // been established.
+ virtual void OnDisconnect() {}
+ };
+
+ // Guarantees that no callback will happen after this object has been
+ // destroyed. The caller has to guarantee that the |event_listener| stays
+ // alive at least as long as the ServiceProxy instance.
+ explicit ServiceProxy(EventListener*);
+ virtual ~ServiceProxy();
+
+ void InitializeBinding(base::WeakPtr<Client>,
+ ServiceID,
+ std::map<std::string, MethodID>);
+
+ // Called by the IPC methods in the autogenerated classes.
+ void BeginInvoke(const std::string& method_name,
+ const ProtoMessage& request,
+ DeferredBase reply,
+ int fd = -1);
+
+ // Called by ClientImpl.
+ // |reply_args| == nullptr means request failure.
+ void EndInvoke(RequestID,
+ std::unique_ptr<ProtoMessage> reply_arg,
+ bool has_more);
+
+ // Called by ClientImpl.
+ void OnConnect(bool success);
+ void OnDisconnect();
+ bool connected() const { return service_id_ != 0; }
+
+ base::WeakPtr<ServiceProxy> GetWeakPtr() const;
+
+ // Implemented by the autogenerated class.
+ virtual const ServiceDescriptor& GetDescriptor() = 0;
+
+ private:
+ base::WeakPtr<Client> client_;
+ ServiceID service_id_ = 0;
+ std::map<std::string, MethodID> remote_method_ids_;
+ std::map<RequestID, DeferredBase> pending_callbacks_;
+ EventListener* const event_listener_;
+ base::WeakPtrFactory<ServiceProxy> weak_ptr_factory_; // Keep last.
+};
+
+} // namespace ipc
+} // namespace perfetto
+
+#endif // INCLUDE_PERFETTO_IPC_SERVICE_PROXY_H_