EDK: Remove Core::GetDispatcher(). R=azani@chromium.org Review URL: https://codereview.chromium.org/1957713003 .
diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc index ac25362..3724de1 100644 --- a/mojo/edk/embedder/embedder.cc +++ b/mojo/edk/embedder/embedder.cc
@@ -73,17 +73,20 @@ DCHECK(platform_handle); DCHECK(internal::g_core); - RefPtr<system::Dispatcher> dispatcher; - MojoResult result = internal::g_core->GetDispatcher( - platform_handle_wrapper_handle, &dispatcher); + system::Handle h; + MojoResult result = + internal::g_core->GetHandle(platform_handle_wrapper_handle, &h); if (result != MOJO_RESULT_OK) return result; - if (dispatcher->GetType() != system::Dispatcher::Type::PLATFORM_HANDLE) + if (h.dispatcher->GetType() != system::Dispatcher::Type::PLATFORM_HANDLE) return MOJO_RESULT_INVALID_ARGUMENT; + if (!h.has_all_rights(MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE)) + return MOJO_RESULT_PERMISSION_DENIED; + *platform_handle = - static_cast<system::PlatformHandleDispatcher*>(dispatcher.get()) + static_cast<system::PlatformHandleDispatcher*>(h.dispatcher.get()) ->PassPlatformHandle(); return MOJO_RESULT_OK; }
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc index 59bd543..a3a2bcf 100644 --- a/mojo/edk/system/core.cc +++ b/mojo/edk/system/core.cc
@@ -105,15 +105,6 @@ return handle_table_.GetHandle(handle, h); } -MojoResult Core::GetDispatcher(MojoHandle handle, - RefPtr<Dispatcher>* dispatcher) { - Handle h; - MojoResult result = GetHandle(handle, &h); - if (result == MOJO_RESULT_OK) - *dispatcher = std::move(h.dispatcher); - return result; -} - MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle, RefPtr<Dispatcher>* dispatcher) { if (handle == MOJO_HANDLE_INVALID) @@ -140,7 +131,7 @@ if (result != MOJO_RESULT_OK) return result; - if ((h.rights & required_handle_rights) != required_handle_rights) { + if (!h.has_all_rights(required_handle_rights)) { return h.dispatcher->SupportsEntrypointClass(entrypoint_class) ? MOJO_RESULT_PERMISSION_DENIED : MOJO_RESULT_INVALID_ARGUMENT; @@ -624,7 +615,7 @@ if (result != MOJO_RESULT_OK) return result; - if (!(h.rights & MOJO_HANDLE_RIGHT_DUPLICATE)) { + if (!h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE)) { return h.dispatcher->SupportsEntrypointClass(EntrypointClass::BUFFER) ? MOJO_RESULT_PERMISSION_DENIED : MOJO_RESULT_INVALID_ARGUMENT;
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h index fbb289c..05504fd 100644 --- a/mojo/edk/system/core.h +++ b/mojo/edk/system/core.h
@@ -62,9 +62,6 @@ // handle value is invalid or |MOJO_RESULT_BUSY| if the handle is marked as // busy. MojoResult GetHandle(MojoHandle handle, Handle* h); - // TODO(vtl): Remove this. - MojoResult GetDispatcher(MojoHandle handle, - util::RefPtr<Dispatcher>* dispatcher); // TODO(vtl): Convert this to |GetAndRemoveHandle()|. // Like |GetDispatcher()|, but on success also removes the handle from the
diff --git a/mojo/edk/system/handle.h b/mojo/edk/system/handle.h index c02fa1d..1a01c36 100644 --- a/mojo/edk/system/handle.h +++ b/mojo/edk/system/handle.h
@@ -48,6 +48,10 @@ void reset() { *this = Handle(); } + bool has_all_rights(MojoHandleRights required_rights) const { + return (rights & required_rights) == required_rights; + } + // Note: |dispatcher| is guaranteed to be null if default-constructed or // moved-from, but we make no guarantees about the value of |rights| in either // case.
diff --git a/mojo/edk/system/handle_unittest.cc b/mojo/edk/system/handle_unittest.cc index 5183c9c..141b390 100644 --- a/mojo/edk/system/handle_unittest.cc +++ b/mojo/edk/system/handle_unittest.cc
@@ -114,6 +114,37 @@ } } +TEST(HandleTest, HasAllRights) { + { + Handle h; + + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE)); + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_TRANSFER)); + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_READ)); + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_WRITE)); + } + + { + Handle h(MakeRefCounted<test::MockSimpleDispatcher>(), + MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_READ); + + EXPECT_TRUE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE)); + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_TRANSFER)); + EXPECT_TRUE(h.has_all_rights(MOJO_HANDLE_RIGHT_READ)); + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_WRITE)); + + EXPECT_TRUE( + h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_READ)); + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE | + MOJO_HANDLE_RIGHT_READ | + MOJO_HANDLE_RIGHT_WRITE)); + EXPECT_FALSE(h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE | + MOJO_HANDLE_RIGHT_WRITE)); + + EXPECT_EQ(MOJO_RESULT_OK, h.dispatcher->Close()); + } +} + } // namespace } // namespace system } // namespace mojo