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_ASSOCIATED_INTERFACE_PTR_INFO_H_
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdint.h>
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <utility>
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/macros.h"
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo {
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// AssociatedInterfacePtrInfo stores necessary information to construct an
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// associated interface pointer. It is similar to InterfacePtrInfo except that
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// it doesn't own a message pipe handle.
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <typename Interface>
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass AssociatedInterfacePtrInfo {
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public:
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  AssociatedInterfacePtrInfo() : version_(0u) {}
23cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli  AssociatedInterfacePtrInfo(std::nullptr_t) : version_(0u) {}
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  AssociatedInterfacePtrInfo(AssociatedInterfacePtrInfo&& other)
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      : handle_(std::move(other.handle_)), version_(other.version_) {
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    other.version_ = 0u;
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  AssociatedInterfacePtrInfo(ScopedInterfaceEndpointHandle handle,
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                             uint32_t version)
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      : handle_(std::move(handle)), version_(version) {}
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ~AssociatedInterfacePtrInfo() {}
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  AssociatedInterfacePtrInfo& operator=(AssociatedInterfacePtrInfo&& other) {
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    if (this != &other) {
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      handle_ = std::move(other.handle_);
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      version_ = other.version_;
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      other.version_ = 0u;
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return *this;
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  bool is_valid() const { return handle_.is_valid(); }
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ScopedInterfaceEndpointHandle PassHandle() {
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return std::move(handle_);
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  const ScopedInterfaceEndpointHandle& handle() const { return handle_; }
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  void set_handle(ScopedInterfaceEndpointHandle handle) {
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    handle_ = std::move(handle);
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  uint32_t version() const { return version_; }
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  void set_version(uint32_t version) { version_ = version; }
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  bool Equals(const AssociatedInterfacePtrInfo& other) const {
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    if (this == &other)
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      return true;
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    // Now that the two refer to different objects, they are equivalent if
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    // and only if they are both invalid.
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return !is_valid() && !other.is_valid();
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private:
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  ScopedInterfaceEndpointHandle handle_;
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  uint32_t version_;
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtrInfo);
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace mojo
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
78