#ifndef __SMARTCARD_H
#define __SMARTCARD_H

#ifndef __MASK_H
#include <mask.h>
#endif

#define MAX_SM_FIELDS 16

typedef enum {no_smartcard, ase_smartcard} smartcard_type;
typedef enum {no_smarterror, wrong_function, card_removed, no_power, wrong_card,
							wrong_password, password_blocked,invelid_handle, invalid_parameter,
							no_card, reset_card, protection_error, unknown_reader, no_reader,
							buffer_overflow, sevice_stopped, timeout_err, no_memory, new_card, unknown_err } smartcard_error;

class TSmart_card : public TObject
{
	smartcard_type _type;
	int _last_smart_field;
	int _num_fields;
	int _key_field;
	int _anno_field;
	int _ndoc_field;
	int _check_field;
	bool _has_pwd;
	bool _card_connected;
	int _input_field[MAX_SM_FIELDS];
	int _output_field[MAX_SM_FIELDS];
	int _prog_field[MAX_SM_FIELDS];
	TBit_array _prot_field;
	TString_array _tab_field;
	TString_array _values;
	TString16 _password;

	TString _ASE_reader_name;

	unsigned long ASEsearch();
	unsigned long ASEread(char ** buffer);
	unsigned long ASEwrite(char * buffer) const ;
	bool ASEloadlibrary();

protected:
	bool init();

public:
	smartcard_type type() const { return _type; }
	int anno_field() const { return _anno_field;}
	int ndoc_field() const { return _ndoc_field;}
	void display_error(smartcard_error error) const ;
	bool card_connected() const { return _card_connected; }
	const bool with_card(const TMask & m) { return m.get_bool(_check_field); }

	smartcard_error  connect_card();
	smartcard_error  disconnect_card();
	smartcard_error read();
	smartcard_error write() const ;

	smartcard_error check_key(const TMask & m);
	void mask2card(const TMask & m);
	void card2mask(TMask & m);
	void enable_prot_fields(TMask & m, bool on = true) const;
	void disable_prot_fields(TMask & m) const { enable_prot_fields(m, false); }

	const TString & get(int field) const { return _values.row(field);}
	int get_int(int field) const { return atoi(get(field));}
	void add2field(int field, real & val);
	void sub2field(int field, real & val) { add2field(field, -val);}

	TSmart_card();
	virtual ~TSmart_card() {}
};

#endif // __SMARTCARD_H