#include "adif.h" #include #include /* W1XT20m14.076DM33JT65-21-14201104220417042441st JT65A QSO. Him: mag loop 20WVK3ACFqf22lb IK1SOW20m14.076JN35JT65-19-1120110422052505333VK3ACFqf22lb */ void ADIF::init(QString filename) { _filename = filename; _data.clear(); } QString ADIF::_extractField(const QString line, const QString fieldName) { int s1 = line.indexOf(fieldName,0,Qt::CaseInsensitive); if (s1 >=0) { int s2 = line.indexOf('>',s1); if (s2 >= 0) { int flsi = s1+fieldName.length(); int flsl = s2-flsi; if (flsl>0) { QString fieldLengthString = line.mid(flsi,flsl); int fieldLength = fieldLengthString.toInt(); QString field = line.mid(s2+1,fieldLength); return field; } } } return ""; } void ADIF::load() { _data.clear(); QFile inputFile(_filename); if (inputFile.open(QIODevice::ReadOnly)) { QTextStream in(&inputFile); while ( !in.atEnd() ) { QString line = in.readLine(); QSO q; q.call = _extractField(line,"CALL:"); q.band = _extractField(line,"BAND:"); q.mode = _extractField(line,"MODE:"); q.date = _extractField(line,"QSO_DATE:"); if (q.call != "") _data << q; } inputFile.close(); } } void ADIF::add(const QString call) { QSO q; q.call = call; q.band = ""; //TODO q.mode = "JT9"; //TODO q.date = ""; //TODO _data << q; } // return true if in the log same band and mode (where JT65 == JT9) bool ADIF::match(const QString call, const QString band, const QString mode) { QSO q; foreach(q,_data) { if (call.compare(q.call) == 0) //TODO handle multiple log entries from same call, should this be a hash table rather than a list? { if ((band.compare(q.band) == 0) || (band=="") || (q.band=="")) { if ( ( ((mode.compare("JT65",Qt::CaseInsensitive)==0) || (mode.compare("JT9",Qt::CaseInsensitive)==0)) && ((q.mode.compare("JT65",Qt::CaseInsensitive)==0) || (q.mode.compare("JT9",Qt::CaseInsensitive)==0)) ) || (mode.compare(q.mode)==0) ) return true; } } } return false; } QList ADIF::getCallList() { QList p; QSO q; foreach(q,_data) p << q.call; return p; } int ADIF::getCount() { return _data.length(); }