//! \~\ingroup IO
//! \~\{
//! \~\file piiostring.h
//! \~\brief
//! \~english PIIODevice wrapper around PIString
//! \~russian Обертка PIIODevice вокруг PIString
//! \~\}
/*
    PIP - Platform Independent Primitives
    PIIODevice wrapper around PIString
    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef PIIOSTRING_H
#define PIIOSTRING_H

#include "piiodevice.h"


//! \~\ingroup IO
//! \~\brief
//! \~english PIIODevice wrapper around PIString.
//! \~russian Обёртка PIIODevice вокруг PIString.
//! \~\details
//! \~english PIIOString provides a PIIODevice interface for reading from and writing to PIString objects.
//! \~russian PIIOString предоставляет интерфейс PIIODevice для чтения и записи объектов PIString.
class PIP_EXPORT PIIOString: public PIIODevice {
	PIIODEVICE(PIIOString, "");

public:
	//! \~english Constructs %PIIOString with "string" content and "mode" open mode.
	//! \~russian Создает %PIIOString с содержимым "string" и режимом открытия "mode".
	explicit PIIOString(PIString * string = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadOnly);

	//! \~english Constructs %PIIOString with "string" content only for read.
	//! \~russian Создает %PIIOString с содержимым "string" только для чтения.
	explicit PIIOString(const PIString & string);

	//! \~english Returns content
	//! \~russian Возвращает содержимое
	PIString * string() const { return str; }

	//! \~english Clear content string
	//! \~russian Очищает содержимое строки
	void clear();

	//! \~english Open "string" content with "mode" open mode
	//! \~russian Открывает содержимое "string" с режимом открытия "mode"
	bool open(PIString * string, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite);

	//! \~english Open "string" content only for read
	//! \~russian Открывает содержимое "string" только для чтения
	bool open(const PIString & string);

	//! \~english Returns if position is at the end of content.
	//! \~russian Возвращает, находится ли позиция в конце содержимого.
	bool isEnd() const;


	//! \~english Move read/write position to "position"
	//! \~russian Перемещает позицию чтения/записи на "position"
	void seek(llong position) { pos = position; }

	//! \~english Move read/write position to the beginning of the string
	//! \~russian Перемещает позицию чтения/записи на начало строки
	void seekToBegin();

	//! \~english Move read/write position to the end of the string
	//! \~russian Перемещает позицию чтения/записи на конец строки
	void seekToEnd();


	//! \~english Reads one text line and returns it.
	//! \~russian Читает одну текстовую строку и возвращает её.
	PIString readLine();

	//! \~english Inserts string "string" into content at current position.
	//! \~russian Вставляет строку "string" в содержимое буфера в текущую позицию.
	int writeString(const PIString & string);

	ssize_t bytesAvailable() const override;

protected:
	bool openDevice() override;
	ssize_t readDevice(void * read_to, ssize_t max_size) override;
	ssize_t writeDevice(const void * data, ssize_t max_size) override;
	DeviceInfoFlags deviceInfoFlags() const override { return PIIODevice::Sequential | PIIODevice::Reliable; }

	ssize_t pos    = 0;
	PIString * str = nullptr;
};

#endif // PIIOSTRING_H
