/*
        Copyright 2012 bigbiff/Dees_Troy TeamWin
        This file is part of TWRP/TeamWin Recovery Project.

        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/>.
*/

extern "C" {
        #include "libtar/libtar.h"
}
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

class twrpTar {
	public:
		int extract();
		int compress(string fn);
		int uncompress(string fn);
                int addFilesToExistingTar(vector <string> files, string tarFile);
		int createTar();
		int addFile(string fn, bool include_root);
		int entryExists(string entry);
		int closeTar(bool gzip);
		int createTarGZFork();
		int createTarFork();
		int extractTarFork();
		int splitArchiveFork();
                void setfn(string fn);
                void setdir(string dir);
	private:
		int createTGZ();
		int create();
		int Split_Archive();
		int removeEOT(string tarFile);
		int extractTar();
		int tarDirs(bool include_root);
		int Generate_Multiple_Archives(string Path);
		string Strip_Root_Dir(string Path);
		int extractTGZ();
		int openTar(bool gzip);
		int has_data_media;
		int Archive_File_Count;
		unsigned long long Archive_Current_Size;
		int getArchiveType(); // 1 for compressed - 0 for uncompressed
		TAR *t;
		FILE* p;
		int fd;
		string tardir;
		string tarfn;
		string basefn;
}; 
