/*------------------------------------------------------------------------- * drawElements Stream Library * --------------------------- * * 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 Stream wrapper for deFile *//*--------------------------------------------------------------------*/ #include "deFileStream.h" #include <stdlib.h> typedef struct FileStream_s { deFile* file; deStreamStatus status; const char* error; } FileStream; static deStreamResult fileIOStream_read (deStreamData* stream, void* buf, deInt32 bufSize, deInt32* numRead) { deInt64 _numRead = 0; FileStream* fileStream = (FileStream*)stream; deFileResult result = deFile_read(fileStream->file, buf, bufSize, &_numRead); *numRead = (deInt32)_numRead; switch (result) { case DE_FILERESULT_SUCCESS: return DE_STREAMRESULT_SUCCESS; break; case DE_FILERESULT_ERROR: fileStream->error = "deFile: DE_FILERESULT_ERROR"; fileStream->status = DE_STREAMSTATUS_ERROR; return DE_STREAMRESULT_ERROR; break; case DE_FILERESULT_END_OF_FILE: return DE_STREAMRESULT_END_OF_STREAM; break; default: fileStream->error = "Uknown: DE_FILERESULT"; fileStream->status = DE_STREAMSTATUS_ERROR; return DE_STREAMRESULT_ERROR; break; }; } static deStreamResult fileIOStream_write (deStreamData* stream, const void* buf, deInt32 bufSize, deInt32* numWritten) { deInt64 _numWritten = 0; FileStream* fileStream = (FileStream*)stream; deFileResult result = deFile_write(fileStream->file, buf, bufSize, &_numWritten); *numWritten = (deInt32)_numWritten; switch (result) { case DE_FILERESULT_SUCCESS: return DE_STREAMRESULT_SUCCESS; break; case DE_FILERESULT_ERROR: fileStream->error = "deFile: DE_FILERESULT_ERROR"; fileStream->status = DE_STREAMSTATUS_ERROR; return DE_STREAMRESULT_ERROR; break; case DE_FILERESULT_END_OF_FILE: return DE_STREAMRESULT_END_OF_STREAM; break; default: fileStream->error = "Uknown: DE_FILERESULT"; fileStream->status = DE_STREAMSTATUS_ERROR; return DE_STREAMRESULT_ERROR; break; }; } static const char* fileIOStream_getError (deStreamData* stream) { FileStream* fileStream = (FileStream*)stream; /* \note [mika] There is only error reporting through return value in deFile */ return fileStream->error; } static deStreamResult fileIOStream_flush (deStreamData* stream) { /* \todo mika deFile doesn't have flush, how should this be handled? */ DE_UNREF(stream); return DE_STREAMRESULT_SUCCESS; } static deStreamResult fileIOStream_deinit (deStreamData* stream) { FileStream* fileStream = (FileStream*)stream; deFile_destroy(fileStream->file); free(fileStream); return DE_STREAMRESULT_SUCCESS; } static deStreamStatus fileIOStrem_getStatus (deStreamData* stream) { FileStream* fileStream = (FileStream*)stream; return fileStream->status; } static const deIOStreamVFTable fileIOStreamVFTable = { fileIOStream_read, fileIOStream_write, fileIOStream_getError, fileIOStream_flush, fileIOStream_deinit, fileIOStrem_getStatus }; static const deIOStreamVFTable fileInStreamVFTable = { fileIOStream_read, DE_NULL, fileIOStream_getError, DE_NULL, fileIOStream_deinit, fileIOStrem_getStatus }; static const deIOStreamVFTable fileOutStreamVFTable = { DE_NULL, fileIOStream_write, fileIOStream_getError, fileIOStream_flush, fileIOStream_deinit, fileIOStrem_getStatus }; void fileIOStream_init (deIOStream* stream, const char* filename, deFileMode mode) { FileStream* fileStream = DE_NULL; DE_ASSERT(stream); fileStream = malloc(sizeof(FileStream)); /* \note mika Check that file is readable and writeable, currently not supported by deFile */ stream->vfTable = &fileIOStreamVFTable; stream->streamData = (deStreamData*)fileStream; fileStream->file = deFile_create(filename, mode); fileStream->status = DE_STREAMSTATUS_GOOD; fileStream->error = DE_NULL; if (!fileStream->file) fileStream->status = DE_STREAMSTATUS_ERROR; } void deFileInStream_init (deInStream* stream, const char* filename, deFileMode mode) { FileStream* fileStream = DE_NULL; DE_ASSERT(stream); fileStream = malloc(sizeof(FileStream)); /* \note mika Check that file is readable, currently not supported by deFile */ stream->ioStream.vfTable = &fileInStreamVFTable; stream->ioStream.streamData = (deStreamData*)fileStream; fileStream->file = deFile_create(filename, mode); fileStream->status = DE_STREAMSTATUS_GOOD; fileStream->error = DE_NULL; if (!fileStream->file) fileStream->status = DE_STREAMSTATUS_ERROR; } void deFileOutStream_init (deOutStream* stream, const char* filename, deFileMode mode) { FileStream* fileStream = DE_NULL; DE_ASSERT(stream); fileStream = malloc(sizeof(FileStream)); /* \note mika Check that file is writeable, currently not supported by deFile */ stream->ioStream.vfTable = &fileOutStreamVFTable; stream->ioStream.streamData = (deStreamData*)fileStream; fileStream->file = deFile_create(filename, mode); fileStream->status = DE_STREAMSTATUS_GOOD; fileStream->error = DE_NULL; if (!fileStream->file) fileStream->status = DE_STREAMSTATUS_ERROR;; }