Home | History | Annotate | Download | only in common
      1 #ifndef _TCURESOURCE_HPP
      2 #define _TCURESOURCE_HPP
      3 /*-------------------------------------------------------------------------
      4  * drawElements Quality Program Tester Core
      5  * ----------------------------------------
      6  *
      7  * Copyright 2014 The Android Open Source Project
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Resource system.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "tcuDefs.hpp"
     27 
     28 #include <string>
     29 
     30 // \todo [2010-07-31 pyry] Move Archive and File* to separate files
     31 
     32 namespace tcu
     33 {
     34 
     35 /*--------------------------------------------------------------------*//*!
     36  * \brief Resource object
     37  *
     38  * Test framework uses abstraction for data access instead of using
     39  * files directly to better support platforms where application resources
     40  * are not available directly in the filesystem.
     41  *
     42  * Resource objects are requested from Archive object provided by Platform.
     43  * The user is responsible of disposing the objects afterwards.
     44  *//*--------------------------------------------------------------------*/
     45 class Resource
     46 {
     47 public:
     48 	virtual				~Resource		(void) {}
     49 
     50 	virtual void		read			(deUint8* dst, int numBytes) = 0;
     51 	virtual int			getSize			(void) const = 0;
     52 	virtual int			getPosition		(void) const = 0;
     53 	virtual void		setPosition		(int position) = 0;
     54 
     55 	const std::string&	getName			(void) const { return m_name; }
     56 
     57 protected:
     58 						Resource		(const std::string& name) : m_name(name) {}
     59 
     60 private:
     61 	std::string			m_name;
     62 };
     63 
     64 /*--------------------------------------------------------------------*//*!
     65  * \brief Abstract resource archive
     66  *//*--------------------------------------------------------------------*/
     67 class Archive
     68 {
     69 public:
     70 	virtual				~Archive		(void) {}
     71 
     72 	/*--------------------------------------------------------------------*//*!
     73 	 * \brief Open resource
     74 	 *
     75 	 * Throws resource error if no resource with given name exists.
     76 	 *
     77 	 * Resource object must be deleted after use
     78 	 *
     79 	 * \param name Resource path
     80 	 * \return Resource object
     81 	 *//*--------------------------------------------------------------------*/
     82 	virtual Resource*	getResource		(const char* name) const = 0;
     83 
     84 protected:
     85 						Archive			() {}
     86 };
     87 
     88 /*--------------------------------------------------------------------*//*!
     89  * \brief Directory-based archive implementation
     90  *//*--------------------------------------------------------------------*/
     91 class DirArchive : public Archive
     92 {
     93 public:
     94 						DirArchive			(const char* path);
     95 						~DirArchive			(void);
     96 
     97 	Resource*			getResource			(const char* name) const;
     98 
     99 	// \note Assignment and copy allowed
    100 						DirArchive			(const DirArchive& other) : Archive(), m_path(other.m_path) {}
    101 	DirArchive&			operator=			(const DirArchive& other) { m_path = other.m_path; return *this; }
    102 
    103 private:
    104 	std::string			m_path;
    105 
    106 };
    107 
    108 class FileResource : public Resource
    109 {
    110 public:
    111 						FileResource	(const char* filename);
    112 						~FileResource	(void);
    113 
    114 	void				read			(deUint8* dst, int numBytes);
    115 	int					getSize			(void) const;
    116 	int					getPosition		(void) const;
    117 	void				setPosition		(int position);
    118 
    119 private:
    120 						FileResource	(const FileResource& other);
    121 	FileResource&		operator=		(const FileResource& other);
    122 
    123 	FILE*				m_file;
    124 };
    125 
    126 class ResourcePrefix : public Archive
    127 {
    128 public:
    129 								ResourcePrefix		(const Archive& archive, const char* prefix);
    130 	virtual						~ResourcePrefix		(void) {}
    131 
    132 	virtual Resource*			getResource			(const char* name) const;
    133 
    134 private:
    135 	const Archive&				m_archive;
    136 	std::string					m_prefix;
    137 };
    138 
    139 } // tcu
    140 
    141 #endif // _TCURESOURCE_HPP
    142