| #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 */ |