dl-fldigi/src/logger/logger.cxx

235 wiersze
6.4 KiB
C++

// ----------------------------------------------------------------------------
// logger.cxx Remote Log Interface for fldigi
//
// Copyright 2006-2009 W1HKJ, Dave Freese
//
// This file is part of fldigi.
//
// Fldigi is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Fldigi is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with fldigi. If not, see <http://www.gnu.org/licenses/>.
// ----------------------------------------------------------------------------
#include <config.h>
#include <sys/types.h>
#include <sys/stat.h>
#if !defined(__WOE32__) && !defined(__APPLE__)
# include <sys/ipc.h>
# include <sys/msg.h>
#endif
#include <errno.h>
#include <string>
#include "logger.h"
#include "lgbook.h"
#include "main.h"
#include "modem.h"
#include "waterfall.h"
#include "fl_digi.h"
#include "trx.h"
#include "debug.h"
#include "macros.h"
#include "status.h"
#include "spot.h"
#include "adif_io.h"
#include "date.h"
#include "configuration.h"
#include "logsupport.h"
#include "lookupcall.h"
#include <FL/fl_ask.H>
using namespace std;
//---------------------------------------------------------------------
const char *logmode;
static string log_msg;
static string errmsg;
static string notes;
//=============================================================================
#if defined(__WOE32__) || defined(__APPLE__)
static string adif;
void writeADIF () {
// open the adif file
FILE *adiFile;
string sfname;
sfname = TempDir;
sfname.append("log.adif");
adiFile = fopen (sfname.c_str(), "a");
if (adiFile) {
// write the current record to the file
fprintf(adiFile,"%s<EOR>\n", adif.c_str());
fclose (adiFile);
}
}
void putadif(int num, const char *s)
{
char tempstr[100];
int slen = strlen(s);
int n = snprintf(tempstr, sizeof(tempstr), "<%s:%d>", fields[num].name, slen);
if (n == -1) {
LOG_PERROR("snprintf");
return;
}
adif.append(tempstr).append(s);
}
void submit_ADIF(cQsoRec &rec)
{
adif.erase();
putadif(QSO_DATE, rec.getField(QSO_DATE));
putadif(TIME_ON, rec.getField(TIME_ON));
putadif(QSO_DATE_OFF, rec.getField(QSO_DATE_OFF));
putadif(TIME_OFF, rec.getField(TIME_OFF));
putadif(CALL, rec.getField(CALL));
putadif(FREQ, rec.getField(FREQ));
putadif(MODE, rec.getField(MODE));
putadif(RST_SENT, rec.getField(RST_SENT));
putadif(RST_RCVD, rec.getField(RST_RCVD));
putadif(TX_PWR, rec.getField(TX_PWR));
putadif(NAME, rec.getField(NAME));
putadif(QTH, rec.getField(QTH));
putadif(STATE, rec.getField(STATE));
putadif(VE_PROV, rec.getField(VE_PROV));
putadif(COUNTRY, rec.getField(COUNTRY));
putadif(GRIDSQUARE, rec.getField(GRIDSQUARE));
putadif(STX, rec.getField(STX));
putadif(SRX, rec.getField(SRX));
putadif(XCHG1, rec.getField(XCHG1));
putadif(MYXCHG, rec.getField(MYXCHG));
notes = rec.getField(NOTES);
for (size_t i = 0; i < notes.length(); i++)
if (notes[i] == '\n') notes[i] = ';';
putadif(NOTES, notes.c_str());
// these fields will always be blank unless they are added to the main
// QSO log area.
putadif(IOTA, rec.getField(IOTA));
putadif(DXCC, rec.getField(DXCC));
putadif(QSL_VIA, rec.getField(QSL_VIA));
putadif(QSLRDATE, rec.getField(QSLRDATE));
putadif(QSLSDATE, rec.getField(QSLSDATE));
writeADIF();
}
#endif
//---------------------------------------------------------------------
// the following IPC message is compatible with xlog remote data spec.
//---------------------------------------------------------------------
#if !defined(__WOE32__) && !defined(__APPLE__)
#define addtomsg(x, y) log_msg = log_msg + (x) + (y) + LOG_MSEPARATOR
static void send_IPC_log(cQsoRec &rec)
{
msgtype msgbuf;
const char LOG_MSEPARATOR[2] = {1,0};
int msqid, len;
int mm, dd, yyyy;
char szdate[9];
char sztime[5];
strncpy(szdate, rec.getField(QSO_DATE_OFF), 8);
szdate[8] = 0;
sscanf(&szdate[6], "%d", &dd); szdate[6] = 0;
sscanf(&szdate[4], "%d", &mm); szdate[4] = 0;
sscanf(szdate, "%d", &yyyy);
Date logdate(mm, dd, yyyy);
log_msg.clear();
log_msg = string("program:") + PACKAGE_NAME + string(" v ") + PACKAGE_VERSION + LOG_MSEPARATOR;
addtomsg("version:", LOG_MVERSION);
addtomsg("date:", logdate.szDate(5));
memset(sztime, 0, sizeof(sztime) / sizeof(char));
strncpy(sztime, rec.getField(TIME_ON), (sizeof(sztime) / sizeof(char)) - 1);
addtomsg("TIME:", sztime);
memset(sztime, 0, 5);
strncpy(sztime, rec.getField(TIME_OFF), 4);
addtomsg("endtime:", sztime);
addtomsg("call:", rec.getField(CALL));
addtomsg("mhz:", rec.getField(FREQ));
addtomsg("mode:", rec.getField(MODE));
addtomsg("tx:", rec.getField(RST_SENT));
addtomsg("rx:", rec.getField(RST_RCVD));
addtomsg("name:", rec.getField(NAME));
addtomsg("qth:", rec.getField(QTH));
addtomsg("state:", rec.getField(STATE));
addtomsg("province:", rec.getField(VE_PROV));
addtomsg("country:", rec.getField(COUNTRY));
addtomsg("locator:", rec.getField(GRIDSQUARE));
addtomsg("serialout:", rec.getField(STX));
addtomsg("serialin:", rec.getField(SRX));
addtomsg("free1:", rec.getField(XCHG1));
notes = rec.getField(NOTES);
for (size_t i = 0; i < notes.length(); i++)
if (notes[i] == '\n') notes[i] = ';';
addtomsg("notes:", notes.c_str());
addtomsg("power:", rec.getField(TX_PWR));
strncpy(msgbuf.mtext, log_msg.c_str(), sizeof(msgbuf.mtext));
msgbuf.mtext[sizeof(msgbuf.mtext) - 1] = '\0';
if ((msqid = msgget(LOG_MKEY, 0666 | IPC_CREAT)) == -1) {
LOG_PERROR("msgget");
return;
}
msgbuf.mtype = LOG_MTYPE;
len = strlen(msgbuf.mtext) + 1;
if (msgsnd(msqid, &msgbuf, len, IPC_NOWAIT) < 0)
LOG_PERROR("msgsnd");
}
#endif
void submit_record(cQsoRec &rec)
{
#if !defined(__WOE32__) && !defined(__APPLE__)
send_IPC_log(rec);
#else
submit_ADIF(rec);
#endif
}
//---------------------------------------------------------------------
extern void xml_add_record();
void submit_log(void)
{
if (progStatus.spot_log)
spot_log(inpCall->value(), inpLoc->value());
logmode = mode_info[active_modem->get_mode()].adif_name;
if (progdefaults.eqsl_when_logged)
makeEQSL("");
if (progdefaults.xml_logbook)
xml_add_record();
else
AddRecord();
}