#ifndef __FILES_H
#define __FILES_H

#ifndef __EXTCTYPE_H
#include  <extctype.h>
#endif 

#ifndef __RECTYPES_H
#include  <rectypes.h>
#endif 

#ifndef __CONFIG_H
#include  <config.h>
#endif 

#define DESCPAR "FieldDescr"
#define DESCTAB "TabDescr"
#define DESCDIR "recdesc"

// @doc EXTERNAL

// @class TFile | Classe per la definizione dei metodi che comprendono tutte le
//                procedure per l'accesso fisico di basso livello ai file.
//
// @base public | TObject
class TFile : public TObject

// @author:(INTERNAL) Alex
  
// @access:(INTERNAL) Private Member  
{

  // @cmember:(INTERNAL) Descrittore del file
  SecDef* _file;
  // @cmember:(INTERNAL) Lunghezza del record
  int _len;
  // @cmember:(INTERNAL) Offset iniziale del file in settori
  int _base;

  // @access Public Member
public:
  // @cmember Apre il file specificato
  void open(const char* name, TFilelock lockmode = _manulock);
  // @cmember Controlla se il file specificato e' corretto (TRUE se non vi sono errori)
  bool verify(const char* name);
  // @cmember Crea il file specificato
  void create(const char* name, TRecnotype nrecord = 10);
  // @cmember Cambia le dimensioni di un file
  void chsize(const char* name, TRecnotype nrecord);
  // @cmember Chiude il file
  void close();
  // @cmember Elimina il file specificato
  void unlink(const char* name);
  // @cmember Legge un record dal file
  void read(char* record, TRecnotype recnum, TReclock lock = _nolock);
  // @cmember Scrive un record sul file
  void write(char* record, TRecnotype recnum, TReclock lock = _nolock);
  // @cmember Ritorna lo stato di errore del file
  int  status() const ;
  // @cmember Ritorna l'offset di base
  int& base()
  { return _base; }
  // @cmember Ritorna la lunghezza del record
  int& len()
  { return _len; }
  // @cmember Controlla che non vi siano errori nel file aperto (TRUE se tutto normale)
  bool ok() const
  { return status() == NOERR; }
  // @cmember Controlla se vi sono errori nel file aperto (TRUE se non ci sono errori)
  bool error() const 
  { return status() != NOERR; }

  // @cmember Costruttore
  TFile(int lenrec = 0, int base = 0);
  // @cmember Distruttore
  virtual ~TFile();
};


// @doc EXTERNAL

// @class TDir | Classe per la gestione del file "dir.gen"
//
// @base public | TObject
class TDir : public TObject

// @author:(INTERNAL) Sandro

// @access:(INTERNAL) Private Member
{  

  // @cmember:(INTERNAL) Descrittore del file
  FileDes _dir;
  // @cmember:(INTERNAL) Numero di file presenti
  int _num;
  // @cmember:(INTERNAL) Appartenenza al direttorio comune (TRUE) o a quello della ditta
  bool _com;

  // @access Public Member
public:
  // @cmember Aggiorna l'oggetto TDir con i paramtri del file indicato
  void get(int nfile, TReclock lock = _nolock, TDirtype dirtype = _nordir, TDirop op = _nordirop);
  // @cmember Aggiorna il file indicato con i parametri passati
  void put(int nfile, TDirtype dirtype = _nordir, TDirop op = _nordirop);
  // @cmember Azzera i parametri del file selezionato
  void zero();

  // @cmember Setta il nome del file
  void set_name (const char * name);
  // @cmember Setta l'EOX del file
  void set_eox(const RecNoType eox);
  void reset_eox();
  // @cmember Setta l'EOD del file
  void set_eod(const RecNoType eod);
  // @cmember Setta la lunghezza del file
  void set_len(const UINT16 len);
  void set_flags(const RecNoType f);
  // @cmember Setta il file con i parametri passati
  void set (const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc);

  // @cmember Stampa la descrizione del direttorio sull'output selezionato
  virtual void print_on(ostream& out) const;
  // @cmember Legge la descrizione del direttorio dall' input selezionato
  virtual void read_from(istream& in);

  // @cmember Ritorna il nome del file selezionato
  const char* name() const;
  // @cmember Ritorna il nome dei file dati selezionato
  const char* filename() const;
  // @cmember Ritorna la descrizione del file selezionato
  const char* des() const;
  // @cmember Ritorna la descrizione della tabella
  static const char* tab_des(const char* tabname);
  // @cmember Ritorna l'espressione associata al file selezionato
  const char* expr() const;
  // @cmember Ritorna l'EOD del file selezionato
  TRecnotype eod() const;
  // @cmember Ritorna l'EOX del file selezionato
  TRecnotype eox() const;
  // @cmember Ritorna il flag del file selezionato
  long flags() const;
  // @cmember Ritorna la lunghezza del tracciato record in bytes
  word len() const;
  // @cmember Ritorna lo stato d'errore del file
  int status(TDirtype dirtype = _nordir) const ;
  // @cmember Ritorna il numero di file presenti
  int  num() const { return _num;}
  // @cmember Ritorna il numero di file presenti nella directory <p dirtype>
  int items(TDirtype dirtype = _nordir) const;
  // @cmember Ritorna il descrittore del file "dir.gen"
  const FileDes& filedesc() const { return _dir; }
  FileDes& filedesc() { return _dir; }
  // @cmember Controlla se il file appartiene ai dati comuni. Valido solo se
  //          la get e' stata effettuata con _sysdirop
  bool is_com() const { return _com; }
  // @cmember Controlla se il file appartiene alla ditta. Valido solo se
  //          la get e' stata effettuata con _sysdirop
  bool is_firm() const { return !_com; }
  // @cmember Controlle se il file e' valido (nome esistente e dimensione
  //          diversa da 0)
  bool is_valid() { return name()[0] > ' ' && len() > 0; }
  // @cmember Controlla se il file e' attivato dalla chiave hardware.
  //          Valido solo se prefhnd e settato a ""
  bool is_active() const;
  // @cmember Duplica il tracciato record
  virtual TObject* dup() const { return new TDir(*this);}

  // @cmember Costruttore di copia
  TDir(const TDir & d);
  // @cmember Costruttore "sicuro"
  TDir(int logicnum);
  // @cmember Costruttore
  TDir();
  // @cmember Distruttore
  virtual ~TDir();
};


