209 lines
5.5 KiB
C
209 lines
5.5 KiB
C
/*-------------------------------------------------------------------------
|
|
* 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 Stream wrapper for deFile
|
|
*//*--------------------------------------------------------------------*/
|
|
#include "deFileStream.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
typedef struct FileStream_s
|
|
{
|
|
deFile* file;
|
|
deStreamStatus status;
|
|
const char* error;
|
|
} FileStream;
|
|
|
|
static deStreamResult fileIOStream_read (deStreamData* stream, void* buf, deInt32 bufSize, deInt32* numRead)
|
|
{
|
|
deInt64 _numRead = 0;
|
|
FileStream* fileStream = (FileStream*)stream;
|
|
|
|
|
|
deFileResult result = deFile_read(fileStream->file, buf, bufSize, &_numRead);
|
|
*numRead = (deInt32)_numRead;
|
|
|
|
switch (result)
|
|
{
|
|
case DE_FILERESULT_SUCCESS:
|
|
return DE_STREAMRESULT_SUCCESS;
|
|
|
|
case DE_FILERESULT_ERROR:
|
|
fileStream->error = "deFile: DE_FILERESULT_ERROR";
|
|
fileStream->status = DE_STREAMSTATUS_ERROR;
|
|
return DE_STREAMRESULT_ERROR;
|
|
|
|
case DE_FILERESULT_END_OF_FILE:
|
|
return DE_STREAMRESULT_END_OF_STREAM;
|
|
|
|
default:
|
|
fileStream->error = "Uknown: DE_FILERESULT";
|
|
fileStream->status = DE_STREAMSTATUS_ERROR;
|
|
return DE_STREAMRESULT_ERROR;
|
|
}
|
|
}
|
|
|
|
static deStreamResult fileIOStream_write (deStreamData* stream, const void* buf, deInt32 bufSize, deInt32* numWritten)
|
|
{
|
|
deInt64 _numWritten = 0;
|
|
FileStream* fileStream = (FileStream*)stream;
|
|
|
|
deFileResult result = deFile_write(fileStream->file, buf, bufSize, &_numWritten);
|
|
*numWritten = (deInt32)_numWritten;
|
|
|
|
switch (result)
|
|
{
|
|
case DE_FILERESULT_SUCCESS:
|
|
return DE_STREAMRESULT_SUCCESS;
|
|
|
|
case DE_FILERESULT_ERROR:
|
|
fileStream->error = "deFile: DE_FILERESULT_ERROR";
|
|
fileStream->status = DE_STREAMSTATUS_ERROR;
|
|
return DE_STREAMRESULT_ERROR;
|
|
|
|
case DE_FILERESULT_END_OF_FILE:
|
|
return DE_STREAMRESULT_END_OF_STREAM;
|
|
|
|
default:
|
|
fileStream->error = "Uknown: DE_FILERESULT";
|
|
fileStream->status = DE_STREAMSTATUS_ERROR;
|
|
return DE_STREAMRESULT_ERROR;
|
|
}
|
|
}
|
|
|
|
static const char* fileIOStream_getError (deStreamData* stream)
|
|
{
|
|
FileStream* fileStream = (FileStream*)stream;
|
|
/* \note [mika] There is only error reporting through return value in deFile */
|
|
return fileStream->error;
|
|
}
|
|
|
|
static deStreamResult fileIOStream_flush (deStreamData* stream)
|
|
{
|
|
/* \todo mika deFile doesn't have flush, how should this be handled? */
|
|
DE_UNREF(stream);
|
|
|
|
return DE_STREAMRESULT_SUCCESS;
|
|
}
|
|
|
|
static deStreamResult fileIOStream_deinit (deStreamData* stream)
|
|
{
|
|
FileStream* fileStream = (FileStream*)stream;
|
|
|
|
deFile_destroy(fileStream->file);
|
|
|
|
free(fileStream);
|
|
|
|
return DE_STREAMRESULT_SUCCESS;
|
|
}
|
|
|
|
static deStreamStatus fileIOStrem_getStatus (deStreamData* stream)
|
|
{
|
|
FileStream* fileStream = (FileStream*)stream;
|
|
return fileStream->status;
|
|
}
|
|
|
|
static const deIOStreamVFTable fileIOStreamVFTable = {
|
|
fileIOStream_read,
|
|
fileIOStream_write,
|
|
fileIOStream_getError,
|
|
fileIOStream_flush,
|
|
fileIOStream_deinit,
|
|
fileIOStrem_getStatus
|
|
};
|
|
|
|
static const deIOStreamVFTable fileInStreamVFTable = {
|
|
fileIOStream_read,
|
|
DE_NULL,
|
|
fileIOStream_getError,
|
|
DE_NULL,
|
|
fileIOStream_deinit,
|
|
fileIOStrem_getStatus
|
|
};
|
|
|
|
static const deIOStreamVFTable fileOutStreamVFTable = {
|
|
DE_NULL,
|
|
fileIOStream_write,
|
|
fileIOStream_getError,
|
|
fileIOStream_flush,
|
|
fileIOStream_deinit,
|
|
fileIOStrem_getStatus
|
|
};
|
|
|
|
void fileIOStream_init (deIOStream* stream, const char* filename, deFileMode mode)
|
|
{
|
|
FileStream* fileStream = DE_NULL;
|
|
|
|
DE_ASSERT(stream);
|
|
|
|
fileStream = malloc(sizeof(FileStream));
|
|
|
|
/* \note mika Check that file is readable and writeable, currently not supported by deFile */
|
|
stream->vfTable = &fileIOStreamVFTable;
|
|
stream->streamData = (deStreamData*)fileStream;
|
|
|
|
fileStream->file = deFile_create(filename, mode);
|
|
fileStream->status = DE_STREAMSTATUS_GOOD;
|
|
fileStream->error = DE_NULL;
|
|
|
|
if (!fileStream->file)
|
|
fileStream->status = DE_STREAMSTATUS_ERROR;
|
|
}
|
|
|
|
void deFileInStream_init (deInStream* stream, const char* filename, deFileMode mode)
|
|
{
|
|
FileStream* fileStream = DE_NULL;
|
|
|
|
DE_ASSERT(stream);
|
|
|
|
fileStream = malloc(sizeof(FileStream));
|
|
|
|
/* \note mika Check that file is readable, currently not supported by deFile */
|
|
stream->ioStream.vfTable = &fileInStreamVFTable;
|
|
stream->ioStream.streamData = (deStreamData*)fileStream;
|
|
|
|
fileStream->file = deFile_create(filename, mode);
|
|
fileStream->status = DE_STREAMSTATUS_GOOD;
|
|
fileStream->error = DE_NULL;
|
|
|
|
if (!fileStream->file)
|
|
fileStream->status = DE_STREAMSTATUS_ERROR;
|
|
}
|
|
|
|
void deFileOutStream_init (deOutStream* stream, const char* filename, deFileMode mode)
|
|
{
|
|
FileStream* fileStream = DE_NULL;
|
|
|
|
DE_ASSERT(stream);
|
|
|
|
fileStream = malloc(sizeof(FileStream));
|
|
|
|
/* \note mika Check that file is writeable, currently not supported by deFile */
|
|
stream->ioStream.vfTable = &fileOutStreamVFTable;
|
|
stream->ioStream.streamData = (deStreamData*)fileStream;
|
|
|
|
fileStream->file = deFile_create(filename, mode);
|
|
fileStream->status = DE_STREAMSTATUS_GOOD;
|
|
fileStream->error = DE_NULL;
|
|
|
|
if (!fileStream->file)
|
|
fileStream->status = DE_STREAMSTATUS_ERROR;
|
|
}
|