#ifndef __ARCHIVES_H
#define __ARCHIVES_H

#ifndef __STDIO_H
#include <stdio.h>
#endif

#ifndef __STRINGS_H
#include <strings.h>
#endif

///////////////////////////////////////////////////////////
// TArchive
///////////////////////////////////////////////////////////

class ALArchive;

// @doc EXTERNAL

// @class TArchive | Classe per effettuare compressione e archiviazione di dati
//
// @base public | TObject
class TArchive : public TObject

// @author:(INTERNAL) Angelo

// @access:(INTERNAL) Private Member
{
#if XVT_OS == XVT_OS_WIN
  // @ccost:(INTERNAL) BUFSIZE | 4096*7 | Dimensione del buffer di lettura/scrittura su dischetto
  enum { BUFSIZE = 4096*7 };
  // @cmember:(INTERNAL) Oggetto per la gestione di archivi (vedi <c ALArchive>)
  ALArchive* _arc;

  // @cmember Funzione per richiedere all'utente il dischetto e per controllare la
  //          corretta sequenza dei dischetti da inserire
  FILE* ask_disk(TFilename& name, int disk, char floppy, bool lettura) const;
  // @cmember Spezza il file in modo da farlo stare sul dischetto
  bool fsplit(const char* filename, char floppy, const char* desc = "") const;
  // @cmember Ricostruisce il file spezzato
  bool fbuild(const char* filename, char floppy) const;
#endif

// @access Protected Member
protected:
  
  // @cmember Ritorna la dimensione del file <p f>
  long fsize(FILE* f) const;         
             
  // @cmember Sposta il file nella directory dir
  bool move_file(const TFilename& file, const char* dir) const;
                   
  // @cmember Spezza il file.zip in modo da farlo stare sul dischetto
  bool fsplit_zip(const char* filename, char floppy, const char* desc = "") const;

  // @cmember Ricostruisce la lista dei file contenuti nel backup
  int build_backup_list(long firm, TString_array& fl) const;
  // @cmember Costruisce la lista delle directory da scompattare
  int build_restore_list(long firm, char floppy, TString_array& fl) const;
  
  bool copy_zipper(const char* dir) const;
  bool remove_zipper(const char* dir) const;
  void add_zipper_list(TString& str) const;

// @access Public Member
public:   

#if XVT_OS == XVT_OS_WIN
  // @cmember Effettua il backup della directory
  bool backup(const char* dir, char floppy, const char* desc);
  // @cmember Effettua il backup della ditta
  bool backup(long firm, char floppy, const char* desc);

  // @cmember Effettua il restore della directory
  bool restore(const char* dir, char floppy, bool temp);
  // @cmember Effettua il restore della ditta
  bool restore(long firm, char floppy, bool temp);

  // @cmember Interrompe le operazioni
  void stop_job();
#endif
  
  // @cmember Effettua il backup della directory
  bool zip(const char* dir, char floppy, const char* desc);
  // @cmember Effettua il backup della ditta
  bool zip(long firm, char floppy, const char* desc);

  // @cmember Effettua il restore della directory
  bool unzip(const char* dir, char floppy, bool temp);
  // @cmember Effettua il restore della ditta
  bool unzip(long firm, char floppy, bool temp);

  TArchive() { }
  virtual ~TArchive() { }
};           

#endif