void TwitterDialog::tweetCurrentRide() { QString strToken = appsettings->cvalue(context->athlete->cyclist, GC_TWITTER_TOKEN).toString(); QString strSecret = appsettings->cvalue(context->athlete->cyclist, GC_TWITTER_SECRET).toString(); QString s_token = QString(strToken); QString s_secret = QString(strSecret); if(s_token.isEmpty() || s_secret.isEmpty()) { #ifdef Q_OS_MACX #define GC_PREF tr("Golden Cheetah->Preferences") #else #define GC_PREF tr("Tools->Options") #endif QString advise = QString(tr("Error fetching OAuth credentials. Please make sure to complete the twitter authorization procedure found under %1.")).arg(GC_PREF); QMessageBox oautherr(QMessageBox::Critical, tr("OAuth Error"), advise); oautherr.exec(); return; } char *postarg = NULL; // This is for API 1.0 // QString qurl = "http://api.twitter.com/1/statuses/update.json?status="; // This is for API 1.1 QString qurl = "https://api.twitter.com/1.1/statuses/update.json?status="; QString twitterMsg = getTwitterMessage(); if(twitterMsg.length() > 140) { QMessageBox tweetlengtherr(QMessageBox::Critical, tr("Tweet Length Error"), tr("Tweet must be 140 characters or fewer.")); tweetlengtherr.exec(); return; } const QString strUrl = QUrl::toPercentEncoding(twitterMsg); qurl.append(strUrl); const char *req_url = oauth_sign_url2(qurl.toLatin1(), &postarg, OA_HMAC, NULL, GC_TWITTER_CONSUMER_KEY, GC_TWITTER_CONSUMER_SECRET, s_token.toLatin1(), s_secret.toLatin1()); const char *strreply = oauth_http_post(req_url,postarg); QString post_reply = QString(strreply); if(!post_reply.contains("created_at", Qt::CaseInsensitive)) { QMessageBox oautherr(QMessageBox::Critical, tr("Error Posting Tweet"), tr("There was an error connecting to Twitter. Check your network connection and try again.")); oautherr.setDetailedText(post_reply); oautherr.exec(); return; } if(postarg) free(postarg); accept(); }
bool WithingsDownload::getBodyMeasures(QString &error, QDateTime from, QDateTime to, QList<BodyMeasure> &data) { response = ""; QString strNokiaToken = ""; QString strNokiaRefreshToken = ""; QString access_token = ""; strNokiaToken = appsettings->cvalue(context->athlete->cyclist, GC_NOKIA_TOKEN).toString(); strNokiaRefreshToken = appsettings->cvalue(context->athlete->cyclist, GC_NOKIA_REFRESH_TOKEN).toString(); if(strNokiaRefreshToken.isEmpty() || strNokiaRefreshToken == "" || strNokiaRefreshToken == "0" ) { #ifdef Q_OS_MACX #define GC_PREF tr("Golden Cheetah->Preferences") #else #define GC_PREF tr("Tools->Options") #endif QString advise = QString(tr("Error fetching OAuth credentials. Please make sure to complete the Withings authorization procedure found under %1.")).arg(GC_PREF); QMessageBox oautherr(QMessageBox::Critical, tr("OAuth Error"), advise); oautherr.exec(); return false; } if(!strNokiaRefreshToken.isEmpty()) { printd("OAuth 2.0 API\n"); #if QT_VERSION > 0x050000 QUrlQuery postData; #else QUrl postData; #endif QString refresh_token = appsettings->cvalue(context->athlete->cyclist, GC_NOKIA_REFRESH_TOKEN).toString(); postData.addQueryItem("grant_type", "refresh_token"); postData.addQueryItem("client_id", GC_NOKIA_CLIENT_ID ); postData.addQueryItem("client_secret", GC_NOKIA_CLIENT_SECRET ); postData.addQueryItem("refresh_token", refresh_token ); QUrl url = QUrl( "https://account.withings.com/oauth2/token" ); emit downloadStarted(100); QNetworkRequest request(url); request.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); nam->post(request, postData.toString(QUrl::FullyEncoded).toUtf8()); printd("url %s %s\n", url.toString().toStdString().c_str(), postData.toString().toStdString().c_str()); // blocking request loop.exec(); // we go on after receiving the data in SLOT(onRequestReady(QByteArray)) printd("response: %s\n", response.toStdString().c_str()); if (response.contains("\"access_token\"", Qt::CaseInsensitive)) { QJsonParseError parseResult; QJsonDocument migrateJson = QJsonDocument::fromJson(response.toUtf8(), &parseResult); access_token = migrateJson.object()["access_token"].toString(); QString refresh_token = migrateJson.object()["refresh_token"].toString(); QString userid = QString("%1").arg(migrateJson.object()["userid"].toInt()); if (access_token != "") appsettings->setCValue(context->athlete->cyclist, GC_NOKIA_TOKEN, access_token); if (refresh_token != "") appsettings->setCValue(context->athlete->cyclist, GC_NOKIA_REFRESH_TOKEN, refresh_token); if (userid != "") appsettings->setCValue(context->athlete->cyclist, GC_WIUSER, userid); #if QT_VERSION > 0x050000 QUrlQuery params; #else QUrl params; #endif emit downloadStarted(100); params.addQueryItem("action", "getmeas"); //params.addQueryItem("userid", userid); params.addQueryItem("access_token", access_token); params.addQueryItem("startdate", QString::number(from.toMSecsSinceEpoch()/1000)); params.addQueryItem("enddate", QString::number(to.toMSecsSinceEpoch()/1000)); QUrl url = QUrl( "https://wbsapi.withings.net/measure?" + params.toString() ); printd("URL: %s\n", url.url().toStdString().c_str()); QNetworkRequest request(url); //request.setRawHeader("Authorization", QString("Bearer %1").arg(access_token).toLatin1()); nam->get(request); emit downloadProgress(50); // blocking request loop.exec(); // we go on after receiving the data in SLOT(onRequestReady(QByteArray)) emit downloadEnded(100); } } printd("response: %s\n", response.toStdString().c_str()); QJsonParseError parseResult; if (response.contains("\"status\":0", Qt::CaseInsensitive)) { parseResult = parse(response, data); } else { QMessageBox oautherr(QMessageBox::Critical, tr("Error"), tr("There was an error during fetching. Please check the error description.")); oautherr.setDetailedText(response); // probably blank oautherr.exec(); return false; } if (QJsonParseError::NoError != parseResult.error) { QMessageBox oautherr(QMessageBox::Critical, tr("Error"), tr("Error parsing Withings API response. Please check the error description.")); QString errorStr = parseResult.errorString() + " at offset " + QString::number(parseResult.offset); error = errorStr.simplified(); oautherr.setDetailedText(error); oautherr.exec(); return false; }; return true; }