// Copyright (c) 2010 The WebM 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 in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS.  All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.

#include "mkvreader.hpp"

#include <cassert>

namespace mkvparser
{

MkvReader::MkvReader() :
    m_file(NULL),
    reader_owns_file_(true) {
}

MkvReader::MkvReader(FILE* fp) :
    m_file(fp),
    reader_owns_file_(false) {
  GetFileSize();
}

MkvReader::~MkvReader() {
  if (reader_owns_file_)
    Close();
  m_file = NULL;
}

int MkvReader::Open(const char* fileName)
{
    if (fileName == NULL)
        return -1;

    if (m_file)
        return -1;

#ifdef _MSC_VER
    const errno_t e = fopen_s(&m_file, fileName, "rb");

    if (e)
        return -1;  //error
#else
    m_file = fopen(fileName, "rb");

    if (m_file == NULL)
        return -1;
#endif
    return !GetFileSize();
}

bool MkvReader::GetFileSize() {
    if (m_file == NULL)
        return false;
#ifdef _MSC_VER
    int status = _fseeki64(m_file, 0L, SEEK_END);

    if (status)
        return false;  //error

    m_length = _ftelli64(m_file);
#else
    fseek(m_file, 0L, SEEK_END);
    m_length = ftell(m_file);
#endif
    assert(m_length >= 0);

    if (m_length < 0)
        return false;

#ifdef _MSC_VER
    status = _fseeki64(m_file, 0L, SEEK_SET);

    if (status)
        return false;  //error
#else
    fseek(m_file, 0L, SEEK_SET);
#endif

    return true;
}

void MkvReader::Close()
{
    if (m_file != NULL)
    {
        fclose(m_file);
        m_file = NULL;
    }
}

int MkvReader::Length(long long* total, long long* available)
{
    if (m_file == NULL)
        return -1;

    if (total)
        *total = m_length;

    if (available)
        *available = m_length;

    return 0;
}

int MkvReader::Read(long long offset, long len, unsigned char* buffer)
{
    if (m_file == NULL)
        return -1;

    if (offset < 0)
        return -1;

    if (len < 0)
        return -1;

    if (len == 0)
        return 0;

    if (offset >= m_length)
        return -1;

#ifdef _MSC_VER
    const int status = _fseeki64(m_file, offset, SEEK_SET);

    if (status)
        return -1;  //error
#else
    fseek(m_file, offset, SEEK_SET);
#endif

    const size_t size = fread(buffer, 1, len, m_file);

    if (size < size_t(len))
        return -1;  //error

    return 0;  //success
}

}  //end namespace mkvparser
