digiKam
Loading...
Searching...
No Matches
collectionmanager_p.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2007-04-09
7 * Description : Collection location management - private containers.
8 *
9 * SPDX-FileCopyrightText: 2007-2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 *
13 * ============================================================ */
14
15#pragma once
16
17#include "collectionmanager.h"
18
19// Qt includes
20
21#include <QDir>
22#include <QDirIterator>
23#include <QCoreApplication>
24#include <QCryptographicHash>
25#include <QReadWriteLock>
26#include <QUrlQuery>
27#include <QThread>
28#include <QUuid>
29
30// KDE includes
31
32#include <klocalizedstring.h>
33
34// Solid includes
35
36#if defined(Q_CC_CLANG)
37# pragma clang diagnostic push
38# pragma clang diagnostic ignored "-Wnonportable-include-path"
39#endif
40
41#include <solid/device.h>
42#include <solid/deviceinterface.h>
43#include <solid/devicenotifier.h>
44#include <solid/storageaccess.h>
45#include <solid/storagedrive.h>
46#include <solid/storagevolume.h>
47#include <solid/opticaldisc.h>
48#include <solid/predicate.h>
49
50#if defined(Q_CC_CLANG)
51# pragma clang diagnostic pop
52#endif
53
54// Local includes
55
56#include "digikam_debug.h"
57#include "coredbaccess.h"
58#include "coredbchangesets.h"
59#include "coredbtransaction.h"
60#include "coredb.h"
61#include "collectionscanner.h"
62#include "collectionlocation.h"
63#include "filereadwritelock.h"
64
65namespace Digikam
66{
67
68class Q_DECL_HIDDEN AlbumRootLocation : public CollectionLocation
69{
70
71public:
72
73 AlbumRootLocation() = default;
74
75 explicit AlbumRootLocation(const AlbumRootInfo& info)
76 {
77 qCDebug(DIGIKAM_DATABASE_LOG) << "Creating new Location " << info.specificPath << " uuid " << info.identifier;
78 m_id = info.id;
79 m_type = (Type)info.type;
80 QString path = info.specificPath;
81 m_caseSensitivity = (CaseSensitivity)info.caseSensitivity;
82
83 if (
84 (path != QLatin1String("/")) &&
85 path.endsWith(QLatin1Char('/'))
86 )
87 {
88 path.chop(1);
89 }
90
91 specificPath = path;
92 identifier = info.identifier;
93 m_label = info.label;
94
95 m_path.clear();
96
97 setStatus((CollectionLocation::Status)info.status);
98 }
99
101 {
102 if (hidden)
103 {
104 m_status = CollectionLocation::LocationHidden;
105 }
106 else
107 {
108 if (available)
109 {
110 m_status = CollectionLocation::LocationAvailable;
111 }
112 else
113 {
114 m_status = CollectionLocation::LocationUnavailable;
115 }
116 }
117 }
118
120 {
121 m_caseSensitivity = c;
122 }
123
125 {
126 m_status = s;
127
128 // status is exclusive, and Hidden wins
129 // but really both states are independent
130 // - a hidden location might or might not be available
131
132 if (m_status == CollectionLocation::LocationAvailable)
133 {
134 available = true;
135 hidden = false;
136 }
137 else if (m_status == CollectionLocation::LocationHidden)
138 {
139 available = false;
140 hidden = true;
141 }
142 else // Unavailable, Null, Deleted
143 {
144 available = false;
145 hidden = false;
146 }
147 }
148
149 void setId(int id)
150 {
151 m_id = id;
152 }
153
154 void setAbsolutePath(const QString& path)
155 {
156 m_path = path;
157 }
158
159 void setType(Type type)
160 {
161 m_type = type;
162 }
163
164 void setLabel(const QString& label)
165 {
166 m_label = label;
167 }
168
169public:
170
172 bool available = false;
173 bool hidden = false;
174};
175
176// -------------------------------------------------
177
178class Q_DECL_HIDDEN SolidVolumeInfo
179{
180
181public:
182
183 SolidVolumeInfo() = default;
184
185 bool isNull() const
186 {
187 return path.isNull();
188 }
189
190public:
191
192 QString udi;
193 QString path;
194 QString uuid;
195 QString label;
196 bool isRemovable = false;
197 bool isOpticalDisc = false;
198 bool isMounted = false;
199};
200
201// -------------------------------------------------
202
203class Q_DECL_HIDDEN CollectionManager::Private
204{
205
206public:
207
208 explicit Private(CollectionManager* const ss);
209
211 QList<SolidVolumeInfo> actuallyListVolumes();
212 void slotTriggerUpdateVolumesList();
213 QList<SolidVolumeInfo> volumesListCache;
214
215
217 QList<SolidVolumeInfo> listVolumes();
218
223 SolidVolumeInfo findVolumeForLocation(const AlbumRootLocation* location, const QList<SolidVolumeInfo>& volumes);
224
229 SolidVolumeInfo findVolumeForUrl(const QUrl& fileUrl, const QList<SolidVolumeInfo>& volumes);
230
232 QString volumeIdentifier(const SolidVolumeInfo& info);
233
235 QString volumeIdentifier(const QString& path);
236
238 QString networkShareIdentifier(const QStringList& paths);
239
241 QString pathFromIdentifier(const AlbumRootLocation* location);
242
244 QStringList networkShareMountPathsFromIdentifier(const AlbumRootLocation* location);
245
247 static QString directoryHash(const QString& path);
248
250 bool checkIfExists(const QString& path, QList<CollectionLocation> assumeDeleted);
251
253 QString technicalDescription(const AlbumRootLocation* location);
254
256 QString getCollectionUUID(const QString& path);
257
259 bool checkCollectionUUID(AlbumRootLocation* const location, const QString& path);
260
261public:
262
263 QReadWriteLock lock;
264 QMap<int, AlbumRootLocation*> locations;
265 bool changingDB = false;
266 QStringList udisToWatch;
267 bool watchEnabled = false;
268 CollectionManager* s = nullptr;
269};
270
271// -------------------------------------------------
272
273class Q_DECL_HIDDEN ChangingDB
274{
275
276public:
277
279 : d(dd)
280 {
281 d->changingDB = true;
282 }
283
285 {
286 d->changingDB = false;
287 }
288
289public:
290
291 CollectionManager::Private* const d = nullptr;
292};
293
294} // namespace Digikam
Definition coredbalbuminfo.h:38
QString identifier
Definition coredbalbuminfo.h:49
int type
Definition coredbalbuminfo.h:48
QString label
Definition coredbalbuminfo.h:46
int caseSensitivity
Definition coredbalbuminfo.h:51
int id
Definition coredbalbuminfo.h:45
QString specificPath
Definition coredbalbuminfo.h:50
int status
Definition coredbalbuminfo.h:47
Definition collectionmanager_p.h:69
void setStatusFromFlags()
Definition collectionmanager_p.h:100
void setStatus(CollectionLocation::Status s)
Definition collectionmanager_p.h:124
void setId(int id)
Definition collectionmanager_p.h:149
void setType(Type type)
Definition collectionmanager_p.h:159
void setLabel(const QString &label)
Definition collectionmanager_p.h:164
QString specificPath
Definition collectionmanager_p.h:171
void setAbsolutePath(const QString &path)
Definition collectionmanager_p.h:154
void setCaseSensitivity(CollectionLocation::CaseSensitivity c)
Definition collectionmanager_p.h:119
AlbumRootLocation(const AlbumRootInfo &info)
Definition collectionmanager_p.h:75
Definition albummanager_p.h:214
ChangingDB(CollectionManager::Private *const dd)
Definition collectionmanager_p.h:278
~ChangingDB()
Definition collectionmanager_p.h:284
Definition collectionlocation.h:31
CaseSensitivity
Definition collectionlocation.h:100
Type
Definition collectionlocation.h:70
Status
Definition collectionlocation.h:36
Definition collectionmanager_p.h:204
QList< SolidVolumeInfo > volumesListCache
Definition collectionmanager_p.h:213
QStringList udisToWatch
Definition collectionmanager_p.h:266
QReadWriteLock lock
Definition collectionmanager_p.h:263
QMap< int, AlbumRootLocation * > locations
Definition collectionmanager_p.h:264
Definition collectionmanager.h:35
Definition collectionmanager_p.h:179
QString label
volume label (think of CDs)
Definition collectionmanager_p.h:195
bool isNull() const
Definition collectionmanager_p.h:185
QString udi
Solid device UDI of the StorageAccess device.
Definition collectionmanager_p.h:192
QString uuid
UUID as from Solid.
Definition collectionmanager_p.h:194
QString path
mount path of volume, with trailing slash
Definition collectionmanager_p.h:193
Definition datefolderview.cpp:34