aboutsummaryrefslogtreecommitdiffstats
path: root/src/m_ver_check/SoftwareVersion.cpp
blob: ed74cb3f71463aafc6dacd36bc89c1bf6dd82d4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/**
 * Copyright (C) 2021-2024 Saturneric <eric@bktus.com>
 *
 * This file is part of GpgFrontend.
 *
 * GpgFrontend is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * GpgFrontend is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with GpgFrontend. If not, see <https://www.gnu.org/licenses/>.
 *
 * The initial version of the source code is inherited from
 * the gpg4usb project, which is under GPL-3.0-or-later.
 *
 * All the source code of GpgFrontend was modified and released by
 * Saturneric <eric@bktus.com> starting on May 12, 2021.
 *
 * SPDX-License-Identifier: GPL-3.0-or-later
 *
 */

#include "SoftwareVersion.h"

#include <GFModule.h>
#include <GFSDKLog.h>

#include <QJsonDocument>
#include <QJsonObject>
#include <QString>

auto SoftwareVersion::NeedUpgrade() const -> bool {
  return !latest_version.isEmpty() &&
         GFCompareSoftwareVersion(current_version.toUtf8().constData(),
                                  latest_version.toUtf8().constData()) < 0;
}

auto SoftwareVersion::VersionWithdrawn() const -> bool {
  return !latest_version.isEmpty() && !current_version_publish_in_remote;
}

auto SoftwareVersion::CurrentVersionReleased() const -> bool {
  return !latest_version.isEmpty() && current_version_publish_in_remote;
}

auto SoftwareVersion::ToJson() const -> QJsonObject {
  QJsonObject obj;
  obj["api"] = api;
  obj["latest_version"] = latest_version;
  obj["current_version"] = current_version;
  obj["current_version_publish_in_remote"] = current_version_publish_in_remote;
  obj["current_commit_hash_publish_in_remote"] =
      current_commit_hash_publish_in_remote;
  obj["publish_date"] = publish_date;
  obj["release_note"] = release_note;
  obj["local_commit_hash"] = local_commit_hash;
  obj["timestamp"] = timestamp.toSecsSinceEpoch();
  return obj;
}

auto SoftwareVersion::VersionSeries(const QString& version) -> QString {
  if (version.isEmpty()) return {};

  auto real_version = version.startsWith('v') || version.startsWith('V')
                          ? version.mid(1)
                          : version;

  const auto parts = real_version.split('.');
  if (parts.size() < 2) return {};

  bool major_ok = false;
  bool minor_ok = false;
  parts[0].toInt(&major_ok);
  parts[1].toInt(&minor_ok);
  if (!major_ok || !minor_ok) return {};

  return parts[0] + "." + parts[1];
}

auto SoftwareVersion::SameSeries(const QString& a, const QString& b) -> bool {
  auto series_a = VersionSeries(a);
  return !series_a.isEmpty() && series_a == VersionSeries(b);
}

void SoftwareVersion::FromJson(const QJsonObject& obj) {
  api = obj.value("api").toString();
  latest_version = obj.value("latest_version").toString();
  current_version = obj.value("current_version").toString();
  current_version_publish_in_remote =
      obj.value("current_version_publish_in_remote").toBool();
  current_commit_hash_publish_in_remote =
      obj.value("current_commit_hash_publish_in_remote").toBool();
  publish_date = obj.value("publish_date").toString();
  release_note = obj.value("release_note").toString();
  local_commit_hash = obj.value("local_commit_hash").toString();
  timestamp = QDateTime::fromSecsSinceEpoch(obj.value("timestamp").toInt());
}