Home | History | Annotate | Download | only in destream
      1 /*-------------------------------------------------------------------------
      2  * drawElements Stream Library
      3  * ---------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Stream wrapper for deFile
     22  *//*--------------------------------------------------------------------*/
     23 #include "deFileStream.h"
     24 
     25 #include <stdlib.h>
     26 
     27 typedef struct FileStream_s
     28 {
     29 	deFile*			file;
     30 	deStreamStatus	status;
     31 	const char*		error;
     32 } FileStream;
     33 
     34 static deStreamResult fileIOStream_read (deStreamData* stream, void* buf, deInt32 bufSize, deInt32* numRead)
     35 {
     36 	deInt64 _numRead = 0;
     37 	FileStream* fileStream = (FileStream*)stream;
     38 
     39 
     40 	deFileResult result = deFile_read(fileStream->file, buf, bufSize, &_numRead);
     41 	*numRead = (deInt32)_numRead;
     42 
     43 	switch (result)
     44 	{
     45 		case  DE_FILERESULT_SUCCESS:
     46 			return DE_STREAMRESULT_SUCCESS;
     47 			break;
     48 
     49 		case DE_FILERESULT_ERROR:
     50 			fileStream->error	= "deFile: DE_FILERESULT_ERROR";
     51 			fileStream->status	= DE_STREAMSTATUS_ERROR;
     52 			return DE_STREAMRESULT_ERROR;
     53 			break;
     54 
     55 		case DE_FILERESULT_END_OF_FILE:
     56 			return DE_STREAMRESULT_END_OF_STREAM;
     57 			break;
     58 
     59 		default:
     60 			fileStream->error	= "Uknown: DE_FILERESULT";
     61 			fileStream->status	= DE_STREAMSTATUS_ERROR;
     62 			return DE_STREAMRESULT_ERROR;
     63 			break;
     64 	};
     65 }
     66 
     67 static deStreamResult fileIOStream_write (deStreamData* stream, const void* buf, deInt32 bufSize, deInt32* numWritten)
     68 {
     69 	deInt64	_numWritten = 0;
     70 	FileStream* fileStream = (FileStream*)stream;
     71 
     72 	deFileResult result = deFile_write(fileStream->file, buf, bufSize, &_numWritten);
     73 	*numWritten = (deInt32)_numWritten;
     74 
     75 	switch (result)
     76 	{
     77 		case  DE_FILERESULT_SUCCESS:
     78 			return DE_STREAMRESULT_SUCCESS;
     79 			break;
     80 
     81 		case DE_FILERESULT_ERROR:
     82 			fileStream->error	= "deFile: DE_FILERESULT_ERROR";
     83 			fileStream->status	= DE_STREAMSTATUS_ERROR;
     84 			return DE_STREAMRESULT_ERROR;
     85 			break;
     86 
     87 		case DE_FILERESULT_END_OF_FILE:
     88 			return DE_STREAMRESULT_END_OF_STREAM;
     89 			break;
     90 
     91 		default:
     92 			fileStream->error	= "Uknown: DE_FILERESULT";
     93 			fileStream->status	= DE_STREAMSTATUS_ERROR;
     94 			return DE_STREAMRESULT_ERROR;
     95 			break;
     96 	};
     97 }
     98 
     99 static const char* fileIOStream_getError (deStreamData* stream)
    100 {
    101 	FileStream* fileStream = (FileStream*)stream;
    102 	/* \note [mika] There is only error reporting through return value in deFile */
    103 	return fileStream->error;
    104 }
    105 
    106 static deStreamResult fileIOStream_flush (deStreamData* stream)
    107 {
    108 	/* \todo mika deFile doesn't have flush, how should this be handled? */
    109 	DE_UNREF(stream);
    110 
    111 	return DE_STREAMRESULT_SUCCESS;
    112 }
    113 
    114 static deStreamResult fileIOStream_deinit (deStreamData* stream)
    115 {
    116 	FileStream* fileStream = (FileStream*)stream;
    117 
    118 	deFile_destroy(fileStream->file);
    119 
    120 	free(fileStream);
    121 
    122 	return DE_STREAMRESULT_SUCCESS;
    123 }
    124 
    125 static deStreamStatus fileIOStrem_getStatus (deStreamData* stream)
    126 {
    127 	FileStream* fileStream = (FileStream*)stream;
    128 	return fileStream->status;
    129 }
    130 
    131 static const deIOStreamVFTable fileIOStreamVFTable = {
    132 	fileIOStream_read,
    133 	fileIOStream_write,
    134 	fileIOStream_getError,
    135 	fileIOStream_flush,
    136 	fileIOStream_deinit,
    137 	fileIOStrem_getStatus
    138 };
    139 
    140 static const deIOStreamVFTable fileInStreamVFTable = {
    141 	fileIOStream_read,
    142 	DE_NULL,
    143 	fileIOStream_getError,
    144 	DE_NULL,
    145 	fileIOStream_deinit,
    146 	fileIOStrem_getStatus
    147 };
    148 
    149 static const deIOStreamVFTable fileOutStreamVFTable = {
    150 	DE_NULL,
    151 	fileIOStream_write,
    152 	fileIOStream_getError,
    153 	fileIOStream_flush,
    154 	fileIOStream_deinit,
    155 	fileIOStrem_getStatus
    156 };
    157 
    158 void fileIOStream_init (deIOStream* stream, const char* filename, deFileMode mode)
    159 {
    160 	FileStream* fileStream = DE_NULL;
    161 
    162 	DE_ASSERT(stream);
    163 
    164 	fileStream = malloc(sizeof(FileStream));
    165 
    166 	/* \note mika Check that file is readable and writeable, currently not supported by deFile */
    167 	stream->vfTable		= &fileIOStreamVFTable;
    168 	stream->streamData	= (deStreamData*)fileStream;
    169 
    170 	fileStream->file	= deFile_create(filename, mode);
    171 	fileStream->status	= DE_STREAMSTATUS_GOOD;
    172 	fileStream->error	= DE_NULL;
    173 
    174 	if (!fileStream->file)
    175 		fileStream->status = DE_STREAMSTATUS_ERROR;
    176 }
    177 
    178 void deFileInStream_init (deInStream* stream, const char* filename, deFileMode mode)
    179 {
    180 	FileStream* fileStream = DE_NULL;
    181 
    182 	DE_ASSERT(stream);
    183 
    184 	fileStream = malloc(sizeof(FileStream));
    185 
    186 	/* \note mika Check that file is readable, currently not supported by deFile */
    187 	stream->ioStream.vfTable		= &fileInStreamVFTable;
    188 	stream->ioStream.streamData		= (deStreamData*)fileStream;
    189 
    190 	fileStream->file	= deFile_create(filename, mode);
    191 	fileStream->status	= DE_STREAMSTATUS_GOOD;
    192 	fileStream->error	= DE_NULL;
    193 
    194 	if (!fileStream->file)
    195 		fileStream->status = DE_STREAMSTATUS_ERROR;
    196 }
    197 
    198 void deFileOutStream_init (deOutStream* stream, const char* filename, deFileMode mode)
    199 {
    200 	FileStream* fileStream = DE_NULL;
    201 
    202 	DE_ASSERT(stream);
    203 
    204 	fileStream = malloc(sizeof(FileStream));
    205 
    206 	/* \note mika Check that file is writeable, currently not supported by deFile */
    207 	stream->ioStream.vfTable		= &fileOutStreamVFTable;
    208 	stream->ioStream.streamData		= (deStreamData*)fileStream;
    209 
    210 	fileStream->file	= deFile_create(filename, mode);
    211 	fileStream->status	= DE_STREAMSTATUS_GOOD;
    212 	fileStream->error	= DE_NULL;
    213 
    214 	if (!fileStream->file)
    215 		fileStream->status = DE_STREAMSTATUS_ERROR;;
    216 }
    217