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