blob: f5f6c890b039d2ee37780adefce2b97a320f9c60 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/printing/service/public/cpp/pdf_service_mojo_utils.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/shared_memory.h"
#include "mojo/public/cpp/system/platform_handle.h"
namespace printing {
std::unique_ptr<base::SharedMemory> GetShmFromMojoHandle(
mojo::ScopedSharedBufferHandle handle) {
base::SharedMemoryHandle memory_handle;
size_t memory_size = 0;
bool read_only_flag = false;
const MojoResult result = mojo::UnwrapSharedMemoryHandle(
std::move(handle), &memory_handle, &memory_size, &read_only_flag);
if (result != MOJO_RESULT_OK)
return nullptr;
DCHECK_GT(memory_size, 0u);
std::unique_ptr<base::SharedMemory> shm =
std::make_unique<base::SharedMemory>(memory_handle, read_only_flag);
if (!shm->Map(memory_size)) {
DLOG(ERROR) << "Map shared memory failed.";
return nullptr;
}
return shm;
}
scoped_refptr<base::RefCountedBytes> GetDataFromMojoHandle(
mojo::ScopedSharedBufferHandle handle) {
std::unique_ptr<base::SharedMemory> shm =
GetShmFromMojoHandle(std::move(handle));
if (!shm)
return nullptr;
return base::MakeRefCounted<base::RefCountedBytes>(
reinterpret_cast<const unsigned char*>(shm->memory()),
shm->mapped_size());
}
} // namespace printing