#pragma once
#define USEWIN32IOAPI

/*
#ifndef _WIN32
#ifndef __USE_FILE_OFFSET64
#define __USE_FILE_OFFSET64
#endif
#ifndef __USE_LARGEFILE64
#define __USE_LARGEFILE64
#endif
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#ifndef _FILE_OFFSET_BIT
#define _FILE_OFFSET_BIT 64
#endif
#endif
*/
#include "zconf.h"
#include "zip.h"
#include "unzip.h"
#ifdef _WIN32
#define USEWIN32IOAPI
#include "iowin32.h"
#endif
#define WRITEBUFFERSIZE (8192)
#define MAXFILENAME (256)
#define CASESENSITIVITY (0)

typedef struct Zip_struct
{
	char nombre[256];
	int size;
	int size_descom;
	int ratio;
	int compresion;
	BOOL encript;
}Zip_struct;
class Cigt_error;
class C_zip
{
public:
	enum
	{
		READ,
		WRITE,
		OWERWRITE
	};
	Cigt_error *igt_err;
	char nombre_zip[256];
	zipFile *zf;
	unzFile *uf;
	Cigt_zip(void);
	Cigt_zip(Cigt_error *err);
	~Cigt_zip(void);
	BOOL borrar_error;

	int nivel_compresion;//nivel de compresion
	BOOL abre_zip(char *filename,int parametro);//abre zip y deja el handle en zf
	BOOL addfile(char *newfile,char *dir_in_zip);//introduce  el archivo newfile con dir dentro del zip dir_in_zip
	BOOL descomprimir2file(char *file,char *fileout);//descomprime el archivo file y lo pone en archivo fileout
	BOOL descomprimir2file(char *file);//Descomprime el archivo file y lo pone en la ruta relativa del zip
	BOOL descomprimir2buff(char *file,BYTE **buf,int *nb );//Descomprime el archivo file y lo carga en buf
	BOOL descomprimir();//Descomprime el zip entero y lo pone en la ruta relativa del zip;
	Zip_struct* listar(int* n);//devuelve una estructura con informacion del contenido del zip,sinedo n el numero de archivos en el zip
	BOOL cierra_zip();//Cierra handle
	BOOL abre_zip_temp();//Crea un archivo vacio en la carpeta temporal de windows (el Path del archivo se puede obtener de la variable nombre_zip)
private:
	BOOL crea_dir(char *dir);
	BOOL descomprimir(char *file,char *fileout,BYTE **bufex,int *n);//descomprime del archivo filezip el archivo file y lo pone en  dirout o en el bufex si dirout==NULL
	BOOL cierra_zip_zf();//cierra el handle escritura
	BOOL cierra_zip_uf();//cierra handle lectura
	//funciones auxiliares
	int isLargeFile(char* filename);
	int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc);
	int filetime(char *f, tm_zip *tmzip, long *dt_);
	void change_file_date(const char *filename,uLong dosdate,tm_unz tmu_date);
};
BOOL lista_file_dir(char *dir,Cstr_array *lista_file,Cigt_error *err);//Lista todos los archivos que contiene la carpeta dir
BOOL lista_file_dir(char *dir,char *omite, Cstr_array *lista_file,Cigt_error *err);//Lista todos los archivos que contiene la carpeta dir omitiendo "omite"
BOOL es_dir(char *dir);//Comprueba si dir es una carpeta
BOOL del_File(char *file,Cigt_error *err);//Borra todos los archivos que contiene la carpeta dir