swift
settingscache.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "misc/settingscache.h"
5 
6 #include <QStandardPaths>
7 
8 #include "misc/logmessage.h"
9 
10 namespace swift::misc
11 {
12  CSettingsCache::CSettingsCache() : CValueCache(0) {}
13 
14  CSettingsCache *CSettingsCache::instance()
15  {
16  static std::unique_ptr<CSettingsCache> cache(new CSettingsCache);
17  static auto dummy = (connect(qApp, &QObject::destroyed, cache.get(), [] { cache.reset(); }), nullptr);
18  Q_UNUSED(dummy) // declared as static to get thread-safe initialization
19  return cache.get();
20  }
21 
22  const QString &CSettingsCache::persistentStore()
23  {
24  static const QString dir = CFileUtils::appendFilePaths(getCacheRootDirectory(), relativeFilePath());
25  return dir;
26  }
27 
28  const QString &CSettingsCache::lockFileName()
29  {
30  static const QString file = CFileUtils::appendFilePaths(persistentStore(), ".lock");
31  return file;
32  }
33 
34  CStatusMessage CSettingsCache::lockFile(QLockFile &lock)
35  {
36  Q_ASSERT(!lock.isLocked());
37  if (!QDir::root().mkpath(persistentStore()))
38  {
39  return CStatusMessage(this).error(u"Failed to create %1") << persistentStore();
40  }
41  if (!lock.lock())
42  {
43  return CStatusMessage(this).error(u"Failed to lock %1: %2")
44  << lockFileName() << CFileUtils::lockFileError(lock);
45  }
46  return {};
47  }
48 
49  CStatusMessage CSettingsCache::saveToStore(const QString &keyPrefix)
50  {
51  QLockFile lock(lockFileName());
52  const CStatusMessage lockStatus = lockFile(lock);
53  if (lockStatus.isFailure()) { return lockStatus; }
54 
55  return saveToFiles(persistentStore(), keyPrefix);
56  }
57 
58  CStatusMessage CSettingsCache::saveToStore(const QStringList &keys)
59  {
60  QLockFile lock(lockFileName());
61  const CStatusMessage lockStatus = lockFile(lock);
62  if (lockStatus.isFailure()) { return lockStatus; }
63 
64  return saveToFiles(persistentStore(), keys);
65  }
66 
67  void CSettingsCache::enableLocalSave()
68  {
69  connect(CSettingsCache::instance(), &CSettingsCache::valuesSaveRequested, CSettingsCache::instance(),
70  &CSettingsCache::saveToStoreByPacket);
71  }
72 
73  void CSettingsCache::saveToStoreByPacket(const CValueCachePacket &values)
74  {
75  QLockFile lock(lockFileName());
76  const CStatusMessage lockStatus = lockFile(lock);
77  if (lockStatus.isFailure())
78  {
79  CLogMessage::preformatted(lockStatus);
80  return;
81  }
82 
83  CStatusMessage status = saveToFiles(persistentStore(), values.toVariantMap());
84  CLogMessage::preformatted(status);
85  }
86 
87  CStatusMessage CSettingsCache::loadFromStore()
88  {
89  QLockFile lock(lockFileName());
90  const CStatusMessage lockStatus = lockFile(lock);
91  if (lockStatus.isFailure()) { return lockStatus; }
92 
93  return loadFromFiles(persistentStore());
94  }
95 
96  QString CSettingsCache::filenameForKey(const QString &key)
97  {
98  return CFileUtils::appendFilePaths(persistentStore(), instance()->CValueCache::filenameForKey(key));
99  }
100 
101  const QString &CSettingsCache::relativeFilePath()
102  {
103  static const QString p("/settings/core");
104  return p;
105  }
106 
107  QStringList CSettingsCache::enumerateStore() const { return enumerateFiles(persistentStore()); }
108 } // namespace swift::misc
Singleton derived class of CValueCache, for settings.
Definition: settingscache.h:23
Streamable status message, e.g.
bool isFailure() const
Operation considered unsuccessful.
Value class used for signalling changed values in the cache.
Definition: valuecache.h:67
CVariantMap toVariantMap() const
Discard timestamps and return as variant map.
Free functions in swift::misc.