1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2015 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#ifndef MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/macros.h"
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/memory/ref_counted.h"
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/interface_id.h"
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo {
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass AssociatedGroupController;
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// ScopedInterfaceEndpointHandle refers to one end of an interface, either the
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// implementation side or the client side.
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass ScopedInterfaceEndpointHandle {
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public:
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Creates an invalid endpoint handle.
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ScopedInterfaceEndpointHandle();
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ScopedInterfaceEndpointHandle(ScopedInterfaceEndpointHandle&& other);
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ~ScopedInterfaceEndpointHandle();
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ScopedInterfaceEndpointHandle& operator=(
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      ScopedInterfaceEndpointHandle&& other);
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  bool is_valid() const { return IsValidInterfaceId(id_); }
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  bool is_local() const { return is_local_; }
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  void reset();
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  void swap(ScopedInterfaceEndpointHandle& other);
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // DO NOT USE METHODS BELOW THIS LINE. These are for internal use and testing.
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  InterfaceId id() const { return id_; }
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  AssociatedGroupController* group_controller() const {
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return group_controller_.get();
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // Releases the handle without closing it.
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  InterfaceId release();
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private:
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  friend class AssociatedGroupController;
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // This is supposed to be used by AssociatedGroupController only.
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // |id| is the corresponding interface ID.
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // If |is_local| is false, this handle is meant to be passed over a message
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  // pipe the remote side of the associated group.
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ScopedInterfaceEndpointHandle(
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      InterfaceId id,
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      bool is_local,
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      scoped_refptr<AssociatedGroupController> group_controller);
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  InterfaceId id_;
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  bool is_local_;
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  scoped_refptr<AssociatedGroupController> group_controller_;
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  DISALLOW_COPY_AND_ASSIGN(ScopedInterfaceEndpointHandle);
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace mojo
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
70