Index: pykoticon/trunk/tests/test.py
===================================================================
--- pykoticon/trunk/tests/test.py (revision 176)
+++ pykoticon/trunk/tests/test.py (revision 3439)
@@ -1,4 +1,4 @@
 #! /usr/bin/env python
-# -*- coding: ISO-8859-15 -*-
+# -*- coding: iso-8859-15 -*-
 
 # PyKotIcon - Client side helper for PyKota and other applications
@@ -14,5 +14,5 @@
 # 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
@@ -43,19 +43,19 @@
     # Opens the connection to the PyKotIcon server :
     server = xmlrpclib.ServerProxy("http://%s:%s" % (arguments[0], arguments[1]))
-    
+
     # Now display something on the PyKotIcon host :
     message1 = "You are about to test PyKotIcon\n\nPyKotIcon is really great software !"
     server.showDialog(xmlrpclib.Binary(message1.encode("UTF-8")), False)
-    
-    # Now ask the end user if he really wants to do this : 
+
+    # Now ask the end user if he really wants to do this :
     message2 = "Are you sure you want to do this ?"
     result = server.showDialog(xmlrpclib.Binary(message2.encode("UTF-8")), True)
     print "The remote user said : %s" % result
-    
+
     # Displays the answer back :
     answer = "You have clicked on the %s button" % result
     server.showDialog(xmlrpclib.Binary(answer.encode("UTF-8")), False)
