diff --git a/core/ClubLog.cpp b/core/ClubLog.cpp index fcd5af1a..443dce71 100644 --- a/core/ClubLog.cpp +++ b/core/ClubLog.cpp @@ -116,6 +116,8 @@ void ClubLog::sendRealtimeRequest(const OnlineCommand command, { FCT_IDENTIFICATION; + static QRegularExpression rx("[a-zA-Z]"); + qCDebug(function_parameters) << command << uploadCallsign;// << record; if ( !isUploadImmediatelyEnabled() ) @@ -132,28 +134,28 @@ void ClubLog::sendRealtimeRequest(const OnlineCommand command, || password.isEmpty() ) return; + QUrl url; QUrlQuery query; query.addQueryItem("email", email); query.addQueryItem("callsign", uploadCallsign); query.addQueryItem("password", password); query.addQueryItem("api", API_KEY); - QByteArray data; - QTextStream stream(&data, QIODevice::ReadWrite); - AdiFormat adi(stream); - adi.exportContact(record); - stream.flush(); - data.replace("\n", " "); - QUrl url; - static QRegularExpression rx("[a-zA-Z]"); - switch (command) { case ClubLog::INSERT_QSO: - case ClubLog::UPDATE_QSO: + { url.setUrl(API_LIVE_UPLOAD_URL); + QByteArray data; + QTextStream stream(&data, QIODevice::ReadWrite); + AdiFormat adi(stream); + adi.exportContact(record); + stream.flush(); + data.replace("\n", " "); query.addQueryItem("adif", data); + } break; + case ClubLog::UPDATE_QSO: case ClubLog::DELETE_QSO: url.setUrl(API_LIVE_DELETE_URL); query.addQueryItem("dxcall", record.value("callsign").toByteArray()); @@ -170,10 +172,25 @@ void ClubLog::sendRealtimeRequest(const OnlineCommand command, QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply *currentReply = nam->post(request, query.query(QUrl::FullyEncoded).toUtf8()); - currentReply->setProperty("messageType", ( command == ClubLog::DELETE_QSO ) ? QVariant("realtimeDelete") - : QVariant("realtimeUpdate")); + + QVariant messageType; + switch ( command ) + { + case ClubLog::INSERT_QSO: + messageType = "realtimeInsert"; + currentReply->setProperty("dxcall", record.value("callsign")); + break; + case ClubLog::UPDATE_QSO: + messageType = "realtimeUpdate"; + RTupdatesInProgress.insert(record.value("id").toULongLong(), record); + break; + case ClubLog::DELETE_QSO: + messageType = "realtimeDelete"; + break; + } + currentReply->setProperty("contactID", record.value("id")); - currentReply->setProperty("dxcall", record.value("callsign")); + currentReply->setProperty("messageType", messageType); currentReply->setProperty("uploadCallsign", uploadCallsign); activeReplies << currentReply; } @@ -280,9 +297,9 @@ void ClubLog::processReply(QNetworkReply* reply) emit uploadFileOK("OK"); } /******************/ - /* realtimeUpdate */ + /* realtimeInsert */ /******************/ - else if ( messageType == "realtimeUpdate" ) + else if ( messageType == "realtimeInsert" ) { query_updateRT.bindValue(":id", reply->property("contactID")); query_updateRT.bindValue(":callsign", reply->property("dxcall")); //to be sure that the QSO with the ID is still the same sa before sending @@ -296,6 +313,24 @@ void ClubLog::processReply(QNetworkReply* reply) } } /******************/ + /* realtimeUpdate */ + /******************/ + else if ( messageType == "realtimeUpdate") + { + QSqlRecord insertRecord = RTupdatesInProgress.take(reply->property("contactID").toULongLong()); + + if ( insertRecord != QSqlRecord() ) + { + sendRealtimeRequest(ClubLog::INSERT_QSO, + insertRecord, + reply->property("uploadCallsign").toString()); + } + else + { + qWarning() << "Cannot find record for update in Update In-Progress Table"; + } + } + /******************/ /* realtimeDelete */ /******************/ else if ( messageType == "realtimeDelete") @@ -329,6 +364,7 @@ void ClubLog::abortRequest() i.remove(); } } + RTupdatesInProgress.clear(); } void ClubLog::insertQSOImmediately(const QSqlRecord &record) diff --git a/core/ClubLog.h b/core/ClubLog.h index e2364f58..d50fb491 100644 --- a/core/ClubLog.h +++ b/core/ClubLog.h @@ -4,6 +4,7 @@ #include #include #include +#include class QNetworkReply; class QNetworkAccessManager; @@ -55,6 +56,7 @@ public slots: const QString generateUploadCallsign(const QSqlRecord &record) const; QSqlRecord stripRecord(const QSqlRecord&); QSqlQuery query_updateRT; + QHash RTupdatesInProgress; const static QString SECURE_STORAGE_KEY; const static QString CONFIG_EMAIL_KEY;