#ifndef _TCURESOURCE_HPP
#define _TCURESOURCE_HPP
/*-------------------------------------------------------------------------
 * 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 system.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"

#include <string>

// \todo [2010-07-31 pyry] Move Archive and File* to separate files

namespace tcu
{

/*--------------------------------------------------------------------*//*!
 * \brief Resource object
 *
 * Test framework uses abstraction for data access instead of using
 * files directly to better support platforms where application resources
 * are not available directly in the filesystem.
 *
 * Resource objects are requested from Archive object provided by Platform.
 * The user is responsible of disposing the objects afterwards.
 *//*--------------------------------------------------------------------*/
class Resource
{
public:
    virtual ~Resource(void)
    {
    }

    virtual void read(uint8_t *dst, int numBytes) = 0;
    virtual int getSize(void) const               = 0;
    virtual int getPosition(void) const           = 0;
    virtual void setPosition(int position)        = 0;

    const std::string &getName(void) const
    {
        return m_name;
    }

protected:
    Resource(const std::string &name) : m_name(name)
    {
    }

private:
    std::string m_name;
};

/*--------------------------------------------------------------------*//*!
 * \brief Abstract resource archive
 *//*--------------------------------------------------------------------*/
class Archive
{
public:
    virtual ~Archive(void)
    {
    }

    /*--------------------------------------------------------------------*//*!
     * \brief Open resource
     *
     * Throws resource error if no resource with given name exists.
     *
     * Resource object must be deleted after use
     *
     * \param name Resource path
     * \return Resource object
     *//*--------------------------------------------------------------------*/
    virtual Resource *getResource(const char *name) const = 0;

protected:
    Archive()
    {
    }
};

/*--------------------------------------------------------------------*//*!
 * \brief Directory-based archive implementation
 *//*--------------------------------------------------------------------*/
class DirArchive : public Archive
{
public:
    DirArchive(const char *path);
    ~DirArchive(void);

    Resource *getResource(const char *name) const;

    // \note Assignment and copy allowed
    DirArchive(const DirArchive &other) : Archive(), m_path(other.m_path)
    {
    }
    DirArchive &operator=(const DirArchive &other)
    {
        m_path = other.m_path;
        return *this;
    }

private:
    std::string m_path;
};

class FileResource : public Resource
{
public:
    FileResource(const char *filename);
    ~FileResource(void);

    void read(uint8_t *dst, int numBytes);
    int getSize(void) const;
    int getPosition(void) const;
    void setPosition(int position);

private:
    FileResource(const FileResource &other);
    FileResource &operator=(const FileResource &other);

    FILE *m_file;
};

class ResourcePrefix : public Archive
{
public:
    ResourcePrefix(const Archive &archive, const char *prefix);
    virtual ~ResourcePrefix(void)
    {
    }

    virtual Resource *getResource(const char *name) const;

private:
    const Archive &m_archive;
    std::string m_prefix;
};

} // namespace tcu

#endif // _TCURESOURCE_HPP
