// ==================================================================================== // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // IMPORT // logFile, path_Dateiname, qsltype, rig, home_id // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void wadif::doImport(QString log,QString fpath, int qslmode, QString rig, int hId) { QString val, token, prog; QString Call, qsoDate; QString t, z; int idx, n, oid, id, sekcnt, vl, len; bool ok; char buf[255]; sekcnt = 10; // Sekundenzähler 10..59 oid = 0; QSqlQuery query; QFile datei( fpath ); if(! datei.open(QIODevice::ReadOnly)) { state = 1; return; // FEHLER } count = 0; QTextStream istream( &datei); // Header lesen ---------------------------------- while( istream.atEnd() != true ) { // HEADER '<eoh>' suchen len = 0; while(len == 0) { // leere zeilen ueberspringen t = istream.readLine(0); len = t.count(); if(len != 0) break; // zeile mit text gefunden } idx = 0; // text auswerten while(len != idx) if(t[idx++] == QChar('<')) break; // suche '<' z = ""; if(len != idx) { // '<' gefunden, text ist gueltig while(t[idx] != QChar(':') && t[idx] != QChar('>')) z += t[idx++]; if(t[idx] == QChar('>')) { // '>' gefunden, dann ist token ohne text z = z.toUpper(); // token immer groß if(z.compare("EOH") == 0) break; // header_ende ? } else { val = ""; // ':' gefunden, es gibt text idx++; if(z.compare("PROGRAMID") == 0) // wenn ProgrammID while(t[idx] != QChar('>')) val += t[idx++]; vl = val.toInt(&ok,10); idx++; val = ""; n = vl; // text:_laenge while(n-- != 0) val += t[idx++]; // text lesen prog = val; } } } // Header gelesen // ------------ jetzt DATA --------------------- Error = ""; count = 0; // Datensatz Zähler while(istream.atEnd() == FALSE) { // ADIF_text bis Datei_ende bearbeiten i = 0; while(i != qsoFields) strcpy(adh[i++].value,""); // value(datenfelder) QSO_tabelle loeschen i = 0; while(i != qslFields) strcpy(adhq[i++].value,""); // value(datenfelder) QSL_tabelle loeschen i = 0; while(i != awdFields) strcpy(adhw[i++].value,""); // value(datenfelder) AWD_tabelle loeschen z = istream.readLine(0); // daten_zeile lesen und bearbeiten. Zeile ist: stream ohne '\n' or '\l\r', // daten_token oder Zeilenanteile, daten_zeile_ende ist <eor> im stream. if(z.compare("<EOF>") == 0) break; // File_ende ? while(z.count() == 0) { // check: es koennte eine leer_zeile vor <eor> sein if(istream.atEnd() == TRUE) break; // oder eine leer_zeile mitten in der text_zeile (Ucx) z = istream.readLine(0); // suche text } if(istream.atEnd() == TRUE) break; // ok. ist File_ende len = z.count(); vl = 0; Lcn = ""; Cqz = ""; Ituz = ""; Dxcc = ""; t = ""; n = 0; idx = 0; // zeilen_index while( 1 ) { // 1. zeile aus datastream while(len != idx) { if(z[idx++] == QChar('<')) break; // gefunden } if(len == idx) { // das war eine leere_restzeile oder z = istream.readLine(0); // zeile war token oder zeilen_anteil; neue zeile (token) lesen len = z.count(); if(len == 0) // war leer_zeile z = istream.readLine(0); // n. zeile lesen len = z.count(); idx = 0; while(z[idx] != QChar('<')) idx++; // suche token_anfang idx++; } t = ""; while(z[idx] != QChar(':') && z[idx] != QChar('>')) t += z[idx++]; // ADIF_token_text if(z[idx] == QChar('>')) { // steht am Textende '>' ist token ohne Text t = t.toUpper(); // wenn ja; immer groß if((t.compare("EOR") == 0) || (t.compare("EOF") == 0)) // check auf zeilen od. Datei_ENDE break; } if(t.compare("EOF") == 0) break; // * schluss * token = t; // ADIF_token sichern t = ""; idx++; while(z[idx] != QChar('>') && z[idx] != QChar(':')) t += z[idx++]; // text_laenge holen vl = t.toInt(&ok,10); // laenge Datenstring sichern if(z[idx] == QChar(':')) { // ist Datum_type <QSL_DATE:8:d> idx++; // z.Z ':' überspringen idx++; // z.Z 'd' überspringen } idx++; // '>' überspringen t = ""; n = vl; // nutz_datenstring_laenge while(n-- != 0) t += z[idx++]; // nutz_daten lesen val = t; // token + data bearbeitem token = token.toUpper(); // ADIF_wort immer in groß_Buchstaben strcpy(buf,token.toAscii()); // ADIF_name nach ascii strcpy(buf,getdbName(buf)); // adif_name nach db_Spalten_name übersetzen // <token:n>val im *QSO_Datensatz* gefunden - jetzt namen checken, variable ist in val if(strlen(buf) != 0) { // falls db_spalten_name gefunden, value bearbeiten sonst überspringen if(strcmp(buf,"rufz") == 0) { // ist es das rufzeichen ? n = val.indexOf("/"); // check Cept_prefix im val if(n != -1) { // flush gefunden if( n <= 4 ) { // ja ist cept ( es gibt auch prefixe grösser 4 !! ) s = val.left(n); // ja: cept_pref sichern s += "/"; // flush anhängen val.remove(0,n +1); // cept_pref vom Rufzeiche entfernen setValue((char *)"cept",s); // CEPT_prefix setzen } } setValue((char *)"rufz",val); // Rufzeichen setzen ( ohne cept ) Call = val; // Rufz merken } else if(strcmp(buf,"dxcc") == 0) { // convertiere ADIF_Nr->la_pref n = val.toInt(&ok,10); // wenn dxcc numerisch if(ok == true ) // wenn Zahl, convertiere nach pref qy = "SELECT lcn,cqz,ituz,ldxcc FROM tla WHERE adif="+s.setNum(n); else qy = "SELECT lcn,cqz,ituz,ldxcc FROM tla WHERE ldxcc='"+val+"'"; query.exec(qy); if(query.size() != 0 ) { // prefix oder adif_nr gefunden query.next(); Lcn = query.value(0).toString(); // hole: cn aus Landestabelle Cqz = query.value(1).toString(); // cqz Ituz = query.value(2).toString(); // ituz Dxcc = query.value(3).toString(); // dxcc_prefix setValue(buf,Dxcc); // setze:DXCC_pref -alpha_type } else { // nicht gefunden Error += " Call "+getValue((char *)"rufz"); Error += " dxcc_prefix < "+val; Error += " > nicht gefunden\n"; // tr() ??? state = 1; // es ist ein Fehler aufgetreten } } else if(strcmp(buf,"band") == 0) { // check Band val = val.toUpper(); val = getSysBand(val); // übersetze Band_variable setValue(buf,val); // setze band } else if(strcmp(buf,"day") == 0) { // check Qso_Tag setValue(buf,val); // Tag setzen qsoDate = val; // Datun merken } else if(strcmp(buf,"btime") == 0) { // check Qso_Start_zeit if(vl != 6) { // falls Zeit 6.stellig sekcnt++; // Sekunden +1 if(sekcnt == 60) // sek. min 10 <-> 60 max sekcnt = 10; val.append(s.setNum(sekcnt)); // Zeit auf 8.stellig erweitern } setValue(buf,val); // setze Zeit } else if(strcmp(buf,"etime") == 0) { // Qso_Ende_zeit if(vl != 6) { sekcnt++; // Sekunden +1 if(sekcnt == 60) sekcnt = 10; val.append(s.setNum(sekcnt)); // Zeit 8.stellig } setValue(buf,val); // setze Zeit } else if(strcmp(buf,"qslr") == 0) { // ---------// QSL_r - Büro -------------------- if(val.compare("N") == 0) val = "R"; else { if(val.compare("Y") == 0) // QSL eralten ? addQslFlag((char *)"qslRvia","B"); // QSLr_via 'B' } setValue(buf,val); // R, Y, I } else if(strcmp(buf,"qsls") == 0) { // qsl_s if( !qslmode ) // qslMode = 0 ( daten aus contest ) val = ""; else { // qslMode = 1 ( daten aus anderem LOG ) - wie Import if(val.compare("N") == 0) { val = "R"; setValue((char *)"prflg","B"); // QSL_Karte drucken - ja; } else if(val.compare("Y") == 0) // QSL gesendet - ja; addQslFlag((char *)"qslSvia","B"); // QSLs_via 'B' } setValue(buf,val); // val = "", R, Y, I } else { setValue(buf,val); // gefunden, default - value in arry eintragen } } else { // ----------------------------------- // QSL * LOTW strcpy(buf,token.toAscii()); strcpy(buf,getdbNameQsl(buf)); // adif_feldname übersetzen if(strlen(buf) != 0) { // falls Spalten_name gefunden, bearbeiten if(strcmp(buf,"eqsls") == 0) { // eQSL * eqsl_s if(val.compare("N") == 0) // (UcxL) N = noch nicht gesendet val = "R"; // setze R_equested else { if(val.compare("Y") == 0) { addQslFlag((char *)"qslSvia","E"); // QSLs_via 'E' setValueQsl(buf,val); // val eintragen R, Y } } } else // eQSL_r if(strcmp(buf,"eqslr") == 0) { if(val.compare("N") == 0) // (UcxL) N = noch nicht erhalten val = "R"; // setze Requested else { if(val.compare("Y") == 0) { // QSL erhalten ? addQslFlag((char *)"qslRvia","E"); // QSLr_via 'E' setValueQsl(buf,val); // val eintragen R, Y } } } else // -------------------------------// LOTW * lotqsl_r if(strcmp(buf,"lotqslr") == 0) { // --------------- if(val.compare("N") == 0) // (UcxL) n = nicht erhalten val = "R"; // setze R_equested else { if(val.compare("Y") == 0) { // QSL erhalten ? addQslFlag((char *)"qslRvia","L"); // QSLr_via 'L' setValueQsl(buf,val); // val eintragen R, Y } } } else // lotqsl_s if(strcmp(buf,"lotqsls") == 0) { if(val.compare("N") == 0) // (UcxL) N = noch nicht erhalten val = "R"; // setze R_equested else { if(val.compare("Y") == 0) { // QSL gesendet ? addQslFlag((char *)"qslSvia","L"); // QSLs_via 'L' setValueQsl(buf,val); // val eintragen R, Y } } } else setValueQsl(buf,val); // default } else { // ----------------------------- AWD_daten_satz strcpy(buf,token.toAscii()); strcpy(buf,getdbNameAwd(buf)); // adif_feldname nach dbname übersetzen if(strlen(buf) != 0) { // AWD_Type gefunden setValueAwd(buf,val); // value eintragen } else { // Fehler_text setzen Error += " Call "+getValue((char *)"rufz"); Error += " "+token; Error += " text < "+val; Error += " > nicht gefunden\n"; // tr() ?? state = 1; // es ist ein Fehler aufgetreten } } } // ein tocken bearbeitet } // WHILE( 1 ) <eor> nicht erreicht //-- ENDE_Adif_data_zeile -- <EOR> gefunden // fehlende Values nachtragen if(getValue((char *)"dxcc").count() == 0) { // falls dxcc_feld leer s = getValue((char *)"rufz"); // hole Rufzeichen n = 1; z = s.left(n); while(getla( z ) == 0) { if(n >= 4) { // unbekannt Error += "dxcc fuer Rufzeichen "+s+" nicht gefunden\n"; state = 1; // es ist ein Fehler aufgetreten break; } z = s.left(++n); } setValue((char *)"cn",Lcn); setValue((char *)"cqz",Cqz); setValue((char *)"ituz",Ituz); setValue((char *)"dxcc",Dxcc); } if(getValue((char *)"cn").count() == 0) { // falls Cont fehlt setValue((char *)"cn",Lcn); // setze continent } if(getValue((char *)"cqz").count() == 0) { // falls CQ_zone fehlt setValue((char *)"cqz",Cqz); // setze..CQzone } if(getValue((char *)"ituz").count() == 0) { // falls ITU_zone fehlt setValue((char *)"ituz",Ituz); // setze ..zone } if(getValue((char *)"etime").count() == 0) { // falls Ende_zeit fehlt setValue((char *)"etime", getValue((char *)"btime")); // setze = bzeit } s = s.setNum(hId); // portabel_id strcpy(buf,s.toAscii()); setValue((char *)"rig",rig); // ( ist für DRUCK erforderlich ) setValue((char *)"qline",(char *)"KW"); // kein ADIF_token - könnte leer bleiben setValue((char *)"quarter",buf); // ist ADIF_import_portabel_type setValue((char *)"op",(char *)"0"); // Operator intern_value z.Z.= 0 // ------ DEBUG /* n = 0; // TEST Data ausgeben i = 0; while(i != qsoFields) { qDebug() << adh[i].pos << adh[i].field << adh[i].adifnam << adh[i].value; i++; } n = 0; i = 0; while(i != qslFields) { qDebug() << adhq[i].pos << adhq[i].field << adhq[i].adifnam << adhq[i].value; i++; } n = 0; i = 0; while(i != awdFields) { qDebug() << adhw[i].pos << adhw[i].field << adhw[i].adifnam << adhw[i].value; i++; } //datei.close(); //return; */ // ----- DEBUG QSqlQuery query; // -- OM -------------------------------------------- alle LOG_Datensatze erzeugen qy = "SELECT omid FROM "+log+"om WHERE rufz='"; qy += Call; qy += "'"; query.exec(qy); n = query.size(); if(n == 0 ) { // ist der OM neu ? qy = "INSERT INTO "+log+"om VALUES (0,'"; // ja; qy += Call; qy += "','"; qy += adh[2].value; qy += "')"; QSqlQuery query; query.exec(qy); oid = query.lastInsertId().toInt(); // Datensatz merken } else { query.next(); oid = query.value(0).toInt(); } // -- QSO ------------------------------------------ n = 3; // starte auf index_pos_3 qy = "INSERT INTO "+log+" VALUES (0,"+s.setNum(oid)+",'"; qy += adh[0].value; // cept while(n != qsoFields -3 ) { // alle felder übernehmen qy += "','"; qy += adh[n++].value; } qy += "',"; qy += adh[n++].value; // quarter qy += ","; qy += adh[n++].value; // Operator qy += ")"; query.exec(qy); // Datensatz eintragen id = query.lastInsertId().toInt(); // -- QSL ------------------------------------------- n = 0; // starte auf index_pos_0 qy = "INSERT INTO "+log+"qsl VALUES (0,"+s.setNum(id)+",'"; qy += Call; qy += "','"+qsoDate; while(n != qslFields) { // alle felder übernehmen qy += "','"; qy += adhq[n++].value; } qy += "')"; query.exec(qy); // Datensatz eintragen // qDebug() << query.lastError(); // -- AWD ------------------------------------------- n = 0; while(n != awdFields) { // alle felder prüfen und übernehmen if(strlen(adhw[n].value) != 0) { // value eingetragen ? qy = "INSERT INTO "+log+"awd VALUES (0,"+s.setNum(id)+",'"; qy += Call; qy += "','"; qy += adhw[n].field; qy += "','"; qy += adhw[n].value; qy += "')"; query.exec(qy); // Datensatz eintragen } n++; // nächsten awd_type } count++; // 1 Datensatz kompl. bearbeitet - QSO_zähler +1 /* if(count == 1) { // TEST einen Datensatz bearbeiten datei.close(); return; } */ } datei.close(); return; }
getrequests() { int t; union wait status; register struct servent *sp; /* ** Set up the address for the mailer. */ sp = getservbyname("smtp", "tcp"); if (sp == NULL) { syserr("server \"smtp\" unknown"); goto severe; } SendmailAddress.sin_family = AF_INET; SendmailAddress.sin_addr.s_addr = INADDR_ANY; SendmailAddress.sin_port = sp->s_port; /* ** Try to actually open the connection. */ # ifdef DEBUG if (tTd(15, 1)) printf("getrequests: port 0x%x\n", SendmailAddress.sin_port); # endif DEBUG /* get a socket for the SMTP connection */ DaemonSocket = socket(AF_INET, SOCK_STREAM, 0, 0); if (DaemonSocket < 0) { /* probably another daemon already */ syserr("getrequests: can't create socket"); severe: # ifdef LOG if (LogLevel > 0) syslog(LOG_SALERT, "cannot get connection"); # endif LOG finis(); } #ifdef DEBUG /* turn on network debugging? */ if (tTd(15, 15)) (void) setsockopt(DaemonSocket, SOL_SOCKET, SO_DEBUG, 0, 0); #endif DEBUG if (bind(DaemonSocket, &SendmailAddress, sizeof SendmailAddress, 0) < 0) { syserr("getrequests: cannot bind"); (void) close(DaemonSocket); goto severe; } listen(DaemonSocket, 10); # ifdef DEBUG if (tTd(15, 1)) printf("getrequests: %d\n", DaemonSocket); # endif DEBUG for (;;) { register int pid; auto int lotherend; struct sockaddr_in otherend; extern int RefuseLA; /* see if we are rejecting connections */ while (getla() > RefuseLA) sleep(5); /* wait for a connection */ do { errno = 0; lotherend = sizeof otherend; t = accept(DaemonSocket, &otherend, &lotherend, 0); } while (t < 0 && errno == EINTR); if (t < 0) { syserr("getrequests: accept"); sleep(5); continue; } /* ** Create a subprocess to process the mail. */ # ifdef DEBUG if (tTd(15, 2)) printf("getrequests: forking (fd = %d)\n", t); # endif DEBUG pid = fork(); if (pid < 0) { syserr("daemon: cannot fork"); sleep(10); (void) close(t); continue; } if (pid == 0) { extern struct hostent *gethostbyaddr(); register struct hostent *hp; extern char *RealHostName; /* srvrsmtp.c */ char buf[MAXNAME]; /* ** CHILD -- return to caller. ** Collect verified idea of sending host. ** Verify calling user id if possible here. */ /* determine host name */ hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET); if (hp != NULL) (void) sprintf(buf, "%s.ARPA", hp->h_name); else /* this should produce a dotted quad */ (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr); RealHostName = newstr(buf); (void) close(DaemonSocket); InChannel = fdopen(t, "r"); OutChannel = fdopen(t, "w"); # ifdef DEBUG if (tTd(15, 2)) printf("getreq: returning\n"); # endif DEBUG # ifdef LOG if (LogLevel > 11) syslog(LOG_DEBUG, "connected, pid=%d", getpid()); # endif LOG return; } /* ** PARENT -- wait for child to terminate. ** Perhaps we should allow concurrent processing? */ # ifdef DEBUG if (tTd(15, 2)) { sleep(2); printf("getreq: parent waiting\n"); } # endif DEBUG /* close the port so that others will hang (for a while) */ (void) close(t); /* pick up old zombies */ while (wait3(&status, WNOHANG, 0) > 0) continue; } /*NOTREACHED*/ }