aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2018-11-18 14:18:45 +0900
committerKitsune Ral <Kitsune-Ral@users.sf.net>2018-11-19 08:35:03 +0900
commitaf0c8135afce32d9e06cc2446d9c675693d2c5fb (patch)
tree3f75c0a72225b87c2b15144f178437cc79298ff5
parent06edc1033427ca96f03954d810aef33e5c940597 (diff)
downloadlibquotient-af0c8135afce32d9e06cc2446d9c675693d2c5fb.tar.gz
libquotient-af0c8135afce32d9e06cc2446d9c675693d2c5fb.zip
BaseJob::rawDataSample()
A new recommended (and localisable) way of getting a piece of raw response to display next to error messages as "details". BaseJob::rawData() returns exactly the trimmed piece of data, no "truncated" suffix there anymore.
-rw-r--r--lib/connection.cpp13
-rw-r--r--lib/connection.h6
-rw-r--r--lib/jobs/basejob.cpp19
-rw-r--r--lib/jobs/basejob.h14
4 files changed, 35 insertions, 17 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index df9fb112..6bda932a 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -65,10 +65,6 @@ HashT erase_if(HashT& hashMap, Pred pred)
return removals;
}
-#ifndef TRIM_RAW_DATA
-#define TRIM_RAW_DATA 65535
-#endif
-
class Connection::Private
{
public:
@@ -228,8 +224,7 @@ void Connection::doConnectToServer(const QString& user, const QString& password,
});
connect(loginJob, &BaseJob::failure, this,
[this, loginJob] {
- emit loginError(loginJob->errorString(),
- loginJob->rawData(TRIM_RAW_DATA));
+ emit loginError(loginJob->errorString(), loginJob->rawDataSample());
});
}
@@ -306,7 +301,7 @@ void Connection::sync(int timeout)
connect( job, &SyncJob::retryScheduled, this,
[this,job] (int retriesTaken, int nextInMilliseconds)
{
- emit networkError(job->errorString(), job->rawData(TRIM_RAW_DATA),
+ emit networkError(job->errorString(), job->rawDataSample(),
retriesTaken, nextInMilliseconds);
});
connect( job, &SyncJob::failure, this, [this, job] {
@@ -315,10 +310,10 @@ void Connection::sync(int timeout)
{
qCWarning(SYNCJOB)
<< "Sync job failed with ContentAccessError - login expired?";
- emit loginError(job->errorString(), job->rawData(TRIM_RAW_DATA));
+ emit loginError(job->errorString(), job->rawDataSample());
}
else
- emit syncError(job->errorString(), job->rawData(TRIM_RAW_DATA));
+ emit syncError(job->errorString(), job->rawDataSample());
});
}
diff --git a/lib/connection.h b/lib/connection.h
index b06fb143..20dade76 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -519,7 +519,7 @@ namespace QMatrixClient
* a successful login and logout and are constant at other times.
*/
void stateChanged();
- void loginError(QString message, QByteArray details);
+ void loginError(QString message, QString details);
/** A network request (job) failed
*
@@ -537,11 +537,11 @@ namespace QMatrixClient
* @param retriesTaken - how many retries have already been taken
* @param nextRetryInMilliseconds - when the job will retry again
*/
- void networkError(QString message, QByteArray details,
+ void networkError(QString message, QString details,
int retriesTaken, int nextRetryInMilliseconds);
void syncDone();
- void syncError(QString message, QByteArray details);
+ void syncError(QString message, QString details);
void newUser(User* user);
diff --git a/lib/jobs/basejob.cpp b/lib/jobs/basejob.cpp
index b21173ae..4a7780b1 100644
--- a/lib/jobs/basejob.cpp
+++ b/lib/jobs/basejob.cpp
@@ -426,8 +426,8 @@ BaseJob::Status BaseJob::parseReply(QNetworkReply* reply)
const auto& json = QJsonDocument::fromJson(d->rawResponse, &error);
if( error.error == QJsonParseError::NoError )
return parseJson(json);
- else
- return { IncorrectResponseError, error.errorString() };
+
+ return { IncorrectResponseError, error.errorString() };
}
BaseJob::Status BaseJob::parseJson(const QJsonDocument&)
@@ -519,8 +519,19 @@ BaseJob::Status BaseJob::status() const
QByteArray BaseJob::rawData(int bytesAtMost) const
{
- return bytesAtMost > 0 && d->rawResponse.size() > bytesAtMost ?
- d->rawResponse.left(bytesAtMost) + "...(truncated)" : d->rawResponse;
+ return bytesAtMost > 0 && d->rawResponse.size() > bytesAtMost
+ ? d->rawResponse.left(bytesAtMost) : d->rawResponse;
+}
+
+QString BaseJob::rawDataSample(int bytesAtMost) const
+{
+ auto data = rawData(bytesAtMost);
+ Q_ASSERT(data.size() <= d->rawResponse.size());
+ return data.size() == d->rawResponse.size()
+ ? data : data + tr("...(truncated, %Ln bytes in total)",
+ "Comes after trimmed raw network response",
+ d->rawResponse.size());
+
}
QString BaseJob::statusCaption() const
diff --git a/lib/jobs/basejob.h b/lib/jobs/basejob.h
index 4ef25ab8..3d50344d 100644
--- a/lib/jobs/basejob.h
+++ b/lib/jobs/basejob.h
@@ -138,8 +138,20 @@ namespace QMatrixClient
Status status() const;
/** Short human-friendly message on the job status */
QString statusCaption() const;
- /** Raw response body as received from the server */
+ /** Get raw response body as received from the server
+ * \param bytesAtMost return this number of leftmost bytes, or -1
+ * to return the entire response
+ */
QByteArray rawData(int bytesAtMost = -1) const;
+ /** Get UI-friendly sample of raw data
+ *
+ * This is almost the same as rawData but appends the "truncated"
+ * suffix if not all data fit in bytesAtMost. This call is
+ * recommended to present a sample of raw data as "details" next to
+ * error messages. Note that the default \p bytesAtMost value is
+ * also tailored to UI cases.
+ */
+ QString rawDataSample(int bytesAtMost = 65535) const;
/** Error (more generally, status) code
* Equivalent to status().code