/*
		Copyright 2013 to 2017 TeamWin
		TWRP 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 3 of the License, or
		(at your option) any later version.

		TWRP 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 TWRP.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _TWRPBACK_HPP
#define _TWRPBACK_HPP

#include <fstream>

class twrpback {
public:
	int adbd_fd;                                                             // adbd data stream
	twrpback(void);
	virtual ~twrpback(void);
	int backup(std::string command);                                         // adb backup stream
	int restore(void);                                                       // adb restore stream
	void adblogwrite(std::string writemsg);                                  // adb debugging log function
	void createFifos(void);                                                  // create fifos needed for adb backup
	void closeFifos(void);                                                   // close created fifos
	void streamFileForTWRP(void);                                            // stream file to twrp via bu
	void setStreamFileName(std::string fn);                                  // tell adb backup what file to load on storage
	void threadStream(void);                                                 // thread bu for streaming

private:
	int read_fd;                                                             // ors input fd
	int write_fd;                                                            // ors operation fd
	int ors_fd;                                                              // ors output fd
	int adb_control_twrp_fd;                                                 // fd for bu to twrp communication
	int adb_control_bu_fd;                                                   // fd for twrp to bu communication
	int adb_read_fd;                                                         // adb read data stream
	int adb_write_fd;                                                        // adb write data stream
	bool firstPart;                                                          // first partition in the stream
	FILE *adbd_fp;                                                           // file pointer for adb stream
	char cmd[512];                                                           // store result of commands
	char operation[512];                                                     // operation to send to ors
	std::ofstream adblogfile;                                                // adb stream log file
	std::string streamFn;
	typedef void (twrpback::*ThreadPtr)(void);
	typedef void* (*PThreadPtr)(void *);
	void adbloginit(void);                                                   // setup adb log stream file
	void close_backup_fds();                                                 // close backup resources
	void close_restore_fds();                                                // close restore resources
};

#endif // _TWRPBACK_HPP
