1#ifndef _DEIOSTREAM_H
2#define _DEIOSTREAM_H
3/*-------------------------------------------------------------------------
4 * drawElements Stream Library
5 * ---------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file
23 * \brief Input-output stream abstraction.
24 *//*--------------------------------------------------------------------*/
25
26#include "deDefs.h"
27
28DE_BEGIN_EXTERN_C
29
30/* Result of operation on stream */
31typedef enum deStreamResult_e
32{
33	DE_STREAMRESULT_SUCCESS = 0,
34	DE_STREAMRESULT_END_OF_STREAM,
35	DE_STREAMRESULT_ERROR,
36
37	DE_STREAMRESULT_LAST
38} deStreamResult;
39
40typedef enum deStreamStatus_e
41{
42	DE_STREAMSTATUS_GOOD = 0,
43	DE_STREAMSTATUS_ERROR,
44
45	DE_STREAMSTATUS_LAST
46} deStreamStatus;
47
48/* Type for pointer to internal stream psecifig data */
49typedef void deStreamData;
50
51/* Function types for v_table */
52typedef deStreamResult	(*deIOStreamReadFunc)		(deStreamData* stream, void* buf, deInt32 bufSize, deInt32* numRead);
53typedef deStreamResult	(*deIOStreamWriteFunc)		(deStreamData* stream, const void* buf, deInt32 bufSize, deInt32* numWritten);
54typedef const char*		(*deIOStreamGetErrorFunc)	(deStreamData* stream);
55typedef deStreamResult	(*deIOStreamFlushFunc)		(deStreamData* stream);
56typedef deStreamResult	(*deIOStreamDeinitFunc)		(deStreamData* stream);
57typedef deStreamStatus	(*deIOStreamStatusFunc)		(deStreamData* stream);
58
59/* Virtual table type for specifying stream specifig behaviour */
60typedef struct deIOStreamVFTable_s
61{
62	deIOStreamReadFunc		readFunc;
63	deIOStreamWriteFunc		writeFunc;
64	deIOStreamGetErrorFunc	getErrorFunc;
65	deIOStreamFlushFunc 	flushFunc;
66	deIOStreamDeinitFunc	deinitFunc;
67	deIOStreamStatusFunc	statusFunc;
68} deIOStreamVFTable;
69
70/* Generig IOStream struct */
71typedef struct deIOStream_s
72{
73	deStreamData*				streamData;
74	const deIOStreamVFTable*	vfTable;
75} deIOStream;
76
77DE_INLINE deStreamResult	deIOStream_read			(deIOStream* stream, void* buf, deInt32 bufSize, deInt32* numRead);
78DE_INLINE deStreamResult	deIOStream_write		(deIOStream* stream, const void* buf, deInt32 bufSize, deInt32* numWritten);
79DE_INLINE const char*		deIOStream_getError 	(deIOStream* stream);
80DE_INLINE deStreamStatus	deIOStream_getStatus	(deIOStream* stream);
81DE_INLINE deStreamResult	deIOStream_flush		(deIOStream* stream);
82DE_INLINE deStreamResult	deIOStream_deinit		(deIOStream* stream);
83
84
85
86DE_INLINE deStreamResult deIOStream_write (deIOStream* stream, const void* buf, deInt32 bufSize, deInt32* numWritten)
87{
88	DE_ASSERT(stream);
89	DE_ASSERT(stream->vfTable);
90	DE_ASSERT(stream->vfTable->writeFunc);
91
92	return stream->vfTable->writeFunc(stream->streamData, buf, bufSize, numWritten);
93}
94
95DE_INLINE deStreamResult deIOStream_read (deIOStream* stream, void* buf, deInt32 bufSize, deInt32* numRead)
96{
97	DE_ASSERT(stream);
98	DE_ASSERT(stream->vfTable);
99	DE_ASSERT(stream->vfTable->readFunc);
100
101	return stream->vfTable->readFunc(stream->streamData, buf, bufSize, numRead);
102}
103
104DE_INLINE const char* deIOStream_getError (deIOStream* stream)
105{
106	DE_ASSERT(stream);
107	DE_ASSERT(stream->vfTable);
108	DE_ASSERT(stream->vfTable->getErrorFunc);
109
110	return stream->vfTable->getErrorFunc(stream->streamData);
111}
112
113DE_INLINE deStreamResult deIOStream_flush (deIOStream* stream)
114{
115	DE_ASSERT(stream);
116	DE_ASSERT(stream->vfTable);
117	DE_ASSERT(stream->vfTable->flushFunc);
118
119	return stream->vfTable->flushFunc(stream->streamData);
120}
121
122DE_INLINE deStreamResult deIOStream_deinit (deIOStream* stream)
123{
124	deStreamResult result = DE_STREAMRESULT_ERROR;
125	DE_ASSERT(stream);
126	DE_ASSERT(stream->vfTable);
127	DE_ASSERT(stream->vfTable->deinitFunc);
128
129	result = stream->vfTable->deinitFunc(stream->streamData);
130
131	stream->vfTable		= DE_NULL;
132	stream->streamData	= DE_NULL;
133
134	return result;
135}
136
137DE_INLINE deStreamStatus deIOStream_getStatus (deIOStream* stream)
138{
139	DE_ASSERT(stream);
140	DE_ASSERT(stream->vfTable);
141	DE_ASSERT(stream->vfTable->statusFunc);
142
143	return stream->vfTable->statusFunc(stream->streamData);
144}
145
146DE_END_EXTERN_C
147
148#endif /* _DEIOSTREAM_H */
149