icinga2/lib/base/stream.hpp

123 lines
2.3 KiB
C++
Raw Permalink Normal View History

Replace all existing copyright headers with `SPDX` headers I've used the following command to replace the original copyright header lines in a C-style comment block: ``` $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f -exec perl -pi -e 's{/\*[^*]*\(\s*c\s*\)\s*(\d{4})\s*Icinga\s+GmbH[^*]*\*/}{// SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n// SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + ``` For files that use shell-style comments (#) like CMakeLists.txt, I've used this command: ``` $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f -exec perl -pi -e 's{#.*\(\s*c\s*\)\s(\d{4})\sIcinga\s+GmbH.*}{# SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n# SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + ``` And for SQL files: ``` $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f \( -name '*.sql' \) -exec perl -pi -e 's{--.*\(c\)\s(\d{4})\sIcinga\sGmbH.*}{-- SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n-- SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + $ find . \( -type d \( -name '\..*' -o -name third-party -o -name scripts -o -name prefix -o -name malloc -o -name server -o -name docker -o -name build -o -name doc \) -prune \) -o -type f \( -name '*.sql' \) -exec perl -pi -e 's{-- Copyright \(c\)\s(\d{4})\sIcinga\s+Development\sTeam.*}{-- SPDX-FileCopyrightText: \1 Icinga GmbH <https://icinga.com>\n-- SPDX-License-Identifier: GPL-2.0-or-later}gi' {} + ```
2026-01-27 09:06:40 -05:00
// SPDX-FileCopyrightText: 2012 Icinga GmbH <https://icinga.com>
// SPDX-License-Identifier: GPL-2.0-or-later
2012-07-15 18:04:16 -04:00
2012-11-22 06:04:32 -05:00
#ifndef STREAM_H
#define STREAM_H
2012-07-15 18:02:31 -04:00
2014-05-25 10:23:35 -04:00
#include "base/i2-base.hpp"
#include "base/object.hpp"
#include <boost/signals2.hpp>
2021-02-02 04:16:04 -05:00
#include <condition_variable>
#include <mutex>
2013-03-15 13:21:29 -04:00
2012-07-15 18:02:31 -04:00
namespace icinga
{
class String;
class Stream;
enum ConnectionRole
{
RoleClient,
RoleServer
};
2017-12-31 01:22:16 -05:00
struct StreamReadContext
{
~StreamReadContext()
{
free(Buffer);
}
bool FillFromStream(const intrusive_ptr<Stream>& stream, bool may_wait);
void DropData(size_t count);
char *Buffer{nullptr};
size_t Size{0};
bool MustRead{true};
bool Eof{false};
};
enum StreamReadStatus
{
StatusNewItem,
StatusNeedData,
StatusEof
};
2012-07-15 18:02:31 -04:00
/**
2012-11-22 06:04:32 -05:00
* A stream.
2012-09-17 07:35:55 -04:00
*
* @ingroup base
2012-07-15 18:02:31 -04:00
*/
2017-12-31 01:22:16 -05:00
class Stream : public Object
2012-07-15 18:02:31 -04:00
{
public:
2014-11-07 06:32:25 -05:00
DECLARE_PTR_TYPEDEFS(Stream);
2012-11-22 06:04:32 -05:00
2012-07-15 18:02:31 -04:00
/**
2012-11-22 06:04:32 -05:00
* Reads data from the stream.
2012-07-15 18:02:31 -04:00
*
2017-12-14 09:37:20 -05:00
* @param buffer The buffer where data should be stored. May be nullptr if you're
2012-07-15 18:02:31 -04:00
* not actually interested in the data.
* @param count The number of bytes to read from the queue.
2012-11-22 06:04:32 -05:00
* @returns The number of bytes actually read.
2012-07-15 18:02:31 -04:00
*/
virtual size_t Read(void *buffer, size_t count) = 0;
2012-07-15 18:02:31 -04:00
/**
2012-11-22 06:04:32 -05:00
* Writes data to the stream.
2012-07-15 18:02:31 -04:00
*
* @param buffer The data that is to be written.
* @param count The number of bytes to write.
* @returns The number of bytes written
*/
virtual void Write(const void *buffer, size_t count) = 0;
2012-11-22 06:04:32 -05:00
2015-06-22 05:11:21 -04:00
/**
* Causes the stream to be closed (via Close()) once all pending data has been
* written.
*/
virtual void Shutdown();
2015-06-22 05:11:21 -04:00
2012-11-22 06:04:32 -05:00
/**
* Closes the stream and releases resources.
*/
virtual void Close();
2012-11-22 06:04:32 -05:00
/**
* Checks whether we've reached the end-of-file condition.
*
* @returns true if EOF.
*/
virtual bool IsEof() const = 0;
/**
* Waits until data can be read from the stream.
2018-02-13 11:29:48 -05:00
* Optionally with a timeout.
*/
2018-02-13 11:29:48 -05:00
bool WaitForData();
bool WaitForData(int timeout);
virtual bool SupportsWaiting() const;
virtual bool IsDataAvailable() const;
void RegisterDataHandler(const std::function<void(const Stream::Ptr&)>& handler);
StreamReadStatus ReadLine(String *line, StreamReadContext& context, bool may_wait = false);
protected:
void SignalDataAvailable();
private:
boost::signals2::signal<void(const Stream::Ptr&)> OnDataAvailable;
2021-02-02 04:16:04 -05:00
std::mutex m_Mutex;
std::condition_variable m_CV;
2012-07-15 18:02:31 -04:00
};
}
2012-11-22 06:04:32 -05:00
#endif /* STREAM_H */