#ifndef _DEIOSTREAM_H #define _DEIOSTREAM_H /*------------------------------------------------------------------------- * 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 Input-output stream abstraction. *//*--------------------------------------------------------------------*/ #include "deDefs.h" DE_BEGIN_EXTERN_C /* Result of operation on stream */ typedef enum deStreamResult_e { DE_STREAMRESULT_SUCCESS = 0, DE_STREAMRESULT_END_OF_STREAM, DE_STREAMRESULT_ERROR, DE_STREAMRESULT_LAST } deStreamResult; typedef enum deStreamStatus_e { DE_STREAMSTATUS_GOOD = 0, DE_STREAMSTATUS_ERROR, DE_STREAMSTATUS_LAST } deStreamStatus; /* Type for pointer to internal stream psecifig data */ typedef void deStreamData; /* Function types for v_table */ typedef deStreamResult (*deIOStreamReadFunc) (deStreamData* stream, void* buf, deInt32 bufSize, deInt32* numRead); typedef deStreamResult (*deIOStreamWriteFunc) (deStreamData* stream, const void* buf, deInt32 bufSize, deInt32* numWritten); typedef const char* (*deIOStreamGetErrorFunc) (deStreamData* stream); typedef deStreamResult (*deIOStreamFlushFunc) (deStreamData* stream); typedef deStreamResult (*deIOStreamDeinitFunc) (deStreamData* stream); typedef deStreamStatus (*deIOStreamStatusFunc) (deStreamData* stream); /* Virtual table type for specifying stream specifig behaviour */ typedef struct deIOStreamVFTable_s { deIOStreamReadFunc readFunc; deIOStreamWriteFunc writeFunc; deIOStreamGetErrorFunc getErrorFunc; deIOStreamFlushFunc flushFunc; deIOStreamDeinitFunc deinitFunc; deIOStreamStatusFunc statusFunc; } deIOStreamVFTable; /* Generig IOStream struct */ typedef struct deIOStream_s { deStreamData* streamData; const deIOStreamVFTable* vfTable; } deIOStream; DE_INLINE deStreamResult deIOStream_read (deIOStream* stream, void* buf, deInt32 bufSize, deInt32* numRead); DE_INLINE deStreamResult deIOStream_write (deIOStream* stream, const void* buf, deInt32 bufSize, deInt32* numWritten); DE_INLINE const char* deIOStream_getError (deIOStream* stream); DE_INLINE deStreamStatus deIOStream_getStatus (deIOStream* stream); DE_INLINE deStreamResult deIOStream_flush (deIOStream* stream); DE_INLINE deStreamResult deIOStream_deinit (deIOStream* stream); DE_INLINE deStreamResult deIOStream_write (deIOStream* stream, const void* buf, deInt32 bufSize, deInt32* numWritten) { DE_ASSERT(stream); DE_ASSERT(stream->vfTable); DE_ASSERT(stream->vfTable->writeFunc); return stream->vfTable->writeFunc(stream->streamData, buf, bufSize, numWritten); } DE_INLINE deStreamResult deIOStream_read (deIOStream* stream, void* buf, deInt32 bufSize, deInt32* numRead) { DE_ASSERT(stream); DE_ASSERT(stream->vfTable); DE_ASSERT(stream->vfTable->readFunc); return stream->vfTable->readFunc(stream->streamData, buf, bufSize, numRead); } DE_INLINE const char* deIOStream_getError (deIOStream* stream) { DE_ASSERT(stream); DE_ASSERT(stream->vfTable); DE_ASSERT(stream->vfTable->getErrorFunc); return stream->vfTable->getErrorFunc(stream->streamData); } DE_INLINE deStreamResult deIOStream_flush (deIOStream* stream) { DE_ASSERT(stream); DE_ASSERT(stream->vfTable); DE_ASSERT(stream->vfTable->flushFunc); return stream->vfTable->flushFunc(stream->streamData); } DE_INLINE deStreamResult deIOStream_deinit (deIOStream* stream) { deStreamResult result = DE_STREAMRESULT_ERROR; DE_ASSERT(stream); DE_ASSERT(stream->vfTable); DE_ASSERT(stream->vfTable->deinitFunc); result = stream->vfTable->deinitFunc(stream->streamData); stream->vfTable = DE_NULL; stream->streamData = DE_NULL; return result; } DE_INLINE deStreamStatus deIOStream_getStatus (deIOStream* stream) { DE_ASSERT(stream); DE_ASSERT(stream->vfTable); DE_ASSERT(stream->vfTable->statusFunc); return stream->vfTable->statusFunc(stream->streamData); } DE_END_EXTERN_C #endif /* _DEIOSTREAM_H */