aboutsummaryrefslogtreecommitdiffstats
path: root/src/fs/output
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-08-07 18:35:57 +0200
committerMax Kellermann <max@duempel.org>2014-08-07 19:38:25 +0200
commitaafff8fd5c60476702466ba06281236222455167 (patch)
tree63aa212567b2b3d40ec5f43ea8c10af080b15de2 /src/fs/output
parent5ac2a699407a3e11344d0c024dbb774ec85eca15 (diff)
downloadmpd-aafff8fd5c60476702466ba06281236222455167.tar.gz
mpd-aafff8fd5c60476702466ba06281236222455167.tar.xz
mpd-aafff8fd5c60476702466ba06281236222455167.zip
fs/output, fs/TextFile: move to fs/io/
Diffstat (limited to 'src/fs/output')
-rw-r--r--src/fs/output/BufferedOutputStream.cxx143
-rw-r--r--src/fs/output/BufferedOutputStream.hxx71
-rw-r--r--src/fs/output/FileOutputStream.cxx135
-rw-r--r--src/fs/output/FileOutputStream.hxx68
-rw-r--r--src/fs/output/GzipOutputStream.cxx106
-rw-r--r--src/fs/output/GzipOutputStream.hxx71
-rw-r--r--src/fs/output/OutputStream.hxx38
-rw-r--r--src/fs/output/StdioOutputStream.hxx45
8 files changed, 0 insertions, 677 deletions
diff --git a/src/fs/output/BufferedOutputStream.cxx b/src/fs/output/BufferedOutputStream.cxx
deleted file mode 100644
index 088a3e279..000000000
--- a/src/fs/output/BufferedOutputStream.cxx
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include "BufferedOutputStream.hxx"
-#include "OutputStream.hxx"
-
-#include <stdarg.h>
-#include <string.h>
-#include <stdio.h>
-
-bool
-BufferedOutputStream::AppendToBuffer(const void *data, size_t size)
-{
- auto r = buffer.Write();
- if (r.size < size)
- return false;
-
- memcpy(r.data, data, size);
- buffer.Append(size);
- return true;
-}
-
-bool
-BufferedOutputStream::Write(const void *data, size_t size)
-{
- if (gcc_unlikely(last_error.IsDefined()))
- return false;
-
- if (AppendToBuffer(data, size))
- return true;
-
- if (!Flush())
- return false;
-
- if (AppendToBuffer(data, size))
- return true;
-
- return os.Write(data, size, last_error);
-}
-
-bool
-BufferedOutputStream::Write(const char *p)
-{
- return Write(p, strlen(p));
-}
-
-bool
-BufferedOutputStream::Format(const char *fmt, ...)
-{
- if (gcc_unlikely(last_error.IsDefined()))
- return false;
-
- auto r = buffer.Write();
- if (r.IsEmpty()) {
- if (!Flush())
- return false;
-
- r = buffer.Write();
- }
-
- /* format into the buffer */
- va_list ap;
- va_start(ap, fmt);
- size_t size = vsnprintf(r.data, r.size, fmt, ap);
- va_end(ap);
-
- if (gcc_unlikely(size >= r.size)) {
- /* buffer was not large enough; flush it and try
- again */
-
- if (!Flush())
- return false;
-
- r = buffer.Write();
-
- if (gcc_unlikely(size >= r.size)) {
- /* still not enough space: grow the buffer and
- try again */
- r.size = size + 1;
- r.data = buffer.Write(r.size);
- }
-
- /* format into the new buffer */
- va_start(ap, fmt);
- size = vsnprintf(r.data, r.size, fmt, ap);
- va_end(ap);
-
- /* this time, it must fit */
- assert(size < r.size);
- }
-
- buffer.Append(size);
- return true;
-}
-
-bool
-BufferedOutputStream::Flush()
-{
- if (!Check())
- return false;
-
- auto r = buffer.Read();
- if (r.IsEmpty())
- return true;
-
- bool success = os.Write(r.data, r.size, last_error);
- if (gcc_likely(success))
- buffer.Consume(r.size);
- return success;
-}
-
-bool
-BufferedOutputStream::Flush(Error &error)
-{
- if (!Check(error))
- return false;
-
- auto r = buffer.Read();
- if (r.IsEmpty())
- return true;
-
- bool success = os.Write(r.data, r.size, error);
- if (gcc_likely(success))
- buffer.Consume(r.size);
- return success;
-}
diff --git a/src/fs/output/BufferedOutputStream.hxx b/src/fs/output/BufferedOutputStream.hxx
deleted file mode 100644
index f2de758a2..000000000
--- a/src/fs/output/BufferedOutputStream.hxx
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef MPD_BUFFERED_OUTPUT_STREAM_HXX
-#define MPD_BUFFERED_OUTPUT_STREAM_HXX
-
-#include "check.h"
-#include "Compiler.h"
-#include "util/DynamicFifoBuffer.hxx"
-#include "util/Error.hxx"
-
-#include <stddef.h>
-
-class OutputStream;
-class Error;
-
-class BufferedOutputStream {
- OutputStream &os;
-
- DynamicFifoBuffer<char> buffer;
-
- Error last_error;
-
-public:
- BufferedOutputStream(OutputStream &_os)
- :os(_os), buffer(32768) {}
-
- bool Write(const void *data, size_t size);
- bool Write(const char *p);
-
- gcc_printf(2,3)
- bool Format(const char *fmt, ...);
-
- gcc_pure
- bool Check() const {
- return !last_error.IsDefined();
- }
-
- bool Check(Error &error) const {
- if (last_error.IsDefined()) {
- error.Set(last_error);
- return false;
- } else
- return true;
- }
-
- bool Flush();
-
- bool Flush(Error &error);
-
-private:
- bool AppendToBuffer(const void *data, size_t size);
-};
-
-#endif
diff --git a/src/fs/output/FileOutputStream.cxx b/src/fs/output/FileOutputStream.cxx
deleted file mode 100644
index dc4456d1f..000000000
--- a/src/fs/output/FileOutputStream.cxx
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include "FileOutputStream.hxx"
-#include "fs/FileSystem.hxx"
-#include "system/fd_util.h"
-#include "util/Error.hxx"
-
-#ifdef WIN32
-
-FileOutputStream::FileOutputStream(Path _path, Error &error)
- :path(_path),
- handle(CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr,
- TRUNCATE_EXISTING,
- FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,
- nullptr))
-{
- if (handle == INVALID_HANDLE_VALUE)
- error.FormatLastError("Failed to create %s", path.c_str());
-}
-
-bool
-FileOutputStream::Write(const void *data, size_t size, Error &error)
-{
- assert(IsDefined());
-
- DWORD nbytes;
- if (!WriteFile(handle, data, size, &nbytes, nullptr)) {
- error.FormatLastError("Failed to write to %s", path.c_str());
- return false;
- }
-
- if (size_t(nbytes) != size) {
- error.FormatLastError(ERROR_DISK_FULL,
- "Failed to write to %s", path.c_str());
- return false;
- }
-
- return true;
-}
-
-bool
-FileOutputStream::Commit(gcc_unused Error &error)
-{
- assert(IsDefined());
-
- CloseHandle(handle);
- return true;
-}
-
-void
-FileOutputStream::Cancel()
-{
- assert(IsDefined());
-
- CloseHandle(handle);
- RemoveFile(path);
-}
-
-#else
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-FileOutputStream::FileOutputStream(Path _path, Error &error)
- :path(_path),
- fd(open_cloexec(path.c_str(),
- O_WRONLY|O_CREAT|O_TRUNC,
- 0666))
-{
- if (fd < 0)
- error.FormatErrno("Failed to create %s", path.c_str());
-}
-
-bool
-FileOutputStream::Write(const void *data, size_t size, Error &error)
-{
- assert(IsDefined());
-
- ssize_t nbytes = write(fd, data, size);
- if (nbytes < 0) {
- error.FormatErrno("Failed to write to %s", path.c_str());
- return false;
- } else if ((size_t)nbytes < size) {
- error.FormatErrno(ENOSPC,
- "Failed to write to %s", path.c_str());
- return false;
- }
-
- return true;
-}
-
-bool
-FileOutputStream::Commit(Error &error)
-{
- assert(IsDefined());
-
- bool success = close(fd) == 0;
- fd = -1;
- if (!success)
- error.FormatErrno("Failed to commit %s", path.c_str());
-
- return success;
-}
-
-void
-FileOutputStream::Cancel()
-{
- assert(IsDefined());
-
- close(fd);
- fd = -1;
-
- RemoveFile(path);
-}
-
-#endif
diff --git a/src/fs/output/FileOutputStream.hxx b/src/fs/output/FileOutputStream.hxx
deleted file mode 100644
index 68174ec83..000000000
--- a/src/fs/output/FileOutputStream.hxx
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef MPD_FILE_OUTPUT_STREAM_HXX
-#define MPD_FILE_OUTPUT_STREAM_HXX
-
-#include "check.h"
-#include "OutputStream.hxx"
-#include "fs/AllocatedPath.hxx"
-
-#include <assert.h>
-
-#ifdef WIN32
-#include <windows.h>
-#endif
-
-class Path;
-
-class FileOutputStream final : public OutputStream {
- AllocatedPath path;
-
-#ifdef WIN32
- HANDLE handle;
-#else
- int fd;
-#endif
-
-public:
- FileOutputStream(Path _path, Error &error);
-
- ~FileOutputStream() {
- if (IsDefined())
- Cancel();
- }
-
-
- bool IsDefined() const {
-#ifdef WIN32
- return handle != INVALID_HANDLE_VALUE;
-#else
- return fd >= 0;
-#endif
- }
-
- bool Commit(Error &error);
- void Cancel();
-
- /* virtual methods from class OutputStream */
- bool Write(const void *data, size_t size, Error &error) override;
-};
-
-#endif
diff --git a/src/fs/output/GzipOutputStream.cxx b/src/fs/output/GzipOutputStream.cxx
deleted file mode 100644
index d05645d9e..000000000
--- a/src/fs/output/GzipOutputStream.cxx
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-#include "GzipOutputStream.hxx"
-#include "util/Error.hxx"
-#include "util/Domain.hxx"
-
-const Domain zlib_domain("zlib");
-
-GzipOutputStream::GzipOutputStream(OutputStream &_next, Error &error)
- :next(_next)
-{
- z.next_in = nullptr;
- z.avail_in = 0;
- z.zalloc = Z_NULL;
- z.zfree = Z_NULL;
- z.opaque = Z_NULL;
-
- constexpr int windowBits = 15;
- constexpr int gzip_encoding = 16;
-
- int result = deflateInit2(&z, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
- windowBits | gzip_encoding,
- 8, Z_DEFAULT_STRATEGY);
- if (result != Z_OK) {
- z.opaque = this;
- error.Set(zlib_domain, result, zError(result));
- }
-}
-
-GzipOutputStream::~GzipOutputStream()
-{
- if (IsDefined())
- deflateEnd(&z);
-}
-
-bool
-GzipOutputStream::Flush(Error &error)
-{
- /* no more input */
- z.next_in = nullptr;
- z.avail_in = 0;
-
- while (true) {
- Bytef output[4096];
- z.next_out = output;
- z.avail_out = sizeof(output);
-
- int result = deflate(&z, Z_FINISH);
- if (z.next_out > output &&
- !next.Write(output, z.next_out - output, error))
- return false;
-
- if (result == Z_STREAM_END)
- return true;
- else if (result != Z_OK) {
- error.Set(zlib_domain, result, zError(result));
- return false;
- }
- }
-}
-
-bool
-GzipOutputStream::Write(const void *_data, size_t size, Error &error)
-{
- /* zlib's API requires non-const input pointer */
- void *data = const_cast<void *>(_data);
-
- z.next_in = reinterpret_cast<Bytef *>(data);
- z.avail_in = size;
-
- while (z.avail_in > 0) {
- Bytef output[4096];
- z.next_out = output;
- z.avail_out = sizeof(output);
-
- int result = deflate(&z, Z_NO_FLUSH);
- if (result != Z_OK) {
- error.Set(zlib_domain, result, zError(result));
- return false;
- }
-
- if (z.next_out > output &&
- !next.Write(output, z.next_out - output, error))
- return false;
- }
-
- return true;
-}
diff --git a/src/fs/output/GzipOutputStream.hxx b/src/fs/output/GzipOutputStream.hxx
deleted file mode 100644
index 4f6d8b357..000000000
--- a/src/fs/output/GzipOutputStream.hxx
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef MPD_GZIP_OUTPUT_STREAM_HXX
-#define MPD_GZIP_OUTPUT_STREAM_HXX
-
-#include "check.h"
-#include "OutputStream.hxx"
-
-#include <assert.h>
-#include <zlib.h>
-
-class Error;
-class Domain;
-
-extern const Domain zlib_domain;
-
-/**
- * A filter that compresses data written to it using zlib, forwarding
- * compressed data in the "gzip" format.
- *
- * Don't forget to call Flush() before destructing this object.
- */
-class GzipOutputStream final : public OutputStream {
- OutputStream &next;
-
- z_stream z;
-
-public:
- /**
- * Construct the filter. Call IsDefined() to check whether
- * the constructor has succeeded. If not, #error will hold
- * information about the failure.
- */
- GzipOutputStream(OutputStream &_next, Error &error);
- ~GzipOutputStream();
-
- /**
- * Check whether the constructor has succeeded.
- */
- bool IsDefined() const {
- return z.opaque == nullptr;
- }
-
- /**
- * Finish the file and write all data remaining in zlib's
- * output buffer.
- */
- bool Flush(Error &error);
-
- /* virtual methods from class OutputStream */
- bool Write(const void *data, size_t size, Error &error) override;
-};
-
-#endif
diff --git a/src/fs/output/OutputStream.hxx b/src/fs/output/OutputStream.hxx
deleted file mode 100644
index 71311c71f..000000000
--- a/src/fs/output/OutputStream.hxx
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef MPD_OUTPUT_STREAM_HXX
-#define MPD_OUTPUT_STREAM_HXX
-
-#include "check.h"
-#include "Compiler.h"
-
-#include <stddef.h>
-
-class Error;
-
-class OutputStream {
-public:
- OutputStream() = default;
- OutputStream(const OutputStream &) = delete;
-
- virtual bool Write(const void *data, size_t size, Error &error) = 0;
-};
-
-#endif
diff --git a/src/fs/output/StdioOutputStream.hxx b/src/fs/output/StdioOutputStream.hxx
deleted file mode 100644
index e00db922f..000000000
--- a/src/fs/output/StdioOutputStream.hxx
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2003-2014 The Music Player Daemon Project
- * http://www.musicpd.org
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef MPD_STDIO_OUTPUT_STREAM_HXX
-#define MPD_STDIO_OUTPUT_STREAM_HXX
-
-#include "check.h"
-#include "OutputStream.hxx"
-#include "fs/AllocatedPath.hxx"
-
-#include <stdio.h>
-
-class StdioOutputStream final : public OutputStream {
- FILE *const file;
-
-public:
- StdioOutputStream(FILE *_file):file(_file) {}
-
- /* virtual methods from class OutputStream */
- bool Write(const void *data, size_t size,
- gcc_unused Error &error) override {
- fwrite(data, 1, size, file);
-
- /* this class is debug-only and ignores errors */
- return true;
- }
-};
-
-#endif