97 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
//
 | 
						|
// 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,
 | 
						|
                             ProcessOutputCapture captureOutput)
 | 
						|
    : mProcess(LaunchProcess(args, captureOutput))
 | 
						|
{}
 | 
						|
 | 
						|
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
 |