summaryrefslogtreecommitdiffstats
path: root/app_templates/kioslave
diff options
context:
space:
mode:
Diffstat (limited to 'app_templates/kioslave')
-rw-r--r--app_templates/kioslave/AUTHORS1
-rw-r--r--app_templates/kioslave/COPYING340
-rw-r--r--app_templates/kioslave/ChangeLog0
-rw-r--r--app_templates/kioslave/INSTALL43
-rw-r--r--app_templates/kioslave/MANIFEST.in6
-rw-r--r--app_templates/kioslave/NEWS0
-rw-r--r--app_templates/kioslave/README0
-rw-r--r--app_templates/kioslave/TODO0
-rw-r--r--app_templates/kioslave/doc/en/index.docbook555
-rwxr-xr-xapp_templates/kioslave/setup.py30
-rw-r--r--app_templates/kioslave/src/kioslave.lsm16
-rw-r--r--app_templates/kioslave/src/kioslave.protocol13
-rwxr-xr-xapp_templates/kioslave/src/kioslave.py618
13 files changed, 1622 insertions, 0 deletions
diff --git a/app_templates/kioslave/AUTHORS b/app_templates/kioslave/AUTHORS
new file mode 100644
index 0000000..0463c0d
--- /dev/null
+++ b/app_templates/kioslave/AUTHORS
@@ -0,0 +1 @@
+$AUTHOR$ <$EMAIL$>
diff --git a/app_templates/kioslave/COPYING b/app_templates/kioslave/COPYING
new file mode 100644
index 0000000..c13faf0
--- /dev/null
+++ b/app_templates/kioslave/COPYING
@@ -0,0 +1,340 @@
+ 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) <year> <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) year 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.
diff --git a/app_templates/kioslave/ChangeLog b/app_templates/kioslave/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/ChangeLog
diff --git a/app_templates/kioslave/INSTALL b/app_templates/kioslave/INSTALL
new file mode 100644
index 0000000..b94cd85
--- /dev/null
+++ b/app_templates/kioslave/INSTALL
@@ -0,0 +1,43 @@
+Basic Installation
+==================
+These are generic installation instructions.
+
+This software uses the Python language's distutils system for installation.
+A detailed guide for users and system administrators to using distutils to
+install software can be found here:
+
+ http://docs.python.org/inst/inst.html
+
+The simplest way to install this software is to run the following command as
+the root user:
+
+ python setup.py install
+
+The setup.py script will automatically detect the directories to use for
+documentation, binaries and other software files.
+
+
+Uninstallation
+==============
+During installation setup.py creates list of files and directories that
+were installed in a file called install_log.txt.
+
+ python setup.py uninstall
+
+
+Installing into an alternate root
+=================================
+For packaging purposes it is often very useful to be able to install all files
+relative not to the usual root directory (/) but into an alternative
+directory.
+
+ python setup.py install --root=/tmp/alternativeroot/
+
+
+Operation Controls
+==================
+--verbose
+ Print more information about what setup.py is doing.
+
+--help
+ Print a summary of the options to setup.py, and exit.
diff --git a/app_templates/kioslave/MANIFEST.in b/app_templates/kioslave/MANIFEST.in
new file mode 100644
index 0000000..c2dde3f
--- /dev/null
+++ b/app_templates/kioslave/MANIFEST.in
@@ -0,0 +1,6 @@
+recursive-include doc *.docbook *.png
+recursive-include po *.po *.pot
+include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
+global-include *.desktop *.py *.ui *.png *.lsm
+global-exclude *~ .svn
+global-exclude *~ .cvs
diff --git a/app_templates/kioslave/NEWS b/app_templates/kioslave/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/NEWS
diff --git a/app_templates/kioslave/README b/app_templates/kioslave/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/README
diff --git a/app_templates/kioslave/TODO b/app_templates/kioslave/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/TODO
diff --git a/app_templates/kioslave/doc/en/index.docbook b/app_templates/kioslave/doc/en/index.docbook
new file mode 100644
index 0000000..325987f
--- /dev/null
+++ b/app_templates/kioslave/doc/en/index.docbook
@@ -0,0 +1,555 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY appname "<application>MyApplicaition 0.1</application>">
+ <!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
+ <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"><!-- change language only here -->
+
+
+ <!-- Do not define any other entities; instead, use the entities
+ from kde-genent.entities and $LANG/user.entities. -->
+]>
+<!-- kdoctemplate v0.8 October 1 1999
+ Minor update to "Credits and Licenses" section on August 24, 2000
+ Removed "Revision history" section on 22 January 2001
+ Changed to Installation/Help menu entities 18 October 2001
+ Other minor cleanup and changes 18 October 2001 -->
+
+
+<!--
+This template was designed by: David Rugge davidrugge@mindspring.com
+with lots of help from: Eric Bischoff ebisch@cybercable.tm.fr
+and Frederik Fouvry fouvry@sfs.nphil.uni-tuebingen.de
+of the KDE DocBook team.
+
+You may freely use this template for writing any sort of KDE documentation.
+If you have any changes or improvements, please let us know.
+
+Remember:
+- in XML, the case of the <tags> and attributes is relevant ;
+- also, quote all attributes.
+
+Please don't forget to remove all these comments in your final documentation,
+thanks ;-).
+-->
+
+<!-- ................................................................ -->
+
+<!-- The language must NOT be changed here. -->
+
+<book lang="&language;">
+
+<!-- This header contains all of the meta-information for the document such
+as Authors, publish date, the abstract, and Keywords -->
+
+<bookinfo>
+<title>The &appname; Handbook</title>
+
+<authorgroup>
+<author>
+<firstname></firstname>
+<othername></othername>
+<surname>%{AUTHOR}</surname>
+<affiliation>
+<address><email>%{EMAIL}</email></address>
+</affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>1999</year>
+<year>%{YEAR}</year>
+<holder>%{AUTHOR}</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
+ and in the FDL itself on how to use it. -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (YYYY-MM-DD) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+
+<date>2001-10-18</date>
+<releaseinfo>%{VERSION}</releaseinfo>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+&appname; is an application specially designed to do nothing you would
+ever want.
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>%{APPNAME}</keyword>
+<keyword>nothing</keyword>
+<keyword>nothing else</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- The contents of the documentation begin here. Label
+each chapter so with the id attribute. This is necessary for two reasons: it
+allows you to easily reference the chapter from other chapters of your
+document, and if there is no ID, the name of the generated HTML files will vary
+from time to time making it hard to manage for maintainers and for the CVS
+system. Any chapter labelled (OPTIONAL) may be left out at the author's
+discretion. Other chapters should not be left out in order to maintain a
+consistent documentation style across all KDE apps. -->
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<!-- The introduction chapter contains a brief introduction for the
+application that explains what it does and where to report
+problems. Basically a long version of the abstract. Don't include a
+revision history. (see installation appendix comment) -->
+
+<para>
+&appname; is a program that lets you do absolutely nothing. Please report
+any problems or feature requests to the &kde; mailing lists.
+</para>
+</chapter>
+
+<chapter id="using-appname">
+<title>Using &appname;</title>
+
+<!-- This chapter should tell the user how to use your app. You should use as
+many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
+your application. -->
+
+<para>
+
+<!-- Note that all graphics should be in .png format. Use no gifs because of
+patent issues. -->
+
+<screenshot>
+<screeninfo>Here's a screenshot of &appname;</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="screenshot.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+
+<sect1 id="appname-features">
+<title>More &appname; features</title>
+
+<para>It slices! It dices! and it comes with a free toaster!</para>
+<para>
+The Squiggle Tool <guiicon><inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="squiggle.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="squiggle.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Squiggle</phrase>
+ </textobject>
+</inlinemediaobject></guiicon> is used to draw squiggly lines all over
+the &appname; main window. It's not a bug, it's a feature!
+</para>
+
+</sect1>
+</chapter>
+
+<chapter id="commands">
+<title>Command Reference</title>
+
+<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
+application windows and their menubar and toolbar commands for easy reference.
+Also include any keys that have a special function but have no equivalent in the
+menus or toolbars. This may not be necessary for small apps or apps with no tool
+or menu bars. -->
+
+<sect1 id="appname-mainwindow">
+<title>The main &appname; window</title>
+
+<sect2>
+<title>The File Menu</title>
+<para>
+<variablelist>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>New</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Creates a new document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Save</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Saves the document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Quit</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Quits</action> &appname;</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+</sect2>
+
+<sect2>
+<title>The <guimenu>Help</guimenu> Menu</title>
+
+<!-- Assuming you have a standard help menu (help, what's this, about -->
+<!-- &appname;, about KDE) then the documentation is already written. -->
+<!-- The following entity is valid anywhere that a variablelist is -->
+<!-- valid. -->
+
+&help.menu.documentation;
+
+</sect2>
+
+</sect1>
+</chapter>
+
+<chapter id="developers">
+<title>Developer's Guide to &appname;</title>
+
+<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+used for apps that use plugins or that provide their own scripting hooks
+and/or development libraries. -->
+
+<para>
+Programming &appname; plugins is a joy to behold. Just read through the next
+66 pages of API's to learn how!
+</para>
+
+<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
+should consult the docbook reference for further details. The example below was
+taken from that reference and shortened a bit for readability. -->
+
+<refentry id="re-1007-unmanagechildren-1">
+<refmeta>
+<refentrytitle>XtUnmanageChildren</refentrytitle>
+<refmiscinfo>Xt - Geometry Management</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>XtUnmanageChildren
+</refname>
+<refpurpose>remove a list of children from a parent widget's managed
+list.
+<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
+<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
+</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv>
+<refsynopsisdivinfo>
+<date>4 March 1996</date>
+</refsynopsisdivinfo>
+<synopsis>
+void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
+ WidgetList <replaceable class="parameter">children</replaceable>;
+ Cardinal <replaceable class="parameter">num_children</replaceable>;
+</synopsis>
+
+<refsect2 id="r2-1007-unmanagechildren-1">
+<title>Inputs</title>
+<variablelist>
+<varlistentry>
+<term><replaceable class="parameter">children</replaceable>
+</term>
+<listitem>
+<para>Specifies an array of child widgets. Each child must be of
+class RectObj or any subclass thereof.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><replaceable class="parameter">num_children</replaceable>
+</term>
+<listitem>
+<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refsect2></refsynopsisdiv>
+
+<refsect1 id="r1-1007-unmanagechildren-1">
+<title>Description
+</title>
+<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
+and removes them from their parent's geometry management.
+The widgets will disappear from the screen, and (depending
+on its parent) may no longer have screen space allocated for
+them.
+</para>
+<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
+the same parent.
+</para>
+<para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+widget unmanagement procedure.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-2">
+<title>Usage</title>
+<para>Unmanaging widgets is the usual method for temporarily
+making them invisible. They can be re-managed with
+<function>XtManageChildren()</function>.
+</para>
+<para>You can unmap a widget, but leave it under geometry
+management by calling <function>XtUnmapWidget()</function>. You can
+destroy a widget's window without destroying the widget by
+calling <function>XtUnrealizeWidget()</function>. You can destroy a
+widget completely with <function>XtDestroyWidget()</function>.
+</para>
+<para>If you are only going to unmanage a single widget, it is
+more convenient to call <function>XtUnmanageChild()</function>. It is
+often more convenient to call <function>XtUnmanageChild()</function>
+several times than it is to declare and initialize an array
+of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+<function>XtUnmanageChildren()</function> is more efficient, however,
+because it only calls the parent's <function>change_managed()</function>
+method once.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-3">
+<title>Algorithm
+</title>
+<para><function>XtUnmanageChildren()</function> performs the following:
+</para>
+<variablelist>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Ignores the child if it already is unmanaged or is being
+destroyed.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Otherwise, if the child is realized, it makes it nonvisible
+by unmapping it.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-4">
+<title>Structures</title>
+<para>The <type>WidgetList</type> type is simply an array of widgets:
+</para>
+<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
+</screen>
+</refsect1>
+</refentry>
+
+</chapter>
+
+<chapter id="faq">
+<title>Questions and Answers</title>
+
+<!-- (OPTIONAL but recommended) This chapter should include all of the silly
+(and not-so-silly) newbie questions that fill up your mailbox. This chapter
+should be reserved for BRIEF questions and answers! If one question uses more
+than a page or so then it should probably be part of the
+"Using this Application" chapter instead. You should use links to
+cross-reference questions to the parts of your documentation that answer them.
+This is also a great place to provide pointers to other FAQ's if your users
+must do some complicated configuration on other programs in order for your
+application work. -->
+
+&reporting.bugs;
+&updating.documentation;
+
+<qandaset id="faqlist">
+<qandaentry>
+<question>
+<para>My Mouse doesn't work. How do I quit &appname;?</para>
+</question>
+<answer>
+<para>You silly goose! Check out the <link linkend="commands">Commands
+Section</link> for the answer.</para>
+</answer>
+</qandaentry>
+<qandaentry>
+<question>
+<para>Why can't I twiddle my documents?</para>
+</question>
+<answer>
+<para>You can only twiddle your documents if you have the foobar.lib
+installed.</para>
+</answer>
+</qandaentry>
+</qandaset>
+</chapter>
+
+<chapter id="credits">
+
+<!-- Include credits for the programmers, documentation writers, and
+contributors here. The license for your software should then be included below
+the credits with a reference to the appropriate license file included in the KDE
+distribution. -->
+
+<title>Credits and License</title>
+
+<para>
+&appname;
+</para>
+<para>
+Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+<para>
+Contributors:
+<itemizedlist>
+<listitem><para>Konqui the KDE Dragon <email>konqui@kde.org</email></para>
+</listitem>
+<listitem><para>Tux the Linux Penguin <email>tux@linux.org</email></para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+
+<!-- Determine which license your application is licensed under,
+ and delete all the remaining licenses below:
+
+ (NOTE: All documentation are licensed under the FDL,
+ regardless of what license the application uses) -->
+
+&underGPL; <!-- GPL License -->
+&underBSDLicense; <!-- BSD License -->
+&underArtisticLicense; <!-- BSD Artistic License -->
+&underX11License; <!-- X11 License -->
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-appname">
+<title>How to obtain &appname;</title>
+
+<!-- This first entity contains boiler plate for applications that are
+part of KDE CVS. You should remove it if you are releasing your
+application -->
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="requirements">
+<title>Requirements</title>
+
+<!--
+List any special requirements for your application here. This should include:
+.Libraries or other software that is not included in kdesupport,
+kdelibs, or kdebase.
+.Hardware requirements like amount of RAM, disk space, graphics card
+capabilities, screen resolution, special expansion cards, etc.
+.Operating systems the app will run on. If your app is designed only for a
+specific OS, (you wrote a graphical LILO configurator for example) put this
+information here.
+-->
+
+<para>
+In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
+required in order to support the advanced &appname; features. &appname; uses
+about 5 megs of memory to run, but this may vary depending on your
+platform and configuration.
+</para>
+
+<para>
+All required libraries as well as &appname; itself can be found
+on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
+</para>
+
+<!-- For a list of updates, you may refer to the application web site
+or the ChangeLog file, or ... -->
+<para>
+You can find a list of changes at <ulink
+url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
+</para>
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+<!-- This entity contains the boilerplate text for standard -->
+<!-- compilation instructions. If your application requires any -->
+<!-- special handling, remove it, and replace with your own text. -->
+
+&install.compile.documentation;
+
+</sect1>
+
+<sect1 id="configuration">
+<title>Configuration</title>
+
+<para>Don't forget to tell your system to start the <filename>dtd</filename>
+dicer-toaster daemon first, or &appname; won't work !</para>
+
+</sect1>
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+-->
+
diff --git a/app_templates/kioslave/setup.py b/app_templates/kioslave/setup.py
new file mode 100755
index 0000000..f9b9e30
--- /dev/null
+++ b/app_templates/kioslave/setup.py
@@ -0,0 +1,30 @@
+#!/usr/bin/python
+###########################################################################
+# setup - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : YOUR@EMAIL.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. #
+# #
+###########################################################################
+
+import kdedistutils
+
+kdedistutils.setup(name="kioslave",
+ version="0.1.0",
+ author="AUTHOR",
+ author_email="YOUR@EMAIL.com",
+ url="http://www.TESTAPP.com/",
+ min_kde_version = "3.0.0",
+ min_qt_version = "3.0.0",
+ license = "GPL",
+ application_data = ['src/kioslave.py'],
+ docbooks = [ ('doc/en','en') ],
+ kioslaves = [ ('src/kioslave.protocol','kioslave.py')] )
diff --git a/app_templates/kioslave/src/kioslave.lsm b/app_templates/kioslave/src/kioslave.lsm
new file mode 100644
index 0000000..43d0d5f
--- /dev/null
+++ b/app_templates/kioslave/src/kioslave.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: $APPNAME$ -- Some description
+Version: $VERSION$
+Entered-date:
+Description:
+Keywords: KDE Qt
+Author: $AUTHOR$ <$EMAIL$>
+Maintained-by: $AUTHOR$ <$EMAIL$>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx $APPNAMELC$-$VERSION$.tar.gz
+ xxx $APPNAMELC$-$VERSION$.lsm
+Platform: Linux. Needs KDE
+Copying-policy: $LICENSE$
+End
diff --git a/app_templates/kioslave/src/kioslave.protocol b/app_templates/kioslave/src/kioslave.protocol
new file mode 100644
index 0000000..01dc5bb
--- /dev/null
+++ b/app_templates/kioslave/src/kioslave.protocol
@@ -0,0 +1,13 @@
+[Protocol]
+exec=kioslave
+protocol=kioslave
+input=none
+output=filesystem
+listing=Name,Type,Size,Date
+reading=true
+writing=true
+makedir=true
+deleting=true
+linking=false
+moving=true
+maxInstances=1
diff --git a/app_templates/kioslave/src/kioslave.py b/app_templates/kioslave/src/kioslave.py
new file mode 100755
index 0000000..63e34f0
--- /dev/null
+++ b/app_templates/kioslave/src/kioslave.py
@@ -0,0 +1,618 @@
+#!/usr/bin/python
+###########################################################################
+# kioslave - description #
+# ------------------------------ #
+# begin : Mon May 2 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : your@email.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. #
+# #
+###########################################################################
+
+# Import the required Qt and KDE modules.
+from qt import *
+from kio import *
+from kdecore import *
+import os, time
+
+# For debugging purposes, import the sys and traceback modules.
+import sys, traceback
+
+DEBUG = 1
+
+# Define a class which will be used to create IOSlave instances.
+############################################################################
+class SlaveClass(KIO.SlaveBase):
+ """SlaveClass(KIO.SlaveBase)
+
+ See kdelibs/kio/kio/slavebase.h for virtual functions to override.
+ """
+
+ ########################################################################
+ def __init__(self, pool, app):
+ # We must call the initialisation method of the base class.
+ KIO.SlaveBase.__init__(self, "kioslave", pool, app)
+
+ # Attach the DCOP client object associated with this IOSlave to the
+ # DCOP server.
+ self.dcopClient().attach()
+
+ self.debug("dcopClient: %i" % self.dcopClient().isRegistered())
+
+ self.contents = RAMDir(None,u"/")
+
+ self.host = ""
+ self.document = None
+ self.file = None
+
+ self.debug("Exiting __init__ now");
+
+ ########################################################################
+ def __del__(self):
+ pass
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def setHost(self, host, port, user, passwd):
+ self.debug(
+ "setHost: %s %s %s %s" % (
+ repr(unicode(host)), repr(unicode(port)),
+ repr(unicode(user)), repr(unicode(passwd))
+ )
+ )
+
+ # This IOSlave does not allow a host to be specified as part of
+ # a URL.
+ if unicode(host) != u"":
+ self.closeConnection()
+ self.error(KIO.ERR_MALFORMED_URL, host)
+ return
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def openConnection(self):
+ # Don't call self.finished() in this method.
+ self.debug("openConnection")
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def closeConnection(self):
+ # Don't call self.finished() in this method.
+ self.debug("closeConnection")
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def get(self, url):
+ path = str(url.path())
+ self.debug("get(): %s" % path)
+ self.openConnection()
+
+ item = self.contents.resolve(path)
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ if item.isDir():
+ self.error(KIO.ERR_IS_DIRECTORY, path)
+
+ self.totalSize(len(item.getData()))
+ self.data(QByteArray(item.getData()))
+
+ # The end of the data string.
+ self.data(QByteArray())
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def put(self, url, permissions, overwrite, resume):
+ self.debug("put")
+ self.openConnection()
+
+ path = str(url.path())
+ parts = path.split('/')
+ filename = parts[-1]
+ parent_dir = self.contents.resolveParent(path)
+ if parent_dir is None:
+ parent_path = '/'.join(parts[:-1])
+ self.error(KIO.ERR_DOES_NOT_EXIST, parent_path)
+ return
+
+ if parent_dir.contains(filename):
+ if not overwrite:
+ self.error(KIO.ERR_COULD_NOT_WRITE, parent_path)
+ return
+ else:
+ parent_dir.unlink(filename)
+
+ # Read data from the application.
+ bytearray = QByteArray()
+ bytes = 0
+ data = ""
+
+ while True:
+ self.dataReq()
+ result = self.readData(bytearray)
+
+ if result <= 0:
+ # An error or the end of data was encountered.
+ break
+
+ # The number of bytes read is given in the result.
+ bytes = bytes + result
+ data = data + str(bytearray)
+
+ parent_dir.insert(RAMFile(parent_dir,filename,data))
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def stat(self, url):
+ self.debug("stat: %s" % url.url(0,0))
+ self.openConnection()
+
+ self.debug("path:%s"% url.path())
+
+ # Return info the for the root.
+ item = self.contents.resolve(str(url.path()))
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, str(url.path()))
+ return
+
+ self.statEntry(item.getStatEntry())
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def mimetype(self, url):
+ self.debug("mimetype: %s" % unicode(url))
+ self.openConnection()
+
+ path = str(url.path())
+ item = self.contents.resolve(path)
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ self.mimeType(item.getMimetype())
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def listDir(self, url):
+ # The "url" argument is a kdecore.KURL object.
+ self.debug("listDir: %s" % str(url.prettyURL(0)))
+ self.openConnection()
+
+ path = str(url.path())
+ dir = self.contents.resolve(path)
+ if dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ if not dir.isDir():
+ self.error(KIO.ERR_IS_FILE, path)
+ return
+
+ for entry in dir.listDir():
+ self.listEntry(entry, 0)
+
+ self.listEntry([], 1) # Signal that the list is finished.
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def mkdir(self, url, permissions):
+ self.debug("mkdir")
+ self.openConnection()
+
+ parent_path = str(url.path())
+ parent_dir = self.contents.resolveParent(parent_path)
+ if parent_dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, parent_path)
+ return
+
+ new_dir_obj = parent_dir.mkdir(parent_path.split('/')[-1])
+ if new_dir_obj is None:
+ self.error(KIO.ERR_COULD_NOT_MKDIR, parent_path)
+ return
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def rename(self, src, dest, overwrite):
+ self.debug("rename: %s %s" % (src.path(), dest.path()))
+ self.openConnection()
+
+ src_path = str(src.path())
+ src_obj = self.contents.resolve(src_path)
+ if src_obj is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, src_path)
+ return
+
+ # See if the destination path already exists.
+ dest_path = str(dest.path())
+ dest_obj = self.contents.resolve(dest_path)
+ if dest_obj is not None:
+ if dest_obj is src_obj:
+ self.finished() # Done already.
+ return
+
+ if not overwrite:
+ # Can't overwrite. not bad.
+ self.error(KIO.ERR_CANNOT_RENAME, dest_path)
+ return
+ else:
+ # Over write, just remove the object.
+ dest_obj.getParent().unlink(dest_obj.getName())
+
+ dest_dir = self.contents.resolveParent(dest_path)
+ if dest_dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, dest_path)
+ return
+
+ src_obj.getParent().unlink(src_obj)
+ src_obj.setName(dest_path.split('/')[-1])
+ dest_dir.insert(src_obj)
+
+ self.finished()
+
+ # Other possible file operations are represented by the following
+ # methods which are not implemented.
+
+ #def symlink(self, target, dest, overwrite):
+ # debug("symlink")
+ # ...
+ # self.finished()
+
+ #def chmod(self, url, permissions):
+ # debug("chmod")
+ # ...
+ # self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def copy(self, src, dest, permissions, overwrite):
+ self.debug("copy")
+ self.openConnection()
+
+ src_path = str(src.path())
+ src_obj = self.contents.resolve(src_path)
+ if src_obj is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, src_path)
+ return
+
+ # See if the destination path already exists.
+ dest_path = str(dest.path())
+ dest_obj = self.contents.resolve(dest_path)
+ if dest_obj is not None:
+ if dest_obj is src_obj:
+ self.finished() # Done already.
+ return
+
+ if not overwrite:
+ # Can't overwrite. not bad.
+ self.error(KIO.ERR_COULD_NOT_WRITE, dest_path)
+ return
+ else:
+ # Over write, just remove the object.
+ dest_obj.getParent().unlink(dest_obj.getName())
+
+ dest_dir = self.contents.resolveParent(dest_path)
+ if dest_dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, dest_path)
+ return
+
+ new_obj = src_obj.copy()
+ new_obj.setName(dest_path.split('/')[-1])
+ dest_dir.insert(new_obj)
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def del_(self, url, isfile):
+ self.debug("del_")
+ self.openConnection()
+
+ path = str(url.path())
+ item = self.contents.resolve(path)
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ item.getParent().unlink(item.getName())
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def disconnectSlave(self):
+ self.debug("disconnectSlave")
+ return
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def dispatchLoop(self):
+ self.debug("dispatchLoop")
+ KIO.SlaveBase.dispatchLoop(self)
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def error(self,errid,text):
+ self.debug("error: %i, %s" % (errid,text) )
+ KIO.SlaveBase.error(self,errid,text)
+
+ ############################################################################
+ def debug(self,msg):
+ if DEBUG == 0: return
+ print "kioslave:"+str(msg)+"\n"
+ sys.stdout.flush()
+
+############################################################################
+class RAMDir(object):
+ ############################################################################
+ def __init__(self,parent,name):
+ self.contents = {}
+ self.parent = parent
+ self.name = str(name)
+
+ ############################################################################
+ def getParent(self):
+ return self.parent
+
+ ############################################################################
+ def setParent(self,parent):
+ self.parent = parent
+
+ ############################################################################
+ def getName(self):
+ return self.name
+
+ ############################################################################
+ def setName(self,name):
+ self.name = str(name)
+
+ ############################################################################
+ def resolve(self,path):
+ while path.endswith('/'):
+ path = path[:-1]
+ while path.startswith('/'):
+ path = path[1:]
+
+ if path=='':
+ return self
+
+ parts = path.split('/')
+ self.debug(path)
+ for item in self.contents.keys():
+ self.debug("keys:"+item)
+
+ if parts[0] in self.contents:
+ return self.contents[parts[0]].resolve('/'.join(parts[1:]))
+ self.debug("CHECKPOINT 1")
+ return None
+
+ ############################################################################
+ def resolveParent(self,path):
+ while path.endswith('/'):
+ path = path[:-1]
+ while path.startswith('/'):
+ path = path[1:]
+
+ if path=="":
+ return None
+
+ parts = path.split('/')
+ return self.resolve('/'.join(parts[:-1]))
+
+ ############################################################################
+ def mkdir(self,name):
+ if name in self.contents:
+ return None
+ new_dir = RAMDir(self,name)
+ self.contents[name] = new_dir
+ return new_dir
+
+ ############################################################################
+ def getStatEntry(self):
+ # Return info the for the root.
+ length = 0
+
+ entry = []
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_NAME
+ atom.m_str = self.name
+ #debug("name: %s" % name)
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_SIZE
+ atom.m_long = length
+ #debug("length: %i" % length)
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MODIFICATION_TIME
+ # Number of seconds since the epoch.
+ atom.m_long = int(time.time())
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_ACCESS
+ # The usual octal permission information (rw-r--r-- in this case).
+ atom.m_long = 0644
+ entry.append(atom)
+
+ # If the stat method is implemented then entries _must_ include
+ # the UDE_FILE_TYPE atom or the whole system may not work at all.
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_FILE_TYPE
+ #atom.m_long = os.path.stat.S_IFREG
+ atom.m_long = os.path.stat.S_IFDIR
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MIME_TYPE
+ atom.m_str = self.getMimetype()
+ entry.append(atom)
+
+ return entry
+
+ ############################################################################
+ def listDir(self):
+ list = []
+ for item in self.contents.values():
+ list.append(item.getStatEntry())
+ return list
+
+ ############################################################################
+ def isDir(self):
+ return True
+
+ ############################################################################
+ def insert(self,item):
+ self.contents[item.getName()] = item
+
+ ############################################################################
+ def contains(self,name):
+ return name in self.contents
+
+ ############################################################################
+ def unlink(self,name):
+ if str(name) in self.contents:
+ del self.contents[str(name)]
+
+ ############################################################################
+ def debug(self,msg):
+ if DEBUG == 0: return
+
+ print "kioslave:"+str(msg)+"\n"
+ sys.stdout.flush()
+
+ ############################################################################
+ def getMimetype(self):
+ return "inode/directory"
+
+ ############################################################################
+ def copy(self):
+ new_dir = RAMDir(None,self.name)
+
+ for item in self.contents.values():
+ new_item = item.copy()
+ new_item.setParent(new_dir)
+ new_dir.insert(new_item)
+
+ return new_dir
+
+############################################################################
+class RAMFile(object):
+ ############################################################################
+ def __init__(self,parent,name,data=None):
+ self.parent = parent
+ self.name = str(name)
+ self.data = data
+
+ ############################################################################
+ def getParent(self):
+ return self.parent
+
+ ############################################################################
+ def setParent(self,parent):
+ self.parent = parent
+
+ ############################################################################
+ def getName(self):
+ return self.name
+
+ ############################################################################
+ def setName(self,name):
+ self.name = str(name)
+
+ ############################################################################
+ def resolve(self,path):
+ if path!="":
+ return None
+ return self
+
+ ############################################################################
+ def getData(self):
+ return self.data
+
+ ############################################################################
+ def resolveParent(self,path):
+ return None
+
+ ############################################################################
+ def getStatEntry(self):
+ # Return info the for the root.
+ length = 0
+
+ entry = []
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_NAME
+ atom.m_str = self.name
+ #debug("name: %s" % name)
+ entry.append(atom)
+
+ length = 0
+ if self.data is not None:
+ length = len(self.data)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_SIZE
+ atom.m_long = length
+ #debug("length: %i" % length)
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MODIFICATION_TIME
+ # Number of seconds since the epoch.
+ atom.m_long = int(time.time())
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_ACCESS
+ # The usual octal permission information (rw-r--r-- in this case).
+ atom.m_long = 0644
+ entry.append(atom)
+
+ # If the stat method is implemented then entries _must_ include
+ # the UDE_FILE_TYPE atom or the whole system may not work at all.
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_FILE_TYPE
+ atom.m_long = os.path.stat.S_IFREG
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MIME_TYPE
+ atom.m_str = self.getMimetype()
+ entry.append(atom)
+
+ return entry
+
+ ############################################################################
+ def isDir(self):
+ return False
+
+ ############################################################################
+ def getMimetype(self):
+ return "text/html"
+
+ ############################################################################
+ def copy(self):
+ return RAMFile(None,self.name,self.data)
+
+############################################################################
+def SlaveFactory(pool, app):
+ slave = SlaveClass(pool, app)
+ slave.dispatchLoop()