// @doc EXTERNAL

// @class TTrec | Classe per le gestione dei tracciati record dei file
//
// @base public | TSortable
class TTrec : public TSortable

// @author:(INTERNAL) Sandro

// @access:(INTERNAL) Private Member
{  

  // @cmember:(INTERNAL) Descrittore del tracciato record
  RecDes  _rec;
  // @cmember:(INTERNAL) Numero del file di appartenenza
  int _num;
  // @cmember:(INTERNAL) Puntatore al TConfig delle descrizioni
  TConfig* _des;
  // @cmember:(INTERNAL) Nome della tabella 
  TString  _tab;

  // @access Protected Member
protected:
  // @cmember Permette di comparare due oggetti (vedi classe <c TSortable>)
  int compare(const TSortable& a) const;

  // @access Public Member
public:
  // @cmember Assegna all'oggetto TTrec il tracciato record del file indicato
  void get(int nfile, TDirtype dirtype = _nordir);
  // @cmember Setta il file indicato con il tracciato record dell'oggetto
  void put(int nfile, TDirtype dirtype = _nordir);
  // @cmember Azzera il tracciato record
  void zero();
  // @cmember Costruisce i puntatori per la ricerca dei campi
  void rehash();
  // @cmember Ritorna lo stato di errore del file
  int status(TDirtype dirtype = _nordir) const ;
  // @cmember Ritorna il numero del file
  int num() const
  { return _num;}
  // @cmember Cambia il numero del file
  void set_num(int num)
  {_num = num;}
  // @cmember Ritorna il numero del campo <p fieldname>
  int field(const char* fieldname) const;
  // @cmember Ritorna il descrittore del tracciato record
  const RecDes& rec() const { return _rec;}
  RecDes& rec() { return _rec;}
  // @cmember Assegna un oggetto TTrec
  TTrec& operator =(const TTrec& b);
  // @cmember Ritorna il numero di campi del tracciato record
  int fields() const { return _rec.NFields; }
  // @cmember Ritorna il numero di chiavi di ordinamento del tracciato record
  int keys() const { return _rec.NKeys; }
  // @cmember Assegna il numero di campi del tracciato record
  void set_fields(int nfields)
  { _rec.NFields = short(nfields);}
  // @cmember Assegna il numero di chiavi di ordinamento del tracciato record
  void set_keys(int nkeys)
  { _rec.NKeys = short(nkeys);}
  // @cmember Ritorna una token string contenente la descrizione del campo
  const char* fielddef(int fld) const;
  // @cmember Ritorna una stringa contenente la chiave
  const char* keydef(int key) const;
  // @cmember Ritorna la lunghezza del record
  int len() const;
  
#ifndef FOXPRO
  // @cmember Aggiorna la chiave. <p desc> e' una token string
  void update_keydef(int key, TToken_string& desc);
  // @cmember Aggiorna il campo. <p desc> e' una token string
  void update_fielddef(int nfld, TToken_string& desc);
  // @cmember Stampa il tracciato record sull'output selezionato
  virtual void print_on(ostream& out) const;
  // @cmember Legge il tracciato record da input selezionato
  virtual void read_from(istream& in);
  void set_des(TConfig* c = NULL, const char* tab = "") { _des = c; _tab = tab;}
#endif
  // @cmember Duplica il descrittore di file
  virtual TObject* dup() const { return new TTrec(*this);}

  // @cmember Costruttore
  TTrec(const TTrec & r);
  // @cmember Costruttore
  TTrec(int logicnum, TDirtype dirtype = _nordir);
  TTrec();
  // @cmember Distruttore
  virtual ~TTrec();
};

#endif // __FILES_H