//! \~\ingroup IO-Utils
//! \~\file pidatatransfer.h
//! \~\brief
//! \~english Class for send and receive PIByteArray via \a PIBaseTransfer
//! \~russian Класс для отправки и приема PIByteArray с помощью \a PIBaseTransfer
/*
    PIP - Platform Independent Primitives
    Class for send and receive PIByteArray via PIBaseTransfer
    Andrey Bychkov work.a.b@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 PIDATATRANSFER_H
#define PIDATATRANSFER_H

#include "pibasetransfer.h"


//! \~\ingroup IO-Utils
//! \~\brief
//! \~english Class for send and receive PIByteArray via \a PIBaseTransfer
//! \~russian Класс для отправки и приема PIByteArray с помощью \a PIBaseTransfer
//! \~\sa PIBaseTransfer
class PIP_EXPORT PIDataTransfer: public PIBaseTransfer {
	PIOBJECT_SUBCLASS(PIDataTransfer, PIBaseTransfer);

public:
	//! \~english Constructs byte-array transfer.
	//! \~russian Создает передачу массива байтов.
	PIDataTransfer() { ; }

	//! \~english Destructor
	//! \~russian Деструктор
	~PIDataTransfer() { ; }

	//! \~english Send data
	//! \~russian Отправить данные
	bool send(const PIByteArray & ba);

	//! \~english Get received data
	//! \~russian Получить принятые данные
	//! \~\note
	//! \~english The data will be valid only after the successful completion of receiving \a receiveFinished.
	//! \~russian Данные будут валидные только после успешного завершения приёма \a receiveFinished.
	const PIByteArray & data() { return data_; }

private:
	PIByteArray buildPacket(Part p) override;
	void receivePart(PIBaseTransfer::Part fi, PIByteArray ba, PIByteArray pheader) override;
	void beginReceive() override;
	PIByteArray data_;
};


#endif // PIDATATRANSFER_H
