Skip to content

Commit

Permalink
Fix divecomputer nickname handling
Browse files Browse the repository at this point in the history
Don't overwrite existing data.

[Dirk Hohndel: rewrote this a litte, but the logic is the same]

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
  • Loading branch information
torvalds authored and dirkhh committed Sep 18, 2015
1 parent ca6f2c2 commit 09ded17
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 12 deletions.
38 changes: 27 additions & 11 deletions divecomputer.cpp
Expand Up @@ -58,25 +58,41 @@ const DiveComputerNode *DiveComputerList::get(const QString &m)
return NULL;
}

void DiveComputerList::addDC(const QString &m, uint32_t d, const QString &n, const QString &s, const QString &f)
void DiveComputerNode::showchanges(const QString &n, const QString &s, const QString &f) const
{
if (nickName != n)
qDebug("new nickname %s for DC model %s deviceId 0x%x", n.toUtf8().data(), model.toUtf8().data(), deviceId);
if (serialNumber != s)
qDebug("new serial number %s for DC model %s deviceId 0x%x", s.toUtf8().data(), model.toUtf8().data(), deviceId);
if (firmware != f)
qDebug("new firmware version %s for DC model %s deviceId 0x%x", f.toUtf8().data(), model.toUtf8().data(), deviceId);
}

void DiveComputerList::addDC(QString m, uint32_t d, QString n, QString s, QString f)
{
if (m.isEmpty() || d == 0)
return;
const DiveComputerNode *existNode = this->getExact(m, d);
DiveComputerNode newNode(m, d, s, f, n);

if (existNode) {
if (newNode.changesValues(*existNode)) {
if (n.size() && existNode->nickName != n)
qDebug("new nickname %s for DC model %s deviceId 0x%x", n.toUtf8().data(), m.toUtf8().data(), d);
if (f.size() && existNode->firmware != f)
qDebug("new firmware version %s for DC model %s deviceId 0x%x", f.toUtf8().data(), m.toUtf8().data(), d);
if (s.size() && existNode->serialNumber != s)
qDebug("new serial number %s for DC model %s deviceId 0x%x", s.toUtf8().data(), m.toUtf8().data(), d);
} else {
// Update any non-existent fields from the old entry
if (n.isEmpty())
n = existNode->nickName;
if (s.isEmpty())
s = existNode->serialNumber;
if (f.isEmpty())
f = existNode->firmware;

// Do all the old values match?
if (n == existNode->nickName && s == existNode->serialNumber && f == existNode->firmware)
return;
}

// debugging: show changes
existNode->showchanges(n, s, f);
dcMap.remove(m, *existNode);
}

DiveComputerNode newNode(m, d, s, f, n);
dcMap.insert(m, newNode);
}

Expand Down
3 changes: 2 additions & 1 deletion divecomputer.h
Expand Up @@ -12,6 +12,7 @@ class DiveComputerNode {
bool operator==(const DiveComputerNode &a) const;
bool operator!=(const DiveComputerNode &a) const;
bool changesValues(const DiveComputerNode &b) const;
void showchanges(const QString &n, const QString &s, const QString &f) const;
QString model;
uint32_t deviceId;
QString serialNumber;
Expand All @@ -25,7 +26,7 @@ class DiveComputerList {
~DiveComputerList();
const DiveComputerNode *getExact(const QString &m, uint32_t d);
const DiveComputerNode *get(const QString &m);
void addDC(const QString &m, uint32_t d, const QString &n = QString(), const QString &s = QString(), const QString &f = QString());
void addDC(QString m, uint32_t d, QString n = QString(), QString s = QString(), QString f = QString());
DiveComputerNode matchDC(const QString &m, uint32_t d);
DiveComputerNode matchModel(const QString &m);
QMultiMap<QString, DiveComputerNode> dcMap;
Expand Down

0 comments on commit 09ded17

Please sign in to comment.