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:
~Resource(void)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 
getName(void) const55 	const std::string&	getName			(void) const { return m_name; }
56 
57 protected:
Resource(const std::string & name)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:
~Archive(void)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:
Archive()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
DirArchive(const DirArchive & other)100 						DirArchive			(const DirArchive& other) : Archive(), m_path(other.m_path) {}
operator =(const DirArchive & other)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);
~ResourcePrefix(void)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