1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program Execution Server
3e5c31af7Sopenharmony_ci * ---------------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief File Reader.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "xsPosixFileReader.hpp"
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include <vector>
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_cinamespace xs
29e5c31af7Sopenharmony_ci{
30e5c31af7Sopenharmony_cinamespace posix
31e5c31af7Sopenharmony_ci{
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_ciFileReader::FileReader (int blockSize, int numBlocks)
34e5c31af7Sopenharmony_ci	: m_file		(DE_NULL)
35e5c31af7Sopenharmony_ci	, m_buf			(blockSize, numBlocks)
36e5c31af7Sopenharmony_ci	, m_isRunning	(false)
37e5c31af7Sopenharmony_ci{
38e5c31af7Sopenharmony_ci}
39e5c31af7Sopenharmony_ci
40e5c31af7Sopenharmony_ciFileReader::~FileReader (void)
41e5c31af7Sopenharmony_ci{
42e5c31af7Sopenharmony_ci}
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_civoid FileReader::start (const char* filename)
45e5c31af7Sopenharmony_ci{
46e5c31af7Sopenharmony_ci	DE_ASSERT(!m_isRunning);
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ci	m_file = deFile_create(filename, DE_FILEMODE_OPEN|DE_FILEMODE_READ);
49e5c31af7Sopenharmony_ci	XS_CHECK(m_file);
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci#if (DE_OS != DE_OS_IOS)
52e5c31af7Sopenharmony_ci	// Set to non-blocking mode.
53e5c31af7Sopenharmony_ci	if (!deFile_setFlags(m_file, DE_FILE_NONBLOCKING))
54e5c31af7Sopenharmony_ci	{
55e5c31af7Sopenharmony_ci		deFile_destroy(m_file);
56e5c31af7Sopenharmony_ci		m_file = DE_NULL;
57e5c31af7Sopenharmony_ci		XS_FAIL("Failed to set non-blocking mode");
58e5c31af7Sopenharmony_ci	}
59e5c31af7Sopenharmony_ci#endif
60e5c31af7Sopenharmony_ci
61e5c31af7Sopenharmony_ci	m_isRunning	= true;
62e5c31af7Sopenharmony_ci
63e5c31af7Sopenharmony_ci	de::Thread::start();
64e5c31af7Sopenharmony_ci}
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_civoid FileReader::run (void)
67e5c31af7Sopenharmony_ci{
68e5c31af7Sopenharmony_ci	std::vector<deUint8>	tmpBuf		(FILEREADER_TMP_BUFFER_SIZE);
69e5c31af7Sopenharmony_ci	deInt64					numRead		= 0;
70e5c31af7Sopenharmony_ci
71e5c31af7Sopenharmony_ci	while (!m_buf.isCanceled())
72e5c31af7Sopenharmony_ci	{
73e5c31af7Sopenharmony_ci		deFileResult result = deFile_read(m_file, &tmpBuf[0], (deInt64)tmpBuf.size(), &numRead);
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci		if (result == DE_FILERESULT_SUCCESS)
76e5c31af7Sopenharmony_ci		{
77e5c31af7Sopenharmony_ci			// Write to buffer.
78e5c31af7Sopenharmony_ci			try
79e5c31af7Sopenharmony_ci			{
80e5c31af7Sopenharmony_ci				m_buf.write((int)numRead, &tmpBuf[0]);
81e5c31af7Sopenharmony_ci				m_buf.flush();
82e5c31af7Sopenharmony_ci			}
83e5c31af7Sopenharmony_ci			catch (const ThreadedByteBuffer::CanceledException&)
84e5c31af7Sopenharmony_ci			{
85e5c31af7Sopenharmony_ci				// Canceled.
86e5c31af7Sopenharmony_ci				break;
87e5c31af7Sopenharmony_ci			}
88e5c31af7Sopenharmony_ci		}
89e5c31af7Sopenharmony_ci		else if (result == DE_FILERESULT_END_OF_FILE ||
90e5c31af7Sopenharmony_ci				 result == DE_FILERESULT_WOULD_BLOCK)
91e5c31af7Sopenharmony_ci		{
92e5c31af7Sopenharmony_ci			// Wait for more data.
93e5c31af7Sopenharmony_ci			deSleep(FILEREADER_IDLE_SLEEP);
94e5c31af7Sopenharmony_ci		}
95e5c31af7Sopenharmony_ci		else
96e5c31af7Sopenharmony_ci			break; // Error.
97e5c31af7Sopenharmony_ci	}
98e5c31af7Sopenharmony_ci}
99e5c31af7Sopenharmony_ci
100e5c31af7Sopenharmony_civoid FileReader::stop (void)
101e5c31af7Sopenharmony_ci{
102e5c31af7Sopenharmony_ci	if (!m_isRunning)
103e5c31af7Sopenharmony_ci		return; // Nothing to do.
104e5c31af7Sopenharmony_ci
105e5c31af7Sopenharmony_ci	m_buf.cancel();
106e5c31af7Sopenharmony_ci
107e5c31af7Sopenharmony_ci	// Join thread.
108e5c31af7Sopenharmony_ci	join();
109e5c31af7Sopenharmony_ci
110e5c31af7Sopenharmony_ci	// Destroy file.
111e5c31af7Sopenharmony_ci	deFile_destroy(m_file);
112e5c31af7Sopenharmony_ci	m_file = DE_NULL;
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_ci	// Reset buffer.
115e5c31af7Sopenharmony_ci	m_buf.clear();
116e5c31af7Sopenharmony_ci
117e5c31af7Sopenharmony_ci	m_isRunning = false;
118e5c31af7Sopenharmony_ci}
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_ci} // posix
121e5c31af7Sopenharmony_ci} // xs
122