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 
28 DE_BEGIN_EXTERN_C
29 
30 /* Result of operation on stream */
31 typedef 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 
40 typedef 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 */
49 typedef void deStreamData;
50 
51 /* Function types for v_table */
52 typedef deStreamResult	(*deIOStreamReadFunc)		(deStreamData* stream, void* buf, deInt32 bufSize, deInt32* numRead);
53 typedef deStreamResult	(*deIOStreamWriteFunc)		(deStreamData* stream, const void* buf, deInt32 bufSize, deInt32* numWritten);
54 typedef const char*		(*deIOStreamGetErrorFunc)	(deStreamData* stream);
55 typedef deStreamResult	(*deIOStreamFlushFunc)		(deStreamData* stream);
56 typedef deStreamResult	(*deIOStreamDeinitFunc)		(deStreamData* stream);
57 typedef deStreamStatus	(*deIOStreamStatusFunc)		(deStreamData* stream);
58 
59 /* Virtual table type for specifying stream specifig behaviour */
60 typedef 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 */
71 typedef struct deIOStream_s
72 {
73 	deStreamData*				streamData;
74 	const deIOStreamVFTable*	vfTable;
75 } deIOStream;
76 
77 DE_INLINE deStreamResult	deIOStream_read			(deIOStream* stream, void* buf, deInt32 bufSize, deInt32* numRead);
78 DE_INLINE deStreamResult	deIOStream_write		(deIOStream* stream, const void* buf, deInt32 bufSize, deInt32* numWritten);
79 DE_INLINE const char*		deIOStream_getError 	(deIOStream* stream);
80 DE_INLINE deStreamStatus	deIOStream_getStatus	(deIOStream* stream);
81 DE_INLINE deStreamResult	deIOStream_flush		(deIOStream* stream);
82 DE_INLINE deStreamResult	deIOStream_deinit		(deIOStream* stream);
83 
84 
85 
deIOStream_write(deIOStream * stream,const void * buf,deInt32 bufSize,deInt32 * numWritten)86 DE_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 
deIOStream_read(deIOStream * stream,void * buf,deInt32 bufSize,deInt32 * numRead)95 DE_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 
deIOStream_getError(deIOStream * stream)104 DE_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 
deIOStream_flush(deIOStream * stream)113 DE_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 
deIOStream_deinit(deIOStream * stream)122 DE_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 
deIOStream_getStatus(deIOStream * stream)137 DE_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 
146 DE_END_EXTERN_C
147 
148 #endif /* _DEIOSTREAM_H */
149