-    
-    # Now we will ask some datas : 
+
+    # Now we will ask some datas :
     result = server.askDatas([xmlrpclib.Binary(v) for v in ["Username", "Password", "Country"]], \
                              ["username", "password", "country"], \
@@ -68,27 +68,27 @@
         answer = "You answered :\n%s" % "\n".join(["%s => '%s'" % (k, v.data) for (k, v) in result.items() if k != "isValid"])
         server.showDialog(xmlrpclib.Binary(answer.encode("UTF-8")), False)
-    else :    
+    else :
         print "The answers are not valid."
-        
-    # Now do nothing :    
+
+    # Now do nothing :
     server.nop()
-        
+
     # Finally we will cause PyKotIcon to die
     message3 = "As soon as you'll click on the button below, PyKotIcon will die."
     server.showDialog(xmlrpclib.Binary(message3.encode("UTF-8")), False)
     server.quitApplication()
-    
+
     # That's all folks !
     print
     print "This demo is finished. Did you like it ?"
-        
+
 if __name__ == "__main__" :
     if len(sys.argv) < 3 :
         sys.stderr.write("usage : %s pykoticon_hostname_or_ip_address pykoticon_TCPPort\n" % sys.argv[0])
-    else :    
+    else :
         try :
             main(sys.argv[1:])
-        except socket.error, msg :    
+        except socket.error, msg :
             sys.stderr.write("ERROR : Network error : %s\n" % msg)
             sys.stderr.write("Are you sure that PyKotIcon is running and accepts incoming connections ?\n")
-            
+
Index: pykoticon/trunk/TODO
===================================================================
--- pykoticon/trunk/TODO (revision 181)
+++ pykoticon/trunk/TODO (revision 3439)
@@ -22,19 +22,19 @@
 TODO, in no particular order :
 
-    - Add a way to provide an additional text when using 
+    - Add a way to provide an additional text when using
       pknotify --ask.
-      
-    - Don't display anything or even initialize the graphical interface  
+
+    - Don't display anything or even initialize the graphical interface
       until an incoming connection is received : this will allow
       a single instance to be launched and choose its display
       at connection time for use on terminal servers.
-      
-    - Add a command line parameter to control the window's modal/modeless  
+
+    - Add a command line parameter to control the window's modal/modeless
       mode. The default will not be modal in any case.
-      
+
     - SSL or other encryption support.
-    
+
     - Fix focus problem reported by some people.
-    
+
 ============================================================
 
Index: pykoticon/trunk/setup.py
===================================================================
--- pykoticon/trunk/setup.py (revision 176)
+++ pykoticon/trunk/setup.py (revision 3439)
@@ -1,4 +1,4 @@
 #! /usr/bin/env python
-# -*- coding: ISO-8859-15 -*-
+# -*- coding: iso-8859-15 -*-
 
 """Packaging and installation script for PyKotIcon."""
@@ -16,5 +16,5 @@
 # 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
@@ -36,11 +36,11 @@
         sys.stderr.write("py2exe is not installed ! ABORTING.\n")
         sys.exit(-1)
-    else :    
+    else :
         directory = os.sep.join(["share", "pykoticon"])
         mandir = os.sep.join(["share", "man", "man1"])
-        manpages = glob.glob(os.sep.join(["man", "*.1"]))    
+        manpages = glob.glob(os.sep.join(["man", "*.1"]))
         initialdatafiles = [(mandir, manpages)]
         withPy2EXE = False
-else :        
+else :
     directory = "."
     initialdatafiles = []
@@ -48,5 +48,5 @@
 
 config = imp.load_source("config", os.path.join("bin", "pykoticon"))
-setupDictionary = { "name" : "pykoticon", 
+setupDictionary = { "name" : "pykoticon",
                     "version" : config.__version__,
                     "license" : config.__license__,
Index: pykoticon/trunk/bin/pykoticon
===================================================================
--- pykoticon/trunk/bin/pykoticon (revision 180)
+++ pykoticon/trunk/bin/pykoticon (revision 3439)
@@ -1,4 +1,4 @@
 #! /usr/bin/env python
-# -*- coding: ISO-8859-15 -*-
+# -*- coding: iso-8859-15 -*-
 
 """PyKotIcon is a generic, networked, cross-platform dialog box manager."""
@@ -16,5 +16,5 @@
 # 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
@@ -45,5 +45,5 @@
 try :
     import optparse
-except ImportError :    
+except ImportError :
     sys.stderr.write("You need Python v2.3 or higher for PyKotIcon to work.\nAborted.\n")
     sys.exit(-1)
@@ -53,20 +53,20 @@
     try :
         import win32api
-    except ImportError :    
+    except ImportError :
         raise ImportError, "Mark Hammond's Win32 Extensions are missing. Please install them."
-    else :    
+    else :
         iconsdir = os.path.split(sys.argv[0])[0]
-else :        
+else :
     isWindows = False
     iconsdir = "/usr/share/pykoticon"   # TODO : change this
     import pwd
-    
-try :    
+
+try :
     import wx
     hasWxPython = True
-except ImportError :    
+except ImportError :
     hasWxPython = False
     raise ImportError, "wxPython is missing. Please install it."
-    
+
 aboutbox = """PyKotIcon v%(__version__)s (c) 2003-2006 %(__author__)s - %(__author_email__)s
 
@@ -98,8 +98,8 @@
         try :
             SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self)
-        except TypeError :    
+        except TypeError :
             SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self, False, None)
         SocketServer.ThreadingTCPServer.__init__(self, addr, requestHandler)
-        
+
 class MyXMLRPCServer(ThreadedXMLRPCServer) :
     """My own server class."""
@@ -119,29 +119,29 @@
         loop = threading.Thread(target=self.mainloop)
         loop.start()
-        
-    def logDebug(self, message) :    
+
+    def logDebug(self, message) :
         """Logs a debug message if debug mode is active."""
         if self.debug :
             sys.stderr.write("%s\n" % message)
-            
+
     def getAnswerFromCache(self, key) :
         """Tries to extract a value from the cache and returns it if still valid."""
         cacheentry = self.cache.get(key)
         if cacheentry is not None :
-            (birth, value) = cacheentry 
+            (birth, value) = cacheentry
             if (time.time() - birth) < self.cacheduration :
                 self.logDebug("Cache hit for %s" % str(key))
                 return value # NB : we don't extend the life of this entry
-            else :    
+            else :
                 self.logDebug("Cache expired for %s" % str(key))
-        else :        
+        else :
             self.logDebug("Cache miss for %s" % str(key))
         return None
-        
-    def storeAnswerInCache(self, key, value) :    
+
+    def storeAnswerInCache(self, key, value) :
         """Stores an entry in the cache."""
         self.cache[key] = (time.time(), value)
         self.logDebug("Cache store for %s" % str(key))
-        
+
     def export_askDatas(self, labels, varnames, varvalues) :
         """Asks some textual datas defined by a list of labels, a list of variables' names and a list of variables values in a mapping."""
@@ -149,5 +149,5 @@
         for (key, value) in varvalues.items() :
             values[key] = self.frame.UTF8ToUserCharset(value.data)
-        cachekey = tuple(values.items())  
+        cachekey = tuple(values.items())
         retcode = self.getAnswerFromCache(cachekey)
         if (retcode is None) or (not retcode["isValid"]) :
@@ -158,5 +158,5 @@
             while self.frame.dialogAnswer is None :
                 time.sleep(0.1)
-            retcode = self.frame.dialogAnswer    
+            retcode = self.frame.dialogAnswer
             for (key, value) in retcode.items() :
                 if key != "isValid" :
@@ -165,11 +165,11 @@
             self.storeAnswerInCache(cachekey, retcode)
         return retcode
-        
-    def export_quitApplication(self) :    
+
+    def export_quitApplication(self) :
         """Makes the application quit."""
         self.frame.quitEvent.set()
         wx.CallAfter(self.frame.OnClose, None)
         return True
-        
+
     def export_showDialog(self, message, yesno) :
         """Opens a notification or confirmation dialog."""
@@ -178,20 +178,20 @@
         while self.frame.dialogAnswer is None :
             time.sleep(0.1)
-        retcode = self.frame.dialogAnswer    
+        retcode = self.frame.dialogAnswer
         self.frame.dialogAnswer = None # prepare for next call, just in case
         return retcode
-        
-    def export_nop(self) :    
+
+    def export_nop(self) :
         """Does nothing, but allows a clean shutdown from the frame itself."""
         return True
-        
-    def _dispatch(self, method, params) :    
+
+    def _dispatch(self, method, params) :
         """Ensure that only export_* methods are available."""
         return getattr(self, "export_%s" % method)(*params)
-        
-    def handle_error(self, request, client_address) :    
+
+    def handle_error(self, request, client_address) :
         """Doesn't display an ugly traceback in case an error occurs."""
         self.logDebug("An exception occured while handling an incoming request from %s:%s" % (client_address[0], client_address[1]))
-        
+
     def verify_request(self, request, client_address) :
         """Ensures that requests which don't come from the print server are rejected."""
@@ -204,5 +204,5 @@
             self.logDebug("%s rejected." % client)
             return False
-        
+
     def mainloop(self) :
         """XML-RPC Server's main loop."""
@@ -213,8 +213,8 @@
         while not self.frame.quitEvent.isSet() :
             self.handle_request()
-        self.server_close()    
+        self.server_close()
         sys.exit(0)
-    
-    
+
+
 class GenericInputDialog(wx.Dialog) :
     """Generic input dialog box."""
@@ -233,7 +233,7 @@
             try :
                 label = labels[i]
-            except IndexError :    
+            except IndexError :
                 label = ""
-            labelid = wx.NewId()    
+            labelid = wx.NewId()
             varid = wx.NewId()
             labelst = wx.StaticText(self, labelid, label)
@@ -242,11 +242,11 @@
             else :
                 variable = wx.TextCtrl(self, varid, varvalues.get(varname, ""))
-            self.variables.append(variable)    
+            self.variables.append(variable)
             hsizer = wx.BoxSizer(wx.HORIZONTAL)
             hsizer.Add(labelst, 0, wx.ALIGN_CENTER | wx.ALIGN_RIGHT | wx.ALL, 5)
             hsizer.Add(variable, 0, wx.ALIGN_CENTER | wx.ALIGN_LEFT | wx.ALL, 5)
             vsizer.Add(hsizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
-            
-        okbutton = wx.Button(self, wx.ID_OK, "OK")    
+
+        okbutton = wx.Button(self, wx.ID_OK, "OK")
         vsizer.Add(okbutton, 0, wx.ALIGN_CENTER | wx.ALL, 5)
         if self.variables :
@@ -255,6 +255,6 @@
         self.SetSizerAndFit(vsizer)
         self.Layout()
-        
-        
+
+
 class PyKotIcon(wx.Frame):
     """Main class."""
@@ -265,5 +265,5 @@
                size = (0, 0), \
                style = wx.FRAME_NO_TASKBAR | wx.NO_FULL_REPAINT_ON_RESIZE)
-                     
+
     def getCurrentUserName(self) :
         """Retrieves the current user's name."""
@@ -271,9 +271,9 @@
             if isWindows :
                 return win32api.GetUserName()
-            else :    
+            else :
                 return pwd.getpwuid(os.geteuid())[0]
         except :
             return "** Unknown **"
-            
+
     def OnIconify(self, event) :
         """Iconify/De-iconify the application."""
@@ -299,5 +299,5 @@
             self.Destroy()
             return True
-        else :    
+        else :
             # self.quitIsForbidden()
             return False
@@ -310,6 +310,6 @@
         """React to close from the taskbar."""
         self.Close()
-            
-    def quitIsForbidden(self) :        
+
+    def quitIsForbidden(self) :
         """Displays a message indicating that quitting the application is not allowed."""
         message = _("Sorry, this was forbidden by your system administrator.")
@@ -319,14 +319,14 @@
         dialog.ShowModal()
         dialog.Destroy()
-        
-    def OnAbout(self, event) :    
+
+    def OnAbout(self, event) :
         """Displays the about box."""
         dialog = wx.MessageDialog(self, aboutbox % globals(), \
                                         _("About"), \
                                         wx.OK | wx.ICON_INFORMATION)
-        dialog.Raise()                                        
+        dialog.Raise()
         dialog.ShowModal()
         dialog.Destroy()
-        
+
     def showDialog(self, message, yesno) :
         """Opens a notification dialog."""
@@ -338,10 +338,10 @@
             caption = _("Information")
             style = wx.OK | wx.ICON_INFORMATION
-        style |= wx.STAY_ON_TOP    
+        style |= wx.STAY_ON_TOP
         dialog = wx.MessageDialog(self, message, caption, style)
         dialog.Raise()
         self.dialogAnswer = ((dialog.ShowModal() == wx.ID_NO) and "CANCEL") or "OK"
         dialog.Destroy()
-        
+
     def askDatas(self, labels, varnames, varvalues) :
         """Opens a dialog box asking for data entry."""
@@ -354,5 +354,5 @@
             for i in range(len(varnames)) :
                 retvalues[varnames[i]] = dialog.variables[i].GetValue()
-        else :        
+        else :
             retvalues["isValid"] = False
             for k in varvalues.keys() :
@@ -360,24 +360,24 @@
         self.dialogAnswer = retvalues
         dialog.Destroy()
-        
-    def closeServer(self) :    
+
+    def closeServer(self) :
         """Tells the xml-rpc server to exit."""
         if not self.quitEvent.isSet() :
             self.quitEvent.set()
-        server = xmlrpclib.ServerProxy("http://localhost:%s" % self.options.port)    
+        server = xmlrpclib.ServerProxy("http://localhost:%s" % self.options.port)
         try :
-            # wake the server with an empty request 
+            # wake the server with an empty request
             # for it to see the event object
             # which has just been set
             server.nop()
-        except :    
+        except :
             # Probably already stopped
             pass
-        
-    def postInit(self, charset, options, arguments) :    
+
+    def postInit(self, charset, options, arguments) :
         """Starts the XML-RPC server."""
         self.charset = charset
         self.options = options
-        
+
         self.tbicon = wx.TaskBarIcon()
         self.greenicon = wx.Icon(os.path.join(iconsdir, "pykoticon-green.ico"), \
@@ -386,8 +386,8 @@
                                   wx.BITMAP_TYPE_ICO)
         self.tbicon.SetIcon(self.greenicon, "PyKotIcon")
-        
+
         wx.EVT_TASKBAR_LEFT_DCLICK(self.tbicon, self.OnTaskBarActivate)
         wx.EVT_TASKBAR_RIGHT_UP(self.tbicon, self.OnTaskBarMenu)
-        
+
         self.TBMENU_ABOUT = wx.NewId()
         self.TBMENU_RESTORE = wx.NewId()
@@ -408,21 +408,21 @@
         self.Show(True)
         self.Hide()
-        
+
         self.quitEvent = threading.Event()
         self.server = MyXMLRPCServer(self, options, arguments)
-        
+
     def UTF8ToUserCharset(self, text) :
         """Converts from UTF-8 to user's charset."""
         if text is not None :
             try :
-                return text.decode("UTF-8").encode(self.charset, "replace") 
-            except (UnicodeError, AttributeError) :    
+                return text.decode("UTF-8").encode(self.charset, "replace")
+            except (UnicodeError, AttributeError) :
                 try :
                     # Maybe already in Unicode
-                    return text.encode(self.charset, "replace") 
+                    return text.encode(self.charset, "replace")
                 except (UnicodeError, AttributeError) :
                     pass # Don't know what to do
         return text
-        
+
     def userCharsetToUTF8(self, text) :
         """Converts from user's charset to UTF-8."""
@@ -432,13 +432,13 @@
             except (UnicodeError, AttributeError) :
                 try :
-                    return text.decode(self.charset, "replace").encode("UTF-8") 
-                except (UnicodeError, AttributeError) :    
+                    return text.decode(self.charset, "replace").encode("UTF-8")
+                except (UnicodeError, AttributeError) :
                     try :
                         # Maybe already in Unicode
-                        return text.encode("UTF-8", "replace") 
+                        return text.encode("UTF-8", "replace")
                     except (UnicodeError, AttributeError) :
                         pass # Don't know what to do
         return text
-        
+
 
 class PyKotIconApp(wx.App):
@@ -448,10 +448,10 @@
         self.SetTopWindow(self.frame)
         return True
-        
-    def postInit(self, charset, options, arguments) :    
+
+    def postInit(self, charset, options, arguments) :
         """Continues processing."""
         self.frame.postInit(charset, options, arguments)
-        
-        
+
+
 def main() :
     """Program's entry point."""
@@ -464,5 +464,5 @@
     language = language or "C"
     charset = ((sys.platform != "win32") and charset) or locale.getpreferredencoding()
-    
+
     # translation stuff
     try :
@@ -474,27 +474,27 @@
     except :
         gettext.NullTranslations().install()
-    
-    
+
+
     parser = optparse.OptionParser(usage="pykoticon [options] server1 [server2 ...]")
-    parser.add_option("-v", "--version", 
-                            action="store_true", 
+    parser.add_option("-v", "--version",
+                            action="store_true",
                             dest="version",
                             help=_("show PyKotIcon's version number and exit."))
-    parser.add_option("-c", "--cache", 
-                            type="int", 
-                            default=0, 
+    parser.add_option("-c", "--cache",
+                            type="int",
+                            default=0,
                             dest="cache",
                             help=_("the duration of the cache in seconds to keep input forms' datas in memory. Defaults to 0 second, meaning no cache."))
-    parser.add_option("-d", "--debug", 
-                            action="store_true", 
+    parser.add_option("-d", "--debug",
+                            action="store_true",
                             dest="debug",
                             help=_("activate debug mode."))
-    parser.add_option("-p", "--port", 
-                            type="int", 
-                            default=7654, 
+    parser.add_option("-p", "--port",
+                            type="int",
+                            default=7654,
                             dest="port",
                             help=_("the TCP port PyKotIcon will listen to, default is 7654."))
-    parser.add_option("-q", "--allowquit", 
-                            action="store_true", 
+    parser.add_option("-q", "--allowquit",
+                            action="store_true",
                             dest="allowquit",
                             help=_("allow the end user to close the application."))
@@ -505,13 +505,13 @@
         if not (1024 <= options.port <= 65535) :
             sys.stderr.write(_("The TCP port number specified for --port must be between 1024 and 65535.\n"))
-        elif not (0 <= options.cache <= 86400) :    
+        elif not (0 <= options.cache <= 86400) :
             sys.stderr.write(_("The duration specified for --cache must be between 0 and 86400 seconds.\n"))
-        else :    
+        else :
             app = PyKotIconApp()
             app.postInit(charset, options, arguments)
             app.MainLoop()
-    
-    
+
+
 if __name__ == '__main__':
     main()
-    
+
Index: pykoticon/trunk/clean.sh
===================================================================
--- pykoticon/trunk/clean.sh (revision 141)
+++ pykoticon/trunk/clean.sh (revision 3439)
@@ -13,5 +13,5 @@
 # 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
Index: pykoticon/trunk/man/genman.sh
===================================================================
--- pykoticon/trunk/man/genman.sh (revision 176)
+++ pykoticon/trunk/man/genman.sh (revision 3439)
@@ -14,7 +14,7 @@
 # $Id$
 #
-for prog in pykoticon ; do 
+for prog in pykoticon ; do
     echo $prog ;
-    help2man --no-info --section=1 --manual "User Commands" --source="C@LL - Conseil Internet & Logiciels Libres" --output=$prog.1 $prog ; 
+    help2man --no-info --section=1 --manual "User Commands" --source="C@LL - Conseil Internet & Logiciels Libres" --output=$prog.1 $prog ;
     echo ;
 done
Index: pykoticon/trunk/NEWS
===================================================================
--- pykoticon/trunk/NEWS (revision 177)
+++ pykoticon/trunk/NEWS (revision 3439)
@@ -23,35 +23,35 @@
 
   - 1.03 (2007-01-26) :
-    
+
     - Can now accept several requests concurrently, which may
       help with terminal servers.
-      
+
     - Fixed a focus problem.
-    
+
     - Rewrote the tests/test.py program to give a better
       experience to testers.
-      
+
   - 1.02 (2006-06-07) :
-    
+
     - Added the --cache command line option to specify the time in
       seconds during which input forms' content will be cached.
       This allows people to avoid retyping their username and
       password for each print job, for example.
-      
+
     - Doesn't display the Quit menu anymore if not allowed.
-    
-    - Doesn't display the ugly traceback anymore when the client  
+
+    - Doesn't display the ugly traceback anymore when the client
       disconnects before the server has sent the answer back
       (pknotify --timeout).
-      
+
   - 1.01 (2006-05-01) :
-      
-    - Now accepts command line options.    
-    
+
+    - Now accepts command line options.
+
     - Less ugly when run under *nix.
-    
+
     - Debug mode off by default.
-    
-  - 1.00 (2006-03-23) : 
-  
+
+  - 1.00 (2006-03-23) :
+
     - First release
Index: pykoticon/trunk/CREDITS
===================================================================
--- pykoticon/trunk/CREDITS (revision 180)
+++ pykoticon/trunk/CREDITS (revision 3439)
@@ -22,3 +22,3 @@
     - Georger Araujo : Fixed a charset encoding problem under MS-Windows.
     - Rodolfo Cossalter : Fixed a problem under MS-Windows 98/Me.
-    
+
Index: pykoticon/trunk/README
===================================================================
--- pykoticon/trunk/README (revision 176)
+++ pykoticon/trunk/README (revision 3439)
@@ -22,20 +22,20 @@
 PyKotIcon is a cross-platform client-side helper for PyKota.
 
-It is meant to be launched whenever the user logs in, and stay in 
-the taskbar (depending on the client operating system) until the 
-user closes his session. 
-  
+It is meant to be launched whenever the user logs in, and stay in
+the taskbar (depending on the client operating system) until the
+user closes his session.
+
 Installation :
 
   * GNU/Linux and similar :
-  
+
     $ cd pykoticon
     $ python setup.py install
-    
+
     Then modify your .xsession file, or the appropriate file depending
     on your desktop environment, to ensure that the pykoticon command
     is launched in the background each time your X Window session
     starts.
-    
+
     You MUST pass the list of hostnames or IP addresses from which
     PyKotIcon should accept incoming connexions on pykoticon's
@@ -44,31 +44,31 @@
     hostnames or IP addresses of ALL print servers on pykoticon's
     command line.
-    
+
     NB : `pykoticon --help` will give you hints about the expected
     command line parameters.
-    
-  * MS Windows :  
-  
-    Download pykoticon-x.yy.zip from 
-    
+
+  * MS Windows :
+
+    Download pykoticon-x.yy.zip from
+
         http://www.pykota.com/software/pykoticon/download/tarballs/
-        
-    Unzip it into a directory of its own. I usually unzip it into    
+
+    Unzip it into a directory of its own. I usually unzip it into
     /var/lib/samba/netlogon/pykoticon/
-    
+
     Modify the PYKOTICON.VBS file to include the list of authorized
     print servers and change other parameters as needed, as explained
     in the GNU/Linux section above.
-    
+
     Ensure that PYKOTICON.VBS is executed each time an user logs
     in. The easiest way to do this is in STARTUP.CMD :
-    
+
       --- CUT ---
       SET PATH=%PATH%;\\MYSERVER\NETLOGON\PYKOTICON\
-      \\MYSERVER\NETLOGON\PYKOTICON\PYKOTICON.VBS 
+      \\MYSERVER\NETLOGON\PYKOTICON\PYKOTICON.VBS
       --- CUT ---
-      
+
     NB : if you launch PYKOTICON.EXE directly instead of from
-    PYKOTICON.VBS, a small but disturbing window may appear on 
+    PYKOTICON.VBS, a small but disturbing window may appear on
     the screen.
 
@@ -84,82 +84,82 @@
   independant of PyKota, and can be used from any application
   which can do remote procedure calls over XML-RPC.
-  
+
   PyKotIcon exposes 4 of its methods over XML-RPC, here they are :
-  
+
     - nop :
-    
+
       This methods does exactly nothing :)
-      
+
       - Input : No argument.
-      
+
       - Output : returns the True boolean value.
-      
-    - quitApplication :  
-    
+
+    - quitApplication :
+
       This method causes the PyKotIcon application to exit.
-      
+
       - Input : No argument.
-      
+
       - Output : returns the True boolean value.
-          
-    - showDialog :  
-   
+
+    - showDialog :
+
       This methods displays an informational message, and returns
       the choice the user made, if any.
-       
-      - Input : 
-        
-        - message : a Binary XML-RPC object representing an UTF-8 encoded 
-          character string which will be displayed to the end user. 
-          This string can contain literal "\n" sequences which will 
+
+      - Input :
+
+        - message : a Binary XML-RPC object representing an UTF-8 encoded
+          character string which will be displayed to the end user.
+          This string can contain literal "\n" sequences which will
           be automatically expanded into line breaks by PyKotIcon.
-          
-        - confirmation : a boolean value indicating if the user will  
+
+        - confirmation : a boolean value indicating if the user will
           be given the choice to valid or cancel (True), or only
           to valid (False) the dialog box.
-            
-      - Output :      
-      
+
+      - Output :
+
         - the literal string "OK" if the user clicked on the OK button,
           else the literal string "CANCEL". The latter is only possible
           if the method was called with its second parameter set to
           True.
-        
-    - askDatas :      
-    
+
+    - askDatas :
+
       This method can generate an input form and return what the user
       entered in the different fields.
-      
+
       - Input :
-      
-        - An array of labels, one label per input field in the 
+
+        - An array of labels, one label per input field in the
           form to be created. Each label in the list is passed as
           a Binary XML-RPC object representing an UTF-8 encoded
           character string.
-          
+
         - An array of variables names, one name per input field in
           the form to be created. Each name in the list is passed
-          as an ASCII encoded character string. 
+          as an ASCII encoded character string.
           IMPORTANT : if one of these names is 'password' then this
-          particular field's input box will be visually protected 
+          particular field's input box will be visually protected
           with * in place of the characters typed during input.
-          
-        - An associative array (e.g. Python mapping) of initial values. 
+
+        - An associative array (e.g. Python mapping) of initial values.
           Each key is a variable name which must be present in the list
           above, and each value is a possibly empty initial content,
-          which will be passed as a Binary XML-RPC object representing 
+          which will be passed as a Binary XML-RPC object representing
           an UTF-8 encoded character string.
-      
+
       - Output :
-      
+
         - An associative array (e.g. Python mapping) containing the
           variables names as keys and the variables' contents as
           values in the following format :
-          
+
           - Each key is an ASCII encoded character string representing
-            the name of a variable to ask which was passed from the 
+            the name of a variable to ask which was passed from the
             caller.
-            
-          - Each value is a Binary XML-RPC object representing an UTF-8  
+
+          - Each value is a Binary XML-RPC object representing an UTF-8
             encoded character string, itself being the result of user
             input in the form's field for this particular variable.
@@ -173,13 +173,13 @@
             In this case, all the other values are empty strings
             anyway.
-            
-            
-IMPORTANT : PyKotIcon doesn't currently support encrypted connexions,            
+
+
+IMPORTANT : PyKotIcon doesn't currently support encrypted connexions,
 so if you're afraid of sensitive information flying in the clear
-over the nework, you should probably install a transparent secure 
+over the nework, you should probably install a transparent secure
 tunneling software like stunnel on both sides of each connection.
 
 ====================================================================
-    
+
 Please e-mail bugs to the PyKota mailing list at : pykota@librelogiciel.com
 or to the main author at : alet@librelogiciel.com (Jerome Alet)
