| // | |
| // Copyright 2019 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // system_utils: Defines common utility functions | |
| #include "util/test_utils.h" | |
| #include <cstring> | |
| #include <fstream> | |
| namespace angle | |
| { | |
| bool CreateTemporaryFile(char *tempFileNameOut, uint32_t maxFileNameLen) | |
| { | |
| constexpr uint32_t kMaxPath = 1000u; | |
| char tempPath[kMaxPath]; | |
| if (!GetTempDir(tempPath, kMaxPath)) | |
| return false; | |
| return CreateTemporaryFileInDir(tempPath, tempFileNameOut, maxFileNameLen); | |
| } | |
| bool GetFileSize(const char *filePath, uint32_t *sizeOut) | |
| { | |
| std::ifstream stream(filePath); | |
| if (!stream) | |
| { | |
| return false; | |
| } | |
| stream.seekg(0, std::ios::end); | |
| *sizeOut = static_cast<uint32_t>(stream.tellg()); | |
| return true; | |
| } | |
| bool ReadEntireFileToString(const char *filePath, char *contentsOut, uint32_t maxLen) | |
| { | |
| std::ifstream stream(filePath); | |
| if (!stream) | |
| { | |
| return false; | |
| } | |
| std::string contents; | |
| stream.seekg(0, std::ios::end); | |
| contents.reserve(static_cast<unsigned int>(stream.tellg())); | |
| stream.seekg(0, std::ios::beg); | |
| contents.assign((std::istreambuf_iterator<char>(stream)), std::istreambuf_iterator<char>()); | |
| strncpy(contentsOut, contents.c_str(), maxLen); | |
| return true; | |
| } | |
| // static | |
| Process::~Process() = default; | |
| ProcessHandle::ProcessHandle() : mProcess(nullptr) {} | |
| ProcessHandle::ProcessHandle(Process *process) : mProcess(process) {} | |
| ProcessHandle::ProcessHandle(const std::vector<const char *> &args, | |
| bool captureStdout, | |
| bool captureStderr) | |
| : mProcess(LaunchProcess(args, captureStdout, captureStderr)) | |
| {} | |
| ProcessHandle::~ProcessHandle() | |
| { | |
| reset(); | |
| } | |
| ProcessHandle::ProcessHandle(ProcessHandle &&other) : mProcess(other.mProcess) | |
| { | |
| other.mProcess = nullptr; | |
| } | |
| ProcessHandle &ProcessHandle::operator=(ProcessHandle &&rhs) | |
| { | |
| std::swap(mProcess, rhs.mProcess); | |
| return *this; | |
| } | |
| void ProcessHandle::reset() | |
| { | |
| if (mProcess) | |
| { | |
| delete mProcess; | |
| mProcess = nullptr; | |
| } | |
| } | |
| } // namespace angle |