1
1
#include " dltfileexporter.h"
2
2
#include " qdltmsg.h"
3
3
4
+ #include < bits/types/time_t.h>
4
5
#include < cstddef>
5
6
#include < qdltfilterlist.h>
6
7
#include < qdltfile.h>
@@ -36,7 +37,7 @@ class SimpleWriter {
36
37
m_output.setFileName (outputPath);
37
38
}
38
39
39
- void write (const QByteArray& buf) {
40
+ void write (const QByteArray& buf, const time_t & ) {
40
41
m_output.write (buf);
41
42
}
42
43
@@ -49,26 +50,57 @@ class SplitWriter {
49
50
SplitWriter (const QString& basePath, std::size_t maxOutputSize)
50
51
: m_basePath(basePath), m_bytesWritten{maxOutputSize}, m_maxOutputSize{maxOutputSize} {}
51
52
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) {
53
62
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" );
56
69
if (!m_output.open (QIODevice::WriteOnly)) {
57
70
qDebug () << " Couldn't open output file: " << m_output.fileName ();
58
71
throw std::runtime_error (" File couldn't be opened for writing" );
59
72
}
60
73
m_bytesWritten = 0 ;
61
74
++m_fileCounter;
75
+ m_timestampBegin = formatTimestamp (ts);
62
76
}
63
77
m_output.write (buf);
64
78
m_bytesWritten += buf.size ();
79
+ m_timestampEnd = formatTimestamp (ts);
65
80
}
66
81
private:
67
82
QFile m_output;
68
83
QString m_basePath;
69
84
std::size_t m_bytesWritten;
70
85
std::size_t m_fileCounter{1 };
71
86
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 (×tamp);
100
+ if (timeTm)
101
+ strftime (strtime, 256 , " %Y-%m-%d_%H-%M-%S" , timeTm);
102
+ return QString (strtime);
103
+ }
72
104
};
73
105
74
106
template <typename Writer>
@@ -80,7 +112,7 @@ void processMessages(const QDltFile& m_input, QDltFilterList& filterList, Writer
80
112
}
81
113
auto [msg, buf] = *res;
82
114
if (filterList.isEmpty () || filterList.checkFilter (msg)) {
83
- writer.write (buf);
115
+ writer.write (buf, msg. getTime () );
84
116
}
85
117
}
86
118
}
@@ -117,7 +149,7 @@ void DltFileExporter::exportMessages(const QString& outputName)
117
149
118
150
const QFileInfo filterInfo (filterFilepath);
119
151
if (m_maxOutputSize) {
120
- SplitWriter writer (outputDir + " /" + filterInfo.baseName () + " _ " , *m_maxOutputSize);
152
+ SplitWriter writer (outputDir + " /" + filterInfo.baseName (), *m_maxOutputSize);
121
153
processMessages (m_input, filterList, writer);
122
154
} else {
123
155
SimpleWriter writer (outputDir + " /" + filterInfo.baseName () + " .dlt" );
@@ -134,7 +166,7 @@ void DltFileExporter::exportMessages(const QString& outputName)
134
166
135
167
const QFileInfo info (outputName);
136
168
if (m_maxOutputSize) {
137
- SplitWriter writer (info.absolutePath () + " /" + info.baseName () + " _ " , *m_maxOutputSize);
169
+ SplitWriter writer (info.absolutePath () + " /" + info.baseName (), *m_maxOutputSize);
138
170
processMessages (m_input, filterList, writer);
139
171
} else {
140
172
SimpleWriter writer (outputName);
0 commit comments