Initial checkin. BFile subclass with some extra output functions.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5545 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,167 @@
|
|||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003 Tyler Dauwalder, [email protected]
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*! \file OutputFile.cpp
|
||||||
|
|
||||||
|
BFile subclass with some handy new output methods. (implementation)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "OutputFile.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
OutputFile::OutputFile(const char *path, uint32 open_mode)
|
||||||
|
: BFile(path, open_mode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
OutputFile::Write(const void *buffer, size_t size)
|
||||||
|
{
|
||||||
|
return BFile::Write(buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
OutputFile::WriteAt(off_t pos, const void *buffer, size_t size)
|
||||||
|
{
|
||||||
|
return BFile::WriteAt(pos, buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
OutputFile::Write(BDataIO &data, size_t size, size_t bufferSize)
|
||||||
|
{
|
||||||
|
status_t error = bufferSize > 0 ? B_OK : B_BAD_VALUE;
|
||||||
|
size_t bytes = 0;
|
||||||
|
if (!error) {
|
||||||
|
void *buffer = malloc(bufferSize);
|
||||||
|
error = buffer ? B_OK : B_NO_MEMORY;
|
||||||
|
if (!error) {
|
||||||
|
// Fudge the buffer size from here out if the requested
|
||||||
|
// number of bytes to write is smaller than the buffer
|
||||||
|
bufferSize = (size < bufferSize ? size : bufferSize);
|
||||||
|
// Zero
|
||||||
|
memset(buffer, 0, bufferSize);
|
||||||
|
// Write
|
||||||
|
while (bytes < size) {
|
||||||
|
ssize_t bytesRead = data.Read(buffer, bufferSize);
|
||||||
|
if (bytesRead >= 0) {
|
||||||
|
ssize_t bytesWritten = BFile::Write(buffer, bytesRead);
|
||||||
|
if (bytesWritten >= 0) {
|
||||||
|
bytes += bytesWritten;
|
||||||
|
} else {
|
||||||
|
error = status_t(bytesWritten);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error = status_t(bytesRead);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
return error ? ssize_t(error) : ssize_t(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
OutputFile::WriteAt(off_t pos, BDataIO &data, size_t size, size_t bufferSize)
|
||||||
|
{
|
||||||
|
status_t error = bufferSize > 0 ? B_OK : B_BAD_VALUE;
|
||||||
|
size_t bytes = 0;
|
||||||
|
if (!error) {
|
||||||
|
void *buffer = malloc(bufferSize);
|
||||||
|
error = buffer ? B_OK : B_NO_MEMORY;
|
||||||
|
if (!error) {
|
||||||
|
// Fudge the buffer size from here out if the requested
|
||||||
|
// number of bytes to write is smaller than the buffer
|
||||||
|
bufferSize = (size < bufferSize ? size : bufferSize);
|
||||||
|
// Zero
|
||||||
|
memset(buffer, 0, bufferSize);
|
||||||
|
// Write
|
||||||
|
while (bytes < size) {
|
||||||
|
ssize_t bytesRead = data.Read(buffer, bufferSize);
|
||||||
|
if (bytesRead >= 0) {
|
||||||
|
ssize_t bytesWritten = BFile::WriteAt(pos, buffer, bytesRead);
|
||||||
|
if (bytesWritten >= 0) {
|
||||||
|
bytes += bytesWritten;
|
||||||
|
pos += bytesWritten;
|
||||||
|
} else {
|
||||||
|
error = status_t(bytesWritten);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error = status_t(bytesRead);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
return error ? ssize_t(error) : ssize_t(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
OutputFile::Zero(size_t size, size_t bufferSize)
|
||||||
|
{
|
||||||
|
status_t error = bufferSize > 0 ? B_OK : B_BAD_VALUE;
|
||||||
|
size_t bytes = 0;
|
||||||
|
if (!error) {
|
||||||
|
void *buffer = malloc(bufferSize);
|
||||||
|
error = buffer ? B_OK : B_NO_MEMORY;
|
||||||
|
if (!error) {
|
||||||
|
// Fudge the buffer size from here out if the requested
|
||||||
|
// number of bytes to write is smaller than the buffer
|
||||||
|
bufferSize = (size < bufferSize ? size : bufferSize);
|
||||||
|
// Zero
|
||||||
|
memset(buffer, 0, bufferSize);
|
||||||
|
// Write
|
||||||
|
while (bytes < size) {
|
||||||
|
ssize_t bytesWritten = BFile::Write(buffer, bufferSize);
|
||||||
|
if (bytesWritten >= 0) {
|
||||||
|
bytes += bytesWritten;
|
||||||
|
} else {
|
||||||
|
error = status_t(bytesWritten);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
return error ? ssize_t(error) : ssize_t(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
OutputFile::ZeroAt(off_t pos, size_t size, size_t bufferSize)
|
||||||
|
{
|
||||||
|
status_t error = bufferSize > 0 ? B_OK : B_BAD_VALUE;
|
||||||
|
size_t bytes = 0;
|
||||||
|
if (!error) {
|
||||||
|
void *buffer = malloc(bufferSize);
|
||||||
|
error = buffer ? B_OK : B_NO_MEMORY;
|
||||||
|
if (!error) {
|
||||||
|
// Fudge the buffer size from here out if the requested
|
||||||
|
// number of bytes to write is smaller than the buffer
|
||||||
|
bufferSize = (size < bufferSize ? size : bufferSize);
|
||||||
|
// Zero
|
||||||
|
memset(buffer, 0, bufferSize);
|
||||||
|
// Write
|
||||||
|
while (bytes < size) {
|
||||||
|
ssize_t bytesWritten = BFile::WriteAt(pos, buffer, bufferSize);
|
||||||
|
if (bytesWritten >= 0) {
|
||||||
|
bytes += bytesWritten;
|
||||||
|
pos += bytesWritten;
|
||||||
|
} else {
|
||||||
|
error = status_t(bytesWritten);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
return error ? ssize_t(error) : ssize_t(bytes);
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003 Tyler Dauwalder, [email protected]
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*! \file OutputFile.h
|
||||||
|
|
||||||
|
BFile subclass with some handy new output methods. (declarations)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _OUTPUT_FILE_H
|
||||||
|
#define _OUTPUT_FILE_H
|
||||||
|
|
||||||
|
#include <File.h>
|
||||||
|
|
||||||
|
class OutputFile : public BFile {
|
||||||
|
public:
|
||||||
|
OutputFile(const char *path, uint32 open_mode);
|
||||||
|
|
||||||
|
static const size_t kDefaultBufferSize = 32 * 1024;
|
||||||
|
|
||||||
|
virtual ssize_t Write(const void *buffer, size_t size);
|
||||||
|
virtual ssize_t WriteAt(off_t pos, const void *buffer, size_t size);
|
||||||
|
ssize_t Write(BDataIO &data, size_t size,
|
||||||
|
size_t bufferSize = kDefaultBufferSize);
|
||||||
|
ssize_t WriteAt(off_t pos, BDataIO &data, size_t size,
|
||||||
|
size_t bufferSize = kDefaultBufferSize);
|
||||||
|
ssize_t Zero(size_t size, size_t bufferSize = kDefaultBufferSize);
|
||||||
|
ssize_t ZeroAt(off_t pos, size_t size,
|
||||||
|
size_t bufferSize = kDefaultBufferSize);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _OUTPUT_FILE_H
|
||||||
Reference in New Issue
Block a user