// Fichier : archive.cpp
#include "stdafx.h"
#include "archive.h"
#include "Fichier.h"

#include "minuxexception.h"

#include <iostream>
using namespace std;

Archive archive1;

bool ouvrir(char*archive,char*mode)
{
	archive1.farc=fopen(archive,mode);
	return (archive1.farc!=NULL);
}

void fermer()
{
	if(archive1.farc!=NULL)
		fclose(archive1.farc);
}

void creer_archive(char*archive)
{
	ouvrir(archive,"wb");
	int n=NOMBRE_MAGIQUE;
	fwrite(&n,1,sizeof(int),archive1.farc);
	fermer();
}

bool verifier_archive(char*archive)
{
	ouvrir(archive,"rb");	
	fread(&archive1.version,1,sizeof(int),archive1.farc);

	if(archive1.version != NOMBRE_MAGIQUE)
	{
		cout << "Format d'archive incorrect " << archive1.version;
		return false; // erreur
		fermer();
	}

	// catalogue	
	cout.width(30);
	cout << left << "Fichier";
	
	cout.width(15);
	cout << right << "Origine";

	cout.width(15);
	cout << right << "Archive";

	cout.width(8);
	cout << right << "Format";

	cout.width(8);
	cout << right << "Ratio";

	cout << endl;
	cout.fill('-');
	cout.width(78);
	cout << "" << endl;
	cout.fill(' ');

	Fichier f;
	while( f.lire_entete(archive1.farc) )
		f.afficher_entete();

	fermer();

	return true;
}

void extraire(char*destination,char*archive)
{
	if( ! verifier_archive(archive) )
	{
		printf("Extraction. Operation annulee\n");
		return;
	}

	if( ! ouvrir(archive,"rb") )
	{
		printf("Extraction. Operation annulee\n");
		return;
	}
	
	int n;
	printf("Extraction en cours ...\n");
	fread(&n,1,sizeof(int),archive1.farc);

	Fichier f;
	while( f.lire_entete(archive1.farc) )
	{
		f.afficher_entete();
		f.expanser(archive1.farc,destination);
	}
	fermer();
}

void ajouter_fichier(char*fichier,char*archive)
{
	if( ! verifier_archive(archive) )
	{
		printf("Ajout de %s. Operation annulee\n",fichier);
		return;
	}

	if( ! ouvrir(archive,"rb+") )
	{
		printf("Ajout de %s. Operation annulee\n",fichier);
		return;
	}
	fseek(archive1.farc,0,SEEK_END);

	try 
	{
		Fichier f;
		f.comprimer(fichier,archive1.farc);
	}
	catch(MinuxException e)
	{
		cerr << "Une erreur est survenue : " << e.message << endl;
	}
	
	fermer();
}