diff --git a/src/apps/bin/makeudfimage/OutputFile.cpp b/src/apps/bin/makeudfimage/OutputFile.cpp new file mode 100644 index 0000000000..1dd143e132 --- /dev/null +++ b/src/apps/bin/makeudfimage/OutputFile.cpp @@ -0,0 +1,167 @@ +//---------------------------------------------------------------------- +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net +//---------------------------------------------------------------------- + +/*! \file OutputFile.cpp + + BFile subclass with some handy new output methods. (implementation) +*/ + +#include "OutputFile.h" + +#include +#include + +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); +} diff --git a/src/apps/bin/makeudfimage/OutputFile.h b/src/apps/bin/makeudfimage/OutputFile.h new file mode 100644 index 0000000000..151f906ce6 --- /dev/null +++ b/src/apps/bin/makeudfimage/OutputFile.h @@ -0,0 +1,35 @@ +//---------------------------------------------------------------------- +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net +//---------------------------------------------------------------------- + +/*! \file OutputFile.h + + BFile subclass with some handy new output methods. (declarations) +*/ + +#ifndef _OUTPUT_FILE_H +#define _OUTPUT_FILE_H + +#include + +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