File kio-stash-1.0git.20250301T021103~51f07b6.obscpio of Package kio-stash

07070100000000000081A400000000000000000000000167C26CB700000038000000000000000000000000000000000000004000000000kio-stash-1.0git.20250301T021103~51f07b6/.git-blame-ignore-revs# clang-format
58907b01c1cde3af30f5fd2e41b3c0baaa5de790
07070100000001000081A400000000000000000000000167C26CB7000000E0000000000000000000000000000000000000003400000000kio-stash-1.0git.20250301T021103~51f07b6/.gitignore# Ignore the following files
*~
*.[oa]
*.diff
*.kate-swp
*.kdev4
.kdev_include_paths
*.kdevelop.pcs
*.moc
*.moc.cpp
*.orig
*.user
.*.swp
.swp.*
Doxyfile
Makefile
avail
random_seed
/build*/
CMakeLists.txt.user*
*.unc-backup*
07070100000002000081A400000000000000000000000167C26CB700000115000000000000000000000000000000000000003800000000kio-stash-1.0git.20250301T021103~51f07b6/.gitlab-ci.yml# SPDX-FileCopyrightText: None
# SPDX-License-Identifier: CC0-1.0

include:
  - project: sysadmin/ci-utilities
    file:
      - /gitlab-templates/linux.yml
      - /gitlab-templates/linux-qt6.yml
      - /gitlab-templates/freebsd.yml
      - /gitlab-templates/freebsd-qt6.yml
07070100000003000081A400000000000000000000000167C26CB700000246000000000000000000000000000000000000003500000000kio-stash-1.0git.20250301T021103~51f07b6/.kde-ci.yml# SPDX-FileCopyrightText: None
# SPDX-License-Identifier: CC0-1.0

Dependencies:
- 'on': ['Linux/Qt5', 'FreeBSD/Qt5']
  'require':
    'frameworks/extra-cmake-modules': '@stable'
    'frameworks/kio': '@stable'
    'frameworks/kconfig': '@stable'
    'frameworks/kdbusaddons': '@stable'
    'frameworks/ki18n': '@stable'

- 'on': ['Linux/Qt6', 'FreeBSD/Qt6']
  'require':
    'frameworks/extra-cmake-modules': '@latest-kf6'
    'frameworks/kio': '@latest-kf6'
    'frameworks/kconfig': '@latest-kf6'
    'frameworks/kdbusaddons': '@latest-kf6'
    'frameworks/ki18n': '@latest-kf6'
07070100000004000081A400000000000000000000000167C26CB7000004B6000000000000000000000000000000000000003800000000kio-stash-1.0git.20250301T021103~51f07b6/CMakeLists.txtcmake_minimum_required(VERSION 3.16)

project(KIOFileStash)

set(QT_MIN_VERSION "5.15.2")
set(KF_MIN_VERSION "5.101.0")
set(KDE_COMPILERSETTINGS_LEVEL "5.84.0")

find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)
set(
    CMAKE_MODULE_PATH
        ${CMAKE_MODULE_PATH}
        ${ECM_MODULE_PATH}
)

include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(ECMSetupVersion)
include(KDEClangFormat)
include(KDEGitCommitHooks)
include(FeatureSummary)

add_definitions(-DQT_NO_URL_CAST_FROM_STRING) #prevents implicit conversion of QString to QUrl
add_definitions(-DTRANSLATION_DOMAIN=\"kio5_stash\")

find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} REQUIRED COMPONENTS
    Core
    DBus
    Test
)

find_package(KF${QT_MAJOR_VERSION} ${KF${QT_MAJOR_VERSION}_MIN_VERSION} REQUIRED COMPONENTS
    Config
    KIO
    DBusAddons
    I18n
)

add_subdirectory(dbus)
add_subdirectory(src)
add_subdirectory(tests)

ki18n_install(po)

file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h)
kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES})

kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT)

feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
07070100000005000081A400000000000000000000000167C26CB700004761000000000000000000000000000000000000003100000000kio-stash-1.0git.20250301T021103~51f07b6/COPYINGNOTE! The GPL below is copyrighted by the Free Software Foundation, but
the instance of code that it refers to (the kde programs) are copyrighted
by the authors who actually wrote it.

---------------------------------------------------------------------------
			
		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
               51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	    How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) 19yy  <name of author>

    This program 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 2 of the License, or
    (at your option) any later version.

    This program 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 this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) 19yy name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.
07070100000006000081A400000000000000000000000167C26CB700004FB3000000000000000000000000000000000000003500000000kio-stash-1.0git.20250301T021103~51f07b6/COPYING.DOC		GNU Free Documentation License
		  Version 1.2, November 2002


 Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.

This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.  It
complements the GNU General Public License, which is a copyleft
license designed for free software.

We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does.  But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book.  We recommend this License
principally for works whose purpose is instruction or reference.


1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License.  Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein.  The "Document", below,
refers to any such manual or work.  Any member of the public is a
licensee, and is addressed as "you".  You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.

A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject.  (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.)  The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.

The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.  If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant.  The Document may contain zero
Invariant Sections.  If the Document does not identify any Invariant
Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.  A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters.  A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text.  A copy that is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification.  Examples of
transparent image formats include PNG, XCF and JPG.  Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page.  For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.

A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language.  (Here XYZ stands for a
specific section name mentioned below, such as "Acknowledgements",
"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
of such a section when you modify the Document means that it remains a
section "Entitled XYZ" according to this definition.

The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document.  These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.


2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License.  You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute.  However, you may accept
compensation in exchange for copies.  If you distribute a large enough
number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and
you may publicly display copies.


3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover.  Both covers must also clearly and legibly identify
you as the publisher of these copies.  The front cover must present
the full title with all words of the title equally prominent and
visible.  You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.

If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.

It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.


4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it.  In addition, you must do these things in the Modified Version:

A. Use in the Title Page (and on the covers, if any) a title distinct
   from that of the Document, and from those of previous versions
   (which should, if there were any, be listed in the History section
   of the Document).  You may use the same title as a previous version
   if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities
   responsible for authorship of the modifications in the Modified
   Version, together with at least five of the principal authors of the
   Document (all of its principal authors, if it has fewer than five),
   unless they release you from this requirement.
C. State on the Title page the name of the publisher of the
   Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
   adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice
   giving the public permission to use the Modified Version under the
   terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections
   and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title, and add
   to it an item stating at least the title, year, new authors, and
   publisher of the Modified Version as given on the Title Page.  If
   there is no section Entitled "History" in the Document, create one
   stating the title, year, authors, and publisher of the Document as
   given on its Title Page, then add an item describing the Modified
   Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for
   public access to a Transparent copy of the Document, and likewise
   the network locations given in the Document for previous versions
   it was based on.  These may be placed in the "History" section.
   You may omit a network location for a work that was published at
   least four years before the Document itself, or if the original
   publisher of the version it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
   Preserve the Title of the section, and preserve in the section all
   the substance and tone of each of the contributor acknowledgements
   and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
   unaltered in their text and in their titles.  Section numbers
   or the equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements".  Such a section
   may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled "Endorsements"
   or to conflict in title with any Invariant Section.
O. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant.  To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.

You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version.  Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity.  If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.


5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy.  If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History"
in the various original documents, forming one section Entitled
"History"; likewise combine any sections Entitled "Acknowledgements",
and any sections Entitled "Dedications".  You must delete all sections
Entitled "Endorsements".


6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.


7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.


8. TRANSLATION

Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections.  You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers.  In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.


9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License.  Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License.  However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.


10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time.  Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.  See
http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation.  If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.


ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:

    Copyright (c)  YEAR  YOUR NAME.
    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.2
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:

    with the Invariant Sections being LIST THEIR TITLES, with the
    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.
07070100000007000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003200000000kio-stash-1.0git.20250301T021103~51f07b6/LICENSES07070100000008000081A400000000000000000000000167C26CB700001B88000000000000000000000000000000000000003E00000000kio-stash-1.0git.20250301T021103~51f07b6/LICENSES/CC0-1.0.txtCreative Commons Legal Code

CC0 1.0 Universal

    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
    HEREUNDER.

Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.

For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:

  i. the right to reproduce, adapt, distribute, perform, display,
     communicate, and translate a Work;
 ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
     likeness depicted in a Work;
 iv. rights protecting against unfair competition in regards to a Work,
     subject to the limitations in paragraph 4(a), below;
  v. rights protecting the extraction, dissemination, use and reuse of data
     in a Work;
 vi. database rights (such as those arising under Directive 96/9/EC of the
     European Parliament and of the Council of 11 March 1996 on the legal
     protection of databases, and under any national implementation
     thereof, including any amended or successor version of such
     directive); and
vii. other similar, equivalent or corresponding rights throughout the
     world based on applicable law or treaty, and any national
     implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.

4. Limitations and Disclaimers.

 a. No trademark or patent rights held by Affirmer are waived, abandoned,
    surrendered, licensed or otherwise affected by this document.
 b. Affirmer offers the Work as-is and makes no representations or
    warranties of any kind concerning the Work, express, implied,
    statutory or otherwise, including without limitation warranties of
    title, merchantability, fitness for a particular purpose, non
    infringement, or the absence of latent or other defects, accuracy, or
    the present or absence of errors, whether or not discoverable, all to
    the greatest extent permissible under applicable law.
 c. Affirmer disclaims responsibility for clearing rights of other persons
    that may apply to the Work or any use thereof, including without
    limitation any person's Copyright and Related Rights in the Work.
    Further, Affirmer disclaims responsibility for obtaining any necessary
    consents, permissions or other rights required for any use of the
    Work.
 d. Affirmer understands and acknowledges that Creative Commons is not a
    party to this document and has no duty or obligation with respect to
    this CC0 or use of the Work.
07070100000009000081A400000000000000000000000167C26CB70000105E000000000000000000000000000000000000003300000000kio-stash-1.0git.20250301T021103~51f07b6/README.md# File Stash KIO Worker

## Introduction

*This is a GSoC 2016 project by Arnav Dhamija, mentored by Boudhayan Gupta and Pinak Ahuja.*

Selecting multiple files in any file manager for copying and pasting has never been a pleasant experience, especially if the files are in a non-continuous order. Often, when selecting files using Ctrl+A or the selection tool, we find that we need to select only a subset of the required files we have selected. This leads to the unwieldy operation of removing files from our selection. Of course, the common workaround is to create a new folder and to put all the items in this folder prior to copying, but this is a very inefficient and very slow process if large files need to be copied. Moreover Ctrl+Click requires fine motor skills to not lose the entire selection of files.

This is an original project with a novel solution to this problem. My solution is to add a virtual folder in all KIO applications, where the links to files and folders can be temporarily saved for a session. The files and folders are "staged" on this virtual folder. Files can be added to this by using all the regular file management operations such as Move, Copy and Paste, or by drag and drop. Hence, complex file operations such as moving files across many devices can be made easy by staging the operation before performing it.

## Project Overview

This project consists of the following modules. As there is no existing implementation in KIO for managing virtual directories, all the following modules were written completely from scratch.

### KIO Worker

The KIO worker is the backbone of the project. This KIO worker is responsible for interfacing with the GUI of a KDE application and provides the methods for various operations such as copying, deleting, and renaming files. All operations on the KIO worker are applied on a virtual stash filesystem (explained below). These operations are applied through inter process communication using the Qt's D-Bus API.

The advantage of the KIO worker is that it provides a consistent experience throughout the entire KDE suite of applications. Hence, this feature would work with all KIO compatible applications.

### Stash File System

The Stash File System (SFS) is used for virtually staging all the files and directories added to the KIO worker. When a file is copied to the SFS, a new File Node is created to it under the folder to which it is copied. On copying a folder, a new Directory Node is created on the SFS with all the files and directories under it copied recursively as dictated by KIO. The SFS is a very important feature of the project as it allows the user to create folders and move items on the stash KIO worker without touching the physical file system at all. Once a selection is curated on the KIO worker, it can be seamlessly copied to the physical filesystem.

The SFS is implemented using a QHash pair of the URL as a key, containing the location of the file on the SFS and the value containing a StashNodeData object which contains all the properties (such as file name, source, children files for directories) of a given node in SFS.

Memory use of the SFS is nominal on a per file basis - each file staged on the SFS requires roughly 300 bytes of memory.

### Stash Daemon

The Stash File System runs in the KDE Daemon (kded5) container process. An object of the SFS is created on startup when the daemon is initialized. The daemon responds to calls from the KIO worker communicated over the session bus and creates and removes nodes in the SFS.

## Installation

Make sure you have KF5 backports with all the [KDE dependency libraries](https://community.kde.org/Guidelines_and_HOWTOs/Build_from_source/Install_the_dependencies) installed before you build!

Clone master to your favorite folder and run:

```
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DKDE_INSTALL_USE_QT_SYS_PATHS=TRUE ..
make
sudo make install
kdeinit5
```

Adaptor classes for D-Bus were generated using:

```
qdbuscpp2xml -a stashnotifier.h -o ../../dbus/org.kde.kio.StashNotifier.xml
qdbusxml2cpp -c StashNotifierAdaptor -a stash_adaptor.h:stash_adaptor.cpp ../../dbus/org.kde.kio.StashNotifier.xml
```
0707010000000A000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002E00000000kio-stash-1.0git.20250301T021103~51f07b6/dbus0707010000000B000081A400000000000000000000000167C26CB7000000A0000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/dbus/CMakeLists.txt# install the dbus interface xml file into the correct place
install(
    FILES org.kde.kio.StashNotifier.xml
    DESTINATION ${KDE_INSTALL_DBUSINTERFACEDIR}
)
0707010000000C000081A400000000000000000000000167C26CB700000445000000000000000000000000000000000000004C00000000kio-stash-1.0git.20250301T021103~51f07b6/dbus/org.kde.kio.StashNotifier.xml<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="org.kde.kio.StashNotifier">
    <signal name="listChanged">
    </signal>
    <method name="addPath">
      <arg name="source" type="s" direction="in"/>
      <arg name="stashPath" type="s" direction="in"/>
      <arg name="fileType" type="i" direction="in"/>
    </method>
    <method name="removePath">
      <arg name="path" type="s" direction="in"/>
    </method>
    <method name="nukeStash">
    </method>
    <method name="pingDaemon">
    </method>
    <method name="copyWithStash">
      <arg type="b" direction="out"/>
      <arg name="src" type="s" direction="in"/>
      <arg name="dest" type="s" direction="in"/>
    </method>
    <method name="fileList">
      <arg type="as" direction="out"/>
      <arg name="path" type="s" direction="in"/>
    </method>
    <method name="fileInfo">
      <arg type="s" direction="out"/>
      <arg name="path" type="s" direction="in"/>
    </method>
  </interface>
</node>
0707010000000D000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002C00000000kio-stash-1.0git.20250301T021103~51f07b6/po0707010000000E000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ar0707010000000F000081A400000000000000000000000167C26CB7000006D5000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ar/kio5_stash.po# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
#
# Zayed Al-Saidi <zayed.alsaidi@gmail.com>, 2021, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 11:16+0400\n"
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
"Language-Team: ar\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "الملف غير موجود أو لم يخزن مؤقتا لحد الآن."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "لا يمكن إنشاء مدخلة UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "لا يمكن إنشاء الدليل"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "لا يمكن النسخ."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "النسخ إلى أجهزة mtp قيد التطوير!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "لا يمكن تغيير الاسم."

#~ msgid "Could not stat."
#~ msgstr "لا يمكن البدء"
07070100000010000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/be07070100000011000081A400000000000000000000000167C26CB700000794000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/be/kio5_stash.po# Zmicier <zmicerturok@gmail.com>, 2023.
msgid ""
msgstr ""
"Project-Id-Version: 86ff119b1606fcaa910d6b44fc14b611\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-01-15 14:16\n"
"Last-Translator: Zmicier <zmicerturok@gmail.com>\n"
"Language-Team: Belarusian\n"
"Language: be\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || n%10>=5 && n%10<=9 || n"
"%100>=11 && n%100<=14 ? 2 : 3);\n"
"X-Generator: Lokalize 22.12.1\n"
"X-Crowdin-Project: 86ff119b1606fcaa910d6b44fc14b611\n"
"X-Crowdin-Project-ID: 127\n"
"X-Crowdin-Language: be\n"
"X-Crowdin-File: /main/be/kio-stash/kio5_stash.po\n"
"X-Crowdin-File-ID: 9046\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Файл або не існуе, або яшчэ не адпраўлены ў часовы буфер."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Не ўдалося стварыць запіс UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Не ўдалося ствараць каталог"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Не ўдалося скапіяваць."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Капіяванне ў mtp worker яшчэ ў распрацоўцы!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Не ўдалося змяніць назву."
07070100000012000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ca07070100000013000081A400000000000000000000000167C26CB7000006DB000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ca/kio5_stash.po# Translation of kio5_stash.po to Catalan
# Copyright (C) 2017-2022 This_file_is_part_of_KDE
# This file is distributed under the license LGPL version 2.1 or
# version 3 or later versions approved by the membership of KDE e.V.
#
# Josep M. Ferrer <txemaq@gmail.com>, 2017, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 13:25+0100\n"
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Accelerator-Marker: &\n"
"X-Generator: Lokalize 20.12.0\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "El fitxer no existeix o encara no s'ha reservat temporalment."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "No s'ha pogut crear l'entrada UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "No s'ha pogut crear el directori"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "No s'ha pogut copiar."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "La còpia als processos de treball MTP encara està en desenvolupament!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "No s'ha pogut reanomenar."
07070100000014000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003800000000kio-stash-1.0git.20250301T021103~51f07b6/po/ca@valencia07070100000015000081A400000000000000000000000167C26CB7000006F3000000000000000000000000000000000000004600000000kio-stash-1.0git.20250301T021103~51f07b6/po/ca@valencia/kio5_stash.po# Translation of kio5_stash.po to Catalan (Valencian)
# Copyright (C) 2017-2022 This_file_is_part_of_KDE
# This file is distributed under the license LGPL version 2.1 or
# version 3 or later versions approved by the membership of KDE e.V.
#
# Josep M. Ferrer <txemaq@gmail.com>, 2017, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 13:25+0100\n"
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
"Language: ca@valencia\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Accelerator-Marker: &\n"
"X-Generator: Lokalize 20.12.0\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "El fitxer no existix o encara no s'ha reservat temporalment."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "No s'ha pogut crear l'entrada UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "No s'ha pogut crear el directori"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "No s'ha pogut copiar."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "La còpia als processos de treball MTP encara està en desenvolupament!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "No s'ha pogut canviar de nom."
07070100000016000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/cs07070100000017000081A400000000000000000000000167C26CB70000059F000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/cs/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# Vít Pelčák <vit@pelcak.org>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2017-07-03 16:04+0100\n"
"Last-Translator: Vít Pelčák <vit@pelcak.org>\n"
"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Lokalize 2.0\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr ""

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr ""

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Nelze vytvořit adresář."

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Nelze kopírovat."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr ""

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Nelze přejmenovat."
07070100000018000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/da07070100000019000081A400000000000000000000000167C26CB70000065C000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/da/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# scootergrisen, 2017.
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2017-11-12 11:12+0200\n"
"Last-Translator: scootergrisen\n"
"Language-Team: Danish\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr ""
"Enten findes filen ikke eller også er den endnu ikke bliver lagt i "
"gemmestedet."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "UDS-posten kunne ikke oprettes."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Kunne ikke oprette en mappe"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Kunne ikke kopiere."

#: kioworker/filestash.cpp:342
#, fuzzy, kde-format
#| msgid "Copying to mtp slaves is still under development!"
msgid "Copying to mtp workers is still under development!"
msgstr "Kopiering til mtp-slaver er stadig under udvikling!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Kunne ikke omdøbe."

#~ msgid "Could not stat."
#~ msgstr "Kunne ikke stat."
0707010000001A000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/de0707010000001B000081A400000000000000000000000167C26CB70000065D000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/de/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# Burkhard Lück <lueck@hube-lueck.de>, 2017.
# Frederik Schwarzer <schwarzer@kde.org>, 2022, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-04-26 20:56+0200\n"
"Last-Translator: Frederik Schwarzer <schwarzer@kde.org>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 22.07.70\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Die Datei existiert nicht oder wurde noch nicht gestasht."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Der USD-Eintrag kann nicht erstellt werden."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Der Ordner lässt sich nicht erstellen"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Kopieren ist nicht möglich."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr ""

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Umbenennen ist nicht möglich."
0707010000001C000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/el0707010000001D000081A400000000000000000000000167C26CB700000763000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/el/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Stelios <sstavra@gmail.com>, 2017.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2017-09-26 17:23+0200\n"
"Last-Translator: Stelios <sstavra@gmail.com>\n"
"Language-Team: Greek <kde-i18n-el@kde.org>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 2.0\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Το αρχείο ή δεν υπάρχει ή δεν έχει μπει ακόμη στην άκρη."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Τα δεδομένα UDS δεν μπορούν να δημιουργηθούν."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Αδυναμία δημιουργίας καταλόγου"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Αδυναμία αντιγραφής."

#: kioworker/filestash.cpp:342
#, fuzzy, kde-format
#| msgid "Copying to mtp slaves is still under development!"
msgid "Copying to mtp workers is still under development!"
msgstr "Η αντιγραφή σε mtp slaves είναι ακόμη υπό κατασκευή!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Αδυναμία μετονομασίας:"

#~ msgid "Could not stat."
#~ msgstr "Αδυναμία να τηρηθεί."
0707010000001E000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003200000000kio-stash-1.0git.20250301T021103~51f07b6/po/en_GB0707010000001F000081A400000000000000000000000167C26CB700000677000000000000000000000000000000000000004000000000kio-stash-1.0git.20250301T021103~51f07b6/po/en_GB/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Steve Allewell <steve.allewell@gmail.com>, 2017, 2022.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-12-31 15:24+0000\n"
"Last-Translator: Steve Allewell <steve.allewell@gmail.com>\n"
"Language-Team: British English <kde-l10n-en_gb@kde.org>\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 21.12.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "The file either does not exist or has not been stashed yet."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "The UDS Entry could not be created."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Could not create a directory"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Could not copy."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Copying to mtp workers is still under development!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Could not rename."

#~ msgid "Could not stat."
#~ msgstr "Could not stat."
07070100000020000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/eo07070100000021000081A400000000000000000000000167C26CB700000695000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/eo/kio5_stash.po# translation of kio5_stash.pot to esperanto
# Copyright (C) 2022 Free Software Foundation, Inc.
# This file is distributed under the same license as the kio-stash package.
# Oliver Kellogg <okellogg@users.sourceforge.net, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-07-16 07:42+0100\n"
"Last-Translator: Oliver Kellogg <okellogg@users.sourceforge.net>\n"
"Language-Team: Esperanto <kde-i18n-eo@kde.org>\n"
"Language: eo\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: translate-po (https://github.com/zcribe/translate-po)\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "La dosiero aŭ ne ekzistas aŭ ankoraŭ ne estis kaŝmemorigita."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Ne eblis krei la UDS-Eniron."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Ne eblis krei dosierujon"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Ne eblis kopii."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Kopiado al mtp-laboristoj estas ankoraŭ evoluanta!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Ne eblis renomi."
07070100000022000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/es07070100000023000081A400000000000000000000000167C26CB70000076B000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/es/kio5_stash.po# Spanish translations for kio5_stash.po package.
# Copyright (C) 2017 This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Automatically generated, 2017.
# Eloy Cuadra <ecuadra@eloihr.net>, 2017, 2022.
# Sofia Priego <spriego@darksylvania.net>, 2017.
# Sofía Priego <spriego@darksylvania.net>, %Y.
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 18:07+0100\n"
"Last-Translator: Sofía Priego <spriego@darksylvania.net>\n"
"Language-Team: Spanish <kde-l10n-es@kde.org>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 22.11.80\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "El archivo no existe o todavía no se ha añadido al almacén temporal."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "No se ha podido crear la entrada UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "No se ha podido crear un directorio"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "No se ha podido copiar."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "La copia en módulos de trabajo mtp está todavía en desarrollo."

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "No se ha podido cambiar el nombre."

#~ msgid "Could not stat."
#~ msgstr "No se ha podido hacer «stat»."
07070100000024000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/et07070100000025000081A400000000000000000000000167C26CB7000006B3000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/et/kio5_stash.po# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
#
# Marek Laane <qiilaq69@gmail.com>, 2019, 2020.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2020-05-05 11:59+0300\n"
"Last-Translator: Marek Laane <qiilaq69@gmail.com>\n"
"Language-Team: Estonian <kde-et@lists.linux.ee>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 19.12.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Faili kas ei ole olemas või ei ole seda veel lattu pandud."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "UDS-kirje loomine ei ole võimalik."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Kataloogi loomine nurjus"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Kopeerimine nurjus."

#: kioworker/filestash.cpp:342
#, fuzzy, kde-format
#| msgid "Copying to mtp slaves is still under development!"
msgid "Copying to mtp workers is still under development!"
msgstr "MTP moodulite kopeerimise võimalus on alles arendusjärgus!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Nime muutmine nurjus."

#~ msgid "Could not stat."
#~ msgstr "stat nurjus."
07070100000026000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/eu07070100000027000081A400000000000000000000000167C26CB700000724000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/eu/kio5_stash.po# Translation for kio5_stash.po to Euskara/Basque (eu).
# Copyright (C) 2020-2022, This file is copyright:
# This file is distributed under the same license as the kio-stash package.
# KDE euskaratzeko proiektuko arduraduna <xalba@ni.eus>.
#
# Translators:
# Iñigo Salvador Azurmendi <xalba@ni.eus>, 2020, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 10:41+0100\n"
"Last-Translator: Iñigo Salvador Azurmendi <xalba@ni.eus>\n"
"Language-Team: Basque <kde-i18n-eu@kde.org>\n"
"Language: eu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 22.08.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Fitxategia ez da existitzen edo ez da oraindik gordelekuan antolatu."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Ezin izan da UDS sarrera sortu."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Ezin izan da direktorio bat sortu"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Ezin izan da kopiatu."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "MTP beharginetara kopiatzea oraindik garatze bidean dago!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Ezin izan da berrizendatu."

#~ msgid "Could not stat."
#~ msgstr "Ezin izan da «stat» egin."
07070100000028000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/fi07070100000029000081A400000000000000000000000167C26CB700000651000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/fi/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# Tommi Nieminen <translator@legisign.org>, 2018, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-03-05 17:57+0200\n"
"Last-Translator: Tommi Nieminen <translator@legisign.org>\n"
"Language-Team: Finnish <kde-i18n-doc@kde.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Tiedostoa ei joko ole olemassa tai sitä ei vielä kätketty."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "UDS-tietuetta ei voida luoda."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Ei voida luoda kansiota."

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Ei voida kopioida."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Kopiointi mtp-asiakkaisiin on vasta kehitteillä!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Ei voida muuttaa nimeä."

#~ msgid "Could not stat."
#~ msgstr "Ei voida lukea tietoja."
0707010000002A000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/fr0707010000002B000081A400000000000000000000000167C26CB7000006F7000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/fr/kio5_stash.po# Simon Depiets <sdepiets@gmail.com>, 2019.
# Xavier Besnard <xavier.besnard@kde.org>, 2020, 2022.
# Xavier Besnard <xavier.besnard@kde.org>, 2023.
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-01-05 12:21+0100\n"
"Last-Translator: Xavier BESNARD <xavier.besnard]neuf.fr>\n"
"Language-Team: French <kde-francophone@kde.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Lokalize 22.12.0\n"
"X-Environment: kde\n"
"X-Accelerator-Marker: &\n"
"X-Text-Markup: kde4\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Le dossier spécifié n'existe pas ou n'a pu être encore caché."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Impossible de créer l'entrée « UDS »."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Impossible de créer un dossier."

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Impossible de copier."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr ""
"La copie vers des processus « mtp » est encore en cours de développement !"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Impossible de renommer."

#~ msgid "Could not stat."
#~ msgstr "Impossible de lancer des statistiques."
0707010000002C000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/gl0707010000002D000081A400000000000000000000000167C26CB7000006BD000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/gl/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# Adrián Chaves (Gallaecio) <adrian@chaves.io>, 2017, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-04-24 07:00+0200\n"
"Last-Translator: Adrián Chaves (Gallaecio) <adrian@chaves.io>\n"
"Language-Team: Galician <proxecto@trasno.gal>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 22.12.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "O ficheiro non existe ou aínda non se reservou."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Non foi posíbel crear a entrada de UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Non foi posíbel crear un directorio."

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Non foi posíbel copiar."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr ""
"Aínda está en desenvolvemento a funcionalidade de copiar a traballadores de "
"MTP."

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Non foi posíbel renomear."

#~ msgid "Could not stat."
#~ msgstr "Non se puido executar «stat»."
0707010000002E000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/hi0707010000002F000081A400000000000000000000000167C26CB700000858000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/hi/kio5_stash.po# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
#
# Sameer Singh <lumarzeli30@gmail.com>, 2021.
# Raghavendra Kamath <raghu@raghukamath.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2021-06-27 13:08+0530\n"
"Last-Translator: Raghavendra Kamath <raghu@raghukamath.com>\n"
"Language-Team: kde-hindi\n"
"Language: hi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"X-Generator: Lokalize 21.04.2\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "फ़ाइल या तो अस्तित्व में नहीं है या अभी तक स्टैश नहीं हुइ है।"

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "यूडीएस फाइल का सृजन नहीं हो सका।"

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "डिरेक्ट्री नहीं बना सके"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "प्रतिलिपि नहीं बना सके।"

#: kioworker/filestash.cpp:342
#, fuzzy, kde-format
#| msgid "Copying to mtp slaves is still under development!"
msgid "Copying to mtp workers is still under development!"
msgstr "एमटीपी स्लेव्स में प्रतिलिपियाँ बनाना अभी भी विकास में है!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "नाम नहीं बदल सके।"

#~ msgid "Could not stat."
#~ msgstr "स्टैट नहीं कर सके।"
07070100000030000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/it07070100000031000081A400000000000000000000000167C26CB700000690000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/it/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# Luigi Toscano <luigi.toscano@tiscali.it>, 2017, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-30 19:29+0100\n"
"Last-Translator: Luigi Toscano <luigi.toscano@tiscali.it>\n"
"Language-Team: Italian <kde-i18n-it@kde.org>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 23.03.70\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Il file non esiste oppure non è stato ancora aggiunto allo stash."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Impossibile creare la voce UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Impossibile creare una cartella"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Impossibile copiare."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "La copia verso il worker MTP è ancora in sviluppo!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Impossibile rinominare."

#~ msgid "Could not stat."
#~ msgstr "Impossibile effettuare lo «stat»."
07070100000032000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ja07070100000033000081A400000000000000000000000167C26CB7000004CA000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ja/kio5_stash.pomsgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2017-07-01 20:15-0700\n"
"Last-Translator: Japanese KDE translation team <kde-jp@kde.org>\n"
"Language-Team: Japanese <kde-jp@kde.org>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Accelerator-Marker: &\n"
"X-Text-Markup: kde4\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr ""

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr ""

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr ""

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr ""

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr ""

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr ""
07070100000034000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ka07070100000035000081A400000000000000000000000167C26CB700000803000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ka/kio5_stash.po# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-27 06:53+0100\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <kde-i18n-doc@kde.org>\n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.2\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "ფაილი ან არ არსებობს, ან ჯერ არ მიპოვია."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "UDS ჩანაწერის შექმნა შეუძლებელია."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "საქაღალდის შექმნა შეუძლებელია"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "კოპირება შეუძლებელია."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "MTP მოწყობილობებზე კოპირება დახვეწას ჯერ კიდევ საჭიროებს!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "სახელის გადარქმევის შეცდომა."

#~ msgid "Could not stat."
#~ msgstr "აღმოჩენის შეცდომა."
07070100000036000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ko07070100000037000081A400000000000000000000000167C26CB700000687000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ko/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# Shinjo Park <kde@peremen.name>, 2017, 2020, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-03-01 02:06+0100\n"
"Last-Translator: Shinjo Park <kde@peremen.name>\n"
"Language-Team: Korean <kde-kr@kde.org>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Lokalize 21.12.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "파일이 없거나 임시 저장소에 없습니다."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "UDS 항목을 만들 수 없습니다."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "디렉터리를 만들 수 없음"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "복사할 수 없습니다."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "mtp 워커에 복사하는 기능은 개발 중입니다!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "이름을 바꿀 수 없습니다."

#~ msgid "Could not stat."
#~ msgstr "임시 저장할 수 없습니다."
07070100000038000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/lt07070100000039000081A400000000000000000000000167C26CB700000595000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/lt/kio5_stash.po# Lithuanian translations for kio-stash package.
# Copyright (C) 2019 This file is copyright:
# This file is distributed under the same license as the kio-stash package.
# Automatically generated, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2018-08-16 09:04+0200\n"
"Last-Translator: Automatically generated\n"
"Language-Team: lt\n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n"
"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr ""

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr ""

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr ""

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr ""

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr ""

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr ""
0707010000003A000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/nl0707010000003B000081A400000000000000000000000167C26CB700000659000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/nl/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Freek de Kruijf <freekdekruijf@kde.nl>, 2017, 2022.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 17:39+0100\n"
"Last-Translator: Freek de Kruijf <freekdekruijf@kde.nl>\n"
"Language-Team: \n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 22.08.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Het bestand bestaat ofwel niet of het is nog niet opgeslagen."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Het UDS-item kon niet worden aangemaakt."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Kon een map niet aanmaken"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Kon niet kopiëren."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Kopiëren naar mtp-workers is nog in ontwikkeling!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Kon niet hernoemen."

#~ msgid "Could not stat."
#~ msgstr "Kon stat niet gebruiken."
0707010000003C000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/nn0707010000003D000081A400000000000000000000000167C26CB700000657000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/nn/kio5_stash.po# Translation of kio5_stash to Norwegian Nynorsk
#
# Karl Ove Hufthammer <karl@huftis.org>, 2018, 2023.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-01-06 19:18+0100\n"
"Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
"Language-Team: Norwegian Nynorsk <l10n-no@lister.huftis.org>\n"
"Language: nn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 22.12.0\n"
"X-Environment: kde\n"
"X-Accelerator-Marker: &\n"
"X-Text-Markup: kde4\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Fila finst ikkje eller er ikkje lagd på hylla enno."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Klarte ikkje oppretta UDS-oppføringa."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Klarte ikkje oppretta mappe"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Klarte ikkje kopiera."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Støtte for kopiering av MTP-arbeidarar er framleis under utvikling."

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Klarte ikkje endra namn."
0707010000003E000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/pl0707010000003F000081A400000000000000000000000167C26CB7000006B4000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/pl/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>, 2017, 2022.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-12-11 07:53+0100\n"
"Last-Translator: Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>\n"
"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Plik jeszcze nie istnieje lub nie trafił do przechowalni."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Nie można utworzyć wpisu UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Nie można utworzyć katalogu"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Nie można skopiować."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Kopiowanie na pracowników mtp jest w trakcie rozwoju!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Nie można zmienić nazwy."

#~ msgid "Could not stat."
#~ msgstr "Nie można wykonać stat."
07070100000040000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/pt07070100000041000081A400000000000000000000000167C26CB7000005C6000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/pt/kio5_stash.pomsgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-28 18:22+0000\n"
"Last-Translator: José Nuno Coelho Pires <zepires@gmail.com>\n"
"Language-Team: Portuguese <kde-i18n-pt@kde.org>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POFile-SpellExtra: UDS MTP slaves\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "O ficheiro ainda não existe ou não foi guardado temporariamente."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Não foi possível criar o Item UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Não foi possível criar uma pasta"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Não foi possível copiar."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "A cópia para módulos de MTP ainda está em desenvolvimento!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Não foi possível mudar o nome."
07070100000042000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003200000000kio-stash-1.0git.20250301T021103~51f07b6/po/pt_BR07070100000043000081A400000000000000000000000167C26CB70000072D000000000000000000000000000000000000004000000000kio-stash-1.0git.20250301T021103~51f07b6/po/pt_BR/kio5_stash.po# Translation of kio5_stash.po to Brazilian Portuguese
# Copyright (C) 2018 This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
# Luiz Fernando Ranghetti <elchevive@opensuse.org>, 2018, 2022.
# André Marcelo Alvarenga <alvarenga@kde.org>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-12-15 11:13-0300\n"
"Last-Translator: Luiz Fernando Ranghetti <elchevive@opensuse.org>\n"
"Language-Team: Portuguese <kde-i18n-pt_BR@kde.org>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Lokalize 21.12.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "O arquivo ainda não existe ou não foi armazenado."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Não foi possível criar o item UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Não foi possível criar uma pasta"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Não foi possível copiar."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "A cópia para MTP workers ainda está em desenvolvimento!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Não foi possível renomear."

#~ msgid "Could not stat."
#~ msgstr "Não foi possível obter as estatísticas."
07070100000044000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ro07070100000045000081A400000000000000000000000167C26CB7000006C7000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ro/kio5_stash.po# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
# Sergiu Bivol <sergiu@cip.md>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2020-09-16 01:15+0100\n"
"Last-Translator: Sergiu Bivol <sergiu@cip.md>\n"
"Language-Team: Romanian\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
"X-Generator: Lokalize 19.12.3\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Fișierul fie nu există, fie nu a fost dosit încă."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Înregistrarea UDS nu a putut fi creată."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Nu s-a putut crea un dosar"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Nu s-a putut copia."

#: kioworker/filestash.cpp:342
#, fuzzy, kde-format
#| msgid "Copying to mtp slaves is still under development!"
msgid "Copying to mtp workers is still under development!"
msgstr "Copierea la sclavi MTP e încă în dezvoltare!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Nu s-a putut redenumi."

#~ msgid "Could not stat."
#~ msgstr "Nu s-a putut face „stat”."
07070100000046000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ru07070100000047000081A400000000000000000000000167C26CB70000084E000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ru/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Alexander Potashev <aspotashev@gmail.com>, 2017.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2017-11-03 16:00+0300\n"
"Last-Translator: Alexander Potashev <aspotashev@gmail.com>\n"
"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Lokalize 2.0\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Файл либо не существует, либо ещё не помещён в каталог-запасник."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Не удалось создать объект UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Не удалось создать каталог."

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Не удалось скопировать объект."

#: kioworker/filestash.cpp:342
#, fuzzy, kde-format
#| msgid "Copying to mtp slaves is still under development!"
msgid "Copying to mtp workers is still under development!"
msgstr ""
"На данный момент не поддерживается копирование на устройства по протоколу "
"MTP."

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Не удалось переименовать объект."

#~ msgid "Could not stat."
#~ msgstr "Не удалось прочитать свойства объекта."
07070100000048000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/sk07070100000049000081A400000000000000000000000167C26CB70000066D000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/sk/kio5_stash.po# translation of kio5_stash.po to Slovak
# Roman Paholik <wizzardsk@gmail.com>, 2017.
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2017-07-01 20:31+0100\n"
"Last-Translator: Roman Paholik <wizzardsk@gmail.com>\n"
"Language-Team: Slovak <kde-sk@linux.sk>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 2.0\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Súbor neexistuje alebo nebol ešte spracovaný."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Nie je možné vytvoriť UDS položku."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Nemôžem vytvoriť adresár"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Nemôžem kopírovať."

#: kioworker/filestash.cpp:342
#, fuzzy, kde-format
#| msgid "Copying to mtp slaves is still under development!"
msgid "Copying to mtp workers is still under development!"
msgstr "Kopírovanie do mtp slave je stále vo vývoji!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Nemôžem premenovať."

#~ msgid "Could not stat."
#~ msgstr "Nemôžem spustiť."
0707010000004A000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/sl0707010000004B000081A400000000000000000000000167C26CB7000006BE000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/sl/kio5_stash.po# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
#
# Matjaž Jeran <matjaz.jeran@amis.net>, 2020, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-27 07:10+0100\n"
"Last-Translator: Matjaž Jeran <matjaz.jeran@amis.net>\n"
"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 22.08.2\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
"%100==4 ? 3 : 0);\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Datoteka bodisi ne obstaja bodisi še ni bila zakrita."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Vnosa UDS ni bilo mogoče ustvariti."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Ni bilo mogoče ustvariti Imenika"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Ni bilo mogoče kopirati."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Kopiranje na mtp workers je še v razvoju!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Ni bilo mogoče preimenovati."

#~ msgid "Could not stat."
#~ msgstr "Ni mogoče izvajati stat."
0707010000004C000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/sv0707010000004D000081A400000000000000000000000167C26CB700000692000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/sv/kio5_stash.po# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
#
# Stefan Asserhäll <stefan.asserhall@gmail.com>, 2018, 2023.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-07-31 09:37+0200\n"
"Last-Translator: Stefan Asserhäll <stefan.asserhall@gmail.com>\n"
"Language-Team: Swedish <kde-i18n-doc@kde.org>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 20.08.1\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Antingen finns inte filen, eller så har den ännu inte gömts undan."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "UDS-posten kunde inte skapas."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Kunde inte skapa en katalog"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Kunde inte kopiera."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Kopiering till MTP-arbetare är under utveckling."

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Kunde inte byta namn."

#~ msgid "Could not stat."
#~ msgstr "Kunde inte hämta status."
0707010000004E000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ta0707010000004F000081A400000000000000000000000167C26CB70000061A000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/ta/kio5_stash.po# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kio-stash package.
#
# Kishore G <kishore96@gmail.com>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-07-05 21:42+0530\n"
"Last-Translator: Kishore G <kishore96@gmail.com>\n"
"Language-Team: Tamil <kde-i18n-doc@kde.org>\n"
"Language: ta\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Lokalize 22.04.2\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr ""

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr ""

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "அடைவை உருவாக்க முடியவில்லை"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "நகலெடுக்க முடியவில்லை."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr ""

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "மறுபெயரிட முடியவில்லை."
07070100000050000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/tr07070100000051000081A400000000000000000000000167C26CB700000676000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/tr/kio5_stash.po# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Emir SARI <emir_sari@icloud.com>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 18:47+0300\n"
"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
"Language-Team: Turkish <kde-l10n-tr@kde.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Lokalize 22.08.3\n"
"X-POOTLE-MTIME: 1502202353.000000\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Dosya yok veya henüz zulalanmamış."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "UDS Girdisi oluşturulamadı."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Dizin oluşturulamadı"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Kopyalanamadı."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "MTP işçilerine kopyalama halen geliştirme aşamasındadır!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Yeniden adlandırılamadı."

#~ msgid "Could not stat."
#~ msgstr "Durumlanamadı."
07070100000052000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/po/uk07070100000053000081A400000000000000000000000167C26CB70000080A000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/po/uk/kio5_stash.po# Translation of kio5_stash.po to Ukrainian
# Copyright (C) 2017 This_file_is_part_of_KDE
# This file is distributed under the license LGPL version 2.1 or
# version 3 or later versions approved by the membership of KDE e.V.
#
# Yuri Chornoivan <yurchor@ukr.net>, 2017, 2022.
msgid ""
msgstr ""
"Project-Id-Version: kio5_stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2022-11-26 10:57+0200\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Lokalize 20.12.0\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "Файла або ще не існує, або його ще не додано до стосу."

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "Не вдалося створити запис UDS."

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "Не вдалося створити каталог"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "Не вдалося скопіювати."

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "Засоби копіювання з обробників mtp ще не розроблено!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "Не вдалося перейменувати."

#~ msgid "Could not stat."
#~ msgstr "Не вдалося створити статистичні дані."
07070100000054000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003200000000kio-stash-1.0git.20250301T021103~51f07b6/po/zh_CN07070100000055000081A400000000000000000000000167C26CB7000005CA000000000000000000000000000000000000004000000000kio-stash-1.0git.20250301T021103~51f07b6/po/zh_CN/kio5_stash.pomsgid ""
msgstr ""
"Project-Id-Version: kdeorg\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2024-04-22 16:04\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: kdeorg\n"
"X-Crowdin-Project-ID: 269464\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /kf5-trunk/messages/kio-stash/kio5_stash.pot\n"
"X-Crowdin-File-ID: 6201\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "该文件要么不存在,要么还没有被暂存。"

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "无法创建 UDS 项目。"

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "无法创建目录"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "无法复制。"

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "复制到 MTP 的工作程序尚未完成开发。"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "无法重命名。"
07070100000056000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003200000000kio-stash-1.0git.20250301T021103~51f07b6/po/zh_TW07070100000057000081A400000000000000000000000167C26CB700000696000000000000000000000000000000000000004000000000kio-stash-1.0git.20250301T021103~51f07b6/po/zh_TW/kio5_stash.po# Copyright (C) 2023 This file is copyright:
# This file is distributed under the same license as the kio-stash package.
#
# pan93412 <pan93412@gmail.com>, 2019.
# SPDX-FileCopyrightText: 2023 Kisaragi Hiu <mail@kisaragi-hiu.com>
msgid ""
msgstr ""
"Project-Id-Version: kio-stash\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-01-03 00:43+0000\n"
"PO-Revision-Date: 2023-12-24 04:45+0900\n"
"Last-Translator: Kisaragi Hiu <mail@kisaragi-hiu.com>\n"
"Language-Team: Traditional Chinese <zh-l10n@lists.slat.org>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Lokalize 23.08.4\n"

#: kioworker/filestash.cpp:205
#, kde-format
msgid "The file either does not exist or has not been stashed yet."
msgstr "檔案不存在或者尚未貯存。"

#: kioworker/filestash.cpp:213
#, kde-format
msgid "The UDS Entry could not be created."
msgstr "無法建立 UDS 項目。"

#: kioworker/filestash.cpp:230
#, kde-format
msgid "Could not create a directory"
msgstr "無法建立目錄"

#: kioworker/filestash.cpp:327 kioworker/filestash.cpp:333
#: kioworker/filestash.cpp:339
#, kde-format
msgid "Could not copy."
msgstr "無法複製。"

#: kioworker/filestash.cpp:342
#, kde-format
msgid "Copying to mtp workers is still under development!"
msgstr "「複製到 MTP worker」功能仍在開發當中!"

#: kioworker/filestash.cpp:387 kioworker/filestash.cpp:393
#: kioworker/filestash.cpp:401
#, kde-format
msgid "Could not rename."
msgstr "無法重新命名。"

#~ msgid "Could not stat."
#~ msgstr "無法顯示檔案狀態。"
07070100000058000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002D00000000kio-stash-1.0git.20250301T021103~51f07b6/src07070100000059000081A400000000000000000000000167C26CB70000008B000000000000000000000000000000000000003C00000000kio-stash-1.0git.20250301T021103~51f07b6/src/CMakeLists.txtadd_subdirectory(kioworker)
add_subdirectory(iodaemon)
install(FILES org.kde.filestash.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR})
0707010000005A000081A400000000000000000000000167C26CB7000000C2000000000000000000000000000000000000003900000000kio-stash-1.0git.20250301T021103~51f07b6/src/Messages.sh#!/usr/bin/env bash

$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` >> rc.cpp
$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h -name \*.qml` -o $podir/kio5_stash.pot
0707010000005B000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003600000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon0707010000005C000081A400000000000000000000000167C26CB700000169000000000000000000000000000000000000004500000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/CMakeLists.txt#build and install the daemon for the KIO worker

add_library(stashnotifier MODULE stashnotifier.cpp fs.cpp stash_adaptor.cpp)

target_link_libraries(stashnotifier
    KF${QT_MAJOR_VERSION}::KIOCore
    KF${QT_MAJOR_VERSION}::DBusAddons
    Qt::DBus
    Qt::Core
)

install(TARGETS stashnotifier DESTINATION ${KDE_INSTALL_PLUGINDIR}/kf${QT_MAJOR_VERSION}/kded)
0707010000005D000081A400000000000000000000000167C26CB7000017B4000000000000000000000000000000000000003D00000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/fs.cpp/*
 * Copyright 2016 Boudhayan Gupta <bgupta@kde.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of KDE e.V. (or its successor approved by the
 *    membership of KDE e.V.) nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "fs.h"

StashFileSystem::StashFileSystem(QObject *parent)
    : QObject(parent)
    , root(DirectoryNode)
{
    root.children = new StashNode();
    displayRoot();
}

StashFileSystem::~StashFileSystem()
{
    deleteChildren(root);
}

StashFileSystem::StashNodeData StashFileSystem::getRoot()
{
    return root;
}

void StashFileSystem::findPathFromSource(const QString &path, const QString &dir, QStringList &fileList, StashNode *node)
{
    for (auto it = node->begin(); it != node->end(); ++it) {
        if (it.value().source == path) {
            fileList.append(dir + QLatin1Char('/') + it.key());
        }
        if (it.value().type == DirectoryNode) {
            findPathFromSource(path, dir + QLatin1Char('/') + it.key(), fileList, it.value().children);
        }
    }
}

void StashFileSystem::deleteChildren(StashNodeData nodeData)
{
    if (nodeData.children != nullptr) {
        Q_FOREACH (auto data, nodeData.children->values()) {
            deleteChildren(data);
        }
        delete nodeData.children;
        nodeData.children = nullptr;
    }
}

QStringList StashFileSystem::splitPath(const QString &path)
{
    QString filePath = path;
    if (filePath.startsWith(QLatin1Char('/'))) {
        filePath = filePath.right(filePath.size() - 1);
    }

    if (filePath.endsWith(QLatin1Char('/'))) {
        filePath = filePath.left(filePath.size() - 1);
    }
    return filePath.split(QLatin1Char('/'));
}

bool StashFileSystem::delEntry(const QString &location)
{
    QStringList path = splitPath(location);
    QString name = path.takeLast();
    StashNodeData baseData = findNode(path);
    if (!(baseData.type == DirectoryNode)) {
        return false;
    }

    if (!(baseData.children->contains(name))) {
        return false;
    }

    deleteChildren(baseData.children->value(name, StashNodeData(InvalidNode)));
    return (baseData.children->remove(name) > 0);
}

bool StashFileSystem::addNode(const QString &location, const StashNodeData &data)
{
    QStringList path = splitPath(location);
    QString name = path.takeLast();
    StashNodeData baseData = findNode(path);

    if (!(baseData.type == DirectoryNode)) {
        deleteChildren(data);
        return false;
    }

    baseData.children->insert(name, data);
    return true;
}

bool StashFileSystem::addFile(const QString &src, const QString &dest)
{
    StashNodeData fileData(FileNode);
    fileData.source = src;
    return addNode(dest, fileData);
}

bool StashFileSystem::addSymlink(const QString &src, const QString &dest)
{
    StashNodeData fileData(SymlinkNode);
    fileData.source = src;
    return addNode(dest, fileData);
}

bool StashFileSystem::addFolder(const QString &dest)
{
    StashNodeData fileData(DirectoryNode);
    fileData.source = QStringLiteral("");
    fileData.children = new StashNode();

    return addNode(dest, fileData);
}

bool StashFileSystem::copyFile(const QString &src, const QString &dest)
{
    StashNodeData fileToCopy = findNode(src);
    return addNode(dest, fileToCopy);
}

StashFileSystem::StashNodeData StashFileSystem::findNode(const QString &path)
{
    return findNode(splitPath(path));
}

StashFileSystem::StashNodeData StashFileSystem::findNode(const QStringList &path)
{
    StashNode *node = root.children;
    StashNodeData data = StashNodeData(InvalidNode);
    if (!path.size() || path.at(0).isEmpty()) {
        return root;
    } else {
        for (int i = 0; i < path.size(); ++i) {
            if (node->contains(path[i])) {
                data = node->value(path[i], StashNodeData(InvalidNode));
                if (data.type == DirectoryNode) {
                    node = data.children;
                }
                if (i == path.size() - 1) {
                    return data;
                }
            } else {
                return StashNodeData(InvalidNode);
            }
        }
        return StashNodeData(InvalidNode);
    }
}

void StashFileSystem::deleteAllItems()
{
    deleteChildren(root);
}

void StashFileSystem::displayNode(StashNode *node)
{
    for (auto it = node->begin(); it != node->end(); ++it) {
        qDebug() << "Stash Path" << it.key();
        qDebug() << "File Path" << it.value().source;
        qDebug() << "File Type" << it.value().type;
        if (it.value().type == DirectoryNode) {
            qDebug() << "Parent" << it.key();
            displayNode(it.value().children);
        }
    }
    return;
}

void StashFileSystem::displayRoot()
{
    displayNode(root.children);
}
0707010000005E000081A400000000000000000000000167C26CB700000CD4000000000000000000000000000000000000003B00000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/fs.h/*
 * Copyright 2016 Boudhayan Gupta <bgupta@kde.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of KDE e.V. (or its successor approved by the
 *    membership of KDE e.V.) nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef STASHFS_H
#define STASHFS_H

#include <QDebug>
#include <QHash>
#include <QObject>
#include <QPointer>
#include <QString>

class StashFileSystem : public QObject
{
    Q_OBJECT

public:
    enum NodeType {
        DirectoryNode,
        SymlinkNode,
        FileNode,
        InvalidNode,
    };

    struct StashNodeData;

    typedef QHash<QString, StashNodeData> StashNode;

    struct StashNodeData {
        StashNodeData(NodeType ntype)
            : type(ntype)
            , children(nullptr)
        {
        }
        ~StashNodeData()
        {
        }

        NodeType type;
        QString source;
        StashFileSystem::StashNode *children;
    };

    explicit StashFileSystem(QObject *parent = nullptr);
    virtual ~StashFileSystem();

    QStringList findNodesFromPath(const QString &path);

    bool delEntry(const QString &path);
    bool addFile(const QString &src, const QString &dest);
    bool addFolder(const QString &dest);
    bool addSymlink(const QString &src, const QString &dest);
    bool copyFile(const QString &src, const QString &dest);
    void deleteAllItems();

    // Finds the node object for the given path in the SFS
    StashNodeData findNode(const QString &path);
    StashNodeData findNode(const QStringList &path);

    StashNodeData getRoot();
    void findPathFromSource(const QString &path, const QString &dir, QStringList &fileList, StashNode *node);

    // For debug purposes
    void displayNode(StashNode *node);
    void displayRoot();

private:
    bool addNode(const QString &location, const StashNodeData &data);
    void deleteChildren(StashNodeData nodeData);
    QStringList splitPath(const QString &path);
    StashNodeData root;
};

#endif
0707010000005F000081A400000000000000000000000167C26CB700000964000000000000000000000000000000000000004800000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/stash_adaptor.cpp/*
 * This file was generated by qdbusxml2cpp version 0.8
 * Command line was:
 *
 * qdbusxml2cpp is Copyright (C) 2016 The Qt Company Ltd.
 *
 * This is an auto-generated file.
 * Do not edit! All changes made to it will be lost.
 */

#include "stash_adaptor.h"
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QMetaObject>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>

/*
 * Implementation of adaptor class StashNotifierAdaptor
 */

StashNotifierAdaptor::StashNotifierAdaptor(QObject *parent)
    : QDBusAbstractAdaptor(parent)
{
    // constructor
    setAutoRelaySignals(true);
}

StashNotifierAdaptor::~StashNotifierAdaptor()
{
    // destructor
}

void StashNotifierAdaptor::addPath(const QString &source, const QString &stashPath, int fileType)
{
    // handle method call org.kde.kio.StashNotifier.addPath
    QMetaObject::invokeMethod(parent(), "addPath", Q_ARG(QString, source), Q_ARG(QString, stashPath), Q_ARG(int, fileType));
}

bool StashNotifierAdaptor::copyWithStash(const QString &src, const QString &dest)
{
    // handle method call org.kde.kio.StashNotifier.copyWithStash
    bool out0;
    QMetaObject::invokeMethod(parent(), "copyWithStash", Q_RETURN_ARG(bool, out0), Q_ARG(QString, src), Q_ARG(QString, dest));
    return out0;
}

QString StashNotifierAdaptor::fileInfo(const QString &path)
{
    // handle method call org.kde.kio.StashNotifier.fileInfo
    QString out0;
    QMetaObject::invokeMethod(parent(), "fileInfo", Q_RETURN_ARG(QString, out0), Q_ARG(QString, path));
    return out0;
}

QStringList StashNotifierAdaptor::fileList(const QString &path)
{
    // handle method call org.kde.kio.StashNotifier.fileList
    QStringList out0;
    QMetaObject::invokeMethod(parent(), "fileList", Q_RETURN_ARG(QStringList, out0), Q_ARG(QString, path));
    return out0;
}

void StashNotifierAdaptor::nukeStash()
{
    // handle method call org.kde.kio.StashNotifier.nukeStash
    QMetaObject::invokeMethod(parent(), "nukeStash");
}

void StashNotifierAdaptor::pingDaemon()
{
    // handle method call org.kde.kio.StashNotifier.pingDaemon
    QMetaObject::invokeMethod(parent(), "pingDaemon");
}

void StashNotifierAdaptor::removePath(const QString &path)
{
    // handle method call org.kde.kio.StashNotifier.removePath
    QMetaObject::invokeMethod(parent(), "removePath", Q_ARG(QString, path));
}
07070100000060000081A400000000000000000000000167C26CB700000B2D000000000000000000000000000000000000004600000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/stash_adaptor.h/*
 * This file was generated by qdbusxml2cpp version 0.8
 * Command line was:
 *
 * qdbusxml2cpp is Copyright (C) 2016 The Qt Company Ltd.
 *
 * This is an auto-generated file.
 * This file may have been hand-edited. Look for HAND-EDIT comments
 * before re-generating it.
 */

#ifndef STASH_ADAPTOR_H
#define STASH_ADAPTOR_H

#include <QtCore/QObject>
#include <QtCore/QStringList>
#include <QtDBus/QtDBus>
QT_BEGIN_NAMESPACE
class QByteArray;
template<class T>
class QList;
template<class Key, class Value>
class QMap;
class QString;
class QVariant;
QT_END_NAMESPACE

/*
 * Adaptor class for interface org.kde.kio.StashNotifier
 */
class StashNotifierAdaptor : public QDBusAbstractAdaptor
{
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface", "org.kde.kio.StashNotifier")
    Q_CLASSINFO("D-Bus Introspection",
                ""
                "  <interface name=\"org.kde.kio.StashNotifier\">\n"
                "    <signal name=\"listChanged\"/>\n"
                "    <method name=\"addPath\">\n"
                "      <arg direction=\"in\" type=\"s\" name=\"source\"/>\n"
                "      <arg direction=\"in\" type=\"s\" name=\"stashPath\"/>\n"
                "      <arg direction=\"in\" type=\"i\" name=\"fileType\"/>\n"
                "    </method>\n"
                "    <method name=\"removePath\">\n"
                "      <arg direction=\"in\" type=\"s\" name=\"path\"/>\n"
                "    </method>\n"
                "    <method name=\"nukeStash\"/>\n"
                "    <method name=\"pingDaemon\"/>\n"
                "    <method name=\"copyWithStash\">\n"
                "      <arg direction=\"out\" type=\"b\"/>\n"
                "      <arg direction=\"in\" type=\"s\" name=\"src\"/>\n"
                "      <arg direction=\"in\" type=\"s\" name=\"dest\"/>\n"
                "    </method>\n"
                "    <method name=\"fileList\">\n"
                "      <arg direction=\"out\" type=\"as\"/>\n"
                "      <arg direction=\"in\" type=\"s\" name=\"path\"/>\n"
                "    </method>\n"
                "    <method name=\"fileInfo\">\n"
                "      <arg direction=\"out\" type=\"s\"/>\n"
                "      <arg direction=\"in\" type=\"s\" name=\"path\"/>\n"
                "    </method>\n"
                "  </interface>\n"
                "")
public:
    StashNotifierAdaptor(QObject *parent);
    virtual ~StashNotifierAdaptor();

public: // PROPERTIES
public Q_SLOTS: // METHODS
    void addPath(const QString &source, const QString &stashPath, int fileType);
    bool copyWithStash(const QString &src, const QString &dest);
    QString fileInfo(const QString &path);
    QStringList fileList(const QString &path);
    void nukeStash();
    void pingDaemon();
    void removePath(const QString &path);
Q_SIGNALS: // SIGNALS
    void listChanged();
};

#endif
07070100000061000081A400000000000000000000000167C26CB700001CD0000000000000000000000000000000000000004800000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/stashnotifier.cpp/***************************************************************************
 *   Copyright (C) 2016 by Arnav Dhamija <arnav.dhamija@gmail.com>         *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/

#include "stashnotifier.h"
#include "stash_adaptor.h"

#include <KDirWatch>
#include <KPluginFactory>

K_PLUGIN_FACTORY_WITH_JSON(StashNotifierFactory, "stashnotifier.json", registerPlugin<StashNotifier>();)

StashNotifier::StashNotifier(QObject *parent, const QList<QVariant> &var, const QString &daemonService, const QString &daemonPath)
    : KDEDModule(parent)
    , m_daemonService(daemonService)
    , m_daemonPath(daemonPath)
{
    dirWatch = new KDirWatch(this);
    qDebug() << "Launching stash daemon.";

    new StashNotifierAdaptor(this);
    QDBusConnection dbus = QDBusConnection::sessionBus();
    dbus.registerObject(m_daemonPath, this);
    dbus.registerService(m_daemonService);

    fileSystem = new StashFileSystem(parent);

    connect(dirWatch, &KDirWatch::dirty, this, &StashNotifier::dirty);
    connect(dirWatch, &KDirWatch::created, this, &StashNotifier::created);
    connect(dirWatch, &KDirWatch::deleted, this, &StashNotifier::removeWatchedPath);
    connect(this, &StashNotifier::listChanged, this, &StashNotifier::displayRoot);
}

StashNotifier::~StashNotifier()
{
}

QString StashNotifier::encodeString(StashFileSystem::StashNode::iterator node, const QString &path) // format type::stashpath::source
{
    QString encodedString;

    switch (node.value().type) {
    case StashFileSystem::NodeType::DirectoryNode:
        encodedString = "dir";
        break;
    case StashFileSystem::NodeType::FileNode:
        encodedString = "file";
        break;
    case StashFileSystem::NodeType::SymlinkNode:
        encodedString = "symlink";
        break;
    case StashFileSystem::NodeType::InvalidNode:
        encodedString = "invalid";
        break;
    }

    if (path == "/") {
        encodedString += "::" + QStringLiteral("/") + node.key();
    } else {
        encodedString += "::" + path + QStringLiteral("/") + node.key();
    }

    if (node.value().type == StashFileSystem::NodeType::FileNode || node.value().type == StashFileSystem::NodeType::SymlinkNode) {
        encodedString += "::" + node.value().source;
    } else {
        encodedString += "::";
    }

    return encodedString;
}

QString StashNotifier::encodeString(StashFileSystem::StashNodeData nodeData, const QString &path)
{
    QString encodedString;

    switch (nodeData.type) {
    case StashFileSystem::NodeType::DirectoryNode:
        encodedString = "dir";
        break;
    case StashFileSystem::NodeType::FileNode:
        encodedString = "file";
        break;
    case StashFileSystem::NodeType::SymlinkNode:
        encodedString = "symlink";
        break;
    case StashFileSystem::NodeType::InvalidNode:
        encodedString = "invalid";
        break;
    }

    encodedString += "::" + path;

    if (nodeData.type == StashFileSystem::NodeType::FileNode || nodeData.type == StashFileSystem::NodeType::SymlinkNode) {
        encodedString += "::" + nodeData.source;
    } else {
        encodedString += "::";
    }

    return encodedString;
}

QStringList StashNotifier::fileList(const QString &path) // forwards list over QDBus to the KIO worker
{
    QStringList contents;
    StashFileSystem::StashNodeData node = fileSystem->findNode(path);
    if (node.type != StashFileSystem::NodeType::DirectoryNode) {
        contents.append("error::error::InvalidNode");
    } else {
        for (auto it = node.children->begin(); it != node.children->end(); ++it) {
            contents.append(encodeString(it, path));
        }
    }
    return contents;
}

QString StashNotifier::fileInfo(const QString &path) // forwards data of a single file to the KIO worker
{
    QString fileData;
    StashFileSystem::StashNodeData node = fileSystem->findNode(path);
    fileData = encodeString(node, path);
    return fileData;
}

void StashNotifier::addPath(const QString &source, const QString &stashPath, int fileType)
{
    QString processedPath = processString(stashPath);

    if (fileSystem->findNode(stashPath).type == StashFileSystem::NodeType::InvalidNode) {
        if (fileType == StashFileSystem::NodeType::DirectoryNode) {
            dirWatch->addDir(processedPath);
            fileSystem->addFolder(processedPath);
        } else if (fileType == StashFileSystem::NodeType::FileNode) {
            dirWatch->addFile(source);
            fileSystem->addFile(processString(source), stashPath);
        } else if (fileType == StashFileSystem::NodeType::SymlinkNode) {
            dirWatch->addFile(source);
            fileSystem->addSymlink(processString(source), stashPath);
        }
        emit listChanged();
    }
}

QString StashNotifier::processString(const QString &path)
{
    QString processedPath = path.simplified();
    if (processedPath.at(processedPath.size() - 1) == '/') {
        processedPath.chop(1);
    }
    return processedPath;
}

void StashNotifier::removeWatchedPath(const QString &filePath)
{
    qDebug() << filePath;
    QStringList matchedFiles;
    fileSystem->findPathFromSource(filePath, "", matchedFiles, fileSystem->getRoot().children);
    foreach (QString file, matchedFiles) {
        fileSystem->delEntry(file);
    }
}

void StashNotifier::removePath(const QString &path)
{
    QString encodedName = fileInfo(path);
    QString filePath = encodedName.split("::", Qt::KeepEmptyParts).at(2);
    dirWatch->removeFile(filePath);
    fileSystem->delEntry(path);
    emit listChanged();
}

void StashNotifier::nukeStash()
{
    qDebug() << "Nuking stash: all files on it will be deleted!";
    fileSystem->deleteAllItems();
    qDebug() << "Nuked.";
}

void StashNotifier::pingDaemon()
{
    // just to see if this exists in kded5 or whether we need to create a process for it for the test case
}

bool StashNotifier::copyWithStash(const QString &src, const QString &dest)
{
    return fileSystem->copyFile(src, dest);
}

void StashNotifier::dirty(const QString &path)
{
    // nothing to be done here
}

void StashNotifier::created(const QString &path)
{
    // nothing to be done here
}

#include "stashnotifier.moc"
07070100000062000081A400000000000000000000000167C26CB700000BD9000000000000000000000000000000000000004600000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/stashnotifier.h/***************************************************************************
 *   Copyright (C) 2016 by Arnav Dhamija <arnav.dhamija@gmail.com>         *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/

#ifndef STASHNOTIFIER_H
#define STASHNOTIFIER_H

#include "fs.h"

#include <QStringList>
#include <QVariant>

#include <KDEDModule>

class KDirWatch;

class StashNotifier : public KDEDModule
{
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface", "org.kde.kio.StashNotifier")

private:
    KDirWatch *dirWatch;
    StashFileSystem *fileSystem;
    const QString m_daemonService;
    const QString m_daemonPath;
    QString processString(const QString &path);
    QString encodeString(StashFileSystem::StashNode::iterator node, const QString &path);
    QString encodeString(StashFileSystem::StashNodeData nodeData, const QString &path);

public:
    StashNotifier(QObject *parent,
                  const QList<QVariant> &,
                  const QString &daemonService = "org.kde.kio.StashNotifier",
                  const QString &daemonPath = "/StashNotifier");
    ~StashNotifier();

Q_SIGNALS:
    Q_SCRIPTABLE void listChanged();

public Q_SLOTS:
    Q_SCRIPTABLE void addPath(const QString &source, const QString &stashPath, int fileType);
    Q_SCRIPTABLE void removePath(const QString &path);
    Q_SCRIPTABLE void nukeStash();
    Q_SCRIPTABLE void pingDaemon();
    Q_SCRIPTABLE bool copyWithStash(const QString &src, const QString &dest);
    Q_SCRIPTABLE QStringList fileList(const QString &path);
    Q_SCRIPTABLE QString fileInfo(const QString &path);

private Q_SLOTS:
    void dirty(const QString &path);
    void created(const QString &path);
    void removeWatchedPath(const QString &filePath);
    void displayRoot() // function to the contents of the SFS for testing
    {
        // fileSystem->displayRoot();
    }
};

#endif
07070100000063000081A400000000000000000000000167C26CB7000012FA000000000000000000000000000000000000004900000000kio-stash-1.0git.20250301T021103~51f07b6/src/iodaemon/stashnotifier.json{
    "KPlugin": {
        "Description": "Monitors directories for changes",
        "Description[ar]": "يراقب تغييرات الأدلة",
        "Description[be]": "Назіранне за зменамі ў каталогах",
        "Description[ca@valencia]": "Controla els canvis en els directoris",
        "Description[ca]": "Controla els canvis en els directoris",
        "Description[cs]": "Monitoruje změny v adresáři",
        "Description[da]": "Overvåger mapper for ændringer",
        "Description[de]": "Überwacht Ordner auf Änderungen",
        "Description[el]": "Παρακολουθεί καταλόγους για αλλαγές",
        "Description[en_GB]": "Monitors directories for changes",
        "Description[eo]": "Monitoras dosierujojn pri ŝanĝoj",
        "Description[es]": "Monitoriza cambios en directorios",
        "Description[et]": "Muutuste jälgimine kataloogides",
        "Description[eu]": "Direktorioen aldaketak gainbegiratzen ditu",
        "Description[fi]": "Tarkkailee muutoksia kansioissa",
        "Description[fr]": "Surveille les modifications des dossiers",
        "Description[gl]": "Monitoriza os cambios en directorios",
        "Description[hi]": "डिरेक्ट्रियोँ में बदलाव के लिए जाँचता है",
        "Description[ia]": "Il monitora le directorios pro variationes",
        "Description[it]": "Sorveglia i cambiamenti nelle cartelle",
        "Description[ka]": "საქაღალდეების მონიტორინგი ცვლილებებზე",
        "Description[ko]": "디렉터리 변경 사항을 감시합니다",
        "Description[nl]": "Mappen monitoren op wijzigingen",
        "Description[nn]": "Overvaker mapper for endringar",
        "Description[pl]": "Monitoruje katalogi w poszukiwaniu zmian",
        "Description[pt]": "Vigia modificações nas pastas",
        "Description[pt_BR]": "Monitora as alterações nas pastas",
        "Description[ro]": "Monitorizează dosare pentru modificări",
        "Description[ru]": "Наблюдение за изменениями в каталогах",
        "Description[sk]": "Sleduje zmeny v adresároch",
        "Description[sl]": "Spremlja mape za spremembe",
        "Description[sv]": "Övervakar om kataloger ändras",
        "Description[tr]": "Dizin değişikliklerini izler",
        "Description[uk]": "Спостереження за змінами у каталогах",
        "Description[x-test]": "xxMonitors directories for changesxx",
        "Description[zh_CN]": "监视目录的更改",
        "Description[zh_TW]": "監視目錄變更",
        "Name": "Stash KIO worker watcher",
        "Name[ar]": "مراقب بريمج التخزين المؤقت لـ KIO",
        "Name[be]": "Stash KIO - назіральнік за часовым буферам",
        "Name[ca@valencia]": "Vigilant del procés de treball KIO Stash",
        "Name[ca]": "Vigilant del procés de treball KIO Stash",
        "Name[de]": "Überwachung des Ein-/Ausgabemoduls für Zwischenlager",
        "Name[en_GB]": "Stash KIO worker watcher",
        "Name[eo]": "Stash KIO-laboranta observilo",
        "Name[es]": "Módulo de trabajo KIO observador de Stash",
        "Name[eu]": "«Stash» KIO beharginaren begiralea",
        "Name[fi]": "Stash KIO -asiakkaan valvonta",
        "Name[fr]": "Cacher le moniteur des processus « KIO »",
        "Name[gl]": "Vixilante de traballador de KIO de reserva",
        "Name[ia]": "Obervator de KIO worker de Stash",
        "Name[it]": "Osservatore del KIO worker Stash",
        "Name[ka]": "Stash-ის KIO დამხმარე პროცესის მაყურებელი",
        "Name[ko]": "임시 저장 KIO 워커 감시기",
        "Name[nl]": "Bewaker van KIO-worker opslaan",
        "Name[nn]": "Hylle-KIO-arbeidarovervakar",
        "Name[pl]": "Obserwator pracownika KIO stosu",
        "Name[pt]": "Monitor do módulo do KIO para repositórios temporários",
        "Name[pt_BR]": "Monitor do KIO worker para Stash",
        "Name[ro]": "Urmăritor Stash pentru lucrători KIO",
        "Name[sl]": "Stash KIO worker watcher",
        "Name[sv]": "Övervakare av Stash I/O-arbetare",
        "Name[tr]": "Stash KIO işçi izleyicisi",
        "Name[uk]": "Обробник KIO для спостереження за схованками",
        "Name[x-test]": "xxStash KIO worker watcherxx",
        "Name[zh_CN]": "Stash KIO 工作程序监视程序",
        "Name[zh_TW]": "暫存 KIO worker 監控器",
        "ServiceTypes": [
            "KDEDModule"
        ]
    },
    "X-KDE-DBus-ModuleName": "stashnotifier",
    "X-KDE-Kded-autoload": true,
    "X-KDE-Kded-load-on-demand": true,
    "X-KDE-Kded-phase": 1
}
07070100000064000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000003700000000kio-stash-1.0git.20250301T021103~51f07b6/src/kioworker07070100000065000081A400000000000000000000000167C26CB7000001C7000000000000000000000000000000000000004600000000kio-stash-1.0git.20250301T021103~51f07b6/src/kioworker/CMakeLists.txt# build and install the staging KIO worker

add_library(kio_filestash MODULE filestash.cpp)

target_link_libraries (kio_filestash
    Qt::DBus
    KF${QT_MAJOR_VERSION}::KIOCore
    KF${QT_MAJOR_VERSION}::I18n
    KF${QT_MAJOR_VERSION}::ConfigCore
    KF${QT_MAJOR_VERSION}::ConfigGui
)

set_target_properties(kio_filestash PROPERTIES OUTPUT_NAME "filestash")
install(TARGETS kio_filestash DESTINATION ${KDE_INSTALL_PLUGINDIR}/kf${QT_MAJOR_VERSION}/kio/)
07070100000066000081A400000000000000000000000167C26CB700003800000000000000000000000000000000000000004500000000kio-stash-1.0git.20250301T021103~51f07b6/src/kioworker/filestash.cpp/***************************************************************************
 *   Copyright (C) 2016 by Arnav Dhamija <arnav.dhamija@gmail.com>         *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/

#include "filestash.h"

#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusMetaType>
#include <QDBusReply>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QMetaType>
#include <QMimeDatabase>
#include <QMimeType>
#include <QUrl>

#include <KConfigGroup>
#include <KFileItem>
#include <KIO/Job>
#include <KIO/StatJob>
#include <KLocalizedString>

class KIOPluginForMetaData : public QObject
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.kde.kio.worker.filestash" FILE "filestash.json")
};

extern "C" {
int Q_DECL_EXPORT kdemain(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
    FileStash worker(argv[2], argv[3]);
    worker.dispatchLoop();
    return 0;
}
}

FileStash::FileStash(const QByteArray &pool, const QByteArray &app, const QString &daemonService, const QString &daemonPath)
    : KIO::ForwardingWorkerBase("stash", pool, app)
    , m_daemonService(daemonService)
    , m_daemonPath(daemonPath)
{
}

FileStash::~FileStash()
{
}

bool FileStash::rewriteUrl(const QUrl &url, QUrl &newUrl)
{
    if (url.scheme() != "file") {
        newUrl.setScheme("file");
        newUrl.setPath(url.path());
    } else {
        newUrl = url;
    }
    return true;
}

void FileStash::createTopLevelDirEntry(KIO::UDSEntry &entry)
{
    entry.clear();
    entry.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
    entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, 0040000);
    entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, 0700);
    entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
}

QStringList FileStash::setFileList(const QUrl &url)
{
    QDBusMessage msg = QDBusMessage::createMethodCall(m_daemonService, m_daemonPath, "", "fileList");
    msg << url.path();
    QDBusReply<QStringList> received = QDBusConnection::sessionBus().call(msg);
    return received.value();
}

QString FileStash::setFileInfo(const QUrl &url)
{
    QDBusMessage msg = QDBusMessage::createMethodCall(m_daemonService, m_daemonPath, "", "fileInfo");
    msg << url.path();
    QDBusReply<QString> received = QDBusConnection::sessionBus().call(msg);
    return received.value();
}

KIO::WorkerResult FileStash::stat(const QUrl &url)
{
    KIO::UDSEntry entry;
    if (isRoot(url.path())) {
        createTopLevelDirEntry(entry);
    } else {
        QString fileInfo = setFileInfo(url);
        FileStash::dirList item = createDirListItem(fileInfo);
        if (!createUDSEntry(entry, item)) {
            return KIO::WorkerResult::fail(KIO::ERR_DOES_NOT_EXIST, url.toDisplayString());
        }
    }
    statEntry(entry);
    return KIO::WorkerResult::pass();
}

bool FileStash::statUrl(const QUrl &url, KIO::UDSEntry &entry)
{
    KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
    bool ok = statJob->exec();
    if (ok) {
        entry = statJob->statResult();
    }
    return ok;
}

bool FileStash::createUDSEntry(KIO::UDSEntry &entry, const FileStash::dirList &fileItem)
{
    QMimeType fileMimetype;
    QMimeDatabase mimeDatabase;
    QString stringFilePath = fileItem.filePath;

    switch (fileItem.type) {
    case NodeType::DirectoryNode:
        entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, 0040000);
        entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QString("inode/directory"));
        entry.fastInsert(KIO::UDSEntry::UDS_NAME, QUrl(stringFilePath).fileName());
        entry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, QUrl(stringFilePath).fileName());
        break;
    case NodeType::InvalidNode:
        return false;
    default:
        QByteArray physicalPath_c = QFile::encodeName(fileItem.source);
        QT_STATBUF buff;
        QT_LSTAT(physicalPath_c, &buff);
        mode_t access = buff.st_mode & 07777;

        QFileInfo entryInfo;
        entryInfo = QFileInfo(fileItem.source);
        fileMimetype = mimeDatabase.mimeTypeForFile(fileItem.source);
        entry.fastInsert(KIO::UDSEntry::UDS_TARGET_URL, QUrl::fromLocalFile(fileItem.source).toString());
        entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, fileMimetype.name());
        entry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, QUrl(stringFilePath).fileName());
        entry.fastInsert(KIO::UDSEntry::UDS_NAME, QUrl(stringFilePath).fileName());
        entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, access);
        entry.fastInsert(KIO::UDSEntry::UDS_SIZE, entryInfo.size());
        entry.fastInsert(KIO::UDSEntry::UDS_MODIFICATION_TIME, buff.st_mtime);
        entry.fastInsert(KIO::UDSEntry::UDS_ACCESS_TIME, buff.st_atime);

        if (fileItem.type == NodeType::FileNode) {
            entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, 0100000);
        } else if (fileItem.type == NodeType::SymlinkNode) {
            entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, 0120000);
        } else {
            return false;
        }
    }
    return true;
}

FileStash::dirList FileStash::createDirListItem(const QString &fileInfo)
{
    QStringList strings = fileInfo.split("::", Qt::KeepEmptyParts);
    FileStash::dirList item;
    if (strings.at(0) == "dir") {
        item.type = FileStash::NodeType::DirectoryNode;
    } else if (strings.at(0) == "file") {
        item.type = FileStash::NodeType::FileNode;
    } else if (strings.at(0) == "symlink") {
        item.type = FileStash::NodeType::SymlinkNode;
    } else if (strings.at(0) == "invalid") {
        item.type = FileStash::NodeType::InvalidNode;
    }
    item.filePath = strings.at(1);
    item.source = strings.at(2);
    return item;
}

KIO::WorkerResult FileStash::listDir(const QUrl &url)
{
    QStringList fileList = setFileList(url);
    if (!fileList.size()) {
        return KIO::WorkerResult::pass();
    }
    FileStash::dirList item;
    KIO::UDSEntry entry;
    if (isRoot(url.path())) {
        createTopLevelDirEntry(entry);
        listEntry(entry);
    }
    if (fileList.at(0) == "error::error::InvalidNode") {
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("The file either does not exist or has not been stashed yet."));
    }
    for (auto it = fileList.begin(); it != fileList.end(); ++it) {
        entry.clear();
        item = createDirListItem(*it);
        if (createUDSEntry(entry, item)) {
            listEntry(entry);
        } else {
            return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("The UDS Entry could not be created."));
        }
    }
    return KIO::WorkerResult::pass();
}

KIO::WorkerResult FileStash::mkdir(const QUrl &url, int permissions)
{
    Q_UNUSED(permissions)

    QDBusMessage replyMessage;
    QDBusMessage msg;
    msg = QDBusMessage::createMethodCall(m_daemonService, m_daemonPath, "", "addPath");
    QString destinationPath = url.path();
    msg << "" << destinationPath << NodeType::DirectoryNode;
    replyMessage = QDBusConnection::sessionBus().call(msg);
    if (replyMessage.type() == QDBusMessage::ErrorMessage) {
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Could not create a directory"));
    }
    return KIO::WorkerResult::pass();
}

bool FileStash::copyFileToStash(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
{
    Q_UNUSED(flags)

    NodeType fileType;
    QFileInfo fileInfo = QFileInfo(src.path());
    if (fileInfo.isFile()) {
        fileType = NodeType::FileNode;
    } else if (fileInfo.isSymLink()) {
        fileType = NodeType::SymlinkNode;
    } else if (fileInfo.isDir()) { // if I'm not wrong, this can never happen, but we should handle it anyway
        fileType = NodeType::DirectoryNode;
    } else {
        return false;
    }

    QDBusMessage replyMessage;
    QDBusMessage msg;
    msg = QDBusMessage::createMethodCall(m_daemonService, m_daemonPath, "", "addPath");
    QString destinationPath = dest.path();

    msg << src.path() << destinationPath << (int)fileType;
    replyMessage = QDBusConnection::sessionBus().call(msg);
    if (replyMessage.type() != QDBusMessage::ErrorMessage) {
        return true;
    } else {
        return false;
    }
}

bool FileStash::copyStashToFile(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
{
    const QString destInfo = setFileInfo(src);
    const FileStash::dirList fileItem = createDirListItem(destInfo);

    if (fileItem.type != NodeType::DirectoryNode) {
        QByteArray physicalPath_c = QFile::encodeName(fileItem.source);
        QT_STATBUF buff;
        QT_LSTAT(physicalPath_c, &buff);
        mode_t access = buff.st_mode & 07777;
        const auto result = KIO::ForwardingWorkerBase::copy(QUrl::fromLocalFile(fileItem.source), dest, access, flags);
        return result.success();
    }
    return false;
}

bool FileStash::copyStashToStash(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
{
    Q_UNUSED(flags)

    KIO::UDSEntry entry;

    statUrl(src, entry);
    KFileItem fileItem(entry, src);

    const dirList item = createDirListItem(setFileInfo(src));
    NodeType fileType;
    if (fileItem.isFile()) {
        fileType = NodeType::FileNode;
    } else if (fileItem.isLink()) {
        fileType = NodeType::SymlinkNode;
    } else if (fileItem.isDir()) {
        fileType = NodeType::DirectoryNode;
    } else {
        return false;
    }

    QDBusMessage replyMessage;
    QDBusMessage msg;
    msg = QDBusMessage::createMethodCall(m_daemonService, m_daemonPath, "", "addPath");
    msg << item.source << dest.path() << fileType;
    replyMessage = QDBusConnection::sessionBus().call(msg);
    if (replyMessage.type() != QDBusMessage::ErrorMessage) {
        return true;
    } else {
        return false;
    }
}

KIO::WorkerResult FileStash::copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFlags flags)
{
    KIO::UDSEntry entry;
    statUrl(src, entry);
    KFileItem item(entry, src);
    QUrl newDestPath;
    newDestPath = QUrl(dest.adjusted(QUrl::RemoveFilename).toString() + item.name());

    if (src.scheme() != "stash" && dest.scheme() == "stash") {
        if (copyFileToStash(src, newDestPath, flags)) {
            return KIO::WorkerResult::pass();
        }

        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Could not copy."));
    }
    if (src.scheme() == "stash" && dest.scheme() != "stash") {
        if (copyStashToFile(src, newDestPath, flags)) {
            return KIO::WorkerResult::pass();
        }
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Could not copy."));
    }
    if (src.scheme() == "stash" && dest.scheme() == "stash") {
        if (copyStashToStash(src, newDestPath, flags)) {
            return KIO::WorkerResult::pass();
        }
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Could not copy."));
    }
    if (dest.scheme() == "mtp") {
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Copying to mtp workers is still under development!"));
    }
    return KIO::ForwardingWorkerBase::copy(item.targetUrl(), newDestPath, permissions, flags);
}

KIO::WorkerResult FileStash::del(const QUrl &url, bool isFile)
{
    Q_UNUSED(isFile)

    if (deletePath(url)) {
        return KIO::WorkerResult::pass();
    }
    return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, QString("Could not reach the stash daemon"));
}

bool FileStash::deletePath(const QUrl &url)
{
    NodeType fileType;

    QDBusMessage replyMessage;
    QDBusMessage msg;
    msg = QDBusMessage::createMethodCall(m_daemonService, m_daemonPath, "", "removePath");

    if (isRoot(url.adjusted(QUrl::RemoveFilename).toString())) {
        msg << url.fileName();
    } else {
        msg << url.path();
    }

    replyMessage = QDBusConnection::sessionBus().call(msg);
    if (replyMessage.type() != QDBusMessage::ErrorMessage) {
        return true;
    } else {
        return false;
    }
}

KIO::WorkerResult FileStash::rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
{
    if (src.scheme() == "stash" && dest.scheme() == "stash") {
        if (copyStashToStash(src, dest, flags)) {
            if (deletePath(src)) {
                return KIO::WorkerResult::pass();
            }
        }
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Could not rename."));
    }
    if (src.scheme() == "file" && dest.scheme() == "stash") {
        if (copyFileToStash(src, dest, flags)) {
            return KIO::WorkerResult::pass();
        }
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Could not rename."));
    }
    if (src.scheme() == "stash" && dest.scheme() == "file") {
        if (copyStashToFile(src, dest, flags)) {
            if (deletePath(src)) {
                return KIO::WorkerResult::pass();
            }
        }
        return KIO::WorkerResult::fail(KIO::ERR_WORKER_DEFINED, i18n("Could not rename."));
    }
    return KIO::WorkerResult::fail();
}

bool FileStash::isRoot(const QString &string)
{
    if (string.isEmpty() || string == "/") {
        return true;
    }
    return false;
}

#include "filestash.moc"
07070100000067000081A400000000000000000000000167C26CB700000DEF000000000000000000000000000000000000004300000000kio-stash-1.0git.20250301T021103~51f07b6/src/kioworker/filestash.h/***************************************************************************
 *   Copyright (C) 2016 by Arnav Dhamija <arnav.dhamija@gmail.com>         *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/

#ifndef FILESTASH_H
#define FILESTASH_H

#include <KIO/ForwardingWorkerBase>
#include <QObject>
#include <QString>

class FileStash : public KIO::ForwardingWorkerBase
{
    Q_OBJECT

public:
    FileStash(const QByteArray &pool,
              const QByteArray &app,
              const QString &daemonService = "org.kde.kio.StashNotifier",
              const QString &daemonPath = "/StashNotifier");
    ~FileStash();

    enum NodeType {
        DirectoryNode,
        SymlinkNode,
        FileNode,
        InvalidNode,
    };

    struct dirList {
        QString filePath;
        QString source;
        FileStash::NodeType type;

        dirList()
        {
        }

        ~dirList()
        {
        }

        dirList(const dirList &obj)
        {
            filePath = obj.filePath;
            source = obj.source;
            type = obj.type;
        }
    };

private:
    void createTopLevelDirEntry(KIO::UDSEntry &entry);
    bool isRoot(const QString &string);
    bool statUrl(const QUrl &url, KIO::UDSEntry &entry);
    bool createUDSEntry(KIO::UDSEntry &entry, const FileStash::dirList &fileItem);
    bool copyFileToStash(const QUrl &src, const QUrl &dest, KIO::JobFlags flags);
    bool copyStashToFile(const QUrl &src, const QUrl &dest, KIO::JobFlags flags);
    bool copyStashToStash(const QUrl &src, const QUrl &dest, KIO::JobFlags flags);
    bool deletePath(const QUrl &src);

    QStringList setFileList(const QUrl &url);
    QString setFileInfo(const QUrl &url);
    FileStash::dirList createDirListItem(const QString &fileInfo);

    const QString m_daemonService;
    const QString m_daemonPath;

public:
    KIO::WorkerResult listDir(const QUrl &url) override;
    KIO::WorkerResult copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFlags flags) override;
    KIO::WorkerResult mkdir(const QUrl &url, int permissions) override;
    KIO::WorkerResult del(const QUrl &url, bool isFile) override;
    KIO::WorkerResult stat(const QUrl &url) override;
    KIO::WorkerResult rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) override;

protected:
    bool rewriteUrl(const QUrl &url, QUrl &newUrl) override;
};

#endif
07070100000068000081A400000000000000000000000167C26CB7000002E7000000000000000000000000000000000000004600000000kio-stash-1.0git.20250301T021103~51f07b6/src/kioworker/filestash.json{
    "KDE-KIO-Protocols": {
        "stash": {
            "Class": ":local",
            "copyFromFile": true,
            "copyToFile": true,
            "deleteRecursive": true,
            "deleting": true,
            "fileNameUsedForCopying": "Name",
            "input": "none",
            "listing": [
                "Name",
                "Type",
                "Size",
                "Date",
                "Access",
                "Link"
            ],
            "makedir": true,
            "moving": true,
            "output": "filesystem",
            "protocol": "stash",
            "reading": true,
            "renameFromFile": true,
            "renameToFile": true,
            "writing": true
        }
    }
}
07070100000069000081A400000000000000000000000167C26CB70000C99D000000000000000000000000000000000000004B00000000kio-stash-1.0git.20250301T021103~51f07b6/src/org.kde.filestash.appdata.xml<?xml version="1.0" encoding="utf-8"?>
<component type="addon">
  <id>org.kde.filestash.desktop</id>
  <metadata_license>CC0-1.0</metadata_license>
  <project_license>GPL-2.0</project_license>
  <extends>org.kde.dolphin.desktop</extends>
  <extends>org.kde.konqueror.desktop</extends>
  <extends>org.kde.krusader.desktop</extends>
  <extends>org.kde.gwenview.desktop</extends>
  <name>FileStash</name>
  <name xml:lang="ar">التخزين المؤقت</name>
  <name xml:lang="be">FileStash</name>
  <name xml:lang="ca">FileStash</name>
  <name xml:lang="ca-valencia">FileStash</name>
  <name xml:lang="cs">FileStash</name>
  <name xml:lang="da">FileStash</name>
  <name xml:lang="de">FileStash</name>
  <name xml:lang="el">FileStash</name>
  <name xml:lang="en-GB">FileStash</name>
  <name xml:lang="eo">FileStash</name>
  <name xml:lang="es">FileStash</name>
  <name xml:lang="et">Faililadu</name>
  <name xml:lang="eu">FileStash</name>
  <name xml:lang="fi">FileStash</name>
  <name xml:lang="fr">FileStash</name>
  <name xml:lang="gl">FileStash</name>
  <name xml:lang="hi">फ़ाइल-स्टेश</name>
  <name xml:lang="id">FileStash</name>
  <name xml:lang="it">FileStash</name>
  <name xml:lang="ka">FileStash</name>
  <name xml:lang="ko">FileStash</name>
  <name xml:lang="nl">FileStash</name>
  <name xml:lang="nn">FileStash</name>
  <name xml:lang="pl">PrzechowalniaPlików</name>
  <name xml:lang="pt">FileStash</name>
  <name xml:lang="pt-BR">FileStash</name>
  <name xml:lang="ro">FileStash</name>
  <name xml:lang="ru">FileStash</name>
  <name xml:lang="sk">FileStash</name>
  <name xml:lang="sl">FileStash</name>
  <name xml:lang="sv">Filestash</name>
  <name xml:lang="tr">Dosya Zulası</name>
  <name xml:lang="uk">FileStash</name>
  <name xml:lang="x-test">xxFileStashxx</name>
  <name xml:lang="zh-CN">FileStash</name>
  <name xml:lang="zh-TW">FileStash</name>
  <summary>A lightweight solution for virtual folder support in KDE Applications</summary>
  <summary xml:lang="ar">حل خفيف الوزن لدعم المجلد الافتراضي للتخزين المؤقت في تطبيقات كِيدِي</summary>
  <summary xml:lang="be">Лёгкаважнае рашэнне для падтрымкі віртуальных каталогаў у праграмах KDE</summary>
  <summary xml:lang="ca">Una solució lleugera per a permetre carpetes virtuals a les aplicacions KDE</summary>
  <summary xml:lang="ca-valencia">Una solució lleugera per a permetre carpetes virtuals en les aplicacions KDE</summary>
  <summary xml:lang="de">Eine leichtgewichtige Lösung für die Unterstützung von virtuellen Ordner in KDE-Anwendungen</summary>
  <summary xml:lang="el">Μια ελαφριά λύση υποστήριξης εικονικών φακέλων στις KDE Εφαρμογές</summary>
  <summary xml:lang="en-GB">A lightweight solution for virtual folder support in KDE Applications</summary>
  <summary xml:lang="eo">Malpeza solvo por subteni virtualajn dosierujojn en KDE-Aplikaĵoj</summary>
  <summary xml:lang="es">Una solución liviana para implementar carpetas virtuales en las aplicaciones de KDE</summary>
  <summary xml:lang="et">Lihtne lahendus virtuaalsete kataloogide toetuse pakkumiseks KDE rakendustes</summary>
  <summary xml:lang="eu">KDEren aplikazioetan alegiazko karpetak erabili ahal izateko irtenbide arin bat</summary>
  <summary xml:lang="fi">Kevyt KDE Applicationsin virtuaalikansiotuen ratkaisu.</summary>
  <summary xml:lang="fr">Une solution légère de prise en charge des dossiers virtuels dans les applications KDE.</summary>
  <summary xml:lang="gl">Unha solución lixeira para compatibilidade con cartafoles virtuais en aplicacións de KDE</summary>
  <summary xml:lang="hi">एक हलका साधन जो केडीई अनुप्रयोगों के लिए वर्चुअल फ़ोल्डर का समर्थन देता है।</summary>
  <summary xml:lang="id">Sebuah solusi yang ringan untuk dukungan folder virtual dalam Aplikasi KDE</summary>
  <summary xml:lang="it">Una soluzione leggera per il supporto delle cartelle virtuali nelle applicazioni KDE</summary>
  <summary xml:lang="ka">ვირტუალური საქაღალდეების მხარდაჭერა KDE-ის აპლიკაციებში</summary>
  <summary xml:lang="ko">KDE 앱의 가벼운 가상 폴더 지원</summary>
  <summary xml:lang="nl">Een lichtgewicht oplossing voor ondersteuning van virtuele mappen in KDE Applications</summary>
  <summary xml:lang="nn">Enkel løysing for støtte av virtuelle mapper i program frå KDE</summary>
  <summary xml:lang="pl">Lekkie rozwiązanie obsługi wirtualnych katalogów w Aplikacjach KDE</summary>
  <summary xml:lang="pt">Uma solução leve para o suporte de pastas virtuais nas Aplicações do KDE</summary>
  <summary xml:lang="pt-BR">Uma solução leve para suporte a pastas virtuais no KDE Applications</summary>
  <summary xml:lang="ro">Soluție simplă pentru susținerea dosarelor virtuale în aplicații KDE</summary>
  <summary xml:lang="sk">Jednoduché riešenie pre podporu virtuálnych priečinkov v KDE aplikáciách.</summary>
  <summary xml:lang="sl">Lahka rešitev za podporo virtualne mape v aplikacijah KDE</summary>
  <summary xml:lang="sv">En lättviktig lösning för stöd av virtuella kataloger i KDE-program</summary>
  <summary xml:lang="tr">KDE uygulamalarında sanal klasör desteği için hafif bir çözüm</summary>
  <summary xml:lang="uk">Невибагливий до ресурсів інструмент підтримки віртуальних тек у програмах KDE</summary>
  <summary xml:lang="x-test">xxA lightweight solution for virtual folder support in KDE Applicationsxx</summary>
  <summary xml:lang="zh-CN">为 KDE 应用提供虚拟文件夹支持的轻量化解决方案。</summary>
  <summary xml:lang="zh-TW">讓 KDE 應用程式支援虛擬資料夾的輕量解決方案</summary>
  <description>
    <p>Selecting multiple files in any file manager for copying and pasting has never been a pleasant experience, especially if the files are in a non-continuous order. Often, when selecting files using Ctrl+A or the selection tool, we find that we need to select only a subset of the required files we have selected. This leads to the unwieldy operation of removing files from our selection. Of course, the common workaround is to create a new folder and to put all the items in this folder prior to copying, but this is a very inefficient and very slow process if large files need to be copied. Moreover Ctrl+Click requires fine motor skills to not lose the entire selection of files.</p>
    <p xml:lang="ar">لم يكن تحديد ملفات متعددة في أي مدير ملفات للنسخ واللصق تجربة ممتعة أبدًا ، خاصةً إذا كانت الملفات بترتيب غير مستمر. في كثير من الأحيان ، عند تحديد الملفات باستخدام Ctrl + A أو أداة التحديد ، نجد أننا بحاجة إلى تحديد مجموعة فرعية فقط من الملفات المطلوبة التي حددناها. هذا يؤدي إلى عملية مزعجة لإزالة الملفات من اختيارنا. بالطبع ، الحل الشائع هو إنشاء مجلد جديد ووضع جميع العناصر في هذا المجلد قبل النسخ ، ولكن هذه عملية غير فعالة وبطيئة للغاية إذا كانت هناك حاجة لنسخ الملفات الكبيرة. علاوة على ذلك ، يتطلب Ctrl + Click مهارات حركية دقيقة حتى لا تفقد المجموعة الكاملة من الملفات.</p>
    <p xml:lang="be">Абіранне некалькіх файлаў у любым кіраўніку файлаў для капіявання і ўстаўляння ніколі не быў прыемным, асабліва калі файлы знаходзяцца не ў патрэбным парадку. Часта пры абіранні файлаў з дапамогай Ctrl+A або інструмента выбару мы бачым, што нам трэба абраць толькі падмноства неабходных файлаў, якія мы абралі. Гэта прыводзіць да грувасткай аперацыі па выдаленні файлаў з абраных. Зразумела, што просты шлях для абыходу гэтага - стварэнне новага каталога і змяшчэнне ўсіх элементаў у яго перад капіяваннем, але гэта вельмі неэфектыўны і павольны працэс. Акрамя таго, пры выкарыстанні Ctrl у спалучэнні з пстрыканнем трэба быць уважлівым, каб не страціць усе абраныя файлы.</p>
    <p xml:lang="ca">La selecció de múltiples fitxers en qualsevol gestor de fitxers per a copiar i enganxar mai ha estat una experiència agradable, especialment si els fitxers estan en un ordre no contigu. Sovint, en seleccionar fitxers usant Ctrl+A o l'eina de selecció, ens trobem que cal seleccionar només un subconjunt dels fitxers requerits que hem seleccionat. Això porta a la pesada tasca d'eliminar fitxers de la selecció. Per descomptat, l'alternativa més freqüent és crear una carpeta nova i posar tots els elements en aquesta carpeta abans de copiar-hi, però això és un procés molt ineficient i molt lent si cal copiar fitxers grans. A més, Ctrl+Clic requereix habilitats motores fines per a no perdre tota la selecció de fitxers.</p>
    <p xml:lang="ca-valencia">La selecció de múltiples fitxers en qualsevol gestor de fitxers per a copiar i apegar mai ha sigut una experiència agradable, especialment si els fitxers estan en un ordre no contigu. Sovint, en seleccionar fitxers utilitzant «Ctrl+A» o l'eina de selecció, ens trobem que cal seleccionar només un subconjunt dels fitxers requerits que hem seleccionat. Açò porta a la pesada tasca d'eliminar fitxers de la selecció. Per descomptat, l'alternativa més freqüent és crear una carpeta nova i posar tots els elements en esta carpeta abans de copiar-hi, però açò és un procés molt ineficient i molt lent si cal copiar fitxers grans. A més, Ctrl+Clic requerix habilitats motores fines per a no perdre tota la selecció de fitxers.</p>
    <p xml:lang="da">At vælge flere filer i enhver filhåndtering til kopiering og indsættelse har aldrig været en behagelig oplevelse, specielt hvis filerne ikke er i fortløbende rækkefølge. Oftest når du vælger filer med Ctrl+A eller markeringsværktøjet, så finder du ud af at du kun har brug for en del af de valgte filer. Det fører til den besværlige handlinger det er at fjerne filer fra markeringen. Man kan selvfølgelig bruge den almindelige løsning med at oprette en ny mappe og ligge alle elementerne i mappen inden kopiering, men det er en meget ineffektiv og meget langsom proces hvis der er store filer som skal kopieres. Desuden kræver Ctrl+klik de nødvendige finmotoriske evner for ikke at miste hele filmarkeringen.</p>
    <p xml:lang="el">Η επιλονή πολλών αρχείων σε οποιονδήποτε διαχειριστή αρχείων για αντιγραφή και επικόλληση δεν είναι ποτέ μια ευχάριστη εμπειρία, ειδικά αν τα αρχεία δεν είναι συνεχόμενα. Συχνά, όταν επιλέγουμε αρχεία με το Ctrl+A ή με το εργαλείο επιλογής, παρατηρούμε ότι χρειαζόμαστε μόνο ένα υποσύνολο από τα αρχεία που έχουμε επιλέξει. Αυτό οδηγεί στην άβολη διαδικασία να διαγράψουμε αρχεία από τα επιλεγμένα. Βέβαια η συνήθης λύση είναι να δημιουργήσουμε έναν νέο φάκελο και να βάλουμε όλα τα αντικείμενα εκεί πριν τα αντιγράψουμε, αλλά αυτή είναι μια πολύ αναποτελεσματική και αργή διεργασία αν απαιτείται η αντιγραφή μεγάλων αρχείων. Επιπλέον το Ctrl+Click απαιτεί λεπτές κινητικές δεξιότητες ώστε να μην αναιρεθεί όλη η επιλογή των αρχείων.</p>
    <p xml:lang="en-GB">Selecting multiple files in any file manager for copying and pasting has never been a pleasant experience, especially if the files are in a non-continuous order. Often, when selecting files using Ctrl+A or the selection tool, we find that we need to select only a subset of the required files we have selected. This leads to the unwieldy operation of removing files from our selection. Of course, the common workaround is to create a new folder and to put all the items in this folder prior to copying, but this is a very inefficient and very slow process if large files need to be copied. Moreover Ctrl+Click requires fine motor skills to not lose the entire selection of files.</p>
    <p xml:lang="eo">Elekti plurajn dosierojn en iu ajn dosieradministranto por kopii kaj alglui neniam estis agrabla sperto, precipe se la dosieroj estas en nekontinua ordo. Ofte, kiam elektante dosierojn per Ctrl+A aŭ la elektilo, ni trovas, ke ni devas elekti nur subaron de la postulataj dosieroj, kiujn ni elektis. Ĉi tio kondukas al la malfacila operacio forigi dosierojn el nia elekto. Kompreneble, la komuna solvo estas krei novan dosierujon kaj meti ĉiujn erojn en ĉi tiun dosierujon antaŭ kopiado, sed ĉi tio estas tre malefika kaj tre malrapida procezo se grandaj dosieroj devas esti kopiitaj. Krome Ctrl+Klako postulas bonajn movajn kapablojn por ne perdi la tutan elekton de dosieroj.</p>
    <p xml:lang="es">La selección de múltiples archivos en cualquier gestor de archivos para copiarlos y pegarlos nunca ha sido una experiencia agradable, especialmente si los archivos no son consecutivos. A menudo, cuando se seleccionan archivos usando Ctrl+A o la herramienta de selección, nos damos cuenta de que solo necesitamos seleccionar un subconjunto de los archivos que ya hemos seleccionado. Esto conduce a la poco manejable operación de eliminar archivos de la selección. Por supuesto, la solución común consiste en crear una nueva carpeta y colocar en ella todos los elementos antes de copiarlos, aunque esto es un proceso muy lento y poco eficiente si es necesario copiar archivos grandes. Además, Ctrl+clic necesita de habilidades motoras precisas para no perder toda la selección de archivos.</p>
    <p xml:lang="et">Paljude failide valimine kopeerimiseks ja asetamiseks ei ole kunagi üheski failihalduris olnud meeldiv tegevus, eriti veel kui failid ei asetse üksteise järel. Faile Ctrl + A või valikutööriista abil valides võib sageli leida, et tegelikult läheb meil valitute asemel tarvis ainult teatavat osa neist. See toob kaasa kohmaka valikust ebavajalike failide eemaldamise operatsiooni. Üks levinumaid lahendusi on mõistagi uue kataloogi loomine ja kõigi vajalike elementide paigutamine sinna enne kopeerimise alustamist, kuid see on üpris vähese tõhususega ja eriti juhul, kui failid on suured, ka päris aeglane protsess. Pealegi nõuab Ctrl + klõps väga head kontrolli liigutuste üle, et mitte kogemata tervet valikut kaotada.</p>
    <p xml:lang="eu">Erabiltzen duzun fitxategi-kudeatzailea erabiltzen duzula, kopiatu eta itsasteko, fitxategi anizkoitzak hautatzea, bereziki jarrian ez daudenean, ez da sekula esperientzia atsegina izan. Fitxategiak hautatzean, Ktrl+A edo hautapen tresnak erabilita, maiz, hautatu ditugun fitxategien azpimultzo bat bakarrik behar dugula konturatzen gara. Horrek gure hautapeneko fitxategiak desautatzeko eragiketa astuna egitera garamatza. Ohiko irtenbidea, karpeta berri bat sortu, eta kopiatu aurretik, elementu guztiak karpeta horretara ipintzea izan ohi da. Baina hori ez da batere eraginkorra eta oso motela gerta daiteke fitxategi handiak kopiatu behar direnean. Gainera, Ktrl+Klik egitean, fitxategien hautapen osoa gal ez dadin motrizitate ona behar da.</p>
    <p xml:lang="fi">Useamman tiedoston valitseminen kopioitavaksi tai liitettäväksi ei milloinkaan missään tiedostonhallintaohjelmassa ole ollut helppoa, etenkään jos tiedostot eivät ole peräkkäin. Usein valittuaan tiedostoja Ctrl+A:lla tai valintatyökalulla huomaa, että tarvitseekin vain osan valituista tiedostoista, jolloin tarpeettomat täytyy hankalasti poistaa valinnasta. Yleinen kiertotie on luoda uusi kansio ja siirtää tiedostot sinne kopioinnin alla, mutta tämä on tehotonta ja hidasta, etenkin jos tiedostot ovat suuria. Lisäksi Ctrl+hiiren napsautus vaatii tarkkuutta, jottei menetä koko valintaa.</p>
    <p xml:lang="fr">La sélection multiple de fichiers dans n'importe quel gestionnaire de fichiers pour les copier et les coller, n'a jamais été une expérience aussi plaisante, en particulier lorsque les fichiers ne sont pas dans un ordre continu. Souvent, lors de la sélection de fichiers en utilisant les touches « CTRL » « A » ou par l'outil de sélection, il n'est besoin que de sélectionner qu'un sous-ensemble de fichiers nécessaires parmi ceux sélectés. Bien sûr, le contournement standard est de créer un nouveau dossier et de d'insérer tous les éléments dan ce fichier avant de les copier. Mais, ceci est un processus très peu efficace et très lent si des fichiers volumineux sont à copier. De plus, une séquence « CTRL » + clic nécessite une connaissance fine du processus pour ne pas perdre la sélection entière des fichiers.</p>
    <p xml:lang="gl">Seleccionar varios ficheiros en calquera xestor de ficheiros para copiar e pegar nunca foi unha experiencia pracenteira, especialmente se os ficheiros non están en orde. A miúdo, ao seleccionar ficheiros usando Ctrl+A ou a ferramenta de selección, descubrimos que só necesitamos seleccionar unha parte dos ficheiros necesarios que seleccionamos. Isto leva á complicada operación de retirar ficheiros da selección. Por suposto, a solución máis común é crear un novo cartafol e poñer todos os elementos nel antes de copialos, pero isto é moi pouco eficiente e moi lento cando hai que copiar ficheiros grandes. Ademais Ctrl+Clic require precisión por parte do usuario para non perder toda a selección de ficheiros.</p>
    <p xml:lang="hi">किसी भी फ़ाइल प्रबंधक में प्रतिलिपि बनाने और चिपकाने के लिए अनेक फ़ाइलों का चयन करना कभी भी सुखद अनुभव नहीं रहा है, विशेषकर जब वे इधर-उधर बिखरी हुई हों। प्रायः Ctrl+A अथवा सेलेक्शन उपकरण के माध्यम से जब हम फ़ाइलों का चयन करतें हैं, तब हम यह पाते हैं कि हमें केवल इनके उपसमुच्चय की आवश्यकता है। इसके कारण हमारे चयन से फ़ाइलों को हटाना बोझिल हो जाता है। निस्संदेह, इसका वैकल्पिक हल, एक नया फ़ोल्डर बनाना होता है, जिसमें हम सभी मनचाहे फ़ाइलें डाल सकते हैं पर बडी फ़ाइलों के लिए यह तरीका बहुत ही धीमा एवं अप्रभावी हो जाता है। साथ ही Ctrl+क्लिक से फ़ाइलों के संपूर्ण चयन को न खोने के लिए ठीक मोटर कौशल की आवश्यकता होती है।</p>
    <p xml:lang="id">Pemilihan banyak file dalam semua pengelola file untuk disalin dan ditempelkan tidak pernah menjadi pengalaman yang menyenangkan, terutama jika file-file tersebut berada dalam urutan yang tidak karuan. Seringkali, ketika memilih file menggunakan Ctrl+A atau alat seleksi, kami menemukan bahwa kami hanya perlu memilih subset dari file yang diperlukan yang telah kami pilih. Ini mengarah pada operasi sulit menghapus file dari pilihan kami. Tentu saja, solusi umum adalah membuat folder baru dan meletakkan semua butir dalam folder ini sebelum disalin, tetapi ini adalah proses yang sangat tidak efisien dan sangat lambat jika file besar perlu disalin. Selain itu Ctrl+Click membutuhkan keterampilan motorik yang baik untuk tidak kehilangan seluruh pilihan file.</p>
    <p xml:lang="it">La selezione di diversi file in un qualsiasi gestore di file per copiarli e incollarli non è mai stata un'esperienza piacevole, specialmente se i file non sono in ordine consecutivo. Spesso, quando si selezionano dei file usando Ctrl+A o lo strumento di selezione, ci ritroviamo a dover selezionare solo un sottoinsieme dei file richiesti che abbiamo selezionato. Questo porta ad una scomoda operazione di rimozione dei file dalla selezione. Ovviamente il trucco classico consiste nella creazione di una nuova cartella e nel copiare tutti gli elementi in questa cartella prima della copia, ma si tratta di un processo molto inefficiente e molto lento nel caso in cui debbano essere copiati dei file grandi. Inoltre Ctrl+clic richiede delle abilità manuali ben precise per non perdere l'intera selezione dei file.</p>
    <p xml:lang="ka">ბევრი ფაილის მონიშვნა ფაილების მმართველში მათ დასაკოპირებლად სასიამოვნო პროცესი არასდროს ყოფილა, განსაკუთრებით, თუ ფაილები მიმდევრულად არაა დალაგებული. ძალიან ხშირად, როცა ფაილებს Ctrl+A-ით ან არჩევის პროგრამით ნიშნავთ, აღმოვაჩენთ, რომ ამ ფაილების მხოლოდ ნაწილი გვჭირდება. ეს კი არასაჭირო ფაილებიდან მონიშვნის მოხსნის საკმაოდ მოსაბეზრებელ ოპერაციას იწვევს . რა თქმა უნდა, შეგიძლიათ, ახალი საქაღალდე შექმნათ და კოპირებამდე ფაილები შიგნით შეაგროვოთ, მაგრამ ეს ძალიან დამქანცველი და ნელი პროცესია, თუ ფაილები რომლებსაც აკოპირებთ, ზომაში დიდია. Ctrl+წკაპი კი ითხოვს დახვეწილ მოტორულ ფუნქციებს, რომ ფაილების სრული მონიშვნა არ დაკარგოთ.</p>
    <p xml:lang="ko">파일 관리자에서 흩어진 파일과 폴더 여러 개를 선택하는 작업은 항상 귀찮은 작업이었습니다. Ctrl+A 키나 선택 도구로 파일을 선택한 후에야 필요한 파일보다 더 많은 파일을 선택했다는 사실을 알게 됩니다. 이 상황에서 필요한 파일만 다시 선택하는 작업은 불편합니다. 새 폴더를 만들어서 복사하기 전에 모든 항목을 저장하는 식으로 둘러갈 수 있지만, 큰 파일을 복사해야 하면 매우 시간이 오래 걸리는 비효율적인 작업입니다. Ctrl+클릭을 하는 도중에 키가 잘못 눌리면 지금까지 선택한 파일이 모두 사라집니다.</p>
    <p xml:lang="nl">Meerdere bestanden selecteren in elke bestandsbeheerder voor kopiëren en plakken is nooit een plezierige ervaring geweest, speciaal als de bestanden niet opeenvolgend zijn. Vaak, bij selecteren van bestanden met Ctrl+A of het selectiehulpmiddel, vinden we dat we het nodig om slechts een subset van de gewenste bestanden die we hebben geselecteerd nodig hebben. Dit leidt tot de onhandelbare bewerking van verwijderen van bestanden uit onze selectie. De algemene weg eromheen is om een nieuwe map te maken en alle items in deze map te plaatsen voor het kopiëren, maar dit is een erg inefficiënt en erg langzaam proces als grote bestanden gekopieerd moeten worden. Verder vereist Ctrl+Click fijne motoriek om niet de gehele selectie van bestanden te verliezen.</p>
    <p xml:lang="nn">Å velja fleire filer for kopiering eller flytting i ein filhandsamar har aldri vore enkelt, spesielt viss dei ikkje ligg rekkjefølgje. Når me vel filer manuelt eller med «Ctrl + A», oppdagar me gjerne at me ikkje treng alle filene, og må fjerna nokre av dei frå utvalet. Ei vanleg løysing er å laga ei mellombels mappe for å husa filene før kopiering, men dette er tregt om ein har mange eller store filer. Og med «Ctrl + klikk» kan ein lett nullstilla heile filutvalet.</p>
    <p xml:lang="pl">Wybieranie wielu plików w dowolnym programie do zarządzania plikami w celu skopiowania i wklejenia jeszcze nigdy nie było przyjemniejsze, szczególnie w przypadku, gdy pliki są w kolejności nie jeden po drugim. Często przy zaznaczaniu plików przy użyciu Ctrl+A lub narzędzia zaznaczania, zdajemy sobie sprawę, że potrzebujemy tylko części zaznaczonych plików. Prowadzi to do nieprzyjemnego usuwania plików z naszego zaznaczaenia. Oczywiście najpowszechniejszym obejściem jest stworzenie nowego katalogu i umieszczenie wszystkich elementów w tym katalogu przed skopiowaniem, lecz jest to bardzo niewydajne i powolne w przypadku kopiowania dużych plików. Ponadto Ctrl+klik wymaga dokładnych zdolności ruchowych, aby nie stracić całego zaznaczenia pliów.</p>
    <p xml:lang="pt">A selecção de vários ficheiros em qualquer gestor de ficheiros para copiar e colar nunca foi uma experiência agradável, especialmente se os ficheiros não estiverem juntos uns aos outros. Muitas vezes, ao seleccionar ficheiros com o Ctrl+A ou a ferramenta de selecção, descobrimos que é necessário seleccionar apenas um sub-conjunto dos ficheiros necessários entre os seleccionados. Isto conduz à operação incómoda de remover os ficheiros da nossa selecção. Obviamente, a alternativa comum é criar uma nova pasta e colocar lá todos os itens antes da cópia, mas isto é um processo muito ineficiente e lento se for necessário copiar ficheiros grandes. Para além disso, o Ctrl+click necessita de aptidões motoras adequadas para não perder toda a selecção de ficheiros.</p>
    <p xml:lang="pt-BR">A seleção de vários arquivos em qualquer gerenciador de arquivos para copiar e colar nunca foi uma experiência agradável, especialmente se os arquivos não estiverem em ordem sequencial. Muitas vezes, ao selecionar arquivos com Ctrl+A ou a ferramenta de seleção, descobrimos que é preciso selecionar apenas um subconjunto dos arquivos necessários entre os selecionados. Isso leva à operação incômoda de remover os arquivos da nossa seleção. Obviamente, a alternativa comum é criar uma nova pasta e colocar lá todos os itens antes da cópia, mas isso é um processo muito ineficiente e lento se for necessário copiar arquivos grandes. Além disso, o Ctrl+Clique requer habilidades motoras adequadas para não perder toda a seleção de arquivos.</p>
    <p xml:lang="sk">Výber viacerých súborov v ľubovoľnom správcovi súborov na kopírovanie a vkladanie nebol nikdy príjemným zážitkom, najmä ak sú súbory v nesúvislom poradí. Pri výbere súborov pomocou klávesov Ctrl + A alebo nástroja na výber často zistíme, že musíme vybrať iba podmnožinu požadovaných súborov, ktoré sme vybrali. To vedie k ťažkopádnemu odstraňovaniu súborov z nášho výberu. Samozrejme, spoločným riešením je vytvoriť nový priečinok a vložiť všetky položky do tohto priečinka pred kopírovaním, je to však veľmi neefektívny a veľmi pomalý proces, ak je potrebné kopírovať veľké súbory. Ctrl + Click navyše vyžaduje jemné motorické zručnosti, aby sa nestratil celý výber súborov.</p>
    <p xml:lang="sl">Izbira več datotek v katerem koli upravitelju datotek za kopiranje in lepljenje ni bila nikoli prijetna izkušnja, še posebej, če so datoteke v neprekinjenem vrstnem redu. Pogosto pri izbiri datotek s Ctrl+A ali izbirnim orodjem ugotovimo, da moramo izbrati samo podmnožico potrebnih datotek, ki smo jih izbrali. To vodi v neprijetno odstranjevanje datotek iz našega izbora. Seveda je skupno rešitev ustvariti novo mapo in vse elemente v to mapo postaviti pred kopiranjem, vendar je to zelo neučinkovit in zelo počasen postopek, če je treba kopirati velike datoteke. Poleg tega Ctrl+Klik zahteva fine motorične spretnosti, da ne izgubite celotnega izbora datotek.</p>
    <p xml:lang="sv">Att markera flera fler i någon filhanterare för att kopiera och klistra in har aldrig varit en trevlig upplevelse, i synnerhet om filerna inte är i följdordning. Ofta när man markerar filer med Ctrl+A eller markeringsverktyg, märker man att man enbart måste välja ut en delmängd av filerna som har blivit markerade. Det leder till en tungrodd operation för att ta bort filer från markeringen. Det vanliga sättet att gå runt det är förstås att skapa en ny katalog och placera alla objekt i den innan kopiering, men det är en mycket ineffektiv och långsam process om stora filer behöver kopieras. Dessutom kräver Ctrl+klick bra motoriska färdigheter för att inte förlora hela filmarkeringen.</p>
    <p xml:lang="tr">Dosya kopyalama ve yapıştırma için herhangi bir dosya yöneticisindeki birden fazla dosyayı seçmek, özellikle dosyalar sürekli olmayan bir sırada olduğunda hoş bir deneyim yaşatmaz. Çoğu zaman, Kontrol+A veya seçim aracı kullanarak dosyaları seçerken, seçmiş olduğumuz gerekli dosyaların yalnızca bir alt kümesini seçmemiz gerektiğini görürüz. Bu, dosyalarımızı seçimimizden kaldırmanın hantallaşmasına yol açar. Elbette, ortak bir geçici çözüm, yeni bir klasör oluşturmak ve kopyalamadan önce bu klasördeki tüm ögeleri içine koymaktır; ancak büyük dosyaların kopyalanması gerekiyorsa bu çok verimsiz ve çok yavaş bir işlemdir. Üstelik Kontrol +Tıklama, tüm dosya seçimini kaybetmemek için iyi motor becerisi gerektirir.</p>
    <p xml:lang="uk">Позначення декількох файлів у програмі для керування файлами ніколи не було зовсім простою справою, особливо якщо файли у наборі розташовано у різних місцях екрана. Часто після позначення файлів за допомогою комбінації клавіш Ctrl+A або засобів позначення виявляється, що потрібні нам файли є лише підмножиною позначеного набору. Звичайно ж, можна створити нову теку і розмістити у ній всі потрібні об’єкти до копіювання, але це значно ускладнює процес, якщо відбувається копіювання великих файлів. Крім того, використання комбінації Ctrl+клацання потребує певних навичок для того, щоб випадково не скасувати позначення усього раніше позначеного набору файлів.</p>
    <p xml:lang="x-test">xxSelecting multiple files in any file manager for copying and pasting has never been a pleasant experience, especially if the files are in a non-continuous order. Often, when selecting files using Ctrl+A or the selection tool, we find that we need to select only a subset of the required files we have selected. This leads to the unwieldy operation of removing files from our selection. Of course, the common workaround is to create a new folder and to put all the items in this folder prior to copying, but this is a very inefficient and very slow process if large files need to be copied. Moreover Ctrl+Click requires fine motor skills to not lose the entire selection of files.xx</p>
    <p xml:lang="zh-CN">在任何文件管理器中,复制粘贴多个文件的体验都十分糟糕,文件顺序不连续时更甚。当我们使用 Ctrl+A 或选择工具选择文件时,一般只需要选择其中的一小部分。在这种情况下,取消选择就会变得十分复杂。当然,最常见的变通办法是在复制前先创建一个新文件夹,并将已选择的文件全放进去。但如果需要复制大量文件,这种过程会变得既低效又漫长;此外,按住 Ctrl 点击也需要精准的鼠标移动技巧,才不会点错而导致已选择的文件被取消选择。</p>
    <p xml:lang="zh-TW">在任何檔案管理員選取多個檔案進行複製貼上的流程總是很不讓人開心,尤其當選取檔案不是連續的時候。我們經常在使用選取工具或是 Ctrl+A 選取檔案之後會發現我們只需要選取一部分,造成需要很不方便的取消選取一些檔案。常見的暫時解決方法是建立一個新資料夾然後把要複製的檔案先放進這個資料夾裡,但這是一個很沒效率又很慢的流程,尤其當需要複製大檔案的時候。另外,按著 Ctrl 進行選取也需要控制按鍵的能力夠好才不會一不小心取消了全部的選取。</p>
    <p>This project has a novel solution to this problem. This adds virtual folder support in all KIO applications, where the links to files and folders can be temporarily saved for a session. The files and folders are "staged" on this virtual folder. Files can be added to this by using all the regular file management operations such as Move, Copy and Paste, or by drag and drop. Hence, complex file operations such as moving files across many devices can be made easy by staging the operation before performing it.</p>
    <p xml:lang="ar">هذا المشروع لديه حل جديد لهذه المشكلة. يضيف هذا دعمًا لمجلد افتراضي في جميع تطبيقات KIO ، حيث يمكن حفظ الروابط إلى الملفات والمجلدات مؤقتًا للجلسة. يتم "تنظيم" الملفات والمجلدات على هذا المجلد الافتراضي. يمكن إضافة الملفات إلى هذا باستخدام جميع عمليات إدارة الملفات العادية مثل النقل والنسخ واللصق ، أو بالسحب والإفلات. وبالتالي ، يمكن تسهيل عمليات الملفات المعقدة مثل نقل الملفات عبر العديد من الأجهزة من خلال تنظيم العملية قبل تنفيذها.</p>
    <p xml:lang="ca">Aquest projecte té una solució nova a aquest problema. Afegeix la implementació de carpetes virtuals a totes les aplicacions KIO, a on els enllaços a fitxers i carpetes es poden desar temporalment durant una sessió. Els fitxers i carpetes es «reserven» en aquesta carpeta virtual. Els fitxers s'hi poden afegir usant totes les operacions normals de la gestió de fitxers com moure, copiar i enganxar, o arrossegar i deixar anar. Per tant, les operacions complexes de fitxer com moure fitxers per diversos dispositius es pot facilitar reservant l'operació abans de portar-la a terme.</p>
    <p xml:lang="ca-valencia">Este projecte té una solució nova a este problema. Afig la implementació de carpetes virtuals a totes les aplicacions KIO, a on els enllaços cap a fitxers i carpetes es poden guardar temporalment durant una sessió. Els fitxers i carpetes es «reserven» en esta carpeta virtual. Els fitxers s'hi poden afegir utilitzant totes les operacions normals de la gestió de fitxers com moure, copiar i apegar, o arrossegar i deixar anar. Per tant, les operacions complexes de fitxer com moure fitxers per diversos dispositius es pot facilitar reservant l'operació abans de portar-la a terme.</p>
    <p xml:lang="en-GB">This project has a novel solution to this problem. This adds virtual folder support in all KIO applications, where the links to files and folders can be temporarily saved for a session. The files and folders are "staged" on this virtual folder. Files can be added to this by using all the regular file management operations such as Move, Copy and Paste, or by drag and drop. Hence, complex file operations such as moving files across many devices can be made easy by staging the operation before performing it.</p>
    <p xml:lang="eo">Ĉi tiu projekto havas novan solvon al ĉi tiu problemo. Ĉi tio aldonas virtualan dosierujon subtenon en ĉiuj KIO-aplikoj, kie la ligiloj al dosieroj kaj dosierujoj povas esti provizore konservitaj por sesio. La dosieroj kaj dosierujoj estas "scenigitaj" sur ĉi tiu virtuala dosierujo. Dosieroj povas esti aldonitaj al ĉi tio uzante ĉiujn regulajn operaciojn pri administrado de dosieroj kiel Movu, Kopiu kaj Algluu, aŭ per trenado kaj faligo. Tial kompleksaj dosieraj operacioj kiel movi dosierojn tra multaj aparatoj povas esti faciligitaj per enscenigado de la operacio antaŭ ol plenumi ĝin.</p>
    <p xml:lang="es">Este proyecto proporciona una solución innovadora para este problema implementando carpetas virtuales a todas las aplicaciones que usan KIO, donde los enlaces a los archivos y carpetas se pueden guardar de forma temporal para una sesión. Los archivos y carpetas se «montan» en esta carpeta virtual. Puede añadir archivos usando las operaciones de gestión de archivos habituales, como mover, copiar y pegar, o arrastrar y soltar. Por consiguiente, puede realizar con facilidad operaciones de archivos complejas, como moverlos entre varios dispositivos, almacenando temporalmente la operación antes de realizarla.</p>
    <p xml:lang="eu">Proiektu honek arazoari irtenbide berri bat ematen dio. KIO aplikazio guztietan alegiazko karpeten euskarria gehitzen du, non fitxategien eta karpeten estekak aldi baterako gorde daitezkeen saioak iraun bitartean. Fitxategiak eta karpetak alegiazko karpeta honetan "antolatzen" dira. Fitxategiak horra gehitzeko, fitxategi kudeaketarako ohiko eragiketa guztiak erabil daitezke, hala nola mugitu, kopiatu eta itsatsi, edo arrastatu eta jaregin. Horri esker, fitxategiak gailu anizkoitzen artean mugitzea bezalako fitxategi-eragiketa korapilotsuak erraz egin daitezke, eragiketa gauzatu aurretik hura antolatuz.</p>
    <p xml:lang="fi">Tämä projekti on ongelmaan uudenlainen ratkaisu. Se lisää kaikkiin KIO-sovelluksiin tuen virtuaalikansioille, jonne linkit tiedostoihin ja kansioihin voi istunnon ajaksi väliaikaisesti tallentaa. Virtuaalikansiossa tiedostot ja kansiot on ”vaiheistettu”. Tiedostoja voi lisätä tavallisin tiedostonhallintatoimenpiten (siirto, kopiointi, liittäminen, veto ja pudotus). Hankalammat toimenpiteet kuten tiedostojen siirto laitteelta toiselle helpottuu, kun kaikki vaiheistetaan ensin yhteen.</p>
    <p xml:lang="fr">Ce projet propose une solution nouvelle à ce problème. Il ajoute la prise en charge d'un dossier virtuel dans tous les applications de KIO, où les liens vers les fichiers peuvent être enregistrés temporairement durant une session. Les fichiers et les dossiers sont « instrumentés » sur ce dossier virtuel. Les fichiers peuvent lui être ajoutés en utilisant les opérations classiques de gestion de fichiers comme Déplacer, Copier et Coller ou par un glisser / déposer. Ainsi, les opérations complexes sur les fichiers, tel que le déplacement de fichiers entre différents périphériques, peuvent être rendus facile en instrumentant l'opération avant d'exécuter.</p>
    <p xml:lang="gl">Este proxecto fornece unha nova solución para este problema. Engade compatibilidade con cartafoles virtuais ás aplicacións que usen KIO, onde poder gardar as ligazóns a ficheiros e cartafoles de maneira temporal, gardados durante a sesión. Os ficheiros e cartafoles “resérvanse” neste cartafol virtual, ao que se lle poden engadir ficheiros usando as operacións habituais de xestión de ficheiros como mover, copiar ou pegar, ou arrastrando e soltando. Deste modo, operacións complexas de ficheiros como mover ficheiros de moitos dispositivos poden simplificarse gardando as operacións na reserva antes de executalas.</p>
    <p xml:lang="id">Projek ini memiliki solusi baru untuk masalah ini. Ini menambahkan dukungan folder virtual di semua aplikasi KIO, dimana tautan ke file dan folder dapat disimpan sementara untuk satu sesi. File dan folder "staged" pada folder virtual ini. File dapat ditambahkan ke sini dengan menggunakan semua operasi pengelola file biasa seperti Pindah, Salin, dan Tempel, atau dengan seret dan taruh. Oleh karena itu, operasi file yang kompleks seperti memindahkan file di banyak peranti dapat dipermudah dengan mengatur operasi sebelum melakukannya.</p>
    <p xml:lang="it">Questo progetto presenta una soluzione originale al problema. Aggiunge il supporto alle cartelle virtuali in tutte le applicazioni KIO, in cui è possibile salvare temporaneamente i collegamenti a file e cartelle per una sessione. I file e le cartelle sono messe da parte («staged») in questa cartella virtuale. I file possono essere aggiunti ad essa usando tutte le normali operazioni di gestione dei file come Sposta, Copia e Incolla, o tramite trascinamento. Perciò tutte le operazioni complesse sui file come lo spostamento di file tra dispositivi diversi possono essere rese semplici tramite uno staging dell'operazione prima di eseguirla.</p>
    <p xml:lang="ka">ამ პროექტს პრობლემის გადაჭრის ორიგინალური საშუალება გააჩნია. ის ამატებს ვირტუალურ საქაღალდეს ყველა KIO აპლიკაციაში, სადაც ის დროებით ბმულებს ქმნის ფაილებისა და საქაღალდეებისათვის, რომლებზეც მუშაობს. ეს ფაილები "შეინახება" ამ ვირტუალურ საქაღალდეში. ამ საქაღალდეში ფაილებთან ჩვეულებრივ მუშაობთ, რაც ნიშნავს, რომ კოპირება, გადატანა და ჩასმა ჩვეულებრივ მუშაობს.</p>
    <p xml:lang="ko">이 프로젝트는 이 문제를 해결하는 방안을 제시합니다. 모든 KIO 앱에 가상 폴더 지원을 추가해서 현재 세션에서 사용할 수 있는 파일과 폴더의 임시 링크를 저장합니다. 파일과 폴더는 이 가상 폴더에 "임시로 저장"됩니다. 이동, 복사, 붙여넣기, 드래그 앤 드롭 등 일반적인 모든 파일 관리 작업으로 여기에 파일을 추가할 수 있습니다. 여러 장치로 파일을 이동하는 등의 복잡한 파일 작업은 실제 작업을 수행하기 전에 임시 폴더에 저장해서 쉽게 해결할 수 있습니다.</p>
    <p xml:lang="nl">Dit project heeft een vernieuwende oplossing tot dit probleem. Dit voegt ondersteuning voor virtuele mappen toe aan alle KIO-toepassingen, waar de koppelingen naar bestanden en mappen tijdelijk in opgeslagen kunnen worden voor een sessie. De bestanden en mappen worden "staged" in deze virtuele map. Bestanden kunnen hieraan worden toegevoegd door alle reguliere bewerkingen bij bestandsbeheer zoals Verplaatsen, Kopiëren en Plakken of door slepen en loslaten. Complexe bestandsbewerkingen zoals verplaatsen van bestanden over vele apparaten kan gemakkelijk gemaakt worden door "staging" van de bewerking alvorens deze uit te voeren.</p>
    <p xml:lang="nn">Dette prosjektet har ei original løysing på problemet. Det legg til ei virtuell mappe i alle program som brukar KIO, der lenkjer til filer og mapper kan lagrast mellombels (ut økta). Du kan bruka alle vanlege filoperasjonar, som kopiering, flytting og innliming, anten med snøggtastar eller dra-og-slepp. Komplekse filoperasjonar, der du for eksempel skal flytta filer på tvers av mange einingar, vert på denne måten mykje enklare.</p>
    <p xml:lang="pl">Ten projekt ma nowe rozwiązanie na przedstawiony problem. Dodaje on obsługę wirtualnych katalogów we wszystkich aplikacjach KIO, w których odnośniki do plików i katalogów można tymczasowo zapisać dla sesji. Pliki i katalogi są "dobierane" do tego wirtualnego katalogu. Pliki można dodawać wykorzystując wszystkie zwyczajne działania na plikach takie jak przenieś, kopiuj, wklej lub przeciągnij. Dzięki temu, złożone działania na plikach takie jak przenoszenie plików z wielu urządzeń jest łatwiejsze poprzez przygotowanie działania przed jego wykonaniem.</p>
    <p xml:lang="pt-BR">Este projeto tem uma nova solução para esse problema. Adiciona o suporte a pastas virtuais em todos os aplicativos do KIO, onde os links com os arquivos e pastas podem ser salvos temporariamente para apenas uma sessão. Os arquivos e pastas ficam "preparados" nessa pasta virtual. Os arquivos podem ser adicionados à mesma ao usar qualquer uma das operações normais de gerenciamento de arquivos, como mover, copiar e colar, ou a ação de arrastar e soltar. Desse modo, as operações complexas com arquivos, como a movimentação entre vários dispositivos pode ser feita facilmente com o preparo da operação antes de sua execução.</p>
    <p xml:lang="sl">Ta projekt ima novo rešitev tega problema. To doda podporo za navidezno mapo v vseh aplikacijah KIO, kjer se lahko povezave do datotek in map začasno shranijo za sejo. Datoteke in mape so "uprizorjene" v tej virtualni mapi. Datoteke lahko k temu dodate z uporabo vseh običajnih operacij upravljanja datotek, kot so premikanje, kopiranje in lepljenje, ali z tehniko povleci in spusti. Zato lahko zapletene datoteke z operacijami, kot je premikanje datotek po številnih napravah, olajšate tako, da operacijo "uprizorite" pred izvedbo.</p>
    <p xml:lang="sv">Detta projekt har en originell lösning på problemet. Det lägger till stöd för virtuella kataloger i alla KIO-program, där länkar till filer och kataloger kan sparas tillfälligt under en session. Filerna och katalogerna "förbereds" i denna virtuella katalog. Filer kan läggas till i den genom att använda de vanliga filhanteringsåtgärderna såsom flytta, kopiera och klistra in, eller med drag och släpp. Därigenom kan komplexa åtgärder såsom att flytta filer mellan många enheter göras enkla genom att förbereda åtgärden innan den utförs.</p>
    <p xml:lang="tr">Proje bu soruna yeni bir çözüm getiriyor. Bu, dosya ve klasörlere olan bağlantılar geçici olarak bir oturum için kaydedilebilen tüm KIO uygulamalarında sanal klasör desteği ekler. Dosyalar ve klasörler bu sanal klasörde "aşamalı" haldedirler. Dosyaları; Taşı, Kopyala ve Yapıştır gibi tüm normal dosya yönetimi işlemlerini kullanarak veya sürükleyip bırakarak ekleyebilirsiniz. Bu nedenle, birçok aygıt arasında dosya taşıma gibi karmaşık dosya işlemleri işlemi gerçekleştirmeden önce işlemi aşamalaştırarak kolaylaştırabilirsiniz.</p>
    <p xml:lang="uk">Цей проєкт пропонує новітнє вирішення проблеми. Програмними засобами створюється віртуальна тека в усіх програмах із підтримкою KIO. У цій теці протягом сеансу роботи можуть тимчасово зберігатися посилання на файли і теки. Ці файли і теки складають «стос» віртуальної теки. До стосу можна додавати нові запис за допомогою звичайних операцій із керування файлами — пересування, копіювання та вставлення — або за допомогою перетягування зі скиданням. Таким чином, складні дії з файлами, зокрема пересування файлів між багатьма пристроями можна доволі просто виконати, розмістивши файли у стосі до виконання копіювання.</p>
    <p xml:lang="x-test">xxThis project has a novel solution to this problem. This adds virtual folder support in all KIO applications, where the links to files and folders can be temporarily saved for a session. The files and folders are "staged" on this virtual folder. Files can be added to this by using all the regular file management operations such as Move, Copy and Paste, or by drag and drop. Hence, complex file operations such as moving files across many devices can be made easy by staging the operation before performing it.xx</p>
    <p xml:lang="zh-CN">此项目为这类问题提供了一个全新的解决方案。它添加了一个所有 KIO 应用程序都支持的虚拟文件夹,并将文件和文件夹的链接临时储存到会话中。会话中的文件和文件夹都会被暂存到虚拟文件夹内,而常规的文件管理操作 (如移动、复制和粘贴或是直接拖动) 都会将文件添加到此文件夹。因此,只要在执行前暂存操作,就能轻易做到复杂的文件操作 (如跨设备移动文件)。</p>
    <p xml:lang="zh-TW">這個專案提供這個問題的一個新穎的解決方案。這個專案為所有 KIO 應用程式提供虛擬資料夾的支援,在一個工作階段中可以暫時存放檔案和資料夾的連結在這裡面。這些檔案和資料夾等同是「暫存」在這個虛擬資料夾中。檔案可以透過一般的檔案管理操作(例如移動、複製/貼上,或透過拖曳)來加入於此。如此,複雜的檔案操作,例如在多個裝置之間移動檔案,可以透過在進行操作之前先準備暫存來變得簡單。</p>
  </description>
  <url type="homepage">https://www.kde.org</url>
  <url type="bugtracker">https://bugs.kde.org/enter_bug.cgi?format=guided&amp;product=filestash</url>
  <url type="donation">https://www.kde.org/community/donations/?app=filestash</url>
  <screenshots>
    <screenshot type="default">
      <image>https://cdn.kde.org/screenshots/kio-stash/kio-stash.png</image>
    </screenshot>
  </screenshots>
  <project_group>KDE</project_group>
  <categories>
    <category>System</category>
  </categories>
  <icon type="stock">folder-temp</icon>
</component>
0707010000006A000041ED00000000000000000000000267C26CB700000000000000000000000000000000000000000000002F00000000kio-stash-1.0git.20250301T021103~51f07b6/tests0707010000006B000081A400000000000000000000000167C26CB7000003AF000000000000000000000000000000000000003E00000000kio-stash-1.0git.20250301T021103~51f07b6/tests/CMakeLists.txt#build the target for the test cases for the KIO worker

include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/.. )

set(workertest_SRCS
    workertest.cpp
)

enable_testing()
set(CMAKE_AUTOMOC_ON)
add_executable(workertest ${workertest_SRCS})
add_test(workertest workertest)

target_link_libraries(workertest
    KF${QT_MAJOR_VERSION}::KIOCore
    KF${QT_MAJOR_VERSION}::DBusAddons
    Qt::Core
    KF${QT_MAJOR_VERSION}::I18n
    Qt::DBus
    KF${QT_MAJOR_VERSION}::KIOCore
    KF${QT_MAJOR_VERSION}::Solid
    Qt::Test
)

#next target
set(testdaemon_SRCS
    testdaemon.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/../src/iodaemon/stashnotifier.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/../src/iodaemon/fs.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/../src/iodaemon/stash_adaptor.cpp
)

add_executable(testdaemon ${testdaemon_SRCS})

target_link_libraries(testdaemon
    KF${QT_MAJOR_VERSION}::KIOCore
    KF${QT_MAJOR_VERSION}::DBusAddons
    Qt::DBus
    Qt::Core
)
0707010000006C000081A400000000000000000000000167C26CB70000065D000000000000000000000000000000000000003E00000000kio-stash-1.0git.20250301T021103~51f07b6/tests/testdaemon.cpp/***************************************************************************
 *   Copyright (C) 2016 by Arnav Dhamija <arnav.dhamija@gmail.com>         *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/

#include "../src/iodaemon/stashnotifier.h"
#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    StashNotifier *stashDaemon = new StashNotifier(0, QVariantList());
    return app.exec();
}
0707010000006D000081A400000000000000000000000167C26CB70000305E000000000000000000000000000000000000003E00000000kio-stash-1.0git.20250301T021103~51f07b6/tests/workertest.cpp/***************************************************************************
 *   Copyright (C) 2016 by Arnav Dhamija <arnav.dhamija@gmail.com>         *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/

#include "workertest.h"

#include <QDBusConnection>
#include <QDBusMessage>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QStandardPaths>
#include <QTemporaryFile>
#include <QTest>

#include <KFileItem>
#include <KIO/CopyJob>
#include <KIO/DeleteJob>
#include <KIO/Job>
#include <KIO/ListJob>
#include <KIO/MkdirJob>
#include <KIO/StatJob>

WorkerTest::WorkerTest()
    : tmpFolder("WorkerTest")
    , m_fileTestFile("TestFile")
    , m_fileTestFolder("TestSubFolder")
    , m_stashTestFolder("StashTestFolder")
    , m_stashTestSymlink("StashTestSymlink")
    , m_stashTestFile("StashFile")
    , m_stashTestFileInSubDirectory("SubTestFile")
    , m_newStashFileName("NewStashFile")
    , m_stashFileForRename("StashRenameFile")
    , m_absolutePath(QDir::currentPath())
{
}

void WorkerTest::initTestCase()
{
    // enclose a check statement around this block to see if kded5 is not already there
    QDBusMessage msg;
    QDBusMessage replyMessage;

    stashDaemonProcess = new QProcess();

    msg = QDBusMessage::createMethodCall("org.kde.kio.StashNotifier", "/StashNotifier", "", "pingDaemon");
    replyMessage = QDBusConnection::sessionBus().call(msg);
    if (replyMessage.type() == QDBusMessage::ErrorMessage) {
        qDebug() << "Launching fallback daemon";
        const QString program = "./testdaemon";
        stashDaemonProcess->start(program, QStringList{});
    }

    replyMessage = QDBusConnection::sessionBus().call(msg);

    if (replyMessage.type() != QDBusMessage::ErrorMessage) {
        qDebug() << "Test case initialised";
    } else {
        qDebug() << "Something is wrong!";
    }
    createTestFiles();
}

void WorkerTest::createTestFiles() // also find a way to reset the directory prior to use
{
    QDir tmpDir;
    tmpDir.mkdir(tmpDirPath()); // creates test dir
    tmpDir.mkdir(tmpDirPath() + m_fileTestFolder);

    QFile tmpFile;
    stashDirectory('/' + m_stashTestFolder);

    QUrl src = QUrl::fromLocalFile(tmpDirPath() + m_fileTestFile); // creates a file to be tested
    tmpFile.setFileName(src.path());
    QVERIFY(tmpFile.open(QIODevice::ReadWrite));
    tmpFile.close();

    src = QUrl::fromLocalFile(tmpDirPath() + m_stashTestFile); // creates a file to be stashed
    tmpFile.setFileName(src.path());
    QVERIFY(tmpFile.open(QIODevice::ReadWrite));
    tmpFile.close();
    stashFile(src.path(), '/' + m_stashTestFile);

    src = QUrl::fromLocalFile(tmpDirPath() + m_stashFileForRename);
    tmpFile.setFileName(src.path());
    QVERIFY(tmpFile.open(QIODevice::ReadWrite));
    tmpFile.close();
    stashFile(src.path(), '/' + m_stashFileForRename);

    src = QUrl::fromLocalFile(tmpDirPath() + m_stashTestFileInSubDirectory);
    tmpFile.setFileName(src.path());
    QVERIFY(tmpFile.open(QIODevice::ReadWrite));
    tmpFile.close();

    stashFile(src.path(), '/' + m_stashTestFolder + '/' + m_stashTestFileInSubDirectory);
}

void WorkerTest::cleanupTestCase()
{
    QDir dir(tmpDirPath());
    dir.removeRecursively();
    stashDaemonProcess->terminate();
}

QString WorkerTest::tmpDirPath()
{
    return m_absolutePath + '/' + tmpFolder + '/';
}

void WorkerTest::statItem(const QUrl &url, const int &type)
{
    KIO::UDSEntry entry;
    QVERIFY(statUrl(url, entry));
    KFileItem item(entry, url);
    switch (type) {
    case NodeType::DirectoryNode:
        QVERIFY(item.isDir());
        break;
    case NodeType::SymlinkNode:
        QVERIFY(item.isLink()); // don't worry this is intentional :)
    case NodeType::FileNode:
        QVERIFY(item.isFile());
    }
    QVERIFY(item.isReadable());
    QVERIFY(!item.isHidden());
    QCOMPARE(item.text(), url.fileName());
}

void WorkerTest::stashFile(const QString &realPath, const QString &stashPath)
{
    QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.kio.StashNotifier", "/StashNotifier", "", "addPath");
    msg << realPath << stashPath << NodeType::FileNode;
    bool queued = QDBusConnection::sessionBus().send(msg);
    QVERIFY(queued);
}

void WorkerTest::stashDirectory(const QString &path)
{
    QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.kio.StashNotifier", "/StashNotifier", "", "addPath");
    QString destinationPath = path;
    msg << "" << destinationPath << NodeType::DirectoryNode;
    bool queued = QDBusConnection::sessionBus().send(msg);
    QVERIFY(queued);
}

void WorkerTest::stashSymlink(const QString &realPath, const QString &stashPath)
{
    QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.kio.StashNotifier", "/StashNotifier", "", "addPath");
    msg << realPath << stashPath << NodeType::SymlinkNode;
    bool queued = QDBusConnection::sessionBus().send(msg);
    QVERIFY(queued);
}

bool WorkerTest::statUrl(const QUrl &url, KIO::UDSEntry &entry)
{
    KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
    bool ok = statJob->exec();
    if (ok) {
        entry = statJob->statResult();
    }
    return ok;
}

void WorkerTest::nukeStash()
{
    QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.kio.StashNotifier", "/StashNotifier", "", "nukeStash");
    bool queued = QDBusConnection::sessionBus().send(msg);
    QVERIFY(queued);
}

void WorkerTest::stashCopy(const QUrl &src, const QUrl &dest)
{
    KIO::CopyJob *job = KIO::copy(src, dest, KIO::HideProgressInfo);
    bool ok = job->exec();
    QVERIFY(ok);
}

void WorkerTest::moveFromStash(const QUrl &src, const QUrl &dest) // make this work
{
    KIO::Job *job = KIO::move(src, dest, KIO::HideProgressInfo);
    bool ok = job->exec();
    QVERIFY(ok);
}

void WorkerTest::deleteFromStash(const QUrl &url)
{
    KIO::Job *delJob = KIO::del(url, KIO::HideProgressInfo);
    bool ok = delJob->exec();
    QVERIFY(ok);
}

void WorkerTest::listRootDir()
{
    KIO::ListJob *job = KIO::listDir(QUrl(QStringLiteral("stash:/")), KIO::HideProgressInfo);
    connect(job, SIGNAL(entries(KIO::Job *, KIO::UDSEntryList)), SLOT(slotEntries(KIO::Job *, KIO::UDSEntryList)));
    bool ok = job->exec();
    QVERIFY(ok);
}

void WorkerTest::listSubDir()
{
    KIO::ListJob *job = KIO::listDir(QUrl("stash:/" + m_stashTestFolder), KIO::HideProgressInfo);
    connect(job, SIGNAL(entries(KIO::Job *, KIO::UDSEntryList)), SLOT(slotEntries(KIO::Job *, KIO::UDSEntryList)));
    bool ok = job->exec();
    QVERIFY(ok);
}

void WorkerTest::createDirectory()
{
    QUrl directoryPath = QUrl("");
    KIO::SimpleJob *job = KIO::mkdir(directoryPath);
    bool ok = job->exec();
    QVERIFY(QFile::exists(directoryPath.path()));
    QCOMPARE(ok, true);
}

void WorkerTest::statRoot()
{
    QUrl url("stash:/");
    KIO::UDSEntry entry;
    QVERIFY(statUrl(url, entry));
    KFileItem item(entry, url);
    QVERIFY(item.isDir());
    QVERIFY(!item.isLink());
    QVERIFY(item.isReadable());
    QVERIFY(item.isWritable());
    QVERIFY(!item.isHidden());
    QCOMPARE(item.name(), QStringLiteral("."));
}

void WorkerTest::statFileInRoot()
{
    QFile file;
    QUrl url("stash:/" + m_stashTestFile);
    stashFile(url.path(), url.path());
    KIO::UDSEntry entry;
    QVERIFY(statUrl(url, entry));
    KFileItem item(entry, url);
    QVERIFY(item.isFile());
    QVERIFY(!item.isDir());
    QVERIFY(!item.isLink());
    QVERIFY(item.isReadable());
    QVERIFY(!item.isHidden());
}

void WorkerTest::statDirectoryInRoot()
{
    QUrl url("stash:/" + m_stashTestFolder);
    stashDirectory(url.path());
    KIO::UDSEntry entry;
    QVERIFY(statUrl(url, entry));
    KFileItem item(entry, url);
    QVERIFY(!item.isFile());
    QVERIFY(item.isDir());
    QVERIFY(!item.isLink());
    QVERIFY(item.isReadable());
    QVERIFY(!item.isHidden());
}

void WorkerTest::statSymlinkInRoot()
{
    QUrl url("stash:/" + m_stashTestSymlink);
    stashSymlink(url.path(), url.path());
    KIO::UDSEntry entry;
    QVERIFY(statUrl(url, entry));
    KFileItem item(entry, url);
    QVERIFY(item.isFile());
    QVERIFY(!item.isDir());
    QVERIFY(item.isReadable());
    QVERIFY(!item.isHidden());
}

void WorkerTest::statFileInDirectory()
{
    QUrl url("stash:/" + m_stashTestFolder + '/' + m_stashTestFileInSubDirectory);
    KIO::UDSEntry entry;
    QVERIFY(statUrl(url, entry));
    KFileItem item(entry, url);
    QVERIFY(item.isFile());
    QVERIFY(!item.isDir());
    QVERIFY(!item.isLink());
    QVERIFY(item.isReadable());
    QVERIFY(!item.isHidden());
}

void WorkerTest::copyFileToStash()
{
    QUrl src = QUrl::fromLocalFile(tmpDirPath() + m_fileTestFile);
    QFile testFile(src.path());
    QVERIFY(testFile.open(QIODevice::WriteOnly));
    QUrl dest("stash:/" + m_fileTestFile);

    stashCopy(src, dest);
    QVERIFY(testFile.exists());
    statItem(dest, NodeType::FileNode);
}

void WorkerTest::copySymlinkFromStashToFile() // create test case
{
    stashSymlink(tmpDirPath() + m_fileTestFile, '/' + m_stashTestSymlink);
    QUrl src("stash:/" + m_stashTestSymlink);
    QUrl dest = QUrl::fromLocalFile(tmpDirPath() + m_fileTestFolder + '/' + m_stashTestSymlink);

    stashCopy(src, dest);
    QVERIFY(QFile::exists(dest.path()));
}

void WorkerTest::copyStashToFile()
{
    QUrl src("stash:/" + m_stashTestFile);
    QUrl dest = QUrl::fromLocalFile(tmpDirPath() + m_fileTestFolder + '/' + m_stashTestFile);
    KIO::UDSEntry entry;
    stashCopy(src, dest);
    QVERIFY(QFile::exists(dest.toLocalFile()));
    QFile(dest.path()).remove();
}

void WorkerTest::moveToFileFromStash()
{
    QUrl src("stash:/" + m_stashTestFile);
    QUrl dest = QUrl::fromLocalFile(tmpDirPath() + m_fileTestFolder + '/' + m_stashTestFile);

    moveFromStash(src, dest);
    KIO::UDSEntry entry;
    QVERIFY(!statUrl(src, entry));
    QVERIFY(QFile::exists(dest.toLocalFile()));
}

void WorkerTest::copyStashToStash()
{
    QUrl src("stash:/" + m_stashTestFile);
    QUrl dest("stash:/" + m_stashTestFolder + '/' + m_stashTestFile);
    stashCopy(src, dest);
    KIO::UDSEntry entry;
    statUrl(src, entry);
    KFileItem item(entry, src);
    QVERIFY(item.name() == m_stashTestFile);
}

void WorkerTest::renameFileInStash()
{
    QUrl src("stash:/" + m_stashFileForRename);
    QUrl dest("stash:/" + m_newStashFileName);

    KIO::UDSEntry entry;

    moveFromStash(src, dest);

    QVERIFY(!statUrl(src, entry));

    statUrl(dest, entry);
    KFileItem item(entry, src);
    QVERIFY(item.name() == m_newStashFileName);
}

void WorkerTest::delRootFile()
{
    QUrl url("stash:/" + m_stashTestFile);
    deleteFromStash(url);
    KIO::UDSEntry entry;
    QVERIFY(!statUrl(url, entry));
}

void WorkerTest::delFileInDirectory()
{
    QUrl url("stash:/" + m_stashTestFolder + '/' + m_stashTestFileInSubDirectory);
    deleteFromStash(url);
    KIO::UDSEntry entry;
    QVERIFY(!statUrl(url, entry));
}

void WorkerTest::delDirectory()
{
    QUrl url("stash:/" + m_stashTestFolder);
    deleteFromStash(url);
    KIO::UDSEntry entry;
    QVERIFY(!statUrl(url, entry));
}

void WorkerTest::init()
{
    createTestFiles();
}

void WorkerTest::cleanup()
{
    QDir dir(tmpDirPath());
    dir.removeRecursively();
}

QTEST_MAIN(WorkerTest)
0707010000006E000081A400000000000000000000000167C26CB700000D15000000000000000000000000000000000000003C00000000kio-stash-1.0git.20250301T021103~51f07b6/tests/workertest.h/***************************************************************************
 *   Copyright (C) 2016 by Arnav Dhamija <arnav.dhamija@gmail.com>         *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/

#ifndef WORKERTEST_H
#define WORKERTEST_H

#include <KIO/Job>
#include <KIO/UDSEntry>
#include <QObject>
#include <QProcess>
#include <QString>

class WorkerTest : public QObject
{
    Q_OBJECT

public:
    WorkerTest();
    ~WorkerTest()
    {
    }

    enum NodeType {
        DirectoryNode,
        SymlinkNode,
        FileNode,
        InvalidNode,
    };

private:
    QString tmpDirPath();
    bool statUrl(const QUrl &url, KIO::UDSEntry &entry);
    void stashFile(const QString &realPath, const QString &stashPath);
    void stashSymlink(const QString &realPath, const QString &stashPath);
    void stashDirectory(const QString &path);
    void stashCopy(const QUrl &src, const QUrl &dest);
    void statItem(const QUrl &url, const int &type);
    void createDirectory();
    void moveFromStash(const QUrl &src, const QUrl &dest);
    void deleteFromStash(const QUrl &url);
    void createTestFiles();
    void nukeStash(); // deletes every folder and file in stash:/

    QProcess *stashDaemonProcess;

    const QString tmpFolder;
    const QString m_fileTestFile;
    const QString m_fileTestFolder;
    const QString m_stashTestFolder;
    const QString m_stashTestSymlink;
    const QString m_stashTestFile;
    const QString m_stashTestFileInSubDirectory;
    const QString m_newStashFileName;
    const QString m_stashFileForRename;
    const QString m_absolutePath;

private slots:
    void initTestCase();
    void init();
    void copyFileToStash();
    void copyStashToFile();
    void copyStashToStash();
    void copySymlinkFromStashToFile();

    void moveToFileFromStash();

    void renameFileInStash();
    void statRoot();
    void statFileInRoot();
    void statDirectoryInRoot();
    void statSymlinkInRoot();
    void statFileInDirectory();

    void listRootDir();
    void listSubDir();

    void delRootFile();
    void delFileInDirectory();
    void delDirectory();

    void cleanup();
    void cleanupTestCase();
};

#endif
07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!500 blocks
openSUSE Build Service is sponsored by