1 /*
2     This file is part of the KDE libraries
3     SPDX-FileCopyrightText: 2000 David Faure <faure@kde.org>
4 
5     SPDX-License-Identifier: LGPL-2.0-only
6 */
7 
8 #include "job.h"
9 #include "kioglobal_p.h"
10 #include <KLocalizedString>
11 #include <KStringHandler>
12 #include <kprotocolmanager.h>
13 
14 #include <QDataStream>
15 #include <QDateTime>
16 #include <QLocale>
17 #include <QUrl>
18 #include <sys/stat.h> // S_IRUSR etc
19 
20 static const int s_maxFilePathLength = 80;
21 
errorString() const22 QString KIO::Job::errorString() const
23 {
24     return KIO::buildErrorString(error(), errorText());
25 }
26 
buildErrorString(int errorCode,const QString & errorText)27 KIOCORE_EXPORT QString KIO::buildErrorString(int errorCode, const QString &errorText)
28 {
29     QString result;
30 
31     switch (errorCode) {
32     case KIO::ERR_CANNOT_OPEN_FOR_READING:
33         result = i18n("Could not read %1.", errorText);
34         break;
35     case KIO::ERR_CANNOT_OPEN_FOR_WRITING:
36         result = i18n("Could not write to %1.", KStringHandler::csqueeze(errorText, s_maxFilePathLength));
37         break;
38     case KIO::ERR_CANNOT_LAUNCH_PROCESS:
39         result = i18n("Could not start process %1.", errorText);
40         break;
41     case KIO::ERR_INTERNAL:
42         result = i18n("Internal Error\nPlease send a full bug report at https://bugs.kde.org\n%1", errorText);
43         break;
44     case KIO::ERR_MALFORMED_URL:
45         result = i18n("Malformed URL %1.", errorText);
46         break;
47     case KIO::ERR_UNSUPPORTED_PROTOCOL:
48         result = i18n("The protocol %1 is not supported.", errorText);
49         break;
50     case KIO::ERR_NO_SOURCE_PROTOCOL:
51         result = i18n("The protocol %1 is only a filter protocol.", errorText);
52         break;
53     case KIO::ERR_UNSUPPORTED_ACTION:
54         result = errorText;
55         //       result = i18n( "Unsupported action %1" ).arg( errorText );
56         break;
57     case KIO::ERR_IS_DIRECTORY:
58         result = i18n("%1 is a folder, but a file was expected.", errorText);
59         break;
60     case KIO::ERR_IS_FILE:
61         result = i18n("%1 is a file, but a folder was expected.", errorText);
62         break;
63     case KIO::ERR_DOES_NOT_EXIST:
64         result = i18n("The file or folder %1 does not exist.", errorText);
65         break;
66     case KIO::ERR_FILE_ALREADY_EXIST:
67         result = i18n("A file named %1 already exists.", errorText);
68         break;
69     case KIO::ERR_DIR_ALREADY_EXIST:
70         result = i18n("A folder named %1 already exists.", errorText);
71         break;
72     case KIO::ERR_UNKNOWN_HOST:
73         result = errorText.isEmpty() ? i18n("No hostname specified.") : i18n("Unknown host %1", errorText);
74         break;
75     case KIO::ERR_ACCESS_DENIED:
76         result = i18n("Access denied to %1.", errorText);
77         break;
78     case KIO::ERR_WRITE_ACCESS_DENIED:
79         result = i18n("Access denied.\nCould not write to %1.", errorText);
80         break;
81     case KIO::ERR_CANNOT_ENTER_DIRECTORY:
82         result = i18n("Could not enter folder %1.", errorText);
83         break;
84     case KIO::ERR_PROTOCOL_IS_NOT_A_FILESYSTEM:
85         result = i18n("The protocol %1 does not implement a folder service.", errorText);
86         break;
87     case KIO::ERR_CYCLIC_LINK:
88         result = i18n("Found a cyclic link in %1.", errorText);
89         break;
90     case KIO::ERR_USER_CANCELED:
91         // Do nothing in this case. The user doesn't need to be told what he just did.
92         break;
93     case KIO::ERR_CYCLIC_COPY:
94         result = i18n("Found a cyclic link while copying %1.", errorText);
95         break;
96     case KIO::ERR_CANNOT_CREATE_SOCKET:
97         result = i18n("Could not create socket for accessing %1.", errorText);
98         break;
99     case KIO::ERR_CANNOT_CONNECT:
100         result = i18n("Could not connect to host %1.", errorText.isEmpty() ? QStringLiteral("localhost") : errorText);
101         break;
102     case KIO::ERR_CONNECTION_BROKEN:
103         result = i18n("Connection to host %1 is broken.", errorText);
104         break;
105     case KIO::ERR_NOT_FILTER_PROTOCOL:
106         result = i18n("The protocol %1 is not a filter protocol.", errorText);
107         break;
108     case KIO::ERR_CANNOT_MOUNT:
109         result = i18n("Could not mount device.\nThe reported error was:\n%1", errorText);
110         break;
111     case KIO::ERR_CANNOT_UNMOUNT:
112         result = i18n("Could not unmount device.\nThe reported error was:\n%1", errorText);
113         break;
114     case KIO::ERR_CANNOT_READ:
115         result = i18n("Could not read file %1.", errorText);
116         break;
117     case KIO::ERR_CANNOT_WRITE:
118         result = i18n("Could not write to file %1.", errorText);
119         break;
120     case KIO::ERR_CANNOT_BIND:
121         result = i18n("Could not bind %1.", errorText);
122         break;
123     case KIO::ERR_CANNOT_LISTEN:
124         result = i18n("Could not listen %1.", errorText);
125         break;
126     case KIO::ERR_CANNOT_ACCEPT:
127         result = i18n("Could not accept %1.", errorText);
128         break;
129     case KIO::ERR_CANNOT_LOGIN:
130         result = errorText;
131         break;
132     case KIO::ERR_CANNOT_STAT:
133         result = i18n("Could not access %1.", errorText);
134         break;
135     case KIO::ERR_CANNOT_CLOSEDIR:
136         result = i18n("Could not terminate listing %1.", errorText);
137         break;
138     case KIO::ERR_CANNOT_MKDIR:
139         result = i18n("Could not make folder %1.", KStringHandler::csqueeze(errorText, s_maxFilePathLength));
140         break;
141     case KIO::ERR_CANNOT_RMDIR:
142         result = i18n("Could not remove folder %1.", errorText);
143         break;
144     case KIO::ERR_CANNOT_RESUME:
145         result = i18n("Could not resume file %1.", errorText);
146         break;
147     case KIO::ERR_CANNOT_RENAME:
148         result = i18n("Could not rename file %1.", KStringHandler::csqueeze(errorText, s_maxFilePathLength));
149         break;
150     case KIO::ERR_CANNOT_CHMOD:
151         result = i18n("Could not change permissions for %1.", errorText);
152         break;
153     case KIO::ERR_CANNOT_CHOWN:
154         result = i18n("Could not change ownership for %1.", errorText);
155         break;
156     case KIO::ERR_CANNOT_DELETE:
157         result = i18n("Could not delete file %1.", errorText);
158         break;
159     case KIO::ERR_SLAVE_DIED:
160         result = i18n("The process for the %1 protocol died unexpectedly.", errorText);
161         break;
162     case KIO::ERR_OUT_OF_MEMORY:
163         result = i18n("Error. Out of memory.\n%1", errorText);
164         break;
165     case KIO::ERR_UNKNOWN_PROXY_HOST:
166         result = i18n("Unknown proxy host\n%1", errorText);
167         break;
168     case KIO::ERR_CANNOT_AUTHENTICATE:
169         result = i18n("Authorization failed, %1 authentication not supported", errorText);
170         break;
171     case KIO::ERR_ABORTED:
172         result = i18n("User canceled action\n%1", errorText);
173         break;
174     case KIO::ERR_INTERNAL_SERVER:
175         result = i18n("Internal error in server\n%1", errorText);
176         break;
177     case KIO::ERR_SERVER_TIMEOUT:
178         result = i18n("Timeout on server\n%1", errorText);
179         break;
180     case KIO::ERR_UNKNOWN:
181         result = i18n("Unknown error\n%1", errorText);
182         break;
183     case KIO::ERR_UNKNOWN_INTERRUPT:
184         result = i18n("Unknown interrupt\n%1", errorText);
185         break;
186     /*
187         case  KIO::ERR_CHECKSUM_MISMATCH:
188           if (errorText)
189             result = i18n( "Warning: MD5 Checksum for %1 does not match checksum returned from server" ).arg(errorText);
190           else
191             result = i18n( "Warning: MD5 Checksum for %1 does not match checksum returned from server" ).arg("document");
192           break;
193     */
194     case KIO::ERR_CANNOT_DELETE_ORIGINAL:
195         result = i18n("Could not delete original file %1.\nPlease check permissions.", errorText);
196         break;
197     case KIO::ERR_CANNOT_DELETE_PARTIAL:
198         result = i18n("Could not delete partial file %1.\nPlease check permissions.", errorText);
199         break;
200     case KIO::ERR_CANNOT_RENAME_ORIGINAL:
201         result = i18n("Could not rename original file %1.\nPlease check permissions.", errorText);
202         break;
203     case KIO::ERR_CANNOT_RENAME_PARTIAL:
204         result = i18n("Could not rename partial file %1.\nPlease check permissions.", errorText);
205         break;
206     case KIO::ERR_CANNOT_SYMLINK:
207         result = i18n("Could not create symlink %1.\nPlease check permissions.", errorText);
208         break;
209     case KIO::ERR_SYMLINKS_NOT_SUPPORTED:
210         result = i18n("Cannot create symlinks at %1.\nThe destination filesystem doesn't support symlinks.", errorText);
211         break;
212     case KIO::ERR_NO_CONTENT:
213         result = errorText;
214         break;
215     case KIO::ERR_DISK_FULL:
216         result = i18n("There is not enough space on the disk to write %1.", errorText);
217         break;
218     case KIO::ERR_IDENTICAL_FILES:
219         result = i18n("The source and destination are the same file.\n%1", errorText);
220         break;
221     case KIO::ERR_SLAVE_DEFINED:
222         result = errorText;
223         break;
224     case KIO::ERR_UPGRADE_REQUIRED:
225         result = i18n("%1 is required by the server, but is not available.", errorText);
226         break;
227     case KIO::ERR_POST_DENIED:
228         result = i18n("Access to restricted port in POST denied.");
229         break;
230     case KIO::ERR_POST_NO_SIZE:
231         result = i18n("The required content size information was not provided for a POST operation.");
232         break;
233     case KIO::ERR_DROP_ON_ITSELF:
234         result = i18n("A file or folder cannot be dropped onto itself");
235         break;
236     case KIO::ERR_CANNOT_MOVE_INTO_ITSELF:
237         result = i18n("A folder cannot be moved into itself");
238         break;
239     case KIO::ERR_PASSWD_SERVER:
240         result = i18n("Communication with the local password server failed");
241         break;
242     case KIO::ERR_CANNOT_CREATE_SLAVE:
243         result = i18n("Unable to create io-slave. %1", errorText);
244         break;
245     case KIO::ERR_FILE_TOO_LARGE_FOR_FAT32:
246         result = xi18nc("@info",
247                         "Cannot transfer <filename>%1</filename> because it is too large. The destination filesystem only supports files up to 4GiB",
248                         errorText);
249         break;
250     case KIO::ERR_PRIVILEGE_NOT_REQUIRED:
251         result =
252             i18n("Privilege escalation is not necessary because \n'%1' is owned by the current user.\nPlease retry after changing permissions.", errorText);
253         break;
254     default:
255         result = i18n("Unknown error code %1\n%2\nPlease send a full bug report at https://bugs.kde.org.", errorCode, errorText);
256         break;
257     }
258 
259     return result;
260 }
261 
detailedErrorStrings(const QUrl * reqUrl,int method) const262 QStringList KIO::Job::detailedErrorStrings(const QUrl *reqUrl /*= 0*/, int method /*= -1*/) const
263 {
264     QString errorName;
265     QString techName;
266     QString description;
267     QString ret2;
268     QStringList causes;
269     QStringList solutions;
270     QStringList ret;
271 
272     QByteArray raw = rawErrorDetail(error(), errorText(), reqUrl, method);
273     QDataStream stream(raw);
274 
275     stream >> errorName >> techName >> description >> causes >> solutions;
276 
277     QString url;
278     QString protocol;
279     QString datetime;
280     if (reqUrl) {
281         QString prettyUrl;
282         prettyUrl = reqUrl->toDisplayString();
283         url = prettyUrl.toHtmlEscaped();
284         protocol = reqUrl->scheme();
285     } else {
286         url = i18nc("@info url", "(unknown)");
287     }
288 
289     datetime = QLocale().toString(QDateTime::currentDateTime(), QLocale::LongFormat);
290 
291     ret << errorName;
292     ret << i18nc("@info %1 error name, %2 description", "<qt><p><b>%1</b></p><p>%2</p></qt>", errorName, description);
293 
294     ret2 = QStringLiteral("<qt>");
295     if (!techName.isEmpty()) {
296         ret2 += QLatin1String("<p>") + i18n("<b>Technical reason</b>: ") + techName + QLatin1String("</p>");
297     }
298     ret2 += QLatin1String("<p>") + i18n("<b>Details of the request</b>:") + QLatin1String("</p><ul>") + i18n("<li>URL: %1</li>", url);
299     if (!protocol.isEmpty()) {
300         ret2 += i18n("<li>Protocol: %1</li>", protocol);
301     }
302     ret2 += i18n("<li>Date and time: %1</li>", datetime) + i18n("<li>Additional information: %1</li>", errorText()) + QLatin1String("</ul>");
303     if (!causes.isEmpty()) {
304         ret2 += QLatin1String("<p>") + i18n("<b>Possible causes</b>:") + QLatin1String("</p><ul><li>") + causes.join(QLatin1String("</li><li>"))
305             + QLatin1String("</li></ul>");
306     }
307     if (!solutions.isEmpty()) {
308         ret2 += QLatin1String("<p>") + i18n("<b>Possible solutions</b>:") + QLatin1String("</p><ul><li>") + solutions.join(QLatin1String("</li><li>"))
309             + QLatin1String("</li></ul>");
310     }
311     ret2 += QLatin1String("</qt>");
312     ret << ret2;
313 
314     return ret;
315 }
316 
rawErrorDetail(int errorCode,const QString & errorText,const QUrl * reqUrl,int)317 KIOCORE_EXPORT QByteArray KIO::rawErrorDetail(int errorCode, const QString &errorText, const QUrl *reqUrl /*= 0*/, int /*method = -1*/)
318 {
319     QString url;
320     QString host;
321     QString protocol;
322     QString datetime;
323     QString domain;
324     QString path;
325     QString filename;
326     bool isSlaveNetwork = false;
327     if (reqUrl) {
328         url = reqUrl->toDisplayString();
329         host = reqUrl->host();
330         protocol = reqUrl->scheme();
331 
332         if (host.startsWith(QLatin1String("www."))) {
333             domain = host.mid(4);
334         } else {
335             domain = host;
336         }
337 
338         filename = reqUrl->fileName();
339         path = reqUrl->path();
340 
341         // detect if protocol is a network protocol...
342         if (!protocol.isEmpty()) {
343             isSlaveNetwork = KProtocolInfo::protocolClass(protocol) == QLatin1String(":internet");
344         }
345     } else {
346         // assume that the errorText has the location we are interested in
347         url = host = domain = path = filename = errorText;
348     }
349 
350     if (protocol.isEmpty()) {
351         protocol = i18nc("@info protocol", "(unknown)");
352     }
353 
354     datetime = QLocale().toString(QDateTime::currentDateTime(), QLocale::LongFormat);
355 
356     QString errorName;
357     QString techName;
358     QString description;
359     QStringList causes;
360     QStringList solutions;
361 
362     // c == cause, s == solution
363     QString sSysadmin = i18n(
364         "Contact your appropriate computer support system, "
365         "whether the system administrator, or technical support group for further "
366         "assistance.");
367     QString sServeradmin = i18n(
368         "Contact the administrator of the server "
369         "for further assistance.");
370     // FIXME active link to permissions dialog
371     QString sAccess = i18n("Check your access permissions on this resource.");
372     QString cAccess = i18n(
373         "Your access permissions may be inadequate to "
374         "perform the requested operation on this resource.");
375     QString cLocked = i18n(
376         "The file may be in use (and thus locked) by "
377         "another user or application.");
378     QString sQuerylock = i18n(
379         "Check to make sure that no other "
380         "application or user is using the file or has locked the file.");
381     QString cHardware = i18n(
382         "Although unlikely, a hardware error may have "
383         "occurred.");
384     QString cBug = i18n("You may have encountered a bug in the program.");
385     QString cBuglikely = i18n(
386         "This is most likely to be caused by a bug in the "
387         "program. Please consider submitting a full bug report as detailed below.");
388     QString sUpdate = i18n(
389         "Update your software to the latest version. "
390         "Your distribution should provide tools to update your software.");
391     QString sBugreport = i18n(
392         "When all else fails, please consider helping the "
393         "KDE team or the third party maintainer of this software by submitting a "
394         "high quality bug report. If the software is provided by a third party, "
395         "please contact them directly. Otherwise, first look to see if "
396         "the same bug has been submitted by someone else by searching at the "
397         "<a href=\"https://bugs.kde.org/\">KDE bug reporting website</a>. If not, take "
398         "note of the details given above, and include them in your bug report, along "
399         "with as many other details as you think might help.");
400     QString cNetwork = i18n(
401         "There may have been a problem with your network "
402         "connection.");
403     // FIXME netconf kcontrol link
404     QString cNetconf = i18n(
405         "There may have been a problem with your network "
406         "configuration. If you have been accessing the Internet with no problems "
407         "recently, this is unlikely.");
408     QString cNetpath = i18n(
409         "There may have been a problem at some point along "
410         "the network path between the server and this computer.");
411     QString sTryagain = i18n("Try again, either now or at a later time.");
412     QString cProtocol = i18n("A protocol error or incompatibility may have occurred.");
413     QString sExists = i18n("Ensure that the resource exists, and try again.");
414     QString cExists = i18n("The specified resource may not exist.");
415     QString sTypo = i18n(
416         "Double-check that you have entered the correct location "
417         "and try again.");
418     QString sNetwork = i18n("Check your network connection status.");
419 
420     switch (errorCode) {
421     case KIO::ERR_CANNOT_OPEN_FOR_READING:
422         errorName = i18n("Cannot Open Resource For Reading");
423         description = i18n(
424             "This means that the contents of the requested file "
425             "or folder <strong>%1</strong> could not be retrieved, as read "
426             "access could not be obtained.",
427             path);
428         causes << i18n(
429             "You may not have permissions to read the file or open "
430             "the folder.")
431                << cLocked << cHardware;
432         solutions << sAccess << sQuerylock << sSysadmin;
433         break;
434 
435     case KIO::ERR_CANNOT_OPEN_FOR_WRITING:
436         errorName = i18n("Cannot Open Resource For Writing");
437         description = i18n(
438             "This means that the file, <strong>%1</strong>, could "
439             "not be written to as requested, because access with permission to "
440             "write could not be obtained.",
441             KStringHandler::csqueeze(filename, s_maxFilePathLength));
442         causes << cAccess << cLocked << cHardware;
443         solutions << sAccess << sQuerylock << sSysadmin;
444         break;
445 
446     case KIO::ERR_CANNOT_LAUNCH_PROCESS:
447         errorName = i18n("Cannot Launch Process required by the %1 Protocol", protocol);
448         techName = i18n("Unable to Launch Process");
449         description = i18n(
450             "The program on your computer which provides access "
451             "to the <strong>%1</strong> protocol could not be found or started. This is "
452             "usually due to technical reasons.",
453             protocol);
454         causes << i18n(
455             "The program which provides compatibility with this "
456             "protocol may not have been updated with your last update of KDE. "
457             "This can cause the program to be incompatible with the current version "
458             "and thus not start.")
459                << cBug;
460         solutions << sUpdate << sSysadmin;
461         break;
462 
463     case KIO::ERR_INTERNAL:
464         errorName = i18n("Internal Error");
465         description = i18n(
466             "The program on your computer which provides access "
467             "to the <strong>%1</strong> protocol has reported an internal error.",
468             protocol);
469         causes << cBuglikely;
470         solutions << sUpdate << sBugreport;
471         break;
472 
473     case KIO::ERR_MALFORMED_URL:
474         errorName = i18n("Improperly Formatted URL");
475         description = i18n(
476             "The <strong>U</strong>niform <strong>R</strong>esource "
477             "<strong>L</strong>ocator (URL) that you entered was not properly "
478             "formatted. The format of a URL is generally as follows:"
479             "<blockquote><strong>protocol://user:password@www.example.org:port/folder/"
480             "filename.extension?query=value</strong></blockquote>");
481         solutions << sTypo;
482         break;
483 
484     case KIO::ERR_UNSUPPORTED_PROTOCOL:
485         errorName = i18n("Unsupported Protocol %1", protocol);
486         description = i18n(
487             "The protocol <strong>%1</strong> is not supported "
488             "by the KDE programs currently installed on this computer.",
489             protocol);
490         causes << i18n("The requested protocol may not be supported.")
491                << i18n(
492                       "The versions of the %1 protocol supported by this computer and "
493                       "the server may be incompatible.",
494                       protocol);
495         solutions << i18n(
496             "You may perform a search on the Internet for a KDE "
497             "program (called a kioslave or ioslave) which supports this protocol. "
498             "Places to search include <a href=\"https://kde-apps.org/\">"
499             "https://kde-apps.org/</a> and <a href=\"http://freshmeat.net/\">"
500             "http://freshmeat.net/</a>.")
501                   << sUpdate << sSysadmin;
502         break;
503 
504     case KIO::ERR_NO_SOURCE_PROTOCOL:
505         errorName = i18n("URL Does Not Refer to a Resource.");
506         techName = i18n("Protocol is a Filter Protocol");
507         description = i18n(
508             "The <strong>U</strong>niform <strong>R</strong>esource "
509             "<strong>L</strong>ocator (URL) that you entered did not refer to a "
510             "specific resource.");
511         causes << i18n(
512             "KDE is able to communicate through a protocol within a "
513             "protocol; the protocol specified is only for use in such situations, "
514             "however this is not one of these situations. This is a rare event, and "
515             "is likely to indicate a programming error.");
516         solutions << sTypo;
517         break;
518 
519     case KIO::ERR_UNSUPPORTED_ACTION:
520         errorName = i18n("Unsupported Action: %1", errorText);
521         description = i18n(
522             "The requested action is not supported by the KDE "
523             "program which is implementing the <strong>%1</strong> protocol.",
524             protocol);
525         causes << i18n(
526             "This error is very much dependent on the KDE program. The "
527             "additional information should give you more information than is available "
528             "to the KDE input/output architecture.");
529         solutions << i18n(
530             "Attempt to find another way to accomplish the same "
531             "outcome.");
532         break;
533 
534     case KIO::ERR_IS_DIRECTORY:
535         errorName = i18n("File Expected");
536         description = i18n(
537             "The request expected a file, however the "
538             "folder <strong>%1</strong> was found instead.",
539             path);
540         causes << i18n("This may be an error on the server side.") << cBug;
541         solutions << sUpdate << sSysadmin;
542         break;
543 
544     case KIO::ERR_IS_FILE:
545         errorName = i18n("Folder Expected");
546         description = i18n(
547             "The request expected a folder, however "
548             "the file <strong>%1</strong> was found instead.",
549             filename);
550         causes << cBug;
551         solutions << sUpdate << sSysadmin;
552         break;
553 
554     case KIO::ERR_DOES_NOT_EXIST:
555         errorName = i18n("File or Folder Does Not Exist");
556         description = i18n(
557             "The specified file or folder <strong>%1</strong> "
558             "does not exist.",
559             path);
560         causes << cExists;
561         solutions << sExists;
562         break;
563 
564     case KIO::ERR_FILE_ALREADY_EXIST:
565         errorName = i18n("File Already Exists");
566         description = i18n(
567             "The requested file could not be created because a "
568             "file with the same name already exists.");
569         solutions << i18n(
570             "Try moving the current file out of the way first, "
571             "and then try again.")
572                   << i18n("Delete the current file and try again.") << i18n("Choose an alternate filename for the new file.");
573         break;
574 
575     case KIO::ERR_DIR_ALREADY_EXIST:
576         errorName = i18n("Folder Already Exists");
577         description = i18n(
578             "The requested folder could not be created because "
579             "a folder with the same name already exists.");
580         solutions << i18n(
581             "Try moving the current folder out of the way first, "
582             "and then try again.")
583                   << i18n("Delete the current folder and try again.") << i18n("Choose an alternate name for the new folder.");
584         break;
585 
586     case KIO::ERR_UNKNOWN_HOST:
587         errorName = i18n("Unknown Host");
588         description = i18n(
589             "An unknown host error indicates that the server with "
590             "the requested name, <strong>%1</strong>, could not be "
591             "located on the Internet.",
592             host);
593         causes << i18n(
594             "The name that you typed, %1, may not exist: it may be "
595             "incorrectly typed.",
596             host)
597                << cNetwork << cNetconf;
598         solutions << sNetwork << sSysadmin;
599         break;
600 
601     case KIO::ERR_ACCESS_DENIED:
602         errorName = i18n("Access Denied");
603         description = i18n(
604             "Access was denied to the specified resource, "
605             "<strong>%1</strong>.",
606             url);
607         causes << i18n(
608             "You may have supplied incorrect authentication details or "
609             "none at all.")
610                << i18n(
611                       "Your account may not have permission to access the "
612                       "specified resource.");
613         solutions << i18n(
614             "Retry the request and ensure your authentication details "
615             "are entered correctly.")
616                   << sSysadmin;
617         if (!isSlaveNetwork) {
618             solutions << sServeradmin;
619         }
620         break;
621 
622     case KIO::ERR_WRITE_ACCESS_DENIED:
623         errorName = i18n("Write Access Denied");
624         description = i18n(
625             "This means that an attempt to write to the file "
626             "<strong>%1</strong> was rejected.",
627             filename);
628         causes << cAccess << cLocked << cHardware;
629         solutions << sAccess << sQuerylock << sSysadmin;
630         break;
631 
632     case KIO::ERR_CANNOT_ENTER_DIRECTORY:
633         errorName = i18n("Unable to Enter Folder");
634         description = i18n(
635             "This means that an attempt to enter (in other words, "
636             "to open) the requested folder <strong>%1</strong> was rejected.",
637             path);
638         causes << cAccess << cLocked;
639         solutions << sAccess << sQuerylock << sSysadmin;
640         break;
641 
642     case KIO::ERR_PROTOCOL_IS_NOT_A_FILESYSTEM:
643         errorName = i18n("Folder Listing Unavailable");
644         techName = i18n("Protocol %1 is not a Filesystem", protocol);
645         description = i18n(
646             "This means that a request was made which requires "
647             "determining the contents of the folder, and the KDE program supporting "
648             "this protocol is unable to do so.");
649         causes << cBug;
650         solutions << sUpdate << sBugreport;
651         break;
652 
653     case KIO::ERR_CYCLIC_LINK:
654         errorName = i18n("Cyclic Link Detected");
655         description = i18n(
656             "UNIX environments are commonly able to link a file or "
657             "folder to a separate name and/or location. KDE detected a link or "
658             "series of links that results in an infinite loop - i.e. the file was "
659             "(perhaps in a roundabout way) linked to itself.");
660         solutions << i18n(
661             "Delete one part of the loop in order that it does not "
662             "cause an infinite loop, and try again.")
663                   << sSysadmin;
664         break;
665 
666     case KIO::ERR_USER_CANCELED:
667         // Do nothing in this case. The user doesn't need to be told what he just did.
668         // rodda: However, if we have been called, an application is about to display
669         // this information anyway. If we don't return sensible information, the
670         // user sees a blank dialog (I have seen this myself)
671         errorName = i18n("Request Aborted By User");
672         description = i18n(
673             "The request was not completed because it was "
674             "aborted.");
675         solutions << i18n("Retry the request.");
676         break;
677 
678     case KIO::ERR_CYCLIC_COPY:
679         errorName = i18n("Cyclic Link Detected During Copy");
680         description = i18n(
681             "UNIX environments are commonly able to link a file or "
682             "folder to a separate name and/or location. During the requested copy "
683             "operation, KDE detected a link or series of links that results in an "
684             "infinite loop - i.e. the file was (perhaps in a roundabout way) linked "
685             "to itself.");
686         solutions << i18n(
687             "Delete one part of the loop in order that it does not "
688             "cause an infinite loop, and try again.")
689                   << sSysadmin;
690         break;
691 
692     case KIO::ERR_CANNOT_CREATE_SOCKET:
693         errorName = i18n("Could Not Create Network Connection");
694         techName = i18n("Could Not Create Socket");
695         description = i18n(
696             "This is a fairly technical error in which a required "
697             "device for network communications (a socket) could not be created.");
698         causes << i18n(
699             "The network connection may be incorrectly configured, or "
700             "the network interface may not be enabled.");
701         solutions << sNetwork << sSysadmin;
702         break;
703 
704     case KIO::ERR_CANNOT_CONNECT:
705         errorName = i18n("Connection to Server Refused");
706         description = i18n(
707             "The server <strong>%1</strong> refused to allow this "
708             "computer to make a connection.",
709             host);
710         causes << i18n(
711             "The server, while currently connected to the Internet, "
712             "may not be configured to allow requests.")
713                << i18n(
714                       "The server, while currently connected to the Internet, "
715                       "may not be running the requested service (%1).",
716                       protocol)
717                << i18n(
718                       "A network firewall (a device which restricts Internet "
719                       "requests), either protecting your network or the network of the server, "
720                       "may have intervened, preventing this request.");
721         solutions << sTryagain << sServeradmin << sSysadmin;
722         break;
723 
724     case KIO::ERR_CONNECTION_BROKEN:
725         errorName = i18n("Connection to Server Closed Unexpectedly");
726         description = i18n(
727             "Although a connection was established to "
728             "<strong>%1</strong>, the connection was closed at an unexpected point "
729             "in the communication.",
730             host);
731         causes << cNetwork << cNetpath
732                << i18n(
733                       "A protocol error may have occurred, "
734                       "causing the server to close the connection as a response to the error.");
735         solutions << sTryagain << sServeradmin << sSysadmin;
736         break;
737 
738     case KIO::ERR_NOT_FILTER_PROTOCOL:
739         errorName = i18n("URL Resource Invalid");
740         techName = i18n("Protocol %1 is not a Filter Protocol", protocol);
741         description = i18n(
742             "The <strong>U</strong>niform <strong>R</strong>esource "
743             "<strong>L</strong>ocator (URL) that you entered did not refer to "
744             "a valid mechanism of accessing the specific resource, "
745             "<strong>%1%2</strong>.",
746             !host.isNull() ? host + QLatin1Char('/') : QString(),
747             path);
748         causes << i18n(
749             "KDE is able to communicate through a protocol within a "
750             "protocol. This request specified a protocol be used as such, however "
751             "this protocol is not capable of such an action. This is a rare event, "
752             "and is likely to indicate a programming error.");
753         solutions << sTypo << sSysadmin;
754         break;
755 
756     case KIO::ERR_CANNOT_MOUNT:
757         errorName = i18n("Unable to Initialize Input/Output Device");
758         techName = i18n("Could Not Mount Device");
759         description = i18n(
760             "The requested device could not be initialized "
761             "(\"mounted\"). The reported error was: <strong>%1</strong>",
762             errorText);
763         causes << i18n(
764             "The device may not be ready, for example there may be "
765             "no media in a removable media device (i.e. no CD-ROM in a CD drive), "
766             "or in the case of a peripheral/portable device, the device may not "
767             "be correctly connected.")
768                << i18n(
769                       "You may not have permissions to initialize (\"mount\") the "
770                       "device. On UNIX systems, often system administrator privileges are "
771                       "required to initialize a device.")
772                << cHardware;
773         solutions << i18n(
774             "Check that the device is ready; removable drives "
775             "must contain media, and portable devices must be connected and powered "
776             "on.; and try again.")
777                   << sAccess << sSysadmin;
778         break;
779 
780     case KIO::ERR_CANNOT_UNMOUNT:
781         errorName = i18n("Unable to Uninitialize Input/Output Device");
782         techName = i18n("Could Not Unmount Device");
783         description = i18n(
784             "The requested device could not be uninitialized "
785             "(\"unmounted\"). The reported error was: <strong>%1</strong>",
786             errorText);
787         causes << i18n(
788             "The device may be busy, that is, still in use by "
789             "another application or user. Even such things as having an open "
790             "browser window on a location on this device may cause the device to "
791             "remain in use.")
792                << i18n(
793                       "You may not have permissions to uninitialize (\"unmount\") "
794                       "the device. On UNIX systems, system administrator privileges are "
795                       "often required to uninitialize a device.")
796                << cHardware;
797         solutions << i18n(
798             "Check that no applications are accessing the device, "
799             "and try again.")
800                   << sAccess << sSysadmin;
801         break;
802 
803     case KIO::ERR_CANNOT_READ:
804         errorName = i18n("Cannot Read From Resource");
805         description = i18n(
806             "This means that although the resource, "
807             "<strong>%1</strong>, was able to be opened, an error occurred while "
808             "reading the contents of the resource.",
809             url);
810         causes << i18n("You may not have permissions to read from the resource.");
811         if (!isSlaveNetwork) {
812             causes << cNetwork;
813         }
814         causes << cHardware;
815         solutions << sAccess;
816         if (!isSlaveNetwork) {
817             solutions << sNetwork;
818         }
819         solutions << sSysadmin;
820         break;
821 
822     case KIO::ERR_CANNOT_WRITE:
823         errorName = i18n("Cannot Write to Resource");
824         description = i18n(
825             "This means that although the resource, <strong>%1</strong>"
826             ", was able to be opened, an error occurred while writing to the resource.",
827             url);
828         causes << i18n("You may not have permissions to write to the resource.");
829         if (!isSlaveNetwork) {
830             causes << cNetwork;
831         }
832         causes << cHardware;
833         solutions << sAccess;
834         if (!isSlaveNetwork) {
835             solutions << sNetwork;
836         }
837         solutions << sSysadmin;
838         break;
839 
840     case KIO::ERR_CANNOT_BIND:
841         errorName = i18n("Could Not Listen for Network Connections");
842         techName = i18n("Could Not Bind");
843         description = i18n(
844             "This is a fairly technical error in which a required "
845             "device for network communications (a socket) could not be established "
846             "to listen for incoming network connections.");
847         causes << i18n(
848             "The network connection may be incorrectly configured, or "
849             "the network interface may not be enabled.");
850         solutions << sNetwork << sSysadmin;
851         break;
852 
853     case KIO::ERR_CANNOT_LISTEN:
854         errorName = i18n("Could Not Listen for Network Connections");
855         techName = i18n("Could Not Listen");
856         description = i18n(
857             "This is a fairly technical error in which a required "
858             "device for network communications (a socket) could not be established "
859             "to listen for incoming network connections.");
860         causes << i18n(
861             "The network connection may be incorrectly configured, or "
862             "the network interface may not be enabled.");
863         solutions << sNetwork << sSysadmin;
864         break;
865 
866     case KIO::ERR_CANNOT_ACCEPT:
867         errorName = i18n("Could Not Accept Network Connection");
868         description = i18n(
869             "This is a fairly technical error in which an error "
870             "occurred while attempting to accept an incoming network connection.");
871         causes << i18n(
872             "The network connection may be incorrectly configured, or "
873             "the network interface may not be enabled.")
874                << i18n("You may not have permissions to accept the connection.");
875         solutions << sNetwork << sSysadmin;
876         break;
877 
878     case KIO::ERR_CANNOT_LOGIN:
879         errorName = i18n("Could Not Login: %1", errorText);
880         description = i18n(
881             "An attempt to login to perform the requested "
882             "operation was unsuccessful.");
883         causes << i18n(
884             "You may have supplied incorrect authentication details or "
885             "none at all.")
886                << i18n(
887                       "Your account may not have permission to access the "
888                       "specified resource.")
889                << cProtocol;
890         solutions << i18n(
891             "Retry the request and ensure your authentication details "
892             "are entered correctly.")
893                   << sServeradmin << sSysadmin;
894         break;
895 
896     case KIO::ERR_CANNOT_STAT:
897         errorName = i18n("Could Not Determine Resource Status");
898         techName = i18n("Could Not Stat Resource");
899         description = i18n(
900             "An attempt to determine information about the status "
901             "of the resource <strong>%1</strong>, such as the resource name, type, "
902             "size, etc., was unsuccessful.",
903             url);
904         causes << i18n(
905             "The specified resource may not have existed or may "
906             "not be accessible.")
907                << cProtocol << cHardware;
908         solutions << i18n(
909             "Retry the request and ensure your authentication details "
910             "are entered correctly.")
911                   << sSysadmin;
912         break;
913 
914     case KIO::ERR_CANNOT_CLOSEDIR:
915         // result = i18n( "Could not terminate listing %1" ).arg( errorText );
916         errorName = i18n("Could Not Cancel Listing");
917         techName = i18n("FIXME: Document this");
918         break;
919 
920     case KIO::ERR_CANNOT_MKDIR:
921         errorName = i18n("Could Not Create Folder");
922         description = i18n("An attempt to create the requested folder failed.");
923         causes << cAccess
924                << i18n(
925                       "The location where the folder was to be created "
926                       "may not exist.");
927         if (!isSlaveNetwork) {
928             causes << cProtocol;
929         }
930         solutions << i18n("Retry the request.") << sAccess;
931         break;
932 
933     case KIO::ERR_CANNOT_RMDIR:
934         errorName = i18n("Could Not Remove Folder");
935         description = i18n(
936             "An attempt to remove the specified folder, "
937             "<strong>%1</strong>, failed.",
938             path);
939         causes << i18n("The specified folder may not exist.") << i18n("The specified folder may not be empty.") << cAccess;
940         if (!isSlaveNetwork) {
941             causes << cProtocol;
942         }
943         solutions << i18n(
944             "Ensure that the folder exists and is empty, and try "
945             "again.")
946                   << sAccess;
947         break;
948 
949     case KIO::ERR_CANNOT_RESUME:
950         errorName = i18n("Could Not Resume File Transfer");
951         description = i18n(
952             "The specified request asked that the transfer of "
953             "file <strong>%1</strong> be resumed at a certain point of the "
954             "transfer. This was not possible.",
955             filename);
956         causes << i18n(
957             "The protocol, or the server, may not support file "
958             "resuming.");
959         solutions << i18n(
960             "Retry the request without attempting to resume "
961             "transfer.");
962         break;
963 
964     case KIO::ERR_CANNOT_RENAME:
965         errorName = i18n("Could Not Rename Resource");
966         description = i18n(
967             "An attempt to rename the specified resource "
968             "<strong>%1</strong> failed.",
969             KStringHandler::csqueeze(url, s_maxFilePathLength));
970         causes << cAccess << cExists;
971         if (!isSlaveNetwork) {
972             causes << cProtocol;
973         }
974         solutions << sAccess << sExists;
975         break;
976 
977     case KIO::ERR_CANNOT_CHMOD:
978         errorName = i18n("Could Not Alter Permissions of Resource");
979         description = i18n(
980             "An attempt to alter the permissions on the specified "
981             "resource <strong>%1</strong> failed.",
982             url);
983         causes << cAccess << cExists;
984         solutions << sAccess << sExists;
985         break;
986 
987     case KIO::ERR_CANNOT_CHOWN:
988         errorName = i18n("Could Not Change Ownership of Resource");
989         description = i18n(
990             "An attempt to change the ownership of the specified "
991             "resource <strong>%1</strong> failed.",
992             url);
993         causes << cAccess << cExists;
994         solutions << sAccess << sExists;
995         break;
996 
997     case KIO::ERR_CANNOT_DELETE:
998         errorName = i18n("Could Not Delete Resource");
999         description = i18n(
1000             "An attempt to delete the specified resource "
1001             "<strong>%1</strong> failed.",
1002             url);
1003         causes << cAccess << cExists;
1004         solutions << sAccess << sExists;
1005         break;
1006 
1007     case KIO::ERR_SLAVE_DIED:
1008         errorName = i18n("Unexpected Program Termination");
1009         description = i18n(
1010             "The program on your computer which provides access "
1011             "to the <strong>%1</strong> protocol has unexpectedly terminated.",
1012             url);
1013         causes << cBuglikely;
1014         solutions << sUpdate << sBugreport;
1015         break;
1016 
1017     case KIO::ERR_OUT_OF_MEMORY:
1018         errorName = i18n("Out of Memory");
1019         description = i18n(
1020             "The program on your computer which provides access "
1021             "to the <strong>%1</strong> protocol could not obtain the memory "
1022             "required to continue.",
1023             protocol);
1024         causes << cBuglikely;
1025         solutions << sUpdate << sBugreport;
1026         break;
1027 
1028     case KIO::ERR_UNKNOWN_PROXY_HOST:
1029         errorName = i18n("Unknown Proxy Host");
1030         description = i18n(
1031             "While retrieving information about the specified "
1032             "proxy host, <strong>%1</strong>, an Unknown Host error was encountered. "
1033             "An unknown host error indicates that the requested name could not be "
1034             "located on the Internet.",
1035             errorText);
1036         causes << i18n(
1037             "There may have been a problem with your network "
1038             "configuration, specifically your proxy's hostname. If you have been "
1039             "accessing the Internet with no problems recently, this is unlikely.")
1040                << cNetwork;
1041         solutions << i18n("Double-check your proxy settings and try again.") << sSysadmin;
1042         break;
1043 
1044     case KIO::ERR_CANNOT_AUTHENTICATE:
1045         errorName = i18n("Authentication Failed: Method %1 Not Supported", errorText);
1046         description = i18n(
1047             "Although you may have supplied the correct "
1048             "authentication details, the authentication failed because the "
1049             "method that the server is using is not supported by the KDE "
1050             "program implementing the protocol %1.",
1051             protocol);
1052         solutions << i18n(
1053             "Please file a bug at <a href=\"https://bugs.kde.org/\">"
1054             "https://bugs.kde.org/</a> to inform the KDE team of the unsupported "
1055             "authentication method.")
1056                   << sSysadmin;
1057         break;
1058 
1059     case KIO::ERR_ABORTED:
1060         errorName = i18n("Request Aborted");
1061         description = i18n(
1062             "The request was not completed because it was "
1063             "aborted.");
1064         solutions << i18n("Retry the request.");
1065         break;
1066 
1067     case KIO::ERR_INTERNAL_SERVER:
1068         errorName = i18n("Internal Error in Server");
1069         description = i18n(
1070             "The program on the server which provides access "
1071             "to the <strong>%1</strong> protocol has reported an internal error: "
1072             "%2.",
1073             protocol,
1074             errorText);
1075         causes << i18n(
1076             "This is most likely to be caused by a bug in the "
1077             "server program. Please consider submitting a full bug report as "
1078             "detailed below.");
1079         solutions << i18n(
1080             "Contact the administrator of the server "
1081             "to advise them of the problem.")
1082                   << i18n(
1083                          "If you know who the authors of the server software are, "
1084                          "submit the bug report directly to them.");
1085         break;
1086 
1087     case KIO::ERR_SERVER_TIMEOUT:
1088         errorName = i18n("Timeout Error");
1089         description = i18n(
1090             "Although contact was made with the server, a "
1091             "response was not received within the amount of time allocated for "
1092             "the request as follows:<ul>"
1093             "<li>Timeout for establishing a connection: %1 seconds</li>"
1094             "<li>Timeout for receiving a response: %2 seconds</li>"
1095             "<li>Timeout for accessing proxy servers: %3 seconds</li></ul>"
1096             "Please note that you can alter these timeout settings in the KDE "
1097             "System Settings, by selecting Network Settings -> Connection Preferences.",
1098             KProtocolManager::connectTimeout(),
1099             KProtocolManager::responseTimeout(),
1100             KProtocolManager::proxyConnectTimeout());
1101         causes << cNetpath
1102                << i18n(
1103                       "The server was too busy responding to other "
1104                       "requests to respond.");
1105         solutions << sTryagain << sServeradmin;
1106         break;
1107 
1108     case KIO::ERR_UNKNOWN:
1109         errorName = i18n("Unknown Error");
1110         description = i18n(
1111             "The program on your computer which provides access "
1112             "to the <strong>%1</strong> protocol has reported an unknown error: "
1113             "%2.",
1114             protocol,
1115             errorText);
1116         causes << cBug;
1117         solutions << sUpdate << sBugreport;
1118         break;
1119 
1120     case KIO::ERR_UNKNOWN_INTERRUPT:
1121         errorName = i18n("Unknown Interruption");
1122         description = i18n(
1123             "The program on your computer which provides access "
1124             "to the <strong>%1</strong> protocol has reported an interruption of "
1125             "an unknown type: %2.",
1126             protocol,
1127             errorText);
1128         causes << cBug;
1129         solutions << sUpdate << sBugreport;
1130         break;
1131 
1132     case KIO::ERR_CANNOT_DELETE_ORIGINAL:
1133         errorName = i18n("Could Not Delete Original File");
1134         description = i18n(
1135             "The requested operation required the deleting of "
1136             "the original file, most likely at the end of a file move operation. "
1137             "The original file <strong>%1</strong> could not be deleted.",
1138             errorText);
1139         causes << cAccess;
1140         solutions << sAccess;
1141         break;
1142 
1143     case KIO::ERR_CANNOT_DELETE_PARTIAL:
1144         errorName = i18n("Could Not Delete Temporary File");
1145         description = i18n(
1146             "The requested operation required the creation of "
1147             "a temporary file in which to save the new file while being "
1148             "downloaded. This temporary file <strong>%1</strong> could not be "
1149             "deleted.",
1150             errorText);
1151         causes << cAccess;
1152         solutions << sAccess;
1153         break;
1154 
1155     case KIO::ERR_CANNOT_RENAME_ORIGINAL:
1156         errorName = i18n("Could Not Rename Original File");
1157         description = i18n(
1158             "The requested operation required the renaming of "
1159             "the original file <strong>%1</strong>, however it could not be "
1160             "renamed.",
1161             errorText);
1162         causes << cAccess;
1163         solutions << sAccess;
1164         break;
1165 
1166     case KIO::ERR_CANNOT_RENAME_PARTIAL:
1167         errorName = i18n("Could Not Rename Temporary File");
1168         description = i18n(
1169             "The requested operation required the creation of "
1170             "a temporary file <strong>%1</strong>, however it could not be "
1171             "created.",
1172             errorText);
1173         causes << cAccess;
1174         solutions << sAccess;
1175         break;
1176 
1177     case KIO::ERR_CANNOT_SYMLINK:
1178         errorName = i18n("Could Not Create Link");
1179         techName = i18n("Could Not Create Symbolic Link");
1180         description = i18n("The requested symbolic link %1 could not be created.", errorText);
1181         causes << cAccess;
1182         solutions << sAccess;
1183         break;
1184 
1185     case KIO::ERR_NO_CONTENT:
1186         errorName = i18n("No Content");
1187         description = errorText;
1188         break;
1189 
1190     case KIO::ERR_DISK_FULL:
1191         errorName = i18n("Disk Full");
1192         description = i18n(
1193             "The requested file <strong>%1</strong> could not be "
1194             "written to as there is inadequate disk space.",
1195             errorText);
1196         solutions << i18n(
1197             "Free up enough disk space by 1) deleting unwanted and "
1198             "temporary files; 2) archiving files to removable media storage such as "
1199             "CD-Recordable discs; or 3) obtain more storage capacity.")
1200                   << sSysadmin;
1201         break;
1202 
1203     case KIO::ERR_IDENTICAL_FILES:
1204         errorName = i18n("Source and Destination Files Identical");
1205         description = i18n(
1206             "The operation could not be completed because the "
1207             "source and destination files are the same file.");
1208         solutions << i18n("Choose a different filename for the destination file.");
1209         break;
1210 
1211     case KIO::ERR_DROP_ON_ITSELF:
1212         errorName = i18n("File or Folder dropped onto itself");
1213         description = i18n(
1214             "The operation could not be completed because the "
1215             "source and destination file or folder are the same.");
1216         solutions << i18n("Drop the item into a different file or folder.");
1217         break;
1218 
1219     // We assume that the slave has all the details
1220     case KIO::ERR_SLAVE_DEFINED:
1221         errorName.clear();
1222         description = errorText;
1223         break;
1224 
1225     case KIO::ERR_CANNOT_MOVE_INTO_ITSELF:
1226         errorName = i18n("Folder moved into itself");
1227         description = i18n(
1228             "The operation could not be completed because the "
1229             "source can not be moved into itself.");
1230         solutions << i18n("Move the item into a different folder.");
1231         break;
1232 
1233     case KIO::ERR_PASSWD_SERVER:
1234         errorName = i18n("Could not communicate with password server");
1235         description = i18n(
1236             "The operation could not be completed because the "
1237             "service for requesting passwords (kpasswdserver) couldn't be contacted");
1238         solutions << i18n("Try restarting your session, or look in the logs for errors from kiod.");
1239         break;
1240 
1241     case KIO::ERR_CANNOT_CREATE_SLAVE:
1242         errorName = i18n("Cannot Initiate the %1 Protocol", protocol);
1243         techName = i18n("Unable to Create io-slave");
1244         description = i18n(
1245             "The io-slave which provides access "
1246             "to the <strong>%1</strong> protocol could not be started. This is "
1247             "usually due to technical reasons.",
1248             protocol);
1249         causes << i18n(
1250             "klauncher could not find or start the plugin which provides the protocol."
1251             "This means you may have an outdated version of the plugin.");
1252         solutions << sUpdate << sSysadmin;
1253         break;
1254 
1255     case KIO::ERR_FILE_TOO_LARGE_FOR_FAT32:
1256         errorName = xi18nc("@info", "Cannot transfer <filename>%1</filename>", errorText);
1257         description = xi18nc("@info",
1258                              "The file <filename>%1</filename> cannot be transferred,"
1259                              " because the destination filesystem does not support files that large",
1260                              errorText);
1261         solutions << i18n("Reformat the destination drive to use a filesystem that supports files that large.");
1262         break;
1263 
1264     default:
1265         // fall back to the plain error...
1266         errorName = i18n("Undocumented Error");
1267         description = buildErrorString(errorCode, errorText);
1268     }
1269 
1270     QByteArray ret;
1271     QDataStream stream(&ret, QIODevice::WriteOnly);
1272     stream << errorName << techName << description << causes << solutions;
1273     return ret;
1274 }
1275 
convertPermissions(int permissions)1276 QFile::Permissions KIO::convertPermissions(int permissions)
1277 {
1278     QFile::Permissions qPermissions;
1279 
1280     if (permissions > 0) {
1281         if (permissions & S_IRUSR) {
1282             qPermissions |= QFile::ReadOwner;
1283         }
1284         if (permissions & S_IWUSR) {
1285             qPermissions |= QFile::WriteOwner;
1286         }
1287         if (permissions & S_IXUSR) {
1288             qPermissions |= QFile::ExeOwner;
1289         }
1290 
1291         if (permissions & S_IRGRP) {
1292             qPermissions |= QFile::ReadGroup;
1293         }
1294         if (permissions & S_IWGRP) {
1295             qPermissions |= QFile::WriteGroup;
1296         }
1297         if (permissions & S_IXGRP) {
1298             qPermissions |= QFile::ExeGroup;
1299         }
1300 
1301         if (permissions & S_IROTH) {
1302             qPermissions |= QFile::ReadOther;
1303         }
1304         if (permissions & S_IWOTH) {
1305             qPermissions |= QFile::WriteOther;
1306         }
1307         if (permissions & S_IXOTH) {
1308             qPermissions |= QFile::ExeOther;
1309         }
1310     }
1311 
1312     return qPermissions;
1313 }
1314