diff --git a/src/BinRideFile.h b/src/BinRideFile.h index ca991427c..9baab1d0d 100644 --- a/src/BinRideFile.h +++ b/src/BinRideFile.h @@ -24,6 +24,7 @@ struct BinFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _BinRideFile_h diff --git a/src/Computrainer3dpFile.h b/src/Computrainer3dpFile.h index 1153b9bb4..cc906653c 100644 --- a/src/Computrainer3dpFile.h +++ b/src/Computrainer3dpFile.h @@ -24,6 +24,7 @@ struct Computrainer3dpFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + virtual bool hasWrite() const { return false; } }; #endif // _GC_COMPUTRAINER3DP_H diff --git a/src/CsvRideFile.cpp b/src/CsvRideFile.cpp index 3083daaad..e642ac425 100644 --- a/src/CsvRideFile.cpp +++ b/src/CsvRideFile.cpp @@ -350,3 +350,51 @@ RideFile *CsvFileReader::openRideFile(QFile &file, QStringList &errors, QListdataPoints()) { + if (point->secs == 0.0) + continue; + out << point->secs/60.0; + out << ","; + out << ((point->nm >= 0) ? point->nm : 0.0); + out << ","; + out << ((point->kph >= 0) ? (point->kph * convertUnit) : 0.0); + out << ","; + out << ((point->watts >= 0) ? point->watts : 0.0); + out << ","; + out << point->km * convertUnit; + out << ","; + out << point->cad; + out << ","; + out << point->hr; + out << ","; + out << point->interval; + out << ","; + out << point->alt; + out << "\n"; + } + + file.close(); + return true; +} diff --git a/src/CsvRideFile.h b/src/CsvRideFile.h index 84a3466f2..4ad0d73e5 100644 --- a/src/CsvRideFile.h +++ b/src/CsvRideFile.h @@ -24,6 +24,8 @@ struct CsvFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool writeRideFile(MainWindow *main, const RideFile *ride, QFile &file) const; + bool hasWrite() const { return true; } }; #endif // _CsvRideFile_h diff --git a/src/FitRideFile.h b/src/FitRideFile.h index f607fac9a..ce0d2f9bf 100644 --- a/src/FitRideFile.h +++ b/src/FitRideFile.h @@ -24,6 +24,7 @@ struct FitFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _FitRideFile_h diff --git a/src/GcRideFile.cpp b/src/GcRideFile.cpp index 189413bc7..465184eb0 100644 --- a/src/GcRideFile.cpp +++ b/src/GcRideFile.cpp @@ -170,8 +170,8 @@ GcFileReader::openRideFile(QFile &file, QStringList &errors, QList*) #define add_sample_hp(name) \ if (present->name) \ sample.setAttribute(#name, QString("%1").arg(point->name, 0, 'g', 11)); -void -GcFileReader::writeRideFile(const RideFile *ride, QFile &file) const +bool +GcFileReader::writeRideFile(MainWindow *,const RideFile *ride, QFile &file) const { QDomDocument doc("GoldenCheetah"); QDomElement root = doc.createElement("ride"); @@ -270,9 +270,9 @@ GcFileReader::writeRideFile(const RideFile *ride, QFile &file) const QByteArray xml = doc.toByteArray(4); if (!file.open(QIODevice::WriteOnly)) - assert(false); + return false; if (file.write(xml) != xml.size()) - assert(false); + return false; file.close(); + return true; } - diff --git a/src/GcRideFile.h b/src/GcRideFile.h index 159b1f8ce..de742d6ca 100644 --- a/src/GcRideFile.h +++ b/src/GcRideFile.h @@ -24,7 +24,8 @@ struct GcFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; - virtual void writeRideFile(const RideFile *ride, QFile &file) const; + bool writeRideFile(MainWindow *, const RideFile *ride, QFile &file) const; + bool hasWrite() const { return true; } }; #endif // _GcRideFile_h diff --git a/src/GpxRideFile.h b/src/GpxRideFile.h index 9b93a552d..197317462 100644 --- a/src/GpxRideFile.h +++ b/src/GpxRideFile.h @@ -27,6 +27,7 @@ struct GpxFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _GpxRideFile_h diff --git a/src/JsonRideFile.h b/src/JsonRideFile.h index b816ce0e7..2ed57d377 100644 --- a/src/JsonRideFile.h +++ b/src/JsonRideFile.h @@ -32,7 +32,8 @@ struct JsonFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; - virtual void writeRideFile(const RideFile *ride, QFile &file) const; + bool writeRideFile(MainWindow *, const RideFile *ride, QFile &file) const; + bool hasWrite() const { return true; } }; #endif // _JsonRideFile_h diff --git a/src/JsonRideFile.y b/src/JsonRideFile.y index ef9ab0fa1..2c566f13f 100644 --- a/src/JsonRideFile.y +++ b/src/JsonRideFile.y @@ -226,7 +226,7 @@ string: STRING { JsonString = unprotect(JsonRideFiletex static int jsonFileReaderRegistered = RideFileFactory::instance().registerReader( - "json", "GoldenCheetah Json Format", new JsonFileReader()); + "json", "GoldenCheetah Json Format", new JsonFileReader()); RideFile * JsonFileReader::openRideFile(QFile &file, QStringList &errors, QList*) const @@ -264,11 +264,11 @@ JsonFileReader::openRideFile(QFile &file, QStringList &errors, QList* } // Writes valid .json (validated at www.jsonlint.com) -void -JsonFileReader::writeRideFile(const RideFile *ride, QFile &file) const +bool +JsonFileReader::writeRideFile(MainWindow *, const RideFile *ride, QFile &file) const { // can we open the file for writing? - if (!file.open(QIODevice::WriteOnly)) return; + if (!file.open(QIODevice::WriteOnly)) return false; // truncate existing file.resize(0); @@ -408,4 +408,6 @@ JsonFileReader::writeRideFile(const RideFile *ride, QFile &file) const // close file.close(); + + return true; } diff --git a/src/KmlRideFile.cpp b/src/KmlRideFile.cpp index d91bc5d6e..87286f15a 100644 --- a/src/KmlRideFile.cpp +++ b/src/KmlRideFile.cpp @@ -60,6 +60,9 @@ using kmldom::TimeStampPtr; using kmldom::StylePtr; using kmldom::StyleMapPtr; +static int kmlFileReaderRegistered = + RideFileFactory::instance().registerReader( + "kml", "Google Earth KML Format", new KmlFileReader()); // // Utility functions // @@ -174,7 +177,7 @@ static StyleMapPtr CreateStyleMap(const char* id) { // Serialise the ride // bool -KmlFileReader::writeRideFile(const RideFile * ride, QFile &file) const +KmlFileReader::writeRideFile(MainWindow *, const RideFile * ride, QFile &file) const { // Create a new DOM document and setup styles et al kmldom::KmlFactory* kml_factory = kmldom::KmlFactory::GetFactory(); diff --git a/src/KmlRideFile.h b/src/KmlRideFile.h index 4ca170c50..711968bab 100644 --- a/src/KmlRideFile.h +++ b/src/KmlRideFile.h @@ -24,7 +24,8 @@ struct KmlFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &, QStringList &, QList* =0) const { return NULL; } // does not support reading - virtual bool writeRideFile(const RideFile *ride, QFile &file) const; + bool writeRideFile(MainWindow *, const RideFile *ride, QFile &file) const; + bool hasWrite() const { return true; } }; #endif // _KmlRideFile_h diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index e0a9be206..31ed4e44e 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -440,18 +440,10 @@ MainWindow::MainWindow(const QDir &home) : rideMenu->addAction(tr("&Import from file..."), this, SLOT (importFile()), tr ("Ctrl+I")); rideMenu->addAction(tr("&Manual activity entry..."), this, SLOT(manualRide()), tr("Ctrl+M")); rideMenu->addSeparator (); - rideMenu->addAction(tr("&Export to CSV..."), this, SLOT(exportCSV()), tr("Ctrl+E")); - rideMenu->addAction(tr("Export to GC..."), this, SLOT(exportGC())); - rideMenu->addAction(tr("&Export to Json..."), this, SLOT(exportJson())); - -#ifdef GC_HAVE_KML - rideMenu->addAction(tr("&Export to KML..."), this, SLOT(exportKML())); -#endif - rideMenu->addAction(tr("Export to PWX..."), this, SLOT(exportPWX())); - rideMenu->addAction(tr("Export to TCX..."), this, SLOT(exportTCX())); + rideMenu->addAction(tr("&Export ..."), this, SLOT(exportRide()), tr("Ctrl+E")); + rideMenu->addAction(tr("&Batch export ..."), this, SLOT(exportBatch()), tr("Ctrl+B")); + rideMenu->addAction(tr("Export Metrics as CSV..."), this, SLOT(exportMetrics()), tr("")); #ifdef GC_HAVE_SOAP - rideMenu->addSeparator (); - rideMenu->addAction(tr("&Export Metrics as CSV..."), this, SLOT(exportMetrics()), tr("")); rideMenu->addSeparator (); rideMenu->addAction(tr("&Upload to Training Peaks"), this, SLOT(uploadTP()), tr("Ctrl+U")); rideMenu->addAction(tr("Down&load from Training Peaks..."), this, SLOT(downloadTP()), tr("Ctrl+L")); @@ -1096,27 +1088,13 @@ MainWindow::currentRide() } void -MainWindow::exportGC() +MainWindow::exportBatch() { - if ((treeWidget->selectedItems().size() != 1) - || (treeWidget->selectedItems().first()->type() != RIDE_TYPE)) { - QMessageBox::critical(this, tr("Select Activity"), tr("No activity selected!")); - return; - } - - QString fileName = QFileDialog::getSaveFileName( - this, tr("Export GC"), QDir::homePath(), tr("GC XML Format (*.gc)")); - if (fileName.length() == 0) - return; - - QString err; - QFile file(fileName); - GcFileReader reader; - reader.writeRideFile(currentRide(), file); + // XXX todo } void -MainWindow::exportJson() +MainWindow::exportRide() { if ((treeWidget->selectedItems().size() != 1) || (treeWidget->selectedItems().first()->type() != RIDE_TYPE)) { @@ -1124,114 +1102,30 @@ MainWindow::exportJson() return; } - QString fileName = QFileDialog::getSaveFileName( - this, tr("Export Json"), QDir::homePath(), tr("GC Json Format (*.json)")); - if (fileName.length() == 0) - return; + // what format? + const RideFileFactory &rff = RideFileFactory::instance(); + QStringList allFormats; + foreach(QString suffix, rff.writeSuffixes()) + allFormats << QString("%1 (*.%2)").arg(rff.description(suffix)).arg(suffix); - QString err; - QFile file(fileName); - JsonFileReader reader; - reader.writeRideFile(currentRide(), file); -} + QString suffix; // what was selected? + QString fileName = QFileDialog::getSaveFileName(this, tr("Export Activity"), QDir::homePath(), allFormats.join(";;"), &suffix); -void -MainWindow::exportPWX() -{ - if ((treeWidget->selectedItems().size() != 1) - || (treeWidget->selectedItems().first()->type() != RIDE_TYPE)) { - QMessageBox::critical(this, tr("Select Activity"), tr("No activity selected!")); - return; - } + if (fileName.length() == 0) return; - QString fileName = QFileDialog::getSaveFileName( - this, tr("Export PWX"), QDir::homePath(), tr("PWX (*.pwx)")); - if (fileName.length() == 0) - return; - - QString err; - QFile file(fileName); - PwxFileReader reader; - reader.writeRideFile(cyclist, currentRide(), file); -} - -void -MainWindow::exportTCX() -{ - if ((treeWidget->selectedItems().size() != 1) - || (treeWidget->selectedItems().first()->type() != RIDE_TYPE)) { - QMessageBox::critical(this, tr("Select Activity"), tr("No activity selected!")); - return; - } - - QString fileName = QFileDialog::getSaveFileName( - this, tr("Export TCX"), QDir::homePath(), tr("TCX (*.tcx)")); - if (fileName.length() == 0) - return; - - QString err; - QFile file(fileName); - TcxFileReader reader; - reader.writeRideFile(this, cyclist, currentRide(), file); -} - -#ifdef GC_HAVE_KML -void -MainWindow::exportKML() -{ - if ((treeWidget->selectedItems().size() != 1) - || (treeWidget->selectedItems().first()->type() != RIDE_TYPE)) { - QMessageBox::critical(this, tr("Select Activity"), tr("No activity selected!")); - return; - } - - QString fileName = QFileDialog::getSaveFileName( - this, tr("Export KML"), QDir::homePath(), tr("Google Earth KML (*.kml)")); - if (fileName.length() == 0) - return; - - QString err; - QFile file(fileName); - KmlFileReader reader; - reader.writeRideFile(currentRide(), file); -} -#endif - -void -MainWindow::exportCSV() -{ - if ((treeWidget->selectedItems().size() != 1) - || (treeWidget->selectedItems().first()->type() != RIDE_TYPE)) { - QMessageBox::critical(this, tr("Select Activity"), tr("No activity selected!")); - return; - } - - ride = (RideItem*) treeWidget->selectedItems().first(); - - // Ask the user if they prefer to export with English or metric units. - QStringList items; - items << tr("Metric") << tr("Imperial"); - bool ok; - QString units = QInputDialog::getItem( - this, tr("Select Units"), tr("Units:"), items, 0, false, &ok); - if(!ok) - return; - bool useMetricUnits = (units == items[0]); - - QString fileName = QFileDialog::getSaveFileName( - this, tr("Export CSV"), QDir::homePath(), - tr("Comma-Separated Values (*.csv)")); - if (fileName.length() == 0) - return; + // which file type was selected + // extract from the suffix returned + QRegExp getSuffix("^[^(]*\\(\\*\\.([^)]*)\\)$"); + getSuffix.exactMatch(suffix); QFile file(fileName); - if (!file.open(QFile::WriteOnly | QFile::Truncate)) - { - QMessageBox::critical(this, tr("Split Activity"), tr("The file %1 can't be opened for writing").arg(fileName)); - return; - } + bool result = RideFileFactory::instance().writeRideFile(this, currentRide(), file, getSuffix.cap(1)); - ride->ride()->writeAsCsv(file, useMetricUnits); + if (result == false) { + QMessageBox oops(QMessageBox::Critical, tr("Export Failed"), + tr("Failed to export ride, please check permissions")); + oops.exec(); + } } void diff --git a/src/MainWindow.h b/src/MainWindow.h index fd9d85d55..0f4c76551 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -183,15 +183,9 @@ class MainWindow : public QMainWindow void openCyclist(); void downloadRide(); void manualRide(); - void exportPWX(); - void exportTCX(); - void exportCSV(); - void exportGC(); - void exportJson(); + void exportRide(); + void exportBatch(); void exportMetrics(); -#ifdef GC_HAVE_KML - void exportKML(); -#endif void manualProcess(QString); #ifdef GC_HAVE_SOAP void uploadTP(); diff --git a/src/ManualRideFile.h b/src/ManualRideFile.h index fb3532df9..66f2981db 100644 --- a/src/ManualRideFile.h +++ b/src/ManualRideFile.h @@ -24,6 +24,7 @@ struct ManualFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _ManualRideFile_h diff --git a/src/PolarRideFile.h b/src/PolarRideFile.h index f75d2234b..493932adb 100644 --- a/src/PolarRideFile.h +++ b/src/PolarRideFile.h @@ -24,6 +24,7 @@ struct PolarFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _PolarRideFile_h diff --git a/src/PwxRideFile.cpp b/src/PwxRideFile.cpp index b424977ef..aa0a754a7 100644 --- a/src/PwxRideFile.cpp +++ b/src/PwxRideFile.cpp @@ -260,7 +260,7 @@ PwxFileReader::PwxFromDomDoc(QDomDocument doc, QStringList &errors) const } bool -PwxFileReader::writeRideFile(const QString cyclist, const RideFile *ride, QFile &file) const +PwxFileReader::writeRideFile(MainWindow *main, const RideFile *ride, QFile &file) const { QDomText text; // used all over QDomDocument doc; @@ -282,9 +282,9 @@ PwxFileReader::writeRideFile(const QString cyclist, const RideFile *ride, QFile // athlete details QDomElement athlete = doc.createElement("athlete"); QDomElement name = doc.createElement("name"); - text = doc.createTextNode(cyclist); name.appendChild(text); + text = doc.createTextNode(main->cyclist); name.appendChild(text); athlete.appendChild(name); - double cyclistweight = ride->getTag("Weight", appsettings->cvalue(cyclist, GC_WEIGHT, 0.0).toString()).toDouble(); + double cyclistweight = ride->getTag("Weight", appsettings->cvalue(main->cyclist, GC_WEIGHT, 0.0).toString()).toDouble(); if (cyclistweight) { QDomElement weight = doc.createElement("weight"); text = doc.createTextNode(QString("%1").arg(cyclistweight)); diff --git a/src/PwxRideFile.h b/src/PwxRideFile.h index e870508db..d8a976c28 100644 --- a/src/PwxRideFile.h +++ b/src/PwxRideFile.h @@ -21,12 +21,14 @@ #include "GoldenCheetah.h" #include "RideFile.h" +#include "MainWindow.h" #include struct PwxFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; - virtual bool writeRideFile(const QString cyclist, const RideFile *ride, QFile &file) const; + bool writeRideFile(MainWindow *, const RideFile *ride, QFile &file) const; virtual RideFile *PwxFromDomDoc(QDomDocument doc, QStringList &errors) const; + bool hasWrite() const { return true; } }; #endif // _PwxRideFile_h diff --git a/src/QuarqRideFile.h b/src/QuarqRideFile.h index c9c6c0e10..6802f883f 100644 --- a/src/QuarqRideFile.h +++ b/src/QuarqRideFile.h @@ -27,6 +27,7 @@ bool quarqInterpreterInstalled( void ); struct QuarqFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _QuarqRideFile_h diff --git a/src/RawRideFile.h b/src/RawRideFile.h index b1ed078aa..88bb06916 100644 --- a/src/RawRideFile.h +++ b/src/RawRideFile.h @@ -24,6 +24,7 @@ struct RawFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _RawRideFile_h diff --git a/src/RideFile.cpp b/src/RideFile.cpp index 927ad270e..7962c3742 100644 --- a/src/RideFile.cpp +++ b/src/RideFile.cpp @@ -195,47 +195,6 @@ RideFile::distanceIndex(double km) const return i - dataPoints_.begin(); } -void RideFile::writeAsCsv(QFile &file, bool bIsMetric) const -{ - - // Use the column headers that make WKO+ happy. - double convertUnit; - QTextStream out(&file); - if (!bIsMetric) - { - out << "Minutes,Torq (N-m),MPH,Watts,Miles,Cadence,Hrate,ID,Altitude (feet)\n"; - convertUnit = MILES_PER_KM; - } - else { - out << "Minutes,Torq (N-m),Km/h,Watts,Km,Cadence,Hrate,ID,Altitude (m)\n"; - convertUnit = 1.0; - } - - foreach (const RideFilePoint *point, dataPoints()) { - if (point->secs == 0.0) - continue; - out << point->secs/60.0; - out << ","; - out << ((point->nm >= 0) ? point->nm : 0.0); - out << ","; - out << ((point->kph >= 0) ? (point->kph * convertUnit) : 0.0); - out << ","; - out << ((point->watts >= 0) ? point->watts : 0.0); - out << ","; - out << point->km * convertUnit; - out << ","; - out << point->cad; - out << ","; - out << point->hr; - out << ","; - out << point->interval; - out << ","; - out << point->alt; - out << "\n"; - } - - file.close(); -} RideFileFactory *RideFileFactory::instance_; @@ -261,6 +220,17 @@ QStringList RideFileFactory::suffixes() const return readFuncs_.keys(); } +QStringList RideFileFactory::writeSuffixes() const +{ + QStringList returning; + QMapIterator i(readFuncs_); + while (i.hasNext()) { + i.next(); + if (i.value()->hasWrite()) returning << i.key(); + } + return returning; +} + QRegExp RideFileFactory::rideFileRegExp() const { @@ -269,6 +239,17 @@ RideFileFactory::rideFileRegExp() const return QRegExp(s.arg(suffixList.join("|")), Qt::CaseInsensitive); } +bool +RideFileFactory::writeRideFile(MainWindow *main, const RideFile *ride, QFile &file, QString format) const +{ + // get the ride file writer for this format + RideFileReader *reader = readFuncs_.value(format.toLower()); + + // write away + if (!reader) return false; + else return reader->writeRideFile(main, ride, file); +} + RideFile *RideFileFactory::openRideFile(MainWindow *main, QFile &file, QStringList &errors, QList *rideList) const { diff --git a/src/RideFile.h b/src/RideFile.h index 92214e945..426096281 100644 --- a/src/RideFile.h +++ b/src/RideFile.h @@ -131,8 +131,6 @@ class RideFile : public QObject // QObject to emit signals void fillInIntervals(); int intervalBegin(const RideFileInterval &interval) const; - void writeAsCsv(QFile &file, bool bIsMetric) const; - // Index offset calculations double timeToDistance(double) const; // get distance in km at time in secs int timeIndex(double) const; // get index offset for time in secs @@ -207,6 +205,10 @@ struct RideFilePoint struct RideFileReader { virtual ~RideFileReader() {} virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const = 0; + + // if hasWrite capability should re-implement writeRideFile and hasWrite + virtual bool hasWrite() const { return false; } + virtual bool writeRideFile(MainWindow *, const RideFile *, QFile &) const { return false; } }; class RideFileFactory { @@ -226,8 +228,10 @@ class RideFileFactory { int registerReader(const QString &suffix, const QString &description, RideFileReader *reader); RideFile *openRideFile(MainWindow *main, QFile &file, QStringList &errors, QList* = 0) const; + bool writeRideFile(MainWindow *main, const RideFile *ride, QFile &file, QString format) const; QStringList listRideFiles(const QDir &dir) const; QStringList suffixes() const; + QStringList writeSuffixes() const; QString description(const QString &suffix) const { return descriptions_[suffix]; } diff --git a/src/RideImportWizard.cpp b/src/RideImportWizard.cpp index 194818837..29265472c 100644 --- a/src/RideImportWizard.cpp +++ b/src/RideImportWizard.cpp @@ -304,7 +304,7 @@ RideImportWizard::process() QString fulltarget = QDir::tempPath() + "/" + QFileInfo(thisfile).baseName() + QString("-%1.tcx").arg(counter+1); TcxFileReader reader; QFile target(fulltarget); - reader.writeRideFile(mainWindow, mainWindow->cyclist, extracted, target); + reader.writeRideFile(mainWindow, extracted, target); deleteMe.append(fulltarget); delete extracted; @@ -810,11 +810,11 @@ RideImportWizard::abortClicked() if (filenames[i].endsWith(".gc")) { GcFileReader reader; QFile target(fulltarget); - reader.writeRideFile(ride, target); + reader.writeRideFile(mainWindow, ride, target); } else { JsonFileReader reader; QFile target(fulltarget); - reader.writeRideFile(ride, target); + reader.writeRideFile(mainWindow, ride, target); } // clear diff --git a/src/SaveDialogs.cpp b/src/SaveDialogs.cpp index 4074c9030..ed30b090d 100644 --- a/src/SaveDialogs.cpp +++ b/src/SaveDialogs.cpp @@ -174,7 +174,7 @@ MainWindow::saveSilent(RideItem *rideItem) // save in GC format JsonFileReader reader; - reader.writeRideFile(rideItem->ride(), savedFile); + reader.writeRideFile(this, rideItem->ride(), savedFile); // rename the file and update the rideItem list to reflect the change if (convert) { diff --git a/src/SlfRideFile.h b/src/SlfRideFile.h index 87ec72389..b5e133b92 100644 --- a/src/SlfRideFile.h +++ b/src/SlfRideFile.h @@ -23,6 +23,7 @@ struct SlfFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _SlfRideFile_h diff --git a/src/SmfRideFile.h b/src/SmfRideFile.h index 056a152e6..d5f0631aa 100644 --- a/src/SmfRideFile.h +++ b/src/SmfRideFile.h @@ -23,6 +23,7 @@ struct SmfFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _SmfRideFile_h diff --git a/src/SplitActivityWizard.cpp b/src/SplitActivityWizard.cpp index edd548eeb..036fab8cb 100644 --- a/src/SplitActivityWizard.cpp +++ b/src/SplitActivityWizard.cpp @@ -811,7 +811,7 @@ SplitConfirm::validatePage() JsonFileReader reader; QFile out(target); - reader.writeRideFile(wizard->activities.at(i), out); + reader.writeRideFile(wizard->main, wizard->activities.at(i), out); current->setText(5, "Saved"); diff --git a/src/SplitRideDialog.cpp b/src/SplitRideDialog.cpp index b98d1bd17..831b38301 100644 --- a/src/SplitRideDialog.cpp +++ b/src/SplitRideDialog.cpp @@ -187,7 +187,7 @@ SplitRideDialog::CreateNewRideFile(const RideFile *ride, int nRecStart, int nRec // write to disk GcFileReader f; - f.writeRideFile(newRideFile.get(), file); + f.writeRideFile(mainWindow, newRideFile.get(), file); // add to the ride list mainWindow->addRide(fileName, false); diff --git a/src/SrdRideFile.h b/src/SrdRideFile.h index 1d92ad9b6..963871c25 100644 --- a/src/SrdRideFile.h +++ b/src/SrdRideFile.h @@ -24,6 +24,7 @@ struct SrdFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; //=================================================================================== diff --git a/src/SrmRideFile.h b/src/SrmRideFile.h index 2d0b10f1e..110f96ebb 100644 --- a/src/SrmRideFile.h +++ b/src/SrmRideFile.h @@ -24,6 +24,7 @@ struct SrmFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _SrmRideFile_h diff --git a/src/SyncRideFile.h b/src/SyncRideFile.h index 8dceb7f2b..62b7f2f10 100644 --- a/src/SyncRideFile.h +++ b/src/SyncRideFile.h @@ -23,6 +23,7 @@ struct SyncFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _SyncRideFile_h diff --git a/src/TPDownloadDialog.cpp b/src/TPDownloadDialog.cpp index 21d083ba1..748e96767 100644 --- a/src/TPDownloadDialog.cpp +++ b/src/TPDownloadDialog.cpp @@ -28,7 +28,6 @@ TPDownloadDialog::TPDownloadDialog(MainWindow *main) : QDialog(main, Qt::Dialog) { setWindowTitle(tr("Download from TrainingPeaks.com")); - cyclist = main->cyclist; athleter = new TPAthlete(this); connect (athleter, SIGNAL(completed(QList >)), this, SLOT(completedAthlete(QList >))); @@ -666,7 +665,7 @@ TPDownloadDialog::syncNext() RideFile *ride = RideFileFactory::instance().openRideFile(main, file, errors); if (ride) { - uploader->upload( main->cyclist, ride); + uploader->upload(main, ride); delete ride; // clean up! QApplication::processEvents(); return true; @@ -821,7 +820,7 @@ TPDownloadDialog::uploadNext() RideFile *ride = RideFileFactory::instance().openRideFile(main, file, errors); if (ride) { - uploader->upload( main->cyclist, ride); + uploader->upload(main, ride); delete ride; // clean up! QApplication::processEvents(); return true; @@ -902,7 +901,7 @@ TPDownloadDialog::saveRide(RideFile *ride, QDomDocument &, QStringList &errors) JsonFileReader reader; QFile file(filename); - reader.writeRideFile(ride, file); + reader.writeRideFile(main, ride, file); // add to the ride list rideFiles< #include "Settings.h" #include "RideFile.h" @@ -74,7 +75,7 @@ TPUpload::TPUpload(QObject *parent) : QObject(parent), http(this), uploading(fal } int -TPUpload::upload(QString cyclist, const RideFile *ride) +TPUpload::upload(MainWindow *main, const RideFile *ride) { // if currently uploading fail! if (uploading == true) return 0; @@ -83,7 +84,7 @@ TPUpload::upload(QString cyclist, const RideFile *ride) QString uploadfile(QDir::tempPath() + "/tpupload.pwx"); QFile file(uploadfile); PwxFileReader reader; - reader.writeRideFile(cyclist, ride, file); + reader.writeRideFile(main, ride, file); // read the whole thing back and encode as base64binary file.open(QFile::ReadOnly); @@ -98,8 +99,8 @@ TPUpload::upload(QString cyclist, const RideFile *ride) http.setHost("www.trainingpeaks.com"); http.setAction("http://www.trainingpeaks.com/TPWebServices/ImportFileForUser"); current.setMethod("ImportFileForUser", "http://www.trainingpeaks.com/TPWebServices/"); - current.addMethodArgument("username", "", appsettings->cvalue(cyclist, GC_TPUSER).toString()); - current.addMethodArgument("password", "", appsettings->cvalue(cyclist, GC_TPPASS).toString()); + current.addMethodArgument("username", "", appsettings->cvalue(main->cyclist, GC_TPUSER).toString()); + current.addMethodArgument("password", "", appsettings->cvalue(main->cyclist, GC_TPPASS).toString()); current.addMethodArgument("byteData", "", pwxFile); // do it! diff --git a/src/TPUpload.h b/src/TPUpload.h index 6063a25f4..ed14c66d8 100644 --- a/src/TPUpload.h +++ b/src/TPUpload.h @@ -31,7 +31,7 @@ class TPUpload : public QObject public: TPUpload(QObject *parent = 0); - int upload(QString cyclist, const RideFile *ride); + int upload(MainWindow *main, const RideFile *ride); signals: void completed(QString); diff --git a/src/TPUploadDialog.cpp b/src/TPUploadDialog.cpp index e23c0dd77..dbc8cdc3a 100644 --- a/src/TPUploadDialog.cpp +++ b/src/TPUploadDialog.cpp @@ -53,7 +53,7 @@ main(main), cyclist(cyclist), ride(ride) connect(uploader, SIGNAL(completed(QString)),this, SLOT(completed(QString))); uploading = true; - int size = uploader->upload(cyclist, ride); + int size = uploader->upload(main, ride); statusLabel->setText(QString(tr("Uploading ride (%1 bytes)...")).arg(size)); diff --git a/src/TacxCafRideFile.cpp b/src/TacxCafRideFile.cpp index d2f992ae6..f25169d0d 100644 --- a/src/TacxCafRideFile.cpp +++ b/src/TacxCafRideFile.cpp @@ -25,6 +25,7 @@ struct TacxCafFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + virtual bool hasWrite() const { return false; } }; static int tacxCafFileReaderRegistered = diff --git a/src/TcxRideFile.cpp b/src/TcxRideFile.cpp index d8a592552..2c8e6ffce 100644 --- a/src/TcxRideFile.cpp +++ b/src/TcxRideFile.cpp @@ -50,9 +50,8 @@ RideFile *TcxFileReader::openRideFile(QFile &file, QStringList &errors, QList* = 0) const; - virtual bool writeRideFile(MainWindow *mainWindow, const QString cyclist, const RideFile *ride, QFile &file) const; + bool writeRideFile(MainWindow *mainWindow, const RideFile *ride, QFile &file) const; + bool hasWrite() const { return true; } }; #endif // _TcxRideFile_h diff --git a/src/TxtRideFile.h b/src/TxtRideFile.h index f3ccbc87a..3b4d8aa0b 100644 --- a/src/TxtRideFile.h +++ b/src/TxtRideFile.h @@ -24,6 +24,7 @@ struct TxtFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; #endif // _TxtRideFile_h diff --git a/src/WkoRideFile.h b/src/WkoRideFile.h index a10495f02..9c5e6cf73 100644 --- a/src/WkoRideFile.h +++ b/src/WkoRideFile.h @@ -31,6 +31,7 @@ struct WkoFileReader : public RideFileReader { virtual RideFile *openRideFile(QFile &file, QStringList &errors, QList* = 0) const; + bool hasWrite() const { return false; } }; typedef std::auto_ptr QDataStreamPtr;