| /*------------------------------------------------------------------------- |
| * drawElements Quality Program Execution Server |
| * --------------------------------------------- |
| * |
| * 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 File Reader. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "xsPosixFileReader.hpp" |
| |
| #include <vector> |
| |
| namespace xs |
| { |
| namespace posix |
| { |
| |
| FileReader::FileReader (int blockSize, int numBlocks) |
| : m_file (DE_NULL) |
| , m_buf (blockSize, numBlocks) |
| , m_isRunning (false) |
| { |
| } |
| |
| FileReader::~FileReader (void) |
| { |
| } |
| |
| void FileReader::start (const char* filename) |
| { |
| DE_ASSERT(!m_isRunning); |
| |
| m_file = deFile_create(filename, DE_FILEMODE_OPEN|DE_FILEMODE_READ); |
| XS_CHECK(m_file); |
| |
| #if (DE_OS != DE_OS_IOS) |
| // Set to non-blocking mode. |
| if (!deFile_setFlags(m_file, DE_FILE_NONBLOCKING)) |
| { |
| deFile_destroy(m_file); |
| m_file = DE_NULL; |
| XS_FAIL("Failed to set non-blocking mode"); |
| } |
| #endif |
| |
| m_isRunning = true; |
| |
| de::Thread::start(); |
| } |
| |
| void FileReader::run (void) |
| { |
| std::vector<deUint8> tmpBuf (FILEREADER_TMP_BUFFER_SIZE); |
| deInt64 numRead = 0; |
| |
| while (!m_buf.isCanceled()) |
| { |
| deFileResult result = deFile_read(m_file, &tmpBuf[0], (deInt64)tmpBuf.size(), &numRead); |
| |
| if (result == DE_FILERESULT_SUCCESS) |
| { |
| // Write to buffer. |
| try |
| { |
| m_buf.write((int)numRead, &tmpBuf[0]); |
| m_buf.flush(); |
| } |
| catch (const ThreadedByteBuffer::CanceledException&) |
| { |
| // Canceled. |
| break; |
| } |
| } |
| else if (result == DE_FILERESULT_END_OF_FILE || |
| result == DE_FILERESULT_WOULD_BLOCK) |
| { |
| // Wait for more data. |
| deSleep(FILEREADER_IDLE_SLEEP); |
| } |
| else |
| break; // Error. |
| } |
| } |
| |
| void FileReader::stop (void) |
| { |
| if (!m_isRunning) |
| return; // Nothing to do. |
| |
| m_buf.cancel(); |
| |
| // Join thread. |
| join(); |
| |
| // Destroy file. |
| deFile_destroy(m_file); |
| m_file = DE_NULL; |
| |
| // Reset buffer. |
| m_buf.clear(); |
| |
| m_isRunning = false; |
| } |
| |
| } // posix |
| } // xs |