// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "printing/metafile.h" #include #include #include "base/files/file.h" #include "base/logging.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/numerics/safe_conversions.h" #include "build/build_config.h" namespace printing { MetafilePlayer::MetafilePlayer() = default; MetafilePlayer::~MetafilePlayer() = default; Metafile::Metafile() = default; Metafile::~Metafile() = default; bool Metafile::GetDataAsVector(std::vector* buffer) const { buffer->resize(GetDataSize()); if (buffer->empty()) return false; return GetData(&buffer->front(), base::checked_cast(buffer->size())); } base::MappedReadOnlyRegion Metafile::GetDataAsSharedMemoryRegion() const { uint32_t data_size = GetDataSize(); if (data_size == 0) { DLOG(ERROR) << "Metafile has no data to map to a region."; return base::MappedReadOnlyRegion(); } base::MappedReadOnlyRegion region_mapping = base::ReadOnlySharedMemoryRegion::Create(data_size); if (!region_mapping.IsValid()) { DLOG(ERROR) << "Failure mapping metafile data into region for size " << data_size; return base::MappedReadOnlyRegion(); } if (!GetData(region_mapping.mapping.memory(), data_size)) { DLOG(ERROR) << "Failure getting metafile data into region"; return base::MappedReadOnlyRegion(); } return region_mapping; } #if !BUILDFLAG(IS_ANDROID) bool Metafile::SaveTo(base::File* file) const { if (!file->IsValid()) return false; std::vector buffer; if (!GetDataAsVector(&buffer)) return false; if (!file->WriteAtCurrentPosAndCheck( base::as_bytes(base::make_span(buffer)))) { DLOG(ERROR) << "Failed to save file."; return false; } return true; } #endif // !BUILDFLAG(IS_ANDROID) } // namespace printing