1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Tester Core
3*35238bceSAndroid Build Coastguard Worker * ----------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Resource system.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "tcuResource.hpp"
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include <stdio.h>
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Worker namespace tcu
29*35238bceSAndroid Build Coastguard Worker {
30*35238bceSAndroid Build Coastguard Worker
DirArchive(const char * path)31*35238bceSAndroid Build Coastguard Worker DirArchive::DirArchive(const char *path) : m_path(path)
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker // Append leading / if necessary
34*35238bceSAndroid Build Coastguard Worker if (m_path.length() > 0 && m_path[m_path.length() - 1] != '/')
35*35238bceSAndroid Build Coastguard Worker m_path += "/";
36*35238bceSAndroid Build Coastguard Worker }
37*35238bceSAndroid Build Coastguard Worker
~DirArchive()38*35238bceSAndroid Build Coastguard Worker DirArchive::~DirArchive()
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker }
41*35238bceSAndroid Build Coastguard Worker
getResource(const char * name) const42*35238bceSAndroid Build Coastguard Worker Resource *DirArchive::getResource(const char *name) const
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker return static_cast<Resource *>(new FileResource((m_path + name).c_str()));
45*35238bceSAndroid Build Coastguard Worker }
46*35238bceSAndroid Build Coastguard Worker
FileResource(const char * filename)47*35238bceSAndroid Build Coastguard Worker FileResource::FileResource(const char *filename) : Resource(std::string(filename))
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker m_file = fopen(filename, "rb");
50*35238bceSAndroid Build Coastguard Worker if (!m_file)
51*35238bceSAndroid Build Coastguard Worker throw ResourceError("Failed to open file", filename, __FILE__, __LINE__);
52*35238bceSAndroid Build Coastguard Worker }
53*35238bceSAndroid Build Coastguard Worker
~FileResource()54*35238bceSAndroid Build Coastguard Worker FileResource::~FileResource()
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker fclose(m_file);
57*35238bceSAndroid Build Coastguard Worker }
58*35238bceSAndroid Build Coastguard Worker
read(uint8_t * dst,int numBytes)59*35238bceSAndroid Build Coastguard Worker void FileResource::read(uint8_t *dst, int numBytes)
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker int numRead = (int)fread(dst, 1, numBytes, m_file);
62*35238bceSAndroid Build Coastguard Worker TCU_CHECK(numRead == numBytes);
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker
getSize(void) const65*35238bceSAndroid Build Coastguard Worker int FileResource::getSize(void) const
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker long curPos = ftell(m_file);
68*35238bceSAndroid Build Coastguard Worker fseek(m_file, 0, SEEK_END);
69*35238bceSAndroid Build Coastguard Worker int size = (int)ftell(m_file);
70*35238bceSAndroid Build Coastguard Worker fseek(m_file, curPos, SEEK_SET);
71*35238bceSAndroid Build Coastguard Worker return size;
72*35238bceSAndroid Build Coastguard Worker }
73*35238bceSAndroid Build Coastguard Worker
getPosition(void) const74*35238bceSAndroid Build Coastguard Worker int FileResource::getPosition(void) const
75*35238bceSAndroid Build Coastguard Worker {
76*35238bceSAndroid Build Coastguard Worker return (int)ftell(m_file);
77*35238bceSAndroid Build Coastguard Worker }
78*35238bceSAndroid Build Coastguard Worker
setPosition(int position)79*35238bceSAndroid Build Coastguard Worker void FileResource::setPosition(int position)
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker fseek(m_file, (size_t)position, SEEK_SET);
82*35238bceSAndroid Build Coastguard Worker }
83*35238bceSAndroid Build Coastguard Worker
ResourcePrefix(const Archive & archive,const char * prefix)84*35238bceSAndroid Build Coastguard Worker ResourcePrefix::ResourcePrefix(const Archive &archive, const char *prefix) : m_archive(archive), m_prefix(prefix)
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker }
87*35238bceSAndroid Build Coastguard Worker
getResource(const char * name) const88*35238bceSAndroid Build Coastguard Worker Resource *ResourcePrefix::getResource(const char *name) const
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker return m_archive.getResource((m_prefix + name).c_str());
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker
93*35238bceSAndroid Build Coastguard Worker } // namespace tcu
94