1
1
#include " dltfileexporter.h"
2
2
#include " qdltmsg.h"
3
3
4
+ #include < ctime>
4
5
#include < cstddef>
5
6
#include < qdltfilterlist.h>
6
7
#include < qdltfile.h>
10
11
#include < QFileInfo>
11
12
#include < QDir>
12
13
#include < stdexcept>
13
- #include < variant>
14
14
15
15
namespace {
16
16
@@ -36,7 +36,7 @@ class SimpleWriter {
36
36
m_output.setFileName (outputPath);
37
37
}
38
38
39
- void write (const QByteArray& buf) {
39
+ void write (const QByteArray& buf, const time_t & ) {
40
40
m_output.write (buf);
41
41
}
42
42
@@ -49,26 +49,56 @@ class SplitWriter {
49
49
SplitWriter (const QString& basePath, std::size_t maxOutputSize)
50
50
: m_basePath(basePath), m_bytesWritten{maxOutputSize}, m_maxOutputSize{maxOutputSize} {}
51
51
52
- void write (const QByteArray& buf) {
52
+ ~SplitWriter () {
53
+ if (m_output.isOpen ()) {
54
+ // rename very last file
55
+ m_output.rename (nextFileName ());
56
+ }
57
+ }
58
+
59
+ void write (const QByteArray& buf, const time_t & ts) {
53
60
if (m_bytesWritten >= m_maxOutputSize) {
54
- m_output.close ();
55
- m_output.setFileName (m_basePath + QString::number (m_fileCounter) + " .dlt" );
61
+ if (m_output.isOpen ()) {
62
+ m_output.rename (nextFileName ());
63
+ m_output.close ();
64
+ }
65
+
66
+ m_output.setFileName (m_basePath + " _tmp.dlt" );
56
67
if (!m_output.open (QIODevice::WriteOnly)) {
57
68
qDebug () << " Couldn't open output file: " << m_output.fileName ();
58
69
throw std::runtime_error (" File couldn't be opened for writing" );
59
70
}
60
71
m_bytesWritten = 0 ;
61
72
++m_fileCounter;
73
+ m_timestampBegin = formatTimestamp (ts);
62
74
}
63
75
m_output.write (buf);
64
76
m_bytesWritten += buf.size ();
77
+ m_timestampEnd = formatTimestamp (ts);
65
78
}
66
79
private:
67
80
QFile m_output;
68
81
QString m_basePath;
69
82
std::size_t m_bytesWritten;
70
- std::size_t m_fileCounter{1 };
83
+ std::size_t m_fileCounter{0 };
71
84
std::size_t m_maxOutputSize;
85
+
86
+ QString m_timestampBegin;
87
+ QString m_timestampEnd;
88
+
89
+ QString nextFileName () {
90
+ return m_basePath + " _" + m_timestampBegin + " -" + m_timestampEnd + " _" +
91
+ QString::number (m_fileCounter) + " .dlt" ;
92
+ }
93
+
94
+ QString formatTimestamp (const time_t & timestamp) {
95
+ char strtime[256 ];
96
+ struct tm *timeTm;
97
+ timeTm = localtime (×tamp);
98
+ if (timeTm)
99
+ strftime (strtime, 256 , " %Y-%m-%d_%H-%M-%S" , timeTm);
100
+ return QString (strtime);
101
+ }
72
102
};
73
103
74
104
template <typename Writer>
@@ -80,7 +110,7 @@ void processMessages(const QDltFile& m_input, QDltFilterList& filterList, Writer
80
110
}
81
111
auto [msg, buf] = *res;
82
112
if (filterList.isEmpty () || filterList.checkFilter (msg)) {
83
- writer.write (buf);
113
+ writer.write (buf, msg. getTime () );
84
114
}
85
115
}
86
116
}
@@ -117,7 +147,7 @@ void DltFileExporter::exportMessages(const QString& outputName)
117
147
118
148
const QFileInfo filterInfo (filterFilepath);
119
149
if (m_maxOutputSize) {
120
- SplitWriter writer (outputDir + " /" + filterInfo.baseName () + " _ " , *m_maxOutputSize);
150
+ SplitWriter writer (outputDir + " /" + filterInfo.baseName (), *m_maxOutputSize);
121
151
processMessages (m_input, filterList, writer);
122
152
} else {
123
153
SimpleWriter writer (outputDir + " /" + filterInfo.baseName () + " .dlt" );
@@ -134,7 +164,7 @@ void DltFileExporter::exportMessages(const QString& outputName)
134
164
135
165
const QFileInfo info (outputName);
136
166
if (m_maxOutputSize) {
137
- SplitWriter writer (info.absolutePath () + " /" + info.baseName () + " _ " , *m_maxOutputSize);
167
+ SplitWriter writer (info.absolutePath () + " /" + info.baseName (), *m_maxOutputSize);
138
168
processMessages (m_input, filterList, writer);
139
169
} else {
140
170
SimpleWriter writer (outputName);
0 commit comments