1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-11 23:54:18 +00:00
JUCE/src/io/files/juce_FileOutputStream.cpp
2010-01-04 15:24:13 +00:00

136 lines
3.8 KiB
C++

/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#include "../../core/juce_StandardHeader.h"
BEGIN_JUCE_NAMESPACE
#include "juce_FileOutputStream.h"
void* juce_fileOpen (const String& path, bool forWriting);
void juce_fileClose (void* handle);
int juce_fileWrite (void* handle, const void* buffer, int size);
void juce_fileFlush (void* handle);
int64 juce_fileGetPosition (void* handle);
int64 juce_fileSetPosition (void* handle, int64 pos);
//==============================================================================
FileOutputStream::FileOutputStream (const File& f,
const int bufferSize_)
: file (f),
bufferSize (bufferSize_),
bytesInBuffer (0)
{
fileHandle = juce_fileOpen (f.getFullPathName(), true);
if (fileHandle != 0)
{
currentPosition = juce_fileGetPosition (fileHandle);
if (currentPosition < 0)
{
jassertfalse
juce_fileClose (fileHandle);
fileHandle = 0;
}
}
buffer.malloc (jmax (bufferSize_, 16));
}
FileOutputStream::~FileOutputStream()
{
flush();
juce_fileClose (fileHandle);
}
int64 FileOutputStream::getPosition()
{
return currentPosition;
}
bool FileOutputStream::setPosition (int64 newPosition)
{
if (newPosition != currentPosition)
{
flush();
currentPosition = juce_fileSetPosition (fileHandle, newPosition);
}
return newPosition == currentPosition;
}
void FileOutputStream::flush()
{
if (bytesInBuffer > 0)
{
juce_fileWrite (fileHandle, buffer, bytesInBuffer);
bytesInBuffer = 0;
}
juce_fileFlush (fileHandle);
}
bool FileOutputStream::write (const void* const src, const int numBytes)
{
if (bytesInBuffer + numBytes < bufferSize)
{
memcpy (buffer + bytesInBuffer, src, numBytes);
bytesInBuffer += numBytes;
currentPosition += numBytes;
}
else
{
if (bytesInBuffer > 0)
{
// flush the reservoir
const bool wroteOk = (juce_fileWrite (fileHandle, buffer, bytesInBuffer) == bytesInBuffer);
bytesInBuffer = 0;
if (! wroteOk)
return false;
}
if (numBytes < bufferSize)
{
memcpy (buffer + bytesInBuffer, src, numBytes);
bytesInBuffer += numBytes;
currentPosition += numBytes;
}
else
{
const int bytesWritten = juce_fileWrite (fileHandle, src, numBytes);
currentPosition += bytesWritten;
return bytesWritten == numBytes;
}
}
return true;
}
END_JUCE_NAMESPACE