Skip to content

Commit d5ab766

Browse files
committed
Add timestamps to split parts
Signed-off-by: Viktor Kopp <vifactor@gmail.com>
1 parent 2383464 commit d5ab766

File tree

1 file changed

+39
-7
lines changed

1 file changed

+39
-7
lines changed

commander/dltfileexporter.cpp

+39-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "dltfileexporter.h"
22
#include "qdltmsg.h"
33

4+
#include <bits/types/time_t.h>
45
#include <cstddef>
56
#include <qdltfilterlist.h>
67
#include <qdltfile.h>
@@ -36,7 +37,7 @@ class SimpleWriter {
3637
m_output.setFileName(outputPath);
3738
}
3839

39-
void write(const QByteArray& buf) {
40+
void write(const QByteArray& buf, const time_t&) {
4041
m_output.write(buf);
4142
}
4243

@@ -49,26 +50,57 @@ class SplitWriter {
4950
SplitWriter(const QString& basePath, std::size_t maxOutputSize)
5051
: m_basePath(basePath), m_bytesWritten{maxOutputSize}, m_maxOutputSize{maxOutputSize} {}
5152

52-
void write(const QByteArray& buf) {
53+
~SplitWriter() {
54+
if (m_output.isOpen()) {
55+
// rename very last file
56+
qDebug() << "Renaming last file: " << m_output.fileName() << " to " << nextFileName();
57+
m_output.rename(nextFileName());
58+
}
59+
}
60+
61+
void write(const QByteArray& buf, const time_t& ts) {
5362
if (m_bytesWritten >= m_maxOutputSize) {
54-
m_output.close();
55-
m_output.setFileName(m_basePath + QString::number(m_fileCounter) + ".dlt");
63+
if (m_output.isOpen()) {
64+
m_output.rename(nextFileName());
65+
m_output.close();
66+
}
67+
68+
m_output.setFileName(m_basePath + "_tmp.dlt");
5669
if (!m_output.open(QIODevice::WriteOnly)) {
5770
qDebug() << "Couldn't open output file: " << m_output.fileName();
5871
throw std::runtime_error("File couldn't be opened for writing");
5972
}
6073
m_bytesWritten = 0;
6174
++m_fileCounter;
75+
m_timestampBegin = formatTimestamp(ts);
6276
}
6377
m_output.write(buf);
6478
m_bytesWritten += buf.size();
79+
m_timestampEnd = formatTimestamp(ts);
6580
}
6681
private:
6782
QFile m_output;
6883
QString m_basePath;
6984
std::size_t m_bytesWritten;
7085
std::size_t m_fileCounter{1};
7186
std::size_t m_maxOutputSize;
87+
88+
QString m_timestampBegin;
89+
QString m_timestampEnd;
90+
91+
QString nextFileName() {
92+
return m_basePath + "_" + m_timestampBegin + "-" + m_timestampEnd + "_" +
93+
QString::number(m_fileCounter) + ".dlt";
94+
}
95+
96+
QString formatTimestamp(const time_t& timestamp) {
97+
char strtime[256];
98+
struct tm *timeTm;
99+
timeTm = localtime(&timestamp);
100+
if(timeTm)
101+
strftime(strtime, 256, "%Y-%m-%d_%H-%M-%S", timeTm);
102+
return QString(strtime);
103+
}
72104
};
73105

74106
template <typename Writer>
@@ -80,7 +112,7 @@ void processMessages(const QDltFile& m_input, QDltFilterList& filterList, Writer
80112
}
81113
auto [msg, buf] = *res;
82114
if (filterList.isEmpty() || filterList.checkFilter(msg)) {
83-
writer.write(buf);
115+
writer.write(buf, msg.getTime());
84116
}
85117
}
86118
}
@@ -117,7 +149,7 @@ void DltFileExporter::exportMessages(const QString& outputName)
117149

118150
const QFileInfo filterInfo(filterFilepath);
119151
if (m_maxOutputSize) {
120-
SplitWriter writer(outputDir + "/" + filterInfo.baseName() + "_", *m_maxOutputSize);
152+
SplitWriter writer(outputDir + "/" + filterInfo.baseName(), *m_maxOutputSize);
121153
processMessages(m_input, filterList, writer);
122154
} else {
123155
SimpleWriter writer(outputDir + "/" + filterInfo.baseName() + ".dlt");
@@ -134,7 +166,7 @@ void DltFileExporter::exportMessages(const QString& outputName)
134166

135167
const QFileInfo info(outputName);
136168
if (m_maxOutputSize) {
137-
SplitWriter writer(info.absolutePath() + "/" + info.baseName() + "_", *m_maxOutputSize);
169+
SplitWriter writer(info.absolutePath() + "/" + info.baseName(), *m_maxOutputSize);
138170
processMessages(m_input, filterList, writer);
139171
} else {
140172
SimpleWriter writer(outputName);

0 commit comments

Comments
 (0)