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