From 7103650023f24de7acef58ab91917a5afa56b972 Mon Sep 17 00:00:00 2001 From: sawinglogz <3787776-sawinglogz@users.noreply.gitlab.com> Date: Tue, 14 May 2019 21:49:43 -0400 Subject: [PATCH] Move PRS1Loader::ParseChunk variable declarations and V3 header unpacking to the appropriate scope. --- oscar/SleepLib/loader_plugins/prs1_loader.cpp | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/oscar/SleepLib/loader_plugins/prs1_loader.cpp b/oscar/SleepLib/loader_plugins/prs1_loader.cpp index 5f6127d1..8b019d0c 100644 --- a/oscar/SleepLib/loader_plugins/prs1_loader.cpp +++ b/oscar/SleepLib/loader_plugins/prs1_loader.cpp @@ -3445,20 +3445,13 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) chunk->m_filepos = f.pos(); chunk->m_index = cnt; - quint16 wvfm_signals=0; - - unsigned char * header; - - QByteArray headerBA, headerB2, extra; - do { chunk->m_header = f.read(15); if (chunk->m_header.size() != 15) { qWarning() << chunk->m_path << "file too short?"; break; } - - header = (unsigned char *)chunk->m_header.data(); + unsigned char * header = (unsigned char *)chunk->m_header.data(); chunk->fileVersion = header[0]; // Correlates to DataFileVersion in PROP[erties].TXT, only 2 or 3 has ever been observed chunk->blockSize = (header[2] << 8) | header[1]; @@ -3481,13 +3474,13 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) bool hasHeaderDataBlock = (chunk->fileVersion == 3); if (chunk->ext < 5) { // Not a waveform chunk + QByteArray headerB2; // Check if this is a newer machine with a header data block if (hasHeaderDataBlock) { // This is a new machine, byte 15 is header data block length // followed by variable, data byte pairs - // then the 8bit Checksum QByteArray extra = f.read(1); if (extra.size() < 1) { qWarning() << chunk->m_path << "read error extended header"; @@ -3506,9 +3499,18 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) } chunk->m_header.append(headerB2); + header = (unsigned char *)chunk->m_header.data(); + const unsigned char * hd = (unsigned char *)headerB2.constData(); + int pos = 0; + int recs = header[15]; + for (int i=0; ihblock[hd[pos]] = hd[pos+1]; + pos += 2; + } } else { headerB2 = QByteArray(); } + chunk->m_headerblock = headerB2; } else { // Waveform Chunk QFileInfo fi(f); @@ -3520,7 +3522,7 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) qDebug() << chunk->m_path << chunk->sessionid; // log mismatched waveforum session IDs } - extra = f.read(5); + QByteArray extra = f.read(5); if (extra.size() != 5) { qWarning() << chunk->m_path << "read error in waveform header"; break; @@ -3535,7 +3537,7 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) qWarning() << chunk->m_path << always_1 << "!= 1"; //break; // don't break to avoid changing behavior (for now) } - wvfm_signals = header[0x12] | header[0x13] << 8; + quint16 wvfm_signals = header[0x12] | header[0x13] << 8; int ws_size = (chunk->fileVersion == 3) ? 4 : 3; int sbsize = wvfm_signals * ws_size; @@ -3565,7 +3567,7 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) } } - // Calculate 8bit additive header checksum + // The 8bit checksum comes at the end. QByteArray checksum = f.read(1); if (checksum.size() < 1) { qWarning() << chunk->m_path << "read error header checksum"; @@ -3573,6 +3575,7 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) } chunk->storedChecksum = checksum.data()[0]; + // Calculate 8bit additive header checksum. header = (unsigned char *)chunk->m_header.data(); // important because its memory location could move int header_size = chunk->m_header.size(); quint8 achk=0; @@ -3581,29 +3584,18 @@ PRS1DataChunk* PRS1Loader::ParseChunk(QFile & f, int cnt) } chunk->calcChecksum = achk; + // Append the stored checksum to the raw data *after* calculating the checksum on the preceding data. chunk->m_header.append(checksum); + // Make sure the calculated checksum matches the stored checksum. if (chunk->calcChecksum != chunk->storedChecksum) { // Header checksum mismatch? qWarning() << chunk->m_path << "header checksum calc" << chunk->calcChecksum << "!= stored" << chunk->storedChecksum; break; } - if (hasHeaderDataBlock) { - header = (unsigned char *)chunk->m_header.data(); - const unsigned char * hd = (unsigned char *)headerB2.constData(); - int pos = 0; - int recs = header[15]; - for (int i=0; ihblock[hd[pos]] = hd[pos+1]; - pos += 2; - } - } - chunk->m_headerblock = headerB2; - int data_size = chunk->blockSize - chunk->m_header.size(); - // Read data block + int data_size = chunk->blockSize - chunk->m_header.size(); chunk->m_data = f.read(data_size); - if (chunk->m_data.size() < data_size) { qWarning() << chunk->m_path << "less data in file than specified in header"; break;