diff --git a/httpserver/httpresponse.cpp b/httpserver/httpresponse.cpp index a7c47193e..cead65bc7 100644 --- a/httpserver/httpresponse.cpp +++ b/httpserver/httpresponse.cpp @@ -13,6 +13,7 @@ HttpResponse::HttpResponse(QTcpSocket* socket) { sentLastPart=false; buffersize=40960; barry.reserve(40960); + userdata_=NULL; } void HttpResponse::setHeader(QByteArray name, QByteArray value) { diff --git a/httpserver/httpresponse.h b/httpserver/httpresponse.h index ccf0dcc31..436b8e94a 100644 --- a/httpserver/httpresponse.h +++ b/httpserver/httpresponse.h @@ -90,6 +90,10 @@ public: void bwrite(QByteArray data); void flush(); + // user data for response + void setUserData(void *here) { userdata_ = here; } + void *userData() { return userdata_; } + /** Indicates wheter the body has been sent completely. Used by the connection handler to terminate the body automatically when necessary. @@ -143,6 +147,8 @@ private: int buffersize; QByteArray barry; + + void *userdata_; }; #endif // HTTPRESPONSE_H diff --git a/src/APIWebService.cpp b/src/APIWebService.cpp index 2a29e7111..b04e2de28 100644 --- a/src/APIWebService.cpp +++ b/src/APIWebService.cpp @@ -163,29 +163,72 @@ APIWebService::writeRideLine(QList wanted, RideItem &item, HttpRequest *req if (item.dateTime.date() < since) return; if (item.dateTime.date() > before) return; - // date, time, filename - response->bwrite(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit()); - response->bwrite(","); - response->bwrite(item.dateTime.time().toString("hh:mm:ss").toLocal8Bit());; - response->bwrite(","); - response->bwrite(item.fileName.toLocal8Bit()); + // are we doing rides or intervals? + listRideSettings *settings = static_cast(response->userData()); - if (wanted.count()) { - // specific metrics - foreach(int index, wanted) { - double value = item.metrics()[index]; - response->bwrite(","); - response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + if (settings->intervals == true) { + + // loop through all available intervals for this ride item + foreach(IntervalItem *interval, item.intervals()){ + + // date, time, filename + response->bwrite(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit()); + response->bwrite(", "); + response->bwrite(item.dateTime.time().toString("hh:mm:ss").toLocal8Bit());; + response->bwrite(", "); + response->bwrite(item.fileName.toLocal8Bit()); + + // now the interval name and type + response->bwrite(", \""); + response->bwrite(interval->name.toLocal8Bit()); + response->bwrite("\", "); + response->bwrite(QString("%1").arg(static_cast(interval->type)).toLocal8Bit()); + + // essentially the same as below .. cut and paste (refactor?XXX) + if (wanted.count()) { + // specific metrics + foreach(int index, wanted) { + double value = interval->metrics()[index]; + response->bwrite(","); + response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + } + } else { + + // all metrics... + foreach(double value, interval->metrics()) { + response->bwrite(","); + response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + } + } + response->bwrite("\n"); } + } else { - // all metrics... - foreach(double value, item.metrics()) { - response->bwrite(","); - response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + // date, time, filename + response->bwrite(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit()); + response->bwrite(","); + response->bwrite(item.dateTime.time().toString("hh:mm:ss").toLocal8Bit());; + response->bwrite(","); + response->bwrite(item.fileName.toLocal8Bit()); + + if (wanted.count()) { + // specific metrics + foreach(int index, wanted) { + double value = item.metrics()[index]; + response->bwrite(","); + response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + } + } else { + + // all metrics... + foreach(double value, item.metrics()) { + response->bwrite(","); + response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + } } + response->bwrite("\n"); } - response->bwrite("\n"); } void diff --git a/src/APIWebService.h b/src/APIWebService.h index f68d92b93..f36d7bdae 100644 --- a/src/APIWebService.h +++ b/src/APIWebService.h @@ -23,6 +23,10 @@ #include "RideItem.h" #include +struct listRideSettings { + bool intervals; +}; + class APIWebService : public HttpRequestHandler { diff --git a/src/RideDB.y b/src/RideDB.y index c504d03bc..fa8107838 100644 --- a/src/RideDB.y +++ b/src/RideDB.y @@ -471,6 +471,8 @@ void RideCache::save() void APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &response) { + listRideSettings settings; + // the ride db QString ridedb = QString("%1/%2/cache/rideDB.json").arg(home.absolutePath()).arg(athlete); QFile rideDB(ridedb); @@ -485,6 +487,14 @@ APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &re return; } + // intervals or rides? + QString intervalsp = request.getParameter("intervals"); + if (intervalsp.toUpper() == "TRUE") settings.intervals = true; + else settings.intervals = false; + + // set user data + response.setUserData(&settings); + // write headings const RideMetricFactory &factory = RideMetricFactory::instance(); QVector indexed(factory.metricCount()); @@ -507,6 +517,9 @@ APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &re // write headings response.bwrite("date, time, filename"); + // if intervals, add interval name + if (settings.intervals == true) response.bwrite(", interval name, interval type"); + int i=0; foreach(const RideMetric *m, indexed) {