Beispiel #1
0
// ====================================================================================
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 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;
}
Beispiel #2
0
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*/
}