* Copyright 2008, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Pfeiffer <laplace@users.sourceforge.net>
* Fredrik ModΓ©en <fredrik@modeen.se>
*/
#include "FileReadWrite.h"
#include <UTF8.h>
#include <Path.h>
FileReadWrite::FileReadWrite(BFile* file, int32 sourceEncoding)
: fFile(file),
fSourceEncoding(sourceEncoding),
fPositionInBuffer(0),
fAmtRead(0)
{}
void
FileReadWrite::SetEncoding(int32 sourceEncoding)
{
fSourceEncoding = sourceEncoding;
}
uint32
FileReadWrite::GetEncoding() const
{
return fSourceEncoding;
}
status_t
FileReadWrite::Write(const BString& contents) const
{
ssize_t written = fFile->Write(contents.String(), contents.Length());
if (written != contents.Length())
return written < 0 ? (status_t)written : B_IO_ERROR;
return B_OK;
}
bool
FileReadWrite::Next(BString& string)
{
if (fPositionInBuffer == 0)
fAmtRead = fFile->Read(&fBuffer, sizeof(fBuffer));
while (fAmtRead > 0) {
while (fPositionInBuffer < fAmtRead) {
if (fBuffer[fPositionInBuffer] == '\n') {
fPositionInBuffer++;
if (fSourceEncoding != -1) {
int32 state = 0;
int32 bufferLen = string.Length();
int32 destBufferLen = bufferLen;
char destination[destBufferLen];
convert_to_utf8(fSourceEncoding, string.String(),
&bufferLen, destination, &destBufferLen, &state);
string = destination;
}
return true;
}
string += fBuffer[fPositionInBuffer];
fPositionInBuffer++;
}
fAmtRead = fFile->Read(&fBuffer, sizeof(fBuffer));
fPositionInBuffer = 0;
}
return false;
}