/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Resource wrapper for AAssetManager.
 *//*--------------------------------------------------------------------*/

#include "tcuAndroidAssets.hpp"

namespace tcu
{
namespace Android
{

AssetArchive::AssetArchive(AAssetManager *assetMgr) : m_assetMgr(assetMgr)
{
}

AssetArchive::~AssetArchive(void)
{
}

Resource *AssetArchive::getResource(const char *name) const
{
    return new AssetResource(m_assetMgr, name);
}

AssetResource::AssetResource(AAssetManager *assetMgr, const char *name) : Resource(name), m_asset(nullptr)
{
    m_asset = AAssetManager_open(assetMgr, name, AASSET_MODE_RANDOM);

    if (!m_asset)
        throw ResourceError("Failed to open asset resource", name, __FILE__, __LINE__);
}

AssetResource::~AssetResource(void)
{
    AAsset_close(m_asset);
}

void AssetResource::read(uint8_t *dst, int numBytes)
{
    TCU_CHECK(AAsset_read(m_asset, dst, numBytes) == numBytes);
}

uint32_t AssetResource::getPosition(void) const
{
    return (int)AAsset_getLength(m_asset) - (int)AAsset_getRemainingLength(m_asset);
}

void AssetResource::setPosition(uint32_t position)
{
    TCU_CHECK(AAsset_seek(m_asset, position, SEEK_SET) == position);
}

bool AssetResource::isFinished(void) const
{
    return AAsset_getRemainingLength(m_asset) <= 0;
}

uint32_t AssetResource::getSize(void) const
{
    return (int)AAsset_getLength(m_asset);
}

} // namespace Android
} // namespace tcu
