ba1500?.* Gestione autorizzazioni basate sulle date

ba1600.*   Fascicolatore con versione sottomoduli
ba1700.*   Gestione versione sottomodule
bacnv.cpp  Corretta conversione uffici unici delle imposte
           Governo ladro: meno uffici, meno imposte, piu' quote latte!


git-svn-id: svn://10.65.10.50/trunk@5749 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1997-12-15 15:11:40 +00:00
parent 5e3d422b57
commit 484f0244fc
9 changed files with 933 additions and 334 deletions

View File

@ -1,8 +1,10 @@
#include <applicat.h>
#include <date.h>
#include <form.h>
#include <modaut.h>
#include <msksheet.h>
#include <prefix.h>
#include <printer.h>
#include <utility.h>
#include <urldefid.h>
@ -11,6 +13,7 @@
#include "ba1.h"
#include "ba1500.h"
#include "ba1500a.h"
#include "ba1600.h"
#define USERADR 26952
#define AGAADR 26953
@ -23,52 +26,11 @@
#define BITTEST(w,p) (((w) & (0x0001 << (p))) != 0)
#define BITSET(w,p,v) ((v) ? ((w) |= (0x0001 << (p))) : ((w) &= (~(0x0001 << (p)))))
enum KeyType { _user_key, _aga_key, _prassi_key, _procom_key};
class TDongle : public TObject
{
word _serno, _max_users;
KeyType _type;
word _eprom[64];
TDate _last_update;
#if XVT_OS == XVT_OS_SCOUNIX
word _port;
#endif
TBit_array _module;
bool _dirty;
protected:
bool already_programmed() const;
bool write_octect(word reg, word data[4]) const;
public:
bool login();
bool logout();
word number() const { return _serno; }
bool ok() const { return _serno != 0xFFFF; }
word max_users() const { return _max_users; }
void garble(word data[4]) const;
KeyType type() const { return _type; }
bool active(word module) const { return _module[module]; }
void activate(word module, bool on = TRUE) { _module.set(module, on); _dirty = TRUE; }
void deactivate(word module) { activate(module, FALSE); }
void set_max_users(word u) { _max_users = u; _dirty = TRUE; }
bool dirty() const { return _dirty; }
bool burn();
TDongle();
virtual ~TDongle() { logout(); }
};
TDongle::TDongle()
: _type(_user_key), _serno(0xFFFF), _dirty(FALSE), _max_users(1)
: _type(_user_key), _serno(0xFFFF), _dirty(FALSE),
_max_users(1), _year_assist(1997)
{
memset(_eprom, 0, sizeof(_eprom));
}
@ -92,10 +54,10 @@ bool TDongle::already_programmed() const
memcpy(data, &_eprom[60], sizeof(data));
garble(data);
if (data[0] != 0xFACE)
if (data[0] < 1997 || data[0] > 2997)
return FALSE;
if (data[1] == 0 || data[1] > 255)
if (data[1] == 0 || data[1] >= 10000)
return FALSE;
const TDate today(TODAY);
@ -156,13 +118,14 @@ bool TDongle::login()
{
#ifdef DBG
if (data[0] == 0x3283)
{
_type = _aga_key;
{
// _type = _aga_key;
_serno = 0;
}
#endif
}
#else
if (_type == _user_key)
ok = FALSE;
#endif
}
}
@ -204,23 +167,35 @@ bool TDongle::login()
break;
}
// Legge numero massimo di utenti
// Legge anno di assitenza e numero massimo di utenti
memcpy(data, &_eprom[60], sizeof(data));
garble(data);
_max_users = data[1];
if (_max_users <= 0 || _max_users > 255)
_max_users = 1;
garble(data);
const long& giulio = (const long&)data[2];
const long yyyymmdd = _last_update.julian2date(giulio);
_last_update = yyyymmdd;
if (already)
{
_year_assist = data[0];
_max_users = data[1];
const long& giulio = (const long&)data[2];
const long yyyymmdd = _last_update.julian2date(giulio);
_last_update = yyyymmdd;
}
else
{
_max_users = 1;
_last_update = TDate(TODAY);
_year_assist = _last_update.year();
}
}
else
{
_module.set(MAX_AUT-1);
_module.set();
if (_type != _user_key)
{
_module.set(MAX_AUT);
_module.set(); // Activate all modules
}
_max_users = 1;
_last_update = TDate(TODAY);
_year_assist = _last_update.year();
}
}
#endif
@ -270,9 +245,9 @@ bool TDongle::burn()
{
memcpy(data, &_eprom[60], sizeof(data));
garble(data);
if (data[0] != 0xFACE)
return error_box("Checksum error.");
if (data[1] == 0 || data[1] > 255)
if (data[0] < 1997 || data[0] > 2997)
return error_box("On Line Assistance error.");
if (data[1] == 0 || data[1] >= 10000)
return error_box("Bad users number.");
const long& val = (const long&)data[2];
const long yyyymmdd = today.julian2date(val);
@ -281,7 +256,7 @@ bool TDongle::burn()
return error_box("Too late sir: key has already expired!");
}
data[0] = 0xFACE;
data[0] = _year_assist;
data[1] = _max_users;
long& val = (long&)data[2];
val = today.date2julian();
@ -364,7 +339,7 @@ TInformazione_moduli::TInformazione_moduli()
}
}
const char * TInformazione_moduli::get_description_by_order(int index)
const char* TInformazione_moduli::get_description_by_order(int index)
{
if (index >= 0 && index < _infos.items())
return _infos.row(index).get(0);
@ -372,7 +347,7 @@ const char * TInformazione_moduli::get_description_by_order(int index)
return "";
}
const char * TInformazione_moduli::get_name_by_order(int index)
const char* TInformazione_moduli::get_name_by_order(int index)
{
if (index >= 0 && index < _infos.items())
return _infos.row(index).get(1);
@ -388,17 +363,105 @@ int TInformazione_moduli::get_module_by_order(int index)
return -1;
}
const char * TInformazione_moduli::get_description(int module)
TDongle::KeyType TInformazione_moduli::get_owner(int module) const
{
if (module >= 40 && module <= 46)
return TDongle::_procom_key;
const int aut[] = { CMAUT, ATAUT, POAUT, AFAUT, TCAUT, TMAUT,
VEAUT, MGAUT, ORAUT, EFAUT, DBAUT, SVAUT, -1 };
for (int a = 0; aut[a] >= 0; a++)
if (module == aut[a])
return TDongle::_aga_key;
return TDongle::_prassi_key;
}
bool TInformazione_moduli::test_owner(int module, TDongle::KeyType owner) const
{
TDongle::KeyType ow = get_owner(module);
bool yes = owner == ow || (owner == TDongle::_aga_key && ow == TDongle::_prassi_key);
return yes;
}
const char* TInformazione_moduli::get_description(int module)
{ return get_description_by_order(_index[module]); }
const char * TInformazione_moduli::get_name(int module)
const char* TInformazione_moduli::get_name(int module)
{ return get_name_by_order(_index[module]); }
int TInformazione_moduli::get_index(int module)
{ return _index[module]; }
///////////////////////////////////////////////////////////
//
// TForm richiesta attivazione
///////////////////////////////////////////////////////////
class TRequest_form : public TForm
{
public:
void update_serno(const TString& serno);
void update_dongle(const TDongle& dongle);
void print_footer();
TRequest_form(const char* name);
virtual ~TRequest_form() { }
};
TRequest_form::TRequest_form(const char* name)
: TForm(name)
{
const TPrint_section& header = section('H', odd_page);
const TPrint_section& footer = section('F', odd_page);
int riga[66];
int y1 = header.height()-2;
int y2 = printer().formlen() - footer.height();
if ((y2-y1) & 0x1) y2--; // Forza un numero pari di righe
for (int i = 0; ; i++)
{
riga[i] = y1 + 2*(i+1);
if (riga[i] >= y2-1)
{
riga[i] = 0;
break;
}
}
genera_intestazioni(odd_page, y1+1);
genera_fincatura(odd_page, y1, y2, riga);
}
void TRequest_form::update_serno(const TString& num)
{
const TDate today(TODAY);
TForm_item& data = find_field('H', odd_page, 101);
data.set(today.string());
TForm_item& serno = find_field('H', odd_page, 102);
serno.set(num);
}
void TRequest_form::update_dongle(const TDongle& dongle)
{
TForm_item& year = find_field('H', odd_page, 103);
TString str;
str << "31-12-" << (int)dongle.year_assist();
year.set(str);
TForm_item& user = find_field('H', odd_page, 104);
str.format("%d", dongle.max_users());
user.set(str);
}
void TRequest_form::print_footer()
{
set_footer(odd_page, TRUE);
printer().formfeed();
}
///////////////////////////////////////////////////////////
// TAttivazione_moduli
///////////////////////////////////////////////////////////
class TAttivazione_moduli : public TApplication
@ -408,6 +471,8 @@ class TAttivazione_moduli : public TApplication
TDongle _dongle;
word _serno;
word _wanted_users, _wanted_assist;
protected:
virtual bool create() ;
@ -417,7 +482,8 @@ protected:
void garble(word k[4]) const;
void garble(word n, TString& str) const;
void garble_users(word u, TString& str) const;
void garble_user(word u, TString& str) const;
void garble_year(word u, TString& str) const;
word& serno() { return _serno; }
@ -431,18 +497,29 @@ protected:
static void keyext(const TString & s, word * v);
static void encode_second_key();
static bool user_hnd(TMask_field & f, KEY k);
static bool date_hnd(TMask_field & f, KEY k);
static bool serno_hnd(TMask_field & f, KEY k);
static bool decode_hnd(TMask_field & f, KEY k);
static bool activate_hnd(TMask_field & f, KEY k);
static bool user_hnd(TMask_field& f, KEY k);
static bool date_hnd(TMask_field& f, KEY k);
static bool serno_hnd(TMask_field& f, KEY k);
static bool decode_hnd(TMask_field& f, KEY k);
static bool activate_hnd(TMask_field& f, KEY k);
static bool k_notify(TSheet_field & f, int r, KEY k);
static bool k_notify(TSheet_field& f, int r, KEY k);
static bool change_users_handler(TMask_field&, KEY key);
static bool maxuser_handler(TMask_field& fld, KEY key);
static bool change_assist_handler(TMask_field&, KEY key);
static bool assist_handler(TMask_field& fld, KEY key);
static bool print_handler(TMask_field& fld, KEY key);
static bool aggiorna_listino_handler(TMask_field& fld, KEY key);
protected:
void print_request();
void print_answer();
public:
TAttivazione_moduli() : _msk(NULL) { }
public:
virtual void print();
TAttivazione_moduli() : _msk(NULL), _wanted_users(0), _wanted_assist(0) { }
virtual ~TAttivazione_moduli() { }
};
@ -452,7 +529,7 @@ int TAttivazione_moduli::build_sheet(bool on)
{
int nmod = 0;
TSheet_field& sf = (TSheet_field&)_msk->field(F_MODULI);
for (int i = 0; i < _im->items(); i++)
for (int i = 0; i < MAX_AUT; i++)
{
const TFixed_string d(_im->get_description_by_order(i));
if (d.blank())
@ -494,60 +571,76 @@ void TAttivazione_moduli::garble(word n, TString& str) const
str.format("%04X%04X", data[0], data[1]);
}
void TAttivazione_moduli::garble_users(word u, TString& str) const
void TAttivazione_moduli::garble_user(word u, TString& str) const
{
const TDate today(_msk->get(F_DT));
const long val = today.date2julian();
word data[4];
data[0] = word(_msk->get_int(F_SN));
data[1] = u;
data[2] = 0;
data[3] = 0;
data[2] = word(val >> 16);
data[3] = word(val & 0xFFFF);
garble(data);
str.format("%04X%04X", data[0], data[1]);
}
void TAttivazione_moduli::garble_year(word y, TString& str) const
{
const TDate today(_msk->get(F_DT));
const long val = today.date2julian();
word data[4];
data[0] = y;
data[1] = word(_msk->get_int(F_SN));
data[2] = word(val >> 16);
data[3] = word(val & 0xFFFF);
garble(data);
str.format("%04X%04X", data[0], data[1]);
}
void TAttivazione_moduli::build_key_column()
{
TSheet_field& sf = (TSheet_field&)_msk->field(F_MODULI);
TSheet_field& sf = _msk->sfield(F_MODULI);
sf.enable_column(F_KEY, FALSE);
TString16 tmp;
for (int i = sf.items()-1; i >= 0; i--)
FOR_EACH_SHEET_ROW_BACK(sf, i, riga)
{
if (!sf.cell_disabled(i, 1))
{
TToken_string& riga = sf.row(i);
int module = riga.get_int(2);
int module = riga->get_int(2);
garble(module, tmp);
riga.add(tmp, 3);
riga->add(tmp, 3);
}
}
sf.force_update();
_msk->set(F_USERS, _dongle.max_users());
_msk->set(F_ASSIST, _dongle.year_assist());
}
bool TAttivazione_moduli::burn_dongle()
{
bool ok = _dongle.type() == _user_key;
bool ok = _dongle.type() == TDongle::_user_key;
if (ok)
{
TString16 str, key;
TSheet_field& sf = _msk->sfield(F_MODULI);
for (int i = 0; i < sf.items(); i++)
FOR_EACH_SHEET_ROW(sf, i, riga)
{
TToken_string& riga = sf.row(i);
key = riga.get(3); key.trim();
key = riga->get(3); key.trim();
if (key.not_empty())
{
const int module = riga.get_int(2);
const int module = riga->get_int(2);
garble(module, str);
if (key == str)
{
if (!_dongle.active(module) &&
yesno_box("Confermare l'attivazione del modulo %d:\n%s",
module, riga.get(0)))
module, riga->get(0)))
{
_dongle.activate(module);
}
@ -556,7 +649,7 @@ bool TAttivazione_moduli::burn_dongle()
{
if (_dongle.active(module) &&
yesno_box("Confermare la disattivazione del modulo %d:\n%s",
module, riga.get(0)))
module, riga->get(0)))
{
_dongle.deactivate(module);
}
@ -581,10 +674,10 @@ bool TAttivazione_moduli::maxuser_handler(TMask_field& fld, KEY key)
if (key == K_TAB && fld.focusdirty())
{
const int utenti = atoi(fld.get());
if (utenti > 0 && utenti <= 255)
if (utenti > 0 && utenti < 10000)
{
TString16 str;
app().garble_users(utenti, str);
app().garble_user(utenti, str);
fld.mask().set(102, str);
}
else
@ -597,17 +690,16 @@ bool TAttivazione_moduli::change_users_handler(TMask_field& fld, KEY key)
{
if (key == K_SPACE)
{
TMask m("Utenti", 1, 40, 6);
m.add_number(101, 0, "Utenti ", 1, 1, 3, "U");
TMask m("Utenti", 1, 40, 5);
m.add_number(101, 0, "Utenti ", 1, 1, 4, "U");
m.add_string(102, 0, "Codice ", 1, 2, 8, "U");
m.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
TDongle& dongle = app().dongle();
m.set(101, dongle.max_users());
if (dongle.type() != _user_key)
if (dongle.type() == TDongle::_user_key)
m.set(101, dongle.max_users());
else
{
m.set_handler(101, maxuser_handler);
m.disable(102);
@ -615,29 +707,123 @@ bool TAttivazione_moduli::change_users_handler(TMask_field& fld, KEY key)
if (m.run() == K_ENTER)
{
if (dongle.type() == _user_key)
const int utenti = m.get_int(101);
if (dongle.type() == TDongle::_user_key)
{
const int utenti = m.get_int(101);
if (utenti > 0 && utenti <= 255)
{
TString16 str;
app().garble_users(utenti, str);
if (str == m.get(102))
{
dongle.set_max_users(utenti);
fld.mask().set(F_USERS, utenti);
}
if (utenti > 0 && utenti < 10000)
{
if (m.field(102).empty())
{
app()._wanted_users = utenti;
if (utenti > 0)
fld.message_box("Premere il bottone '%s'\n"
"per richiedere l'attivazione di %d utenti.",
fld.mask().field(F_PRINT).prompt(), utenti);
}
else
error_box("Codice errato");
{
TString16 str;
app().garble_user(utenti, str);
if (str == m.get(102))
{
dongle.set_max_users(utenti);
fld.mask().set(F_USERS, utenti);
}
else
fld.error_box("Codice errato");
}
}
else
error_box("Numero di utenti errato");
fld.error_box("Numero di utenti errato");
}
else
app()._wanted_users = utenti;
}
}
return TRUE;
}
bool TAttivazione_moduli::assist_handler(TMask_field& fld, KEY key)
{
bool ok = TRUE;
if (key == K_TAB && fld.focusdirty())
{
const int year = atoi(fld.get());
if (year > 1997 && year <= 2997)
{
TString16 str;
app().garble_year(year, str);
fld.mask().set(102, str);
}
else
ok = fld.error_box("Anno errato");
}
return ok;
}
bool TAttivazione_moduli::change_assist_handler(TMask_field& fld, KEY key)
{
if (key == K_SPACE)
{
TMask m("Assistenza", 1, 40, 5);
m.add_number(101, 0, "Anno ", 1, 1, 4, "U");
m.add_string(102, 0, "Codice ", 1, 2, 8, "U");
m.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
TDongle& dongle = app().dongle();
if (dongle.type() == TDongle::_user_key)
m.set(101, dongle.year_assist());
else
{
m.set_handler(101, assist_handler);
m.disable(102);
}
if (m.run() == K_ENTER)
{
const word year = m.get_int(101);
if (dongle.type() == TDongle::_user_key)
{
if (year > dongle.year_assist() && year <= 2997)
{
if (m.field(102).empty())
{
app()._wanted_assist = year;
fld.message_box("Premere il bottone '%s'\n"
"per rinnovare il contratto di assistenza per l'anno %u.",
fld.mask().field(F_PRINT).prompt(), year);
}
else
{
TString16 str;
app().garble_year(year, str);
if (str == m.get(102))
{
dongle.set_year_assist(year);
fld.mask().set(F_ASSIST, year);
}
else
fld.error_box("Codice errato");
}
}
else
fld.error_box("Anno errato");
}
else
app()._wanted_assist = year;
}
}
return TRUE;
}
bool TAttivazione_moduli::print_handler(TMask_field& fld, KEY key)
{
if (key == K_SPACE)
app().print();
return TRUE;
}
void TAttivazione_moduli::generate_key()
{
#if XVT_OS == XVT_OS_SCOUNIX
@ -674,8 +860,8 @@ void TAttivazione_moduli::generate_key()
_msk->set(F_SN, _dongle.number());
_msk->set(F_DT, d);
const int utenti = _dongle.max_users();
_msk->set(F_USERS, utenti);
_msk->set(F_USERS, _dongle.max_users());
_msk->set(F_ASSIST, _dongle.year_assist());
}
int hexdigit(char c)
@ -750,7 +936,8 @@ bool TAttivazione_moduli::user_hnd(TMask_field & f, KEY k)
HL_WRITE(50, ud2[2]);
HL_WRITE(51, ud2[3]);
#endif
} else
}
else
sf.force_update();
return TRUE;
}
@ -764,19 +951,24 @@ bool TAttivazione_moduli::serno_hnd(TMask_field& f, KEY k)
return TRUE;
}
bool TAttivazione_moduli::date_hnd(TMask_field& f, KEY k)
{
bool ok = TRUE;
if (k == K_TAB && f.focusdirty())
{
const TDate data(f.get());
const TDate oggi(TODAY);
ok = data <= oggi;
if (!ok)
f.error_box("La data deve essere antecedente a quella di sistema");
if (data > oggi)
return f.error_box("La data deve essere antecedente a quella di sistema");
const TDate& last_update = app()._dongle.last_update();
if (data < last_update)
return f.error_box("La data deve essere successiva al %s", last_update.string());
const int year_assist = app()._dongle.year_assist()+1;
if (data.year() > year_assist)
return f.error_box("La data deve essere antecedente al 31-12-%d", year_assist);
}
return ok;
return TRUE;
}
void TAttivazione_moduli::encode_second_key()
@ -870,6 +1062,218 @@ bool TAttivazione_moduli::k_notify(TSheet_field& f, int r, KEY k)
return TRUE;
}
bool TAttivazione_moduli::aggiorna_listino_handler(TMask_field& fld, KEY key)
{
bool ok = TRUE;
if (key == K_SPACE)
{
TInstall_ini ini;
TFilename name = ini.get("DiskPath");
name.add(ini.default_name());
while (!fexist(name))
{
TMask msk("Aggiornamento listino", 1, -1, -1, 60, 4);
msk.add_string(DLG_USER, 0, "Percorso", 1, 1, 50);
msk.add_button(DLG_CANCEL, 0, "", -12, -1, 10, 2);
msk.add_button(DLG_OK, 0, "", -22, -1, 10, 2);
msk.set(DLG_USER, name);
if (msk.run() == K_ENTER)
name = msk.get(DLG_USER);
else
{
ok = FALSE;
break;
}
}
if (ok)
ok = ini.update_prices(name);
}
return ok;
}
void TAttivazione_moduli::print_request()
{
TRequest_form form("ba1500a");
TForm_item& num = form.find_field('B', odd_page, 101);
TForm_item& descr = form.find_field('B', odd_page, 102);
TForm_item& codice = form.find_field('B', odd_page, 103);
TForm_item& price = form.find_field('B', odd_page, 104);
TForm_item& manut = form.find_field('B', odd_page, 105);
TInstall_ini ini;
const bool special = _wanted_assist > _dongle.year_assist() || _wanted_users != 0;
const word users = max(_wanted_users, _dongle.max_users());
TSheet_field& sheet = _msk->sfield(F_MODULI);
for (TDongle::KeyType owner = TDongle::_aga_key;
owner <= TDongle::_procom_key;
owner = TDongle::KeyType(owner+1))
{
int found = 0;
TString str;
FOR_EACH_SHEET_ROW(sheet, r, row)
{
const int module = _im->get_module_by_order(r);
const bool active = _dongle.active(module);
const bool wanted = *row->get(1) > ' ';
if (!special && active)
continue;
if (!wanted && !active)
continue;
if (_im->get_owner(module) != owner)
continue;
if (found == 0)
{
printer().open();
form.update_serno(_msk->get(F_SN));
form.update_dongle(_dongle);
}
str.format("%3d", ++found);
num.set(str);
str = row->get(0);
descr.set(str);
str = active ? "*ATTIVO*" : "";
codice.set(str);
str = _im->get_name(module);
real full, assist;
ini.prices(str, users, full, assist);
if (active)
{
real old_full, old_assist;
ini.prices(str, _dongle.max_users(), old_full, old_assist);
full -= old_full;
assist -= old_assist;
}
else
assist = 0.0;
price.set(full.string());
manut.set(assist.string());
form.print(-1);
}
if (special && found > 0)
{
codice.set("");
price.set("");
manut.set("");
if (_wanted_users != 0)
{
str.format("%3d", ++found);
num.set(str);
str.format("Variazione del numero utenti da %u a %u",
_dongle.max_users(), _wanted_users);
descr.set(str);
form.print(-1);
}
if (_wanted_assist > _dongle.year_assist())
{
str.format("%3d", ++found);
num.set(str);
str.format("Contratto di assistenza per l'anno %u", _wanted_assist);
descr.set(str);
form.print(-1);
}
}
if (found)
{
form.print_footer();
printer().close();
}
}
}
void TAttivazione_moduli::print_answer()
{
TString str;
int found = 0;
TRequest_form form("ba1500a");
TForm_item& num = form.find_field('B', odd_page, 101);
TForm_item& descr = form.find_field('B', odd_page, 102);
TForm_item& codice = form.find_field('B', odd_page, 103);
TSheet_field& sheet = _msk->sfield(F_MODULI);
FOR_EACH_SHEET_ROW(sheet, r, row) if (*row->get(1) > ' ')
{
const int module = _im->get_module_by_order(r);
if (module != BAAUT)
{
if (found == 0)
{
printer().open();
form.update_serno(_msk->get(F_SN));
}
str.format("%3d", ++found);
num.set(str);
str = row->get(0);
descr.set(str);
str = row->get(3);
codice.set(str);
form.print(-1);
}
}
if (_wanted_users != 0 || _wanted_assist != 0)
{
if (found == 0)
{
printer().open();
form.update_serno(_msk->get(F_SN));
}
if (_wanted_users != 0)
{
str.format("%3d", ++found);
num.set(str);
str.format("Variazione del numero utenti da %u a %u",
_dongle.max_users(), _wanted_users);
descr.set(str);
garble_user(_wanted_users, str);
codice.set(str);
form.print(-1);
}
if (_wanted_assist != 0)
{
str.format("%3d", ++found);
num.set(str);
str.format("Contratto di assistenza per l'anno %u", _wanted_assist);
descr.set(str);
garble_year(_wanted_assist, str);
codice.set(str);
form.print(-1);
}
}
if (found)
{
form.print_footer();
printer().close();
}
}
void TAttivazione_moduli::print()
{
if (_dongle.type() == TDongle::_user_key)
print_request();
else
print_answer();
}
bool TAttivazione_moduli::create()
{
bool ok = _dongle.login();
@ -885,14 +1289,17 @@ bool TAttivazione_moduli::create()
_msk = new TMask("ba1500a") ;
_msk->set_handler(F_CHANGEUSERS, change_users_handler);
_msk->set_handler(F_CHANGEASSIST, change_assist_handler);
_msk->set_handler(F_PRINT, print_handler);
TSheet_field& sf = _msk->sfield(F_MODULI);
sf.set_notify(k_notify);
const int un = _im->unassigned();
switch (_dongle.type())
const TDongle::KeyType mydongle = _dongle.type();
switch (mydongle)
{
case _user_key:
case TDongle::_user_key:
{
_msk->disable(F_K1);
_msk->disable(F_K2);
@ -902,19 +1309,13 @@ bool TAttivazione_moduli::create()
_msk->set_handler(F_DT, date_hnd);
generate_key();
sf.enable_column(F_ENABLE, FALSE);
// sf.enable_column(F_ENABLE, FALSE);
sf.enable_column(F_KEY, serno() != 0);
}
break;
case _prassi_key:
{
const int aut[] = { CMAUT, ATAUT, POAUT, AFAUT, TCAUT, TMAUT,
VEAUT, MGAUT, ORAUT, EFAUT, DBAUT, SVAUT, -1 };
for (int a = 0; aut[a] >= 0; a++)
sf.disable_cell(_im->get_index(aut[a])-un,1);
}
case _aga_key:
case _procom_key:
case TDongle::_prassi_key:
case TDongle::_aga_key:
case TDongle::_procom_key:
{
_msk->set_handler(F_K2, decode_hnd);
_msk->disable(F_K3);
@ -931,12 +1332,9 @@ bool TAttivazione_moduli::create()
const int af = _im->get_module_by_order(i);
const int index = i-un;
if (af == 0)
sf.disable_cell(index,1);
if (_dongle.type() == _procom_key)
sf.enable_cell(index,1,af>=40 && af<=46);
else
if (af>=40 && af<=46)
sf.disable_cell(index,1);
sf.disable_cell(index,1);
else
sf.enable_cell(index,1,_im->test_owner(af, mydongle));
}
build_key_column();
@ -944,7 +1342,10 @@ bool TAttivazione_moduli::create()
break;
default:
break;
}
}
enable_menu_item(M_FILE_PG_SETUP);
enable_menu_item(M_FILE_PRINT);
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}

View File

@ -5,7 +5,57 @@
#include <strings.h>
#endif
const word MAX_AUT = 48 * 3;
class TDongle : public TObject
{
public:
enum KeyType { _user_key, _aga_key, _prassi_key, _procom_key };
private:
word _serno, _max_users, _year_assist;
KeyType _type;
word _eprom[64];
TDate _last_update;
#if XVT_OS == XVT_OS_SCOUNIX
word _port;
#endif
TBit_array _module;
bool _dirty;
protected:
bool already_programmed() const;
bool write_octect(word reg, word data[4]) const;
public:
bool login();
bool logout();
word number() const { return _serno; }
bool ok() const { return _serno != 0xFFFF; }
word max_users() const { return _max_users; }
word year_assist() const { return _year_assist; }
void garble(word data[4]) const;
KeyType type() const { return _type; }
bool active(word module) const { return _module[module]; }
void activate(word module, bool on = TRUE) { _module.set(module, on); _dirty = TRUE; }
void deactivate(word module) { activate(module, FALSE); }
void set_max_users(word u) { _max_users = u; _dirty = TRUE; }
void set_year_assist(word y) { _year_assist = y; _dirty = TRUE; }
const TDate& last_update() const { return _last_update; }
bool dirty() const { return _dirty; }
bool burn();
TDongle();
virtual ~TDongle() { logout(); }
};
const int MAX_AUT = 48 * 3;
class TInformazione_moduli : public TObject
{
@ -14,16 +64,18 @@ class TInformazione_moduli : public TObject
int _unassigned_modules; // Moduli non assegnati, con descrizione vuota
public:
const char * get_description_by_order(int index);
const char * get_name_by_order(int index);
int get_module_by_order(int index);
const char * get_description(int module);
const char * get_name(int module);
int get_index(int module);
int unassigned() { return _unassigned_modules; }
int items() const { return _infos.items(); }
TInformazione_moduli() ;
~TInformazione_moduli() {};
const char* get_description_by_order(int index);
const char* get_name_by_order(int index);
int get_module_by_order(int index);
const char* get_description(int module);
const char* get_name(int module);
int get_index(int module);
TDongle::KeyType get_owner(int module) const;
bool test_owner(int module, TDongle::KeyType owner) const;
int unassigned() const { return _unassigned_modules; }
int items() const { return _infos.items(); }
TInformazione_moduli();
virtual ~TInformazione_moduli() {};
};
#endif

View File

@ -11,9 +11,11 @@
#define F_SN 211
#define F_DT 212
#define F_MODULI 213
#define F_USERS 214
#define F_CHANGEUSERS 215
#define F_REQUEST 216
#define F_USERS 214
#define F_CHANGEUSERS 215
#define F_ASSIST 216
#define F_CHANGEASSIST 217
#define F_PRINT 218
#define F_NOMEMOD 101
#define F_ENABLE 102

View File

@ -7,9 +7,9 @@ BEGIN
PROMPT -13 -1 ""
END
BUTTON F_REQUEST 18 2
BUTTON F_PRINT 22 2
BEGIN
PROMPT -11 -1 "~Stampa richiesta"
PROMPT -11 -1 "~Stampa Attivazioni"
END
BUTTON DLG_QUIT 10 2
@ -35,27 +35,37 @@ END
STRING F_SN 5
BEGIN
PROMPT 56 1 "N.Serie "
PROMPT 54 1 "N.Serie "
FLAGS "DUZ"
END
DATE F_DT
BEGIN
PROMPT 56 2 "Data "
PROMPT 54 2 "Data "
FLAGS "AD"
END
NUMBER F_USERS 3
NUMBER F_USERS 4
BEGIN
PROMPT 56 3 "Utenti "
PROMPT 54 3 "Utenti "
FLAGS "D"
END
BUTTON F_CHANGEUSERS 6 1
BEGIN
PROMPT 69 3 "Cambia"
PROMPT 71 3 "Cambia"
END
NUMBER F_ASSIST 4
BEGIN
PROMPT 54 4 "Assistenza "
FLAGS "D"
END
BUTTON F_CHANGEASSIST 6 1
BEGIN
PROMPT 71 4 "Cambia"
END
STRING F_K3 16
BEGIN
@ -120,3 +130,4 @@ END
ENDPAGE
ENDMASK

View File

@ -24,7 +24,7 @@ int TInstall_ini::build_list(const TString& module, TString_array& a,
CHECKS(module.len() >= 2 || module[0]=='_', "Bad module ", (const char*)module);
TConfig* sum = NULL;
if (sommario)
if (sommario && *sommario)
sum = new TConfig(sommario, module);
TAuto_token_string tmp;
@ -89,7 +89,8 @@ void TInstall_ini::export_paragraph(const char* module, const char* summary)
}
void TInstall_ini::export_module_paragraphs(const char* module, const char* summary)
{
{
CHECK(summary && *summary, "NULL export ini");
TString mod;
for (int sub = -1; sub <= 9; sub++)
{
@ -100,6 +101,81 @@ void TInstall_ini::export_module_paragraphs(const char* module, const char* summ
}
}
const TString& TInstall_ini::version(const char* module)
{
CHECK(module && *module, "Can't get version of NULL module");
const TString& ver = get("Versione", module);
if (ver.empty() && strlen(module) > 2)
{
TString16 str;
str.strncpy(module, 2);
return get("Versione", str);
}
return ver;
}
bool TInstall_ini::update_prices(const char* from)
{
TConfig from_ini(from);
const TDate curr_date = get("Main", "Listino");
const TDate from_date = from_ini.get("Main", "Listino");
if (from_date < curr_date)
return FALSE;
set("Listino", from_date);
TString_array modules;
from_ini.list_paragraphs(modules);
FOR_EACH_ARRAY_ROW_BACK(modules, r, row) if (row->len() == 2)
{
TAssoc_array& prices = (TAssoc_array&)from_ini.list_variables(*row);
FOR_EACH_ASSOC_STRING(prices, obj, key, str)
{
const TFixed_string price(key);
if (price.compare("Prezzo", 6, TRUE) == 0)
set(key, str);
}
}
return TRUE;
}
void TInstall_ini::prices(const char* module, word users,
real& full, real& assist)
{
word min_user = 0;
TAssoc_array& arr = (TAssoc_array&)list_variables(module);
FOR_EACH_ASSOC_STRING(arr, obj, key, str)
{
const TFixed_string price(key);
if (price.compare("Prezzo", 6, TRUE) == 0)
{
const word user = atoi(key+7);
if (user >= min_user && user <= users)
{
min_user = user;
TAuto_token_string tmp = str;
full = tmp.get(0);
if (full < 50000.0)
full *= 1000.0;
assist = tmp.get();
if (assist < 50000.0)
assist *= 1000.0;
if (user == 1 && users > 1)
{
full *= users;
assist *= users;
}
const int mese = TDate(TODAY).month();
assist = assist * (12-mese) / 12;
assist.round(-3);
}
}
}
}
///////////////////////////////////////////////////////////
// TFconv_ini
///////////////////////////////////////////////////////////
@ -132,8 +208,7 @@ void TFconv_ini::export_module(const char* module, const char* summary)
FOR_EACH_ARRAY_ROW(paragraphs, p, para)
{
set_paragraph(*para);
TAssoc_array& variables = (TAssoc_array&)list_variables();
TAssoc_array& variables = (TAssoc_array&)list_variables(*para);
FOR_EACH_ASSOC_STRING(variables, obj, key, str)
{
const char* parenthesis = strchr(key, '(');
@ -516,6 +591,8 @@ void TModule_mask::save()
int index;
const TString module = get(F_MODULE);
const TString version = ini.version(module);
for (index = 0; index <= 9; index++)
{
TString16 sub; sub << module << index;
@ -545,6 +622,7 @@ void TModule_mask::save()
const bool agg = row->get_char() > ' ';
if (agg) tmp.add("X"); // Flag aggiornamento
ini.set("File", tmp, sub, TRUE, index++);
ini.set("Versione", version); // Aggiorna versione del sottomodulo
}
}
}

View File

@ -16,6 +16,12 @@ public:
void export_paragraph(const char* module, const char* summary);
void export_module_paragraphs(const char* module, const char* summary);
bool demo() { return get_bool("Demo", "Main"); }
const TString& version(const char* module);
bool update_prices(const char* src_ini);
void prices(const char* module, word users, real& full, real& manut);
static const char* default_name() { return "install.ini"; }
TInstall_ini() : TConfig("install.ini", "Main") { }

View File

@ -9,10 +9,11 @@
#include <utility.h>
#include "ba1.h"
#include "ba1500.h"
#include "ba1600.h"
#include "ba1700a.h"
HIDDEN int compare_version(const TString& v1, const TString& v2)
HIDDEN int compare_version(const char* v1, const char* v2)
{
TString16 ver1(v1), ver2(v2);
ver1.trim();
@ -24,6 +25,15 @@ HIDDEN int compare_version(const TString& v1, const TString& v2)
return ver1.compare(ver2, -1, TRUE);
}
HIDDEN word version2year(const char* v)
{
TString16 ver(v);
if (ver.len() == 4)
ver.insert((v[0] == '9') ? "19" : "20", 0);
ver.cut(4);
return atoi(ver);
}
///////////////////////////////////////////////////////////
// Maschera principale
///////////////////////////////////////////////////////////
@ -33,7 +43,7 @@ class TInstaller_mask : public TArray_sheet
static TInstaller_mask* _curr_mask;
protected: // TSheet
bool on_key(KEY key);
virtual bool on_key(KEY key);
protected:
static bool path_handler(TMask_field& fld, KEY key);
@ -42,9 +52,14 @@ protected:
bool add_module(TConfig& ini, const TString& module);
void update_version();
bool move_file(const TFilename& file, const char* dir) const;
bool move_module(const TString& module, TInstall_ini& ini, bool update) const;
bool can_install(const char* module, TInstall_ini& ini);
void install_selection();
bool do_process(TAuto_token_string& commands) const;
bool do_process(TToken_string& commands) const;
bool pre_process(TInstall_ini& ini, const char* module) const;
bool post_process(TInstall_ini& ini, const char* module) const;
@ -89,16 +104,6 @@ void TInstaller_mask::update_version()
const TString16 oldver = ini.get("Versione");
row->add(oldver, 5);
row->add(ini.get("Data"), 6);
/*
const int cmp = compare_version(newver, oldver);
if (cmp > 0)
sheet.set_back_and_fore_color(FOCUS_BACK_COLOR, NORMAL_COLOR, m);
if (cmp == 0)
sheet.set_back_and_fore_color(NORMAL_BACK_COLOR, NORMAL_COLOR, m);
if (cmp < 0)
sheet.set_back_and_fore_color(DISABLED_BACK_COLOR, NORMAL_COLOR, m);
*/
}
force_update();
}
@ -125,10 +130,10 @@ bool TInstaller_mask::autoload()
TInstall_ini ini(ininame);
ini.list_paragraphs(modules);
FOR_EACH_ARRAY_ROW_BACK(modules, i, row)
FOR_EACH_ARRAY_ROW(modules, i, row)
{
const TString& module = *row;
if (module.len() == 2 && module != "xx")
if (module.len() == 2)
add_module(ini, module);
}
}
@ -137,7 +142,7 @@ bool TInstaller_mask::autoload()
ininame = path;
ininame.add("??inst.ini");
list_files(ininame, modules);
FOR_EACH_ARRAY_ROW_BACK(modules, m, row)
FOR_EACH_ARRAY_ROW(modules, m, row)
{
TString& ininame = *row;
ininame.lower();
@ -160,7 +165,7 @@ bool TInstaller_mask::autoload()
return ok;
}
bool TInstaller_mask::do_process(TAuto_token_string& commands) const
bool TInstaller_mask::do_process(TToken_string& commands) const
{
bool ok = TRUE;
TFilename cmd;
@ -181,28 +186,6 @@ bool TInstaller_mask::pre_process(TInstall_ini& ini, const char* module) const
{
bool ok = TRUE;
TInstall_ini cur_ini;
TAuto_token_string altri(ini.get("Moduli", module));
if (stricmp(module, "ba") != 0)
altri.add("ba"); // La base e' obbligatoria per tutti
TString submodule, curver, reqver;
for (const char* mod = altri.get(0); mod && ok; mod = altri.get())
{
submodule = mod;
submodule.cut(2);
reqver = ini.get("Versione", submodule);
curver = cur_ini.get("Versione", submodule);
ok = compare_version(reqver, curver) <= 0;
if (!ok)
{
TString msg;
msg << "L'installazione del modulo " << module
<< " richiede\nla versione " << reqver
<< " del sottomodulo " << submodule;
error_box(msg);
}
}
if (ok)
{
TAuto_token_string commands(ini.get("PreProcess", module));
@ -218,9 +201,141 @@ bool TInstaller_mask::post_process(TInstall_ini& ini, const char* module) const
return do_process(commands);
}
bool TInstaller_mask::can_install(const char* module, TInstall_ini& ini)
{
TInstall_ini curini;
if (curini.demo() != ini.demo())
{
TString msg;
msg << "Attenzione: Non e' possibile installare la versione ";
msg << (ini.demo() ? "dimostrativa" : "normale");
msg << " nella cartella della versione ";
msg << (curini.demo() ? "dimostrativa" : "normale");
return error_box(msg);
}
const TString& version = ini.version(module);
const word year = version2year(module);
if (year < 1997)
return error_box("Il modulo '%s' non ha una versione valida.", module);
TDongle dongle; dongle.login(); dongle.logout();
if (year > dongle.year_assist())
return error_box("Per installare il modulo %s %s e' necessario\n"
"rinnovare il contratto di assistenza del %d.",
module, (const char*)version, year);
TAuto_token_string altri(ini.get("Moduli", module));
if (stricmp(module, "ba") != 0 && altri.get_pos("ba") < 0)
altri.add("ba"); // La base e' obbligatoria per tutti
bool ok = TRUE;
TString submodule;
for (const char* mod = altri.get(0); mod && ok; mod = altri.get())
{
submodule = mod;
if (submodule.len() == 2)
{
if (curini.get("Versione", submodule).empty())
{
TString msg;
msg << "L'installazione del modulo " << module
<< "\nrichiede la presenza del modulo " << submodule
<< ":\nSi desidera procedere alla sua installazione?";
ok = yesno_box(msg);
if (ok)
ok = install(submodule);
}
}
}
return ok;
}
bool TInstaller_mask::move_file(const TFilename& file, const char* dir) const
{
TFilename dest(dir);
dest.add(file.name());
const long filesize = fsize(file);
bool space_ok = FALSE;
while (!space_ok)
{
int disk = 0;
if (dest[1] == ':')
{
const char letter = toupper(dest[0]);
disk = 'A' - letter + 1;
}
struct _diskfree_t drive;
_dos_getdiskfree(disk, &drive);
const unsigned requested_clusters = unsigned(filesize / drive.sectors_per_cluster / drive.bytes_per_sector) + 1;
space_ok = requested_clusters <= drive.avail_clusters;
if (!space_ok)
{
TString msg;
msg << "Lo spazio sull'unita' e' insufficiente";
if (GetDriveType(disk-1) == DRIVE_REMOVABLE)
{
msg << ":\nInserire un nuovo disco e ritentare?";
if (!yesno_box(msg))
return FALSE;
}
else
return error_box(msg);
}
}
bool write_ok = TRUE;
bool user_abort = FALSE;
do
{
write_ok = ::fcopy(file, dest);
if (write_ok)
::remove(file);
else
{
if (!yesno_box("Errore di scrittura del file %s.\nSi desidera riprovare?",
(const char*)file));
user_abort = TRUE;
}
} while (!write_ok && !user_abort);
return write_ok;
}
bool TInstaller_mask::move_module(const TString& module, TInstall_ini& ini, bool update) const
{
bool ok = TRUE;
TFilename src;
TString_array list;
ini.build_list(module, list);
FOR_EACH_ARRAY_ROW(list, f, file)
{
src.tempdir();
src.add(file->get(0));
if (update)
{
const bool move_ok = move_file(src, ".");
if (!move_ok)
ok = update = FALSE;
}
if (!update)
::remove(src);
}
if (update)
ini.export_paragraph(module, ini.default_name());
return ok;
}
bool TInstaller_mask::install(const TString& module)
{
TWait_cursor hourglass;
bool ok = FALSE;
const TString& path = get(F_PATH);
@ -231,9 +346,12 @@ bool TInstaller_mask::install(const TString& module)
if (fexist(ininame))
{
TInstall_ini ini(ininame);
if (!can_install(module, ini))
return FALSE;
const int dischi = ini.get_int("Dischi", module);
ok = dischi > 0;
if (!ok)
{
return error_box("Impossibile determinare il numero dei dischetti");
@ -245,6 +363,7 @@ bool TInstaller_mask::install(const TString& module)
}
TProgind pi(dischi, "Decompressione in corso...", FALSE, TRUE);
TFilename tempdir; tempdir.tempdir();
TFilename cmdline;
for (int d = 1; d <= dischi && ok; d++)
@ -272,7 +391,7 @@ bool TInstaller_mask::install(const TString& module)
{
struct _diskfree_t drive;
_dos_getdiskfree(0, &drive);
const long required = fsize(cmdline) * (dischi-d+1) * 3;
const long required = fsize(cmdline) * (dischi-d+1) * 4;
const unsigned requested_clusters = unsigned(required / drive.sectors_per_cluster / drive.bytes_per_sector) + 1;
if (requested_clusters >= drive.avail_clusters)
{
@ -285,17 +404,45 @@ bool TInstaller_mask::install(const TString& module)
{
TWait_cursor hourglass;
cmdline.insert("unzip.pif -o ", 0);
cmdline << ' ' << tempdir;
TExternal_app app(cmdline);
ok = app.run(FALSE, FALSE, FALSE, FALSE) == 0;
pi.addstatus(1);
}
}
}
if (ok)
{
post_process(ini, module);
ini.export_module_paragraphs(module, ini.default_name());
{
pi.set_text("Aggiornamento in corso...");
ok = move_module(module, ini, TRUE);
TAuto_token_string altri(ini.get("Moduli", module));
FOR_EACH_TOKEN(altri, mod)
{
const TString16 submod = mod;
if (submod.len() > 2) // sposta sottomoduli esterni
{
bool upd = ok;
if (ok)
{
TInstall_ini curini;
const TString16 curver = curini.version(submod);
const TString16 reqver = ini.version(submod);
upd = compare_version(reqver, curver) > 0;
if (!upd)
{
warning_box("La versione del sottomodulo %s (%s) e' piu' aggiornata\n"
"di quella che si desidera installare (%s):\n"
"L'aggiornamento del sottomodulo verra' ignorato.",
(const char*)submod, (const char*)curver, (const char*)reqver);
}
}
ok &= move_module(submod, ini, upd);
}
}
}
if (ok)
ok = post_process(ini, module);
}
else
{
@ -305,6 +452,9 @@ bool TInstaller_mask::install(const TString& module)
if (ok)
{
TInstall_ini ini(ininame);
if (!can_install(module, ini))
return FALSE;
TString_array list;
const int files = ini.build_list(module, list);
if (files > 0)
@ -328,7 +478,7 @@ bool TInstaller_mask::install(const TString& module)
if (ok)
{
ini.export_module_paragraphs(module, ini.default_name());
post_process(ini, module);
ok = post_process(ini, module);
}
}
}
@ -339,9 +489,10 @@ bool TInstaller_mask::install(const TString& module)
TInstall_ini ini;
ini.set("DiskPath", path);
ini.set("Data", TDate(TODAY), module);
ini.update_prices(ininame);
}
// Non spostare nell'if precedente
// Non spostare nell'if precedente: permettere l'aggiornamento del .ini
if (ok)
update_version();
@ -375,7 +526,13 @@ void TInstaller_mask::install_selection()
{
const TString modulo = row->get(2);
const TString newver = row->get(3);
const TString oldver = row->get(5);
const TString oldver = row->get(5);
if (version2year(newver) < 1997)
{
error_box("Il modulo '%s' non ha una versione valida.", (const char*)modulo);
continue;
}
bool ok = TRUE;
const int cmp = compare_version(oldver, newver);
@ -389,8 +546,6 @@ void TInstaller_mask::install_selection()
"funzionamento di tutti i programmi!", (const char*)oldver);
if (ok)
install(modulo);
else
break;
}
}

View File

@ -1,104 +0,0 @@
#include "ba1700a.h"
TOOLBAR "" 0 20 0 2
BUTTON F_UPDATE 15 2
BEGIN
PROMPT -12 -11 "Aggiorna lista"
END
BUTTON DLG_QUIT 15 2
BEGIN
PROMPT -22 -11 ""
END
ENDPAGE
PAGE "Installazione" -1 -1 78 20
STRING F_PATH 45
BEGIN
PROMPT 1 1 "Percorso da cui installare "
END
STRING F_CURPATH 45
BEGIN
PROMPT 1 2 "Percorso in cui installare "
FLAGS "D"
END
SPREADSHEET F_SHEET
BEGIN
PROMPT 1 3 ""
ITEM "Modulo@30"
ITEM "Cod."
ITEM "Versione\nda installare@13"
ITEM "Data\nRilascio@10"
ITEM "Versione\nInstallata@10"
ITEM "Data\nInstallazione@13"
END
ENDPAGE
ENDMASK
PAGE "Modulo" -1 -1 52 10
GROUPBOX DLG_NULL 50 3
BEGIN
PROMPT 1 0 "@bModulo"
END
STRING 101 43
BEGIN
PROMPT 6 1 ""
END
STRING 102 2
BEGIN
PROMPT 2 1 ""
END
GROUPBOX DLG_NULL 50 3
BEGIN
PROMPT 1 3 "@bVersione da installare"
END
STRING 103 6
BEGIN
PROMPT 2 4 "Versione "
END
DATE 104
BEGIN
PROMPT 34 4 "Data "
END
GROUPBOX DLG_NULL 50 3
BEGIN
PROMPT 1 6 "@bVersione installata"
END
STRING 105 6
BEGIN
PROMPT 2 7 "Versione "
END
DATE 106
BEGIN
PROMPT 34 7 "Data "
END
BUTTON DLG_CANCEL 10 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON 100 10 2
BEGIN
PROMPT -22 -1 "Installa"
END
ENDPAGE
ENDMASK

View File

@ -1429,9 +1429,9 @@ void TConversione_archivi::convert_uue() const
{
TProgind pi(0, "Caricamento tabella Uffici Unici", FALSE, FALSE);
TSystemisamfile uue(LF_TABCOM);
TFilename lf;
lf.format("%sstd/bacnv16a.txt", __ptprf);
TFilename lf;
lf = __ptprf;
lf.add("std/bacnv16a.txt");
uue.load(lf);
pi.set_text("Caricamento Uffici Unici nei comuni");
@ -1441,7 +1441,8 @@ void TConversione_archivi::convert_uue() const
TSystemisamfile comuni(LF_COMUNI);
comuni.open(_excllock);
lf.format("%sstd/bacnv16b.txt", __ptprf);
lf = __ptprf;
lf.add("std/bacnv16b.txt");
TScanner scan16b(lf);
TToken_string line;
@ -1460,8 +1461,7 @@ void TConversione_archivi::convert_uue() const
{
fieldname = "CODUUE"; fieldname << uue;
fieldval = comuni.get(fieldname);
if (first_uue == 0 && fieldval.empty())
if (first_uue == 0 && atoi(fieldval) == 0)
first_uue = uue;
if (fieldval == uff)
{
@ -1475,9 +1475,7 @@ void TConversione_archivi::convert_uue() const
comuni.put(fieldname, uff);
err = comuni.rewrite();
}
if (uue == 1)
cod_uue.add(cod, comuni.get("CODUUE1"));
cod_uue.add(cod, comuni.get("CODUUE1"));
}
if (err != NOERR)
error_box("Impossibile aggiornare l'ufficio unico del comune %s: errore %d",