kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Reversion of commit 2a957966c1
Partial reversion of Multi-user-logbook commit Preparation for introduction of client/server logbookpull/2/head
rodzic
afeccbb9af
commit
f2b39b1ede
|
@ -19,8 +19,8 @@ private:
|
||||||
cQsoRec adifqso;
|
cQsoRec adifqso;
|
||||||
FILE *adiFile;
|
FILE *adiFile;
|
||||||
void fillfield(int, char *);
|
void fillfield(int, char *);
|
||||||
std::string log_checksum;
|
// std::string log_checksum;
|
||||||
std::string file_checksum;
|
// std::string file_checksum;
|
||||||
public:
|
public:
|
||||||
cAdifIO ();
|
cAdifIO ();
|
||||||
~cAdifIO () {};
|
~cAdifIO () {};
|
||||||
|
@ -30,10 +30,10 @@ public:
|
||||||
int writeFile (const char *, cQsoDb *);
|
int writeFile (const char *, cQsoDb *);
|
||||||
int writeLog (const char *, cQsoDb *);
|
int writeLog (const char *, cQsoDb *);
|
||||||
bool log_changed(const char *fname);
|
bool log_changed(const char *fname);
|
||||||
std::string get_checksum() { return log_checksum; }
|
// std::string get_checksum() { return log_checksum; }
|
||||||
void set_checksum( std::string s ) { log_checksum = s; }
|
// void set_checksum( std::string s ) { log_checksum = s; }
|
||||||
std::string get_file_checksum() { return file_checksum; }
|
// std::string get_file_checksum() { return file_checksum; }
|
||||||
void do_checksum(cQsoDb &);
|
// void do_checksum(cQsoDb &);
|
||||||
};
|
};
|
||||||
|
|
||||||
// crc 16 cycle redundancy check sum
|
// crc 16 cycle redundancy check sum
|
||||||
|
|
|
@ -37,9 +37,19 @@ int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout);
|
||||||
int sem_timedwait_rel(sem_t* sem, double rel_timeout);
|
int sem_timedwait_rel(sem_t* sem, double rel_timeout);
|
||||||
int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout);
|
int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout);
|
||||||
|
|
||||||
|
//enum {
|
||||||
|
// INVALID_TID = -1,
|
||||||
|
// TRX_TID, QRZ_TID, RIGCTL_TID, NORIGCTL_TID, LOGBOOK_TID,
|
||||||
|
//#if USE_XMLRPC
|
||||||
|
// XMLRPC_TID,
|
||||||
|
//#endif
|
||||||
|
// ARQ_TID, ARQSOCKET_TID,
|
||||||
|
// FLMAIN_TID,
|
||||||
|
// NUM_THREADS, NUM_QRUNNER_THREADS = NUM_THREADS - 1
|
||||||
|
//};
|
||||||
enum {
|
enum {
|
||||||
INVALID_TID = -1,
|
INVALID_TID = -1,
|
||||||
TRX_TID, QRZ_TID, RIGCTL_TID, NORIGCTL_TID, LOGBOOK_TID,
|
TRX_TID, QRZ_TID, RIGCTL_TID, NORIGCTL_TID,
|
||||||
#if USE_XMLRPC
|
#if USE_XMLRPC
|
||||||
XMLRPC_TID,
|
XMLRPC_TID,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -94,18 +94,6 @@ void initfields()
|
||||||
fields[i].name = new string(fieldnames[i]);
|
fields[i].name = new string(fieldnames[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
int fieldnbr (const char *s) {
|
|
||||||
for (int i = 0; i < NUMFIELDS; i++)
|
|
||||||
if (fields[i].name == s) {
|
|
||||||
// if (strncasecmp( fields[i].name, s, fields[i].size) == 0) {
|
|
||||||
if (fields[i].type == COMMENT) return(NOTES);
|
|
||||||
return fields[i].type;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
int findfield( char *p )
|
int findfield( char *p )
|
||||||
{
|
{
|
||||||
int m;
|
int m;
|
||||||
|
@ -186,7 +174,6 @@ void cAdifIO::readFile (const char *fname, cQsoDb *db) {
|
||||||
// relaxed file integrity test to all importing from non conforming log programs
|
// relaxed file integrity test to all importing from non conforming log programs
|
||||||
if ((strcasestr(buff, "<ADIF_VER:") != 0) &&
|
if ((strcasestr(buff, "<ADIF_VER:") != 0) &&
|
||||||
(strcasestr(buff, "<CALL:") == 0)) {
|
(strcasestr(buff, "<CALL:") == 0)) {
|
||||||
// fl_alert2(_("No records in ADIF logbook file"));
|
|
||||||
delete [] buff;
|
delete [] buff;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -195,15 +182,6 @@ void cAdifIO::readFile (const char *fname, cQsoDb *db) {
|
||||||
delete [] buff;
|
delete [] buff;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char *p = strcasestr(buff, "<DATA CHECKSUM:");
|
|
||||||
if (p) {
|
|
||||||
p = strchr(p + 1, '>');
|
|
||||||
if (p) {
|
|
||||||
p++;
|
|
||||||
file_checksum.clear();
|
|
||||||
for (int i = 0; i < 4; i++, p++) file_checksum += *p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char *p1 = buff, *p2;
|
char *p1 = buff, *p2;
|
||||||
if (*p1 != '<') { // yes, skip over header to start of records
|
if (*p1 != '<') { // yes, skip over header to start of records
|
||||||
|
@ -238,7 +216,6 @@ void cAdifIO::readFile (const char *fname, cQsoDb *db) {
|
||||||
p2 = strchr(p1,'<');
|
p2 = strchr(p1,'<');
|
||||||
}
|
}
|
||||||
|
|
||||||
log_checksum = file_checksum;
|
|
||||||
db->SortByDate();
|
db->SortByDate();
|
||||||
delete [] buff;
|
delete [] buff;
|
||||||
}
|
}
|
||||||
|
@ -360,61 +337,7 @@ int cAdifIO::writeLog (const char *fname, cQsoDb *db) {
|
||||||
fprintf (adiFile, "%s", records.c_str());
|
fprintf (adiFile, "%s", records.c_str());
|
||||||
|
|
||||||
fclose (adiFile);
|
fclose (adiFile);
|
||||||
log_checksum = s_checksum;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cAdifIO::do_checksum(cQsoDb &db)
|
|
||||||
{
|
|
||||||
Ccrc16 checksum;
|
|
||||||
string sFld;
|
|
||||||
cQsoRec *rec;
|
|
||||||
string records;
|
|
||||||
string record;
|
|
||||||
char recfield[200];
|
|
||||||
|
|
||||||
records.clear();
|
|
||||||
for (int i = 0; i < db.nbrRecs(); i++) {
|
|
||||||
rec = db.getRec(i);
|
|
||||||
record.clear();
|
|
||||||
for (int j = 0; j < NUMFIELDS; j++) {
|
|
||||||
sFld = rec->getField(j);
|
|
||||||
if (!sFld.empty()) {
|
|
||||||
snprintf(recfield, sizeof(recfield), adifmt,
|
|
||||||
fields[j].name->c_str(), sFld.length());
|
|
||||||
record.append(recfield).append(sFld);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
record.append(szEOR);
|
|
||||||
record.append(szEOL);
|
|
||||||
records.append(record);
|
|
||||||
}
|
|
||||||
log_checksum = checksum.scrc16(records);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cAdifIO::log_changed (const char *fname)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
// open the adif file
|
|
||||||
FILE *adiFile = fopen (fname, "r");
|
|
||||||
if (!adiFile)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// read first 2048 chars
|
|
||||||
char buff[2048];
|
|
||||||
retval = fread (buff, 2048, 1, adiFile);
|
|
||||||
fclose (adiFile);
|
|
||||||
|
|
||||||
if (retval) {
|
|
||||||
string sbuff = buff;
|
|
||||||
size_t p = sbuff.find("<DATA CHECKSUM:");
|
|
||||||
if (p == string::npos) return false;
|
|
||||||
p = sbuff.find(">", p);
|
|
||||||
if (p == string::npos) return false;
|
|
||||||
p++;
|
|
||||||
if (log_checksum != sbuff.substr(p, 4))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,40 +13,6 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
std::string log_checksum;
|
|
||||||
|
|
||||||
pthread_t logbook_thread;
|
|
||||||
pthread_mutex_t logbook_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
bool logbook_exit = false;
|
|
||||||
|
|
||||||
static void *logbook_loop(void *args)
|
|
||||||
{
|
|
||||||
SET_THREAD_ID(LOGBOOK_TID);
|
|
||||||
int cnt = 5;
|
|
||||||
for (;;) {
|
|
||||||
/* see if we are being canceled */
|
|
||||||
if (logbook_exit)
|
|
||||||
break;
|
|
||||||
if (cnt-- == 0) {
|
|
||||||
cnt = 5;
|
|
||||||
pthread_mutex_lock (&logbook_mutex);
|
|
||||||
|
|
||||||
if (adifFile.log_changed(logbook_filename.c_str())) {
|
|
||||||
qsodb.deleteRecs();
|
|
||||||
adifFile.readFile (logbook_filename.c_str(), &qsodb);
|
|
||||||
REQ(loadBrowser,0);
|
|
||||||
qsodb.isdirty(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock (&logbook_mutex);
|
|
||||||
}
|
|
||||||
MilliSleep(100);
|
|
||||||
|
|
||||||
}
|
|
||||||
// exit the arq thread
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void start_logbook ()
|
void start_logbook ()
|
||||||
{
|
{
|
||||||
create_logbook_dialogs();
|
create_logbook_dialogs();
|
||||||
|
@ -71,17 +37,10 @@ void start_logbook ()
|
||||||
qsodb.isdirty(0);
|
qsodb.isdirty(0);
|
||||||
activateButtons();
|
activateButtons();
|
||||||
|
|
||||||
if (pthread_create(&logbook_thread, NULL, logbook_loop, NULL) < 0)
|
|
||||||
LOG_ERROR("%s", "pthread_create failed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void close_logbook()
|
void close_logbook()
|
||||||
{
|
{
|
||||||
saveLogbook();
|
saveLogbook();
|
||||||
// tell the logbook thread to kill it self
|
|
||||||
logbook_exit = true;
|
|
||||||
// and then wait for it to die
|
|
||||||
pthread_join(logbook_thread, NULL);
|
|
||||||
logbook_exit = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -149,9 +149,9 @@ void saveLogbook()
|
||||||
cQsoDb::reverse = false;
|
cQsoDb::reverse = false;
|
||||||
qsodb.SortByDate();
|
qsodb.SortByDate();
|
||||||
|
|
||||||
pthread_mutex_lock (&logbook_mutex);
|
// pthread_mutex_lock (&logbook_mutex);
|
||||||
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
||||||
pthread_mutex_unlock (&logbook_mutex);
|
// pthread_mutex_unlock (&logbook_mutex);
|
||||||
|
|
||||||
qsodb.isdirty(0);
|
qsodb.isdirty(0);
|
||||||
restore_sort();
|
restore_sort();
|
||||||
|
@ -208,9 +208,9 @@ void cb_mnuSaveLogbook(Fl_Menu_*m, void* d) {
|
||||||
cQsoDb::reverse = false;
|
cQsoDb::reverse = false;
|
||||||
qsodb.SortByDate();
|
qsodb.SortByDate();
|
||||||
|
|
||||||
pthread_mutex_lock (&logbook_mutex);
|
// pthread_mutex_lock (&logbook_mutex);
|
||||||
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
||||||
pthread_mutex_unlock (&logbook_mutex);
|
// pthread_mutex_unlock (&logbook_mutex);
|
||||||
|
|
||||||
qsodb.isdirty(0);
|
qsodb.isdirty(0);
|
||||||
restore_sort();
|
restore_sort();
|
||||||
|
@ -606,9 +606,9 @@ void saveRecord() {
|
||||||
cQsoDb::reverse = false;
|
cQsoDb::reverse = false;
|
||||||
qsodb.SortByDate();
|
qsodb.SortByDate();
|
||||||
|
|
||||||
pthread_mutex_lock (&logbook_mutex);
|
// pthread_mutex_lock (&logbook_mutex);
|
||||||
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
||||||
pthread_mutex_unlock (&logbook_mutex);
|
// pthread_mutex_unlock (&logbook_mutex);
|
||||||
|
|
||||||
qsodb.isdirty(0);
|
qsodb.isdirty(0);
|
||||||
}
|
}
|
||||||
|
@ -651,9 +651,9 @@ cQsoRec rec;
|
||||||
cQsoDb::reverse = false;
|
cQsoDb::reverse = false;
|
||||||
qsodb.SortByDate();
|
qsodb.SortByDate();
|
||||||
|
|
||||||
pthread_mutex_lock (&logbook_mutex);
|
// pthread_mutex_lock (&logbook_mutex);
|
||||||
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
||||||
pthread_mutex_unlock (&logbook_mutex);
|
// pthread_mutex_unlock (&logbook_mutex);
|
||||||
|
|
||||||
qsodb.isdirty(0);
|
qsodb.isdirty(0);
|
||||||
restore_sort();
|
restore_sort();
|
||||||
|
@ -672,9 +672,9 @@ void deleteRecord () {
|
||||||
cQsoDb::reverse = false;
|
cQsoDb::reverse = false;
|
||||||
qsodb.SortByDate();
|
qsodb.SortByDate();
|
||||||
|
|
||||||
pthread_mutex_lock (&logbook_mutex);
|
// pthread_mutex_lock (&logbook_mutex);
|
||||||
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
adifFile.writeLog (logbook_filename.c_str(), &qsodb);
|
||||||
pthread_mutex_unlock (&logbook_mutex);
|
// pthread_mutex_unlock (&logbook_mutex);
|
||||||
|
|
||||||
qsodb.isdirty(0);
|
qsodb.isdirty(0);
|
||||||
restore_sort();
|
restore_sort();
|
||||||
|
|
Ładowanie…
Reference in New Issue