//===-- FileCache.cpp -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Host/FileCache.h"

#include "lldb/Host/File.h"

using namespace lldb;
using namespace lldb_private;

FileCache *FileCache::m_instance = nullptr;

FileCache &
FileCache::GetInstance()
{
    if (m_instance == nullptr)
        m_instance = new FileCache();

    return *m_instance;
}

lldb::user_id_t
FileCache::OpenFile(const FileSpec &file_spec, uint32_t flags, uint32_t mode, Error &error)
{
    std::string path(file_spec.GetPath());
    if (path.empty())
    {
        error.SetErrorString("empty path");
        return UINT64_MAX;
    }
    FileSP file_sp(new File());
    error = file_sp->Open(path.c_str(), flags, mode);
    if (file_sp->IsValid() == false)
        return UINT64_MAX;
    lldb::user_id_t fd = file_sp->GetDescriptor();
    m_cache[fd] = file_sp;
    return fd;
}

bool
FileCache::CloseFile(lldb::user_id_t fd, Error &error)
{
    if (fd == UINT64_MAX)
    {
        error.SetErrorString("invalid file descriptor");
        return false;
    }
    FDToFileMap::iterator pos = m_cache.find(fd);
    if (pos == m_cache.end())
    {
        error.SetErrorStringWithFormat("invalid host file descriptor %" PRIu64, fd);
        return false;
    }
    FileSP file_sp = pos->second;
    if (!file_sp)
    {
        error.SetErrorString("invalid host backing file");
        return false;
    }
    error = file_sp->Close();
    m_cache.erase(pos);
    return error.Success();
}

uint64_t
FileCache::WriteFile(lldb::user_id_t fd, uint64_t offset, const void *src, uint64_t src_len, Error &error)
{
    if (fd == UINT64_MAX)
    {
        error.SetErrorString("invalid file descriptor");
        return UINT64_MAX;
    }
    FDToFileMap::iterator pos = m_cache.find(fd);
    if (pos == m_cache.end())
    {
        error.SetErrorStringWithFormat("invalid host file descriptor %" PRIu64, fd);
        return false;
    }
    FileSP file_sp = pos->second;
    if (!file_sp)
    {
        error.SetErrorString("invalid host backing file");
        return UINT64_MAX;
    }
    if (static_cast<uint64_t>(file_sp->SeekFromStart(offset, &error)) != offset || error.Fail())
        return UINT64_MAX;
    size_t bytes_written = src_len;
    error = file_sp->Write(src, bytes_written);
    if (error.Fail())
        return UINT64_MAX;
    return bytes_written;
}

uint64_t
FileCache::ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst, uint64_t dst_len, Error &error)
{
    if (fd == UINT64_MAX)
    {
        error.SetErrorString("invalid file descriptor");
        return UINT64_MAX;
    }
    FDToFileMap::iterator pos = m_cache.find(fd);
    if (pos == m_cache.end())
    {
        error.SetErrorStringWithFormat("invalid host file descriptor %" PRIu64, fd);
        return false;
    }
    FileSP file_sp = pos->second;
    if (!file_sp)
    {
        error.SetErrorString("invalid host backing file");
        return UINT64_MAX;
    }
    if (static_cast<uint64_t>(file_sp->SeekFromStart(offset, &error)) != offset || error.Fail())
        return UINT64_MAX;
    size_t bytes_read = dst_len;
    error = file_sp->Read(dst, bytes_read);
    if (error.Fail())
        return UINT64_MAX;
    return bytes_read;
}
