1/*
2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2004 Kevin Ottens <ervin ipsquad net>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "remoteimpl.h"
9
10#include "../utils_p.h"
11
12#include "debug.h"
13#include <KConfigGroup>
14#include <KDesktopFile>
15#include <KLocalizedString>
16
17#include <QDir>
18#include <QFile>
19
20RemoteImpl::RemoteImpl()
21{
22 const QString path = QStringLiteral("%1/remoteview").arg(a: QStandardPaths::writableLocation(type: QStandardPaths::GenericDataLocation));
23 QDir().mkpath(dirPath: path);
24}
25
26void RemoteImpl::listRoot(KIO::UDSEntryList &list) const
27{
28 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::listRoot";
29
30 QStringList names_found;
31 const QStringList dirList = QStandardPaths::locateAll(type: QStandardPaths::GenericDataLocation, QStringLiteral("remoteview"), options: QStandardPaths::LocateDirectory);
32
33 for (const QString &dirpath : dirList) {
34 QDir dir(dirpath);
35 if (!dir.exists()) {
36 continue;
37 }
38
39 const QStringList filenames = dir.entryList(nameFilters: {QStringLiteral("*.desktop")}, filters: QDir::Files | QDir::Readable);
40
41 KIO::UDSEntry entry;
42 for (const QString &name : filenames) {
43 if (!names_found.contains(str: name) && createEntry(entry, directory: dirpath, file: name)) {
44 list.append(t: entry);
45 names_found.append(t: name);
46 }
47 }
48 }
49}
50
51bool RemoteImpl::findDirectory(const QString &filename, QString &directory) const
52{
53 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::findDirectory";
54
55 const QStringList dirList = QStandardPaths::locateAll(type: QStandardPaths::GenericDataLocation, QStringLiteral("remoteview"), options: QStandardPaths::LocateDirectory);
56
57 for (const QString &dirpath : dirList) {
58 if (QFileInfo::exists(file: dirpath + QLatin1Char('/') + filename)) {
59 directory = dirpath + QLatin1Char('/');
60 return true;
61 }
62 }
63
64 return false;
65}
66
67QString RemoteImpl::findDesktopFile(const QString &filename) const
68{
69 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::findDesktopFile";
70
71 QString directory;
72 const QString desktopFileName = filename + QLatin1String(".desktop");
73 if (findDirectory(filename: desktopFileName, directory)) {
74 return directory + desktopFileName;
75 }
76
77 return QString();
78}
79
80QUrl RemoteImpl::findBaseURL(const QString &filename) const
81{
82 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::findBaseURL";
83
84 const QString file = findDesktopFile(filename);
85 if (!file.isEmpty()) {
86 KDesktopFile desktop(file);
87 return QUrl::fromUserInput(userInput: desktop.readUrl());
88 }
89
90 return QUrl();
91}
92
93void RemoteImpl::createTopLevelEntry(KIO::UDSEntry &entry) const
94{
95 entry.clear();
96 entry.reserve(size: 8);
97 entry.fastInsert(field: KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
98 entry.fastInsert(field: KIO::UDSEntry::UDS_DISPLAY_NAME, i18n("Network"));
99 entry.fastInsert(field: KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
100 entry.fastInsert(field: KIO::UDSEntry::UDS_ACCESS, l: 0500);
101 entry.fastInsert(field: KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
102 entry.fastInsert(field: KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("folder-remote"));
103 entry.fastInsert(field: KIO::UDSEntry::UDS_USER, QStringLiteral("root"));
104 entry.fastInsert(field: KIO::UDSEntry::UDS_GROUP, QStringLiteral("root"));
105}
106
107bool RemoteImpl::createEntry(KIO::UDSEntry &entry, const QString &directory, const QString &file) const
108{
109 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::createEntry";
110
111 const QString dir = Utils::slashAppended(s: directory);
112
113 KDesktopFile desktop(dir + file);
114
115 qCDebug(KIOREMOTE_LOG) << "path = " << directory << file << desktop.readName();
116
117 entry.clear();
118
119 if (desktop.readName().isEmpty()) {
120 return false;
121 }
122
123 QString new_filename = file;
124 new_filename.chop(n: 8);
125
126 entry.reserve(size: 8);
127 entry.fastInsert(field: KIO::UDSEntry::UDS_NAME, value: desktop.readName());
128 entry.fastInsert(field: KIO::UDSEntry::UDS_URL, value: QLatin1String("remote:/") + new_filename);
129
130 entry.fastInsert(field: KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
131 entry.fastInsert(field: KIO::UDSEntry::UDS_ACCESS, l: 0500);
132 entry.fastInsert(field: KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
133
134 const QString icon = desktop.readIcon();
135 entry.fastInsert(field: KIO::UDSEntry::UDS_ICON_NAME, value: icon);
136 entry.fastInsert(field: KIO::UDSEntry::UDS_LINK_DEST, value: desktop.readUrl());
137 entry.fastInsert(field: KIO::UDSEntry::UDS_TARGET_URL, value: desktop.readUrl());
138 return true;
139}
140
141bool RemoteImpl::statNetworkFolder(KIO::UDSEntry &entry, const QString &filename) const
142{
143 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::statNetworkFolder: " << filename;
144
145 QString directory;
146 const QString desktopFileName = filename + QLatin1String(".desktop");
147 return findDirectory(filename: desktopFileName, directory) && createEntry(entry, directory, file: desktopFileName);
148}
149
150bool RemoteImpl::deleteNetworkFolder(const QString &filename) const
151{
152 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::deleteNetworkFolder: " << filename;
153
154 QString directory;
155 const QString desktopFileName = filename + QLatin1String(".desktop");
156 if (findDirectory(filename: desktopFileName, directory)) {
157 qCDebug(KIOREMOTE_LOG) << "Removing " << directory << filename << ".desktop";
158 return QFile::remove(fileName: directory + desktopFileName);
159 }
160
161 return false;
162}
163
164bool RemoteImpl::renameFolders(const QString &src, const QString &dest, bool overwrite) const
165{
166 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::renameFolders: " << src << ", " << dest;
167
168 QString directory;
169 const QString srcDesktopFileName = src + QLatin1String(".desktop");
170 if (findDirectory(filename: srcDesktopFileName, directory)) {
171 const QString destDesktopFileName = dest + QLatin1String(".desktop");
172 const QString destDesktopFilePath = directory + destDesktopFileName;
173 if (!overwrite && QFile::exists(fileName: destDesktopFilePath)) {
174 return false;
175 }
176
177 qCDebug(KIOREMOTE_LOG) << "Renaming " << directory << src << ".desktop";
178 QDir dir(directory);
179 bool res = dir.rename(oldName: srcDesktopFileName, newName: destDesktopFileName);
180 if (res) {
181 KDesktopFile desktop(destDesktopFilePath);
182 desktop.desktopGroup().writeEntry(key: "Name", value: dest);
183 }
184 return res;
185 }
186
187 return false;
188}
189
190bool RemoteImpl::changeFolderTarget(const QString &src, const QString &target, bool overwrite) const
191{
192 qCDebug(KIOREMOTE_LOG) << "RemoteImpl::changeFolderTarget: " << src << ", " << target;
193
194 QString directory;
195 const QString srcDesktopFileName = src + QLatin1String(".desktop");
196 if (findDirectory(filename: srcDesktopFileName, directory)) {
197 const QString srcDesktopFilePath = directory + srcDesktopFileName;
198 if (!overwrite || !QFile::exists(fileName: srcDesktopFilePath)) {
199 return false;
200 }
201
202 qCDebug(KIOREMOTE_LOG) << "Changing target " << directory << src << ".desktop";
203 KDesktopFile desktop(srcDesktopFilePath);
204 desktop.desktopGroup().writeEntry(key: "URL", value: target);
205 return true;
206 }
207
208 return false;
209}
210

source code of kio/src/kioworkers/remote/remoteimpl.cpp