Changed file format for saved login data to XML.

Sat, 03 Mar 2012 17:42:42 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 03 Mar 2012 17:42:42 +0100
changeset 1685
7640d5500966
parent 1683
ef9a9e86269e
child 1686
bd756cb42d5b

Changed file format for saved login data to XML.

APIs/Python3/eric5.api file | annotate | diff | comparison | revisions
APIs/Python3/eric5.bas file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.Passwords.LoginForm.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.Passwords.PasswordManager.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.Passwords.PasswordReader.html file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.Passwords.PasswordWriter.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric5.Helpviewer.Passwords.html file | annotate | diff | comparison | revisions
Helpviewer/Passwords/LoginForm.py file | annotate | diff | comparison | revisions
Helpviewer/Passwords/PasswordManager.py file | annotate | diff | comparison | revisions
Helpviewer/Passwords/PasswordReader.py file | annotate | diff | comparison | revisions
Helpviewer/Passwords/PasswordWriter.py file | annotate | diff | comparison | revisions
eric5.e4p file | annotate | diff | comparison | revisions
i18n/eric5_cs.ts file | annotate | diff | comparison | revisions
i18n/eric5_de.ts file | annotate | diff | comparison | revisions
i18n/eric5_en.ts file | annotate | diff | comparison | revisions
i18n/eric5_es.ts file | annotate | diff | comparison | revisions
i18n/eric5_fr.ts file | annotate | diff | comparison | revisions
i18n/eric5_it.ts file | annotate | diff | comparison | revisions
i18n/eric5_ru.ts file | annotate | diff | comparison | revisions
i18n/eric5_tr.ts file | annotate | diff | comparison | revisions
i18n/eric5_zh_CN.GB2312.ts file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric5.api	Wed Feb 29 20:09:55 2012 +0100
+++ b/APIs/Python3/eric5.api	Sat Mar 03 17:42:42 2012 +0100
@@ -2446,10 +2446,8 @@
 eric5.Helpviewer.OpenSearch.OpenSearchWriter.OpenSearchWriter?1()
 eric5.Helpviewer.PageScreenDialog.PageScreenDialog.on_buttonBox_clicked?4(button)
 eric5.Helpviewer.PageScreenDialog.PageScreenDialog?1(view, parent=None)
-eric5.Helpviewer.Passwords.PasswordManager.LoginForm.isValid?4()
-eric5.Helpviewer.Passwords.PasswordManager.LoginForm.load?4(data)
-eric5.Helpviewer.Passwords.PasswordManager.LoginForm.save?4(f)
-eric5.Helpviewer.Passwords.PasswordManager.LoginForm?1()
+eric5.Helpviewer.Passwords.LoginForm.LoginForm.isValid?4()
+eric5.Helpviewer.Passwords.LoginForm.LoginForm?1()
 eric5.Helpviewer.Passwords.PasswordManager.PasswordManager.FORMS?7
 eric5.Helpviewer.Passwords.PasswordManager.PasswordManager.NEVER?7
 eric5.Helpviewer.Passwords.PasswordManager.PasswordManager.SEPARATOR?7
@@ -2478,6 +2476,10 @@
 eric5.Helpviewer.Passwords.PasswordModel.PasswordModel.setShowPasswords?4(on)
 eric5.Helpviewer.Passwords.PasswordModel.PasswordModel.showPasswords?4()
 eric5.Helpviewer.Passwords.PasswordModel.PasswordModel?1(manager, parent=None)
+eric5.Helpviewer.Passwords.PasswordReader.PasswordReader.read?4(fileNameOrDevice)
+eric5.Helpviewer.Passwords.PasswordReader.PasswordReader?1()
+eric5.Helpviewer.Passwords.PasswordWriter.PasswordWriter.write?4(fileNameOrDevice, logins, forms, nevers)
+eric5.Helpviewer.Passwords.PasswordWriter.PasswordWriter?1()
 eric5.Helpviewer.Passwords.PasswordsDialog.PasswordsDialog.on_passwordsButton_clicked?4()
 eric5.Helpviewer.Passwords.PasswordsDialog.PasswordsDialog?1(parent=None)
 eric5.Helpviewer.QtHelpDocumentationDialog.QtHelpDocumentationDialog.getTabsToClose?4()
--- a/APIs/Python3/eric5.bas	Wed Feb 29 20:09:55 2012 +0100
+++ b/APIs/Python3/eric5.bas	Sat Mar 03 17:42:42 2012 +0100
@@ -55,7 +55,7 @@
 BrowserSysPathItem BrowserItem
 ChangeBookmarkCommand QUndoCommand
 ChatWidget QWidget Ui_ChatWidget
-Class ClbrBaseClasses.Class VisibilityMixin
+Class ClbrBase
 ClassItem UMLItem
 ClassScope Scope
 ClbrBase _ClbrBase
@@ -394,6 +394,8 @@
 PageThumbnailer QObject
 PasswordManager QObject
 PasswordModel QAbstractTableModel
+PasswordReader QXmlStreamReader
+PasswordWriter QXmlStreamWriter
 PasswordsDialog QDialog Ui_PasswordsDialog
 Pep8Checker pep8.Checker
 Pep8CheckerPlugin QObject
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Wed Feb 29 20:09:55 2012 +0100
+++ b/Documentation/Help/source.qhp	Sat Mar 03 17:42:42 2012 +0100
@@ -271,8 +271,11 @@
               <section title="eric5.Helpviewer.OpenSearch.OpenSearchWriter" ref="eric5.Helpviewer.OpenSearch.OpenSearchWriter.html" />
             </section>
             <section title="eric5.Helpviewer.Passwords" ref="index-eric5.Helpviewer.Passwords.html">
+              <section title="eric5.Helpviewer.Passwords.LoginForm" ref="eric5.Helpviewer.Passwords.LoginForm.html" />
               <section title="eric5.Helpviewer.Passwords.PasswordManager" ref="eric5.Helpviewer.Passwords.PasswordManager.html" />
               <section title="eric5.Helpviewer.Passwords.PasswordModel" ref="eric5.Helpviewer.Passwords.PasswordModel.html" />
+              <section title="eric5.Helpviewer.Passwords.PasswordReader" ref="eric5.Helpviewer.Passwords.PasswordReader.html" />
+              <section title="eric5.Helpviewer.Passwords.PasswordWriter" ref="eric5.Helpviewer.Passwords.PasswordWriter.html" />
               <section title="eric5.Helpviewer.Passwords.PasswordsDialog" ref="eric5.Helpviewer.Passwords.PasswordsDialog.html" />
             </section>
             <section title="eric5.Helpviewer.SiteInfo" ref="index-eric5.Helpviewer.SiteInfo.html">
@@ -6181,11 +6184,10 @@
       <keyword name="LogViewer.appendToStderr" id="LogViewer.appendToStderr" ref="eric5.UI.LogView.html#LogViewer.appendToStderr" />
       <keyword name="LogViewer.appendToStdout" id="LogViewer.appendToStdout" ref="eric5.UI.LogView.html#LogViewer.appendToStdout" />
       <keyword name="LogViewer.preferencesChanged" id="LogViewer.preferencesChanged" ref="eric5.UI.LogView.html#LogViewer.preferencesChanged" />
-      <keyword name="LoginForm" id="LoginForm" ref="eric5.Helpviewer.Passwords.PasswordManager.html#LoginForm" />
-      <keyword name="LoginForm (Constructor)" id="LoginForm (Constructor)" ref="eric5.Helpviewer.Passwords.PasswordManager.html#LoginForm.__init__" />
-      <keyword name="LoginForm.isValid" id="LoginForm.isValid" ref="eric5.Helpviewer.Passwords.PasswordManager.html#LoginForm.isValid" />
-      <keyword name="LoginForm.load" id="LoginForm.load" ref="eric5.Helpviewer.Passwords.PasswordManager.html#LoginForm.load" />
-      <keyword name="LoginForm.save" id="LoginForm.save" ref="eric5.Helpviewer.Passwords.PasswordManager.html#LoginForm.save" />
+      <keyword name="LoginForm" id="LoginForm" ref="eric5.Helpviewer.Passwords.LoginForm.html#LoginForm" />
+      <keyword name="LoginForm (Constructor)" id="LoginForm (Constructor)" ref="eric5.Helpviewer.Passwords.LoginForm.html#LoginForm.__init__" />
+      <keyword name="LoginForm (Module)" id="LoginForm (Module)" ref="eric5.Helpviewer.Passwords.LoginForm.html" />
+      <keyword name="LoginForm.isValid" id="LoginForm.isValid" ref="eric5.Helpviewer.Passwords.LoginForm.html#LoginForm.isValid" />
       <keyword name="MasterPasswordEntryDialog" id="MasterPasswordEntryDialog" ref="eric5.Preferences.ConfigurationPages.MasterPasswordEntryDialog.html#MasterPasswordEntryDialog" />
       <keyword name="MasterPasswordEntryDialog (Constructor)" id="MasterPasswordEntryDialog (Constructor)" ref="eric5.Preferences.ConfigurationPages.MasterPasswordEntryDialog.html#MasterPasswordEntryDialog.__init__" />
       <keyword name="MasterPasswordEntryDialog (Module)" id="MasterPasswordEntryDialog (Module)" ref="eric5.Preferences.ConfigurationPages.MasterPasswordEntryDialog.html" />
@@ -6735,6 +6737,7 @@
       <keyword name="PasswordManager.__extractMultipartQueryItems" id="PasswordManager.__extractMultipartQueryItems" ref="eric5.Helpviewer.Passwords.PasswordManager.html#PasswordManager.__extractMultipartQueryItems" />
       <keyword name="PasswordManager.__findForm" id="PasswordManager.__findForm" ref="eric5.Helpviewer.Passwords.PasswordManager.html#PasswordManager.__findForm" />
       <keyword name="PasswordManager.__load" id="PasswordManager.__load" ref="eric5.Helpviewer.Passwords.PasswordManager.html#PasswordManager.__load" />
+      <keyword name="PasswordManager.__loadNonXml" id="PasswordManager.__loadNonXml" ref="eric5.Helpviewer.Passwords.PasswordManager.html#PasswordManager.__loadNonXml" />
       <keyword name="PasswordManager.__stripUrl" id="PasswordManager.__stripUrl" ref="eric5.Helpviewer.Passwords.PasswordManager.html#PasswordManager.__stripUrl" />
       <keyword name="PasswordManager.allSiteNames" id="PasswordManager.allSiteNames" ref="eric5.Helpviewer.Passwords.PasswordManager.html#PasswordManager.allSiteNames" />
       <keyword name="PasswordManager.clear" id="PasswordManager.clear" ref="eric5.Helpviewer.Passwords.PasswordManager.html#PasswordManager.clear" />
@@ -6761,6 +6764,23 @@
       <keyword name="PasswordModel.rowCount" id="PasswordModel.rowCount" ref="eric5.Helpviewer.Passwords.PasswordModel.html#PasswordModel.rowCount" />
       <keyword name="PasswordModel.setShowPasswords" id="PasswordModel.setShowPasswords" ref="eric5.Helpviewer.Passwords.PasswordModel.html#PasswordModel.setShowPasswords" />
       <keyword name="PasswordModel.showPasswords" id="PasswordModel.showPasswords" ref="eric5.Helpviewer.Passwords.PasswordModel.html#PasswordModel.showPasswords" />
+      <keyword name="PasswordReader" id="PasswordReader" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader" />
+      <keyword name="PasswordReader (Constructor)" id="PasswordReader (Constructor)" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader.__init__" />
+      <keyword name="PasswordReader (Module)" id="PasswordReader (Module)" ref="eric5.Helpviewer.Passwords.PasswordReader.html" />
+      <keyword name="PasswordReader.__readForms" id="PasswordReader.__readForms" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader.__readForms" />
+      <keyword name="PasswordReader.__readLogins" id="PasswordReader.__readLogins" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader.__readLogins" />
+      <keyword name="PasswordReader.__readNevers" id="PasswordReader.__readNevers" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader.__readNevers" />
+      <keyword name="PasswordReader.__readPasswords" id="PasswordReader.__readPasswords" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader.__readPasswords" />
+      <keyword name="PasswordReader.__skipUnknownElement" id="PasswordReader.__skipUnknownElement" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader.__skipUnknownElement" />
+      <keyword name="PasswordReader.read" id="PasswordReader.read" ref="eric5.Helpviewer.Passwords.PasswordReader.html#PasswordReader.read" />
+      <keyword name="PasswordWriter" id="PasswordWriter" ref="eric5.Helpviewer.Passwords.PasswordWriter.html#PasswordWriter" />
+      <keyword name="PasswordWriter (Constructor)" id="PasswordWriter (Constructor)" ref="eric5.Helpviewer.Passwords.PasswordWriter.html#PasswordWriter.__init__" />
+      <keyword name="PasswordWriter (Module)" id="PasswordWriter (Module)" ref="eric5.Helpviewer.Passwords.PasswordWriter.html" />
+      <keyword name="PasswordWriter.__write" id="PasswordWriter.__write" ref="eric5.Helpviewer.Passwords.PasswordWriter.html#PasswordWriter.__write" />
+      <keyword name="PasswordWriter.__writeForms" id="PasswordWriter.__writeForms" ref="eric5.Helpviewer.Passwords.PasswordWriter.html#PasswordWriter.__writeForms" />
+      <keyword name="PasswordWriter.__writeLogins" id="PasswordWriter.__writeLogins" ref="eric5.Helpviewer.Passwords.PasswordWriter.html#PasswordWriter.__writeLogins" />
+      <keyword name="PasswordWriter.__writeNevers" id="PasswordWriter.__writeNevers" ref="eric5.Helpviewer.Passwords.PasswordWriter.html#PasswordWriter.__writeNevers" />
+      <keyword name="PasswordWriter.write" id="PasswordWriter.write" ref="eric5.Helpviewer.Passwords.PasswordWriter.html#PasswordWriter.write" />
       <keyword name="Passwords (Package)" id="Passwords (Package)" ref="index-eric5.Helpviewer.Passwords.html" />
       <keyword name="PasswordsDialog" id="PasswordsDialog" ref="eric5.Helpviewer.Passwords.PasswordsDialog.html#PasswordsDialog" />
       <keyword name="PasswordsDialog (Constructor)" id="PasswordsDialog (Constructor)" ref="eric5.Helpviewer.Passwords.PasswordsDialog.html#PasswordsDialog.__init__" />
@@ -11770,8 +11790,11 @@
       <file>eric5.Helpviewer.OpenSearch.OpenSearchReader.html</file>
       <file>eric5.Helpviewer.OpenSearch.OpenSearchWriter.html</file>
       <file>eric5.Helpviewer.PageScreenDialog.html</file>
+      <file>eric5.Helpviewer.Passwords.LoginForm.html</file>
       <file>eric5.Helpviewer.Passwords.PasswordManager.html</file>
       <file>eric5.Helpviewer.Passwords.PasswordModel.html</file>
+      <file>eric5.Helpviewer.Passwords.PasswordReader.html</file>
+      <file>eric5.Helpviewer.Passwords.PasswordWriter.html</file>
       <file>eric5.Helpviewer.Passwords.PasswordsDialog.html</file>
       <file>eric5.Helpviewer.QtHelpDocumentationDialog.html</file>
       <file>eric5.Helpviewer.QtHelpFiltersDialog.html</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric5.Helpviewer.Passwords.LoginForm.html	Sat Mar 03 17:42:42 2012 +0100
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Helpviewer.Passwords.LoginForm</title>
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric5.Helpviewer.Passwords.LoginForm</h1>
+<p>
+Module implementing a data structure for login forms.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#LoginForm">LoginForm</a></td>
+<td>Class implementing a data structure for login forms.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="LoginForm" ID="LoginForm"></a>
+<h2>LoginForm</h2>
+<p>
+    Class implementing a data structure for login forms.
+</p>
+<h3>Derived from</h3>
+object
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#LoginForm.__init__">LoginForm</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#LoginForm.isValid">isValid</a></td>
+<td>Public method to test for validity.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="LoginForm.__init__" ID="LoginForm.__init__"></a>
+<h4>LoginForm (Constructor)</h4>
+<b>LoginForm</b>(<i></i>)
+<p>
+        Constructor
+</p><a NAME="LoginForm.isValid" ID="LoginForm.isValid"></a>
+<h4>LoginForm.isValid</h4>
+<b>isValid</b>(<i></i>)
+<p>
+        Public method to test for validity.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a valid form (boolean)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/eric5.Helpviewer.Passwords.PasswordManager.html	Wed Feb 29 20:09:55 2012 +0100
+++ b/Documentation/Source/eric5.Helpviewer.Passwords.PasswordManager.html	Sat Mar 03 17:42:42 2012 +0100
@@ -31,9 +31,6 @@
 <h3>Classes</h3>
 <table>
 <tr>
-<td><a href="#LoginForm">LoginForm</a></td>
-<td>Class implementing a data structure for login forms.</td>
-</tr><tr>
 <td><a href="#PasswordManager">PasswordManager</a></td>
 <td>Class implementing the password manager.</td>
 </tr>
@@ -43,89 +40,6 @@
 <tr><td>None</td></tr>
 </table>
 <hr /><hr />
-<a NAME="LoginForm" ID="LoginForm"></a>
-<h2>LoginForm</h2>
-<p>
-    Class implementing a data structure for login forms.
-</p>
-<h3>Derived from</h3>
-object
-<h3>Class Attributes</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Class Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-<table>
-<tr>
-<td><a href="#LoginForm.__init__">LoginForm</a></td>
-<td>Constructor</td>
-</tr><tr>
-<td><a href="#LoginForm.isValid">isValid</a></td>
-<td>Public method to test for validity.</td>
-</tr><tr>
-<td><a href="#LoginForm.load">load</a></td>
-<td>Public method to load the form data from a file.</td>
-</tr><tr>
-<td><a href="#LoginForm.save">save</a></td>
-<td>Public method to save the form data to a file.</td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-<table>
-<tr><td>None</td></tr>
-</table>
-<a NAME="LoginForm.__init__" ID="LoginForm.__init__"></a>
-<h4>LoginForm (Constructor)</h4>
-<b>LoginForm</b>(<i></i>)
-<p>
-        Constructor
-</p><a NAME="LoginForm.isValid" ID="LoginForm.isValid"></a>
-<h4>LoginForm.isValid</h4>
-<b>isValid</b>(<i></i>)
-<p>
-        Public method to test for validity.
-</p><dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a valid form (boolean)
-</dd>
-</dl><a NAME="LoginForm.load" ID="LoginForm.load"></a>
-<h4>LoginForm.load</h4>
-<b>load</b>(<i>data</i>)
-<p>
-        Public method to load the form data from a file.
-</p><dl>
-<dt><i>data</i></dt>
-<dd>
-list of strings to load data from (list of strings)
-</dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating success (boolean)
-</dd>
-</dl><a NAME="LoginForm.save" ID="LoginForm.save"></a>
-<h4>LoginForm.save</h4>
-<b>save</b>(<i>f</i>)
-<p>
-        Public method to save the form data to a file.
-</p><dl>
-<dt><i>f</i></dt>
-<dd>
-file or file like object open for writing
-</dd>
-</dl><dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating success (booelan)
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr /><hr />
 <a NAME="PasswordManager" ID="PasswordManager"></a>
 <h2>PasswordManager</h2>
 <p>
@@ -168,6 +82,9 @@
 <td><a href="#PasswordManager.__load">__load</a></td>
 <td>Private method to load the saved login credentials.</td>
 </tr><tr>
+<td><a href="#PasswordManager.__loadNonXml">__loadNonXml</a></td>
+<td>Private method to load non-XML password files.</td>
+</tr><tr>
 <td><a href="#PasswordManager.__stripUrl">__stripUrl</a></td>
 <td>Private method to strip off all unneeded parts of a URL.</td>
 </tr><tr>
@@ -291,7 +208,20 @@
 <b>__load</b>(<i></i>)
 <p>
         Private method to load the saved login credentials.
-</p><a NAME="PasswordManager.__stripUrl" ID="PasswordManager.__stripUrl"></a>
+</p><a NAME="PasswordManager.__loadNonXml" ID="PasswordManager.__loadNonXml"></a>
+<h4>PasswordManager.__loadNonXml</h4>
+<b>__loadNonXml</b>(<i>loginFile</i>)
+<p>
+        Private method to load non-XML password files.
+</p><p>
+        This method is to convert from the old, non-XML format to the new
+        XML based format.
+</p><dl>
+<dt><i>loginFile</i></dt>
+<dd>
+name of the non-XML password file (string)
+</dd>
+</dl><a NAME="PasswordManager.__stripUrl" ID="PasswordManager.__stripUrl"></a>
 <h4>PasswordManager.__stripUrl</h4>
 <b>__stripUrl</b>(<i>url</i>)
 <p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric5.Helpviewer.Passwords.PasswordReader.html	Sat Mar 03 17:42:42 2012 +0100
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Helpviewer.Passwords.PasswordReader</title>
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric5.Helpviewer.Passwords.PasswordReader</h1>
+<p>
+Module implementing a class to read login data files.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PasswordReader">PasswordReader</a></td>
+<td>Class implementing a reader object for login data files.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PasswordReader" ID="PasswordReader"></a>
+<h2>PasswordReader</h2>
+<p>
+    Class implementing a reader object for login data files.
+</p>
+<h3>Derived from</h3>
+QXmlStreamReader
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#PasswordReader.__init__">PasswordReader</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PasswordReader.__readForms">__readForms</a></td>
+<td>Private method to read the forms information.</td>
+</tr><tr>
+<td><a href="#PasswordReader.__readLogins">__readLogins</a></td>
+<td>Private method to read the login information.</td>
+</tr><tr>
+<td><a href="#PasswordReader.__readNevers">__readNevers</a></td>
+<td>Private method to read the never URLs.</td>
+</tr><tr>
+<td><a href="#PasswordReader.__readPasswords">__readPasswords</a></td>
+<td>Private method to read and parse the login data file.</td>
+</tr><tr>
+<td><a href="#PasswordReader.__skipUnknownElement">__skipUnknownElement</a></td>
+<td>Private method to skip over all unknown elements.</td>
+</tr><tr>
+<td><a href="#PasswordReader.read">read</a></td>
+<td>Public method to read an XBEL bookmark file.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PasswordReader.__init__" ID="PasswordReader.__init__"></a>
+<h4>PasswordReader (Constructor)</h4>
+<b>PasswordReader</b>(<i></i>)
+<p>
+        Constructor
+</p><a NAME="PasswordReader.__readForms" ID="PasswordReader.__readForms"></a>
+<h4>PasswordReader.__readForms</h4>
+<b>__readForms</b>(<i></i>)
+<p>
+        Private method to read the forms information.
+</p><a NAME="PasswordReader.__readLogins" ID="PasswordReader.__readLogins"></a>
+<h4>PasswordReader.__readLogins</h4>
+<b>__readLogins</b>(<i></i>)
+<p>
+        Private method to read the login information.
+</p><a NAME="PasswordReader.__readNevers" ID="PasswordReader.__readNevers"></a>
+<h4>PasswordReader.__readNevers</h4>
+<b>__readNevers</b>(<i></i>)
+<p>
+        Private method to read the never URLs.
+</p><a NAME="PasswordReader.__readPasswords" ID="PasswordReader.__readPasswords"></a>
+<h4>PasswordReader.__readPasswords</h4>
+<b>__readPasswords</b>(<i></i>)
+<p>
+        Private method to read and parse the login data file.
+</p><a NAME="PasswordReader.__skipUnknownElement" ID="PasswordReader.__skipUnknownElement"></a>
+<h4>PasswordReader.__skipUnknownElement</h4>
+<b>__skipUnknownElement</b>(<i></i>)
+<p>
+        Private method to skip over all unknown elements.
+</p><a NAME="PasswordReader.read" ID="PasswordReader.read"></a>
+<h4>PasswordReader.read</h4>
+<b>read</b>(<i>fileNameOrDevice</i>)
+<p>
+        Public method to read an XBEL bookmark file.
+</p><dl>
+<dt><i>fileNameOrDevice</i></dt>
+<dd>
+name of the file to read (string)
+            or reference to the device to read (QIODevice)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing the logins, forms and never URLs
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric5.Helpviewer.Passwords.PasswordWriter.html	Sat Mar 03 17:42:42 2012 +0100
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
+'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html><head>
+<title>eric5.Helpviewer.Passwords.PasswordWriter</title>
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric5.Helpviewer.Passwords.PasswordWriter</h1>
+<p>
+Module implementing a class to write login data files.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PasswordWriter">PasswordWriter</a></td>
+<td>Class implementing a writer object to generate login data files.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="PasswordWriter" ID="PasswordWriter"></a>
+<h2>PasswordWriter</h2>
+<p>
+    Class implementing a writer object to generate login data files.
+</p>
+<h3>Derived from</h3>
+QXmlStreamWriter
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#PasswordWriter.__init__">PasswordWriter</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#PasswordWriter.__write">__write</a></td>
+<td>Private method to write an login data file.</td>
+</tr><tr>
+<td><a href="#PasswordWriter.__writeForms">__writeForms</a></td>
+<td>Private method to write forms data.</td>
+</tr><tr>
+<td><a href="#PasswordWriter.__writeLogins">__writeLogins</a></td>
+<td>Private method to write the login data.</td>
+</tr><tr>
+<td><a href="#PasswordWriter.__writeNevers">__writeNevers</a></td>
+<td>Private method to write the URLs never to store login data for.</td>
+</tr><tr>
+<td><a href="#PasswordWriter.write">write</a></td>
+<td>Public method to write an login data file.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="PasswordWriter.__init__" ID="PasswordWriter.__init__"></a>
+<h4>PasswordWriter (Constructor)</h4>
+<b>PasswordWriter</b>(<i></i>)
+<p>
+        Constructor
+</p><a NAME="PasswordWriter.__write" ID="PasswordWriter.__write"></a>
+<h4>PasswordWriter.__write</h4>
+<b>__write</b>(<i>logins, forms, nevers</i>)
+<p>
+        Private method to write an login data file.
+</p><dl>
+<dt><i>logins</i></dt>
+<dd>
+dictionary with login data (user name, password)
+</dd><dt><i>forms</i></dt>
+<dd>
+list of forms data (list of LoginForm)
+</dd><dt><i>nevers</i></dt>
+<dd>
+list of URLs to never store data for (list of strings)
+</dd>
+</dl><a NAME="PasswordWriter.__writeForms" ID="PasswordWriter.__writeForms"></a>
+<h4>PasswordWriter.__writeForms</h4>
+<b>__writeForms</b>(<i>forms</i>)
+<p>
+        Private method to write forms data.
+</p><dl>
+<dt><i>forms</i></dt>
+<dd>
+list of forms data (list of LoginForm)
+</dd>
+</dl><a NAME="PasswordWriter.__writeLogins" ID="PasswordWriter.__writeLogins"></a>
+<h4>PasswordWriter.__writeLogins</h4>
+<b>__writeLogins</b>(<i>logins</i>)
+<p>
+        Private method to write the login data.
+</p><dl>
+<dt><i>logins</i></dt>
+<dd>
+dictionary with login data (user name, password)
+</dd>
+</dl><a NAME="PasswordWriter.__writeNevers" ID="PasswordWriter.__writeNevers"></a>
+<h4>PasswordWriter.__writeNevers</h4>
+<b>__writeNevers</b>(<i>nevers</i>)
+<p>
+        Private method to write the URLs never to store login data for.
+</p><dl>
+<dt><i>nevers</i></dt>
+<dd>
+list of URLs to never store data for (list of strings)
+</dd>
+</dl><a NAME="PasswordWriter.write" ID="PasswordWriter.write"></a>
+<h4>PasswordWriter.write</h4>
+<b>write</b>(<i>fileNameOrDevice, logins, forms, nevers</i>)
+<p>
+        Public method to write an login data file.
+</p><dl>
+<dt><i>fileNameOrDevice</i></dt>
+<dd>
+name of the file to write (string)
+            or device to write to (QIODevice)
+</dd><dt><i>logins</i></dt>
+<dd>
+dictionary with login data (user name, password)
+</dd><dt><i>forms</i></dt>
+<dd>
+list of forms data (list of LoginForm)
+</dd><dt><i>nevers</i></dt>
+<dd>
+list of URLs to never store data for (list of strings)
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/index-eric5.Helpviewer.Passwords.html	Wed Feb 29 20:09:55 2012 +0100
+++ b/Documentation/Source/index-eric5.Helpviewer.Passwords.html	Sat Mar 03 17:42:42 2012 +0100
@@ -29,12 +29,21 @@
 <h3>Modules</h3>
 <table>
 <tr>
+<td><a href="eric5.Helpviewer.Passwords.LoginForm.html">LoginForm</a></td>
+<td>Module implementing a data structure for login forms.</td>
+</tr><tr>
 <td><a href="eric5.Helpviewer.Passwords.PasswordManager.html">PasswordManager</a></td>
 <td>Module implementing the password manager.</td>
 </tr><tr>
 <td><a href="eric5.Helpviewer.Passwords.PasswordModel.html">PasswordModel</a></td>
 <td>Module implementing a model for password management.</td>
 </tr><tr>
+<td><a href="eric5.Helpviewer.Passwords.PasswordReader.html">PasswordReader</a></td>
+<td>Module implementing a class to read login data files.</td>
+</tr><tr>
+<td><a href="eric5.Helpviewer.Passwords.PasswordWriter.html">PasswordWriter</a></td>
+<td>Module implementing a class to write login data files.</td>
+</tr><tr>
 <td><a href="eric5.Helpviewer.Passwords.PasswordsDialog.html">PasswordsDialog</a></td>
 <td>Module implementing a dialog to show all saved logins.</td>
 </tr>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Helpviewer/Passwords/LoginForm.py	Sat Mar 03 17:42:42 2012 +0100
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a data structure for login forms.
+"""
+
+from PyQt4.QtCore import QUrl
+
+
+class LoginForm(object):
+    """
+    Class implementing a data structure for login forms.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.url = QUrl()
+        self.name = ""
+        self.hasAPassword = False
+        self.elements = []      # list of tuples of element name and value
+                                # (string, string)
+        self.elementTypes = {}  # dict of element name as key and type as value
+    
+    def isValid(self):
+        """
+        Public method to test for validity.
+        
+        @return flag indicating a valid form (boolean)
+        """
+        return len(self.elements) > 0
--- a/Helpviewer/Passwords/PasswordManager.py	Wed Feb 29 20:09:55 2012 +0100
+++ b/Helpviewer/Passwords/PasswordManager.py	Sat Mar 03 17:42:42 2012 +0100
@@ -9,7 +9,8 @@
 
 import os
 
-from PyQt4.QtCore import pyqtSignal, QObject, QByteArray, QUrl, QCoreApplication
+from PyQt4.QtCore import pyqtSignal, QObject, QByteArray, QUrl, QCoreApplication, \
+    QXmlStreamReader
 from PyQt4.QtGui import QProgressDialog, QApplication
 from PyQt4.QtNetwork import QNetworkRequest
 from PyQt4.QtWebKit import QWebSettings, QWebPage
@@ -18,63 +19,16 @@
 
 from Helpviewer.JavaScriptResources import parseForms_js
 
+from .LoginForm import LoginForm
+from .PasswordWriter import PasswordWriter
+from .PasswordReader import PasswordReader
+
 from Utilities.AutoSaver import AutoSaver
 import Utilities
 import Utilities.crypto
 import Preferences
 
 
-class LoginForm(object):
-    """
-    Class implementing a data structure for login forms.
-    """
-    def __init__(self):
-        """
-        Constructor
-        """
-        self.url = QUrl()
-        self.name = ""
-        self.hasAPassword = False
-        self.elements = []      # list of tuples of element name and value
-                                # (string, string)
-        self.elementTypes = {}  # dict of element name as key and type as value
-    
-    def isValid(self):
-        """
-        Public method to test for validity.
-        
-        @return flag indicating a valid form (boolean)
-        """
-        return len(self.elements) > 0
-    
-    def load(self, data):
-        """
-        Public method to load the form data from a file.
-        
-        @param data list of strings to load data from (list of strings)
-        @return flag indicating success (boolean)
-        """
-        self.url = QUrl(data[0])
-        self.name = data[1]
-        self.hasAPassword = data[2] == "True"
-        for element in data[3:]:
-            name, value = element.split(" = ", 1)
-            self.elements.append((name, value))
-    
-    def save(self, f):
-        """
-        Public method to save the form data to a file.
-        
-        @param f file or file like object open for writing
-        @return flag indicating success (booelan)
-        """
-        f.write("{0}\n".format(self.url.toString()))
-        f.write("{0}\n".format(self.name))
-        f.write("{0}\n".format(self.hasAPassword))
-        for element in self.elements:
-            f.write("{0} = {1}\n".format(element[0], element[1]))
-
-
 class PasswordManager(QObject):
     """
     Class implementing the password manager.
@@ -174,7 +128,7 @@
         
         @return name of the passwords file (string)
         """
-        return os.path.join(Utilities.getConfigDir(), "browser", "logins")
+        return os.path.join(Utilities.getConfigDir(), "browser", "logins.xml")
     
     def save(self):
         """
@@ -184,37 +138,46 @@
             return
         
         loginFile = self.getFileName()
-        try:
-            f = open(loginFile, "w", encoding="utf-8")
-            for key, login in list(self.__logins.items()):
-                f.write("{0}\n".format(key))
-                f.write("{0}\n".format(login[0]))
-                f.write("{0}\n".format(login[1]))
-                f.write("{0}\n".format(self.SEPARATOR))
-            if self.__loginForms:
-                f.write("{0}\n".format(self.FORMS))
-                for key, form in list(self.__loginForms.items()):
-                    f.write("{0}\n".format(key))
-                    form.save(f)
-                    f.write("{0}\n".format(self.SEPARATOR))
-            if self.__never:
-                f.write("{0}\n".format(self.NEVER))
-                for key in self.__never:
-                    f.write("{0}\n".format(key))
-            f.close()
-            self.passwordsSaved.emit()
-        except IOError as err:
+        writer = PasswordWriter()
+        if not writer.write(loginFile, self.__logins, self.__loginForms, self.__never):
             E5MessageBox.critical(None,
                 self.trUtf8("Saving login data"),
                 self.trUtf8("""<p>Login data could not be saved to <b>{0}</b></p>"""
-                            """<p>Reason: {1}</p>""").format(loginFile, str(err)))
-            return
+                            ).format(loginFile))
+        else:
+            self.passwordsSaved.emit()
     
     def __load(self):
         """
         Private method to load the saved login credentials.
         """
         loginFile = self.getFileName()
+        if not os.path.exists(loginFile):
+            self.__loadNonXml(os.path.splitext(loginFile)[0])
+        else:
+            reader = PasswordReader()
+            self.__logins, self.__loginForms, self.__never = reader.read(loginFile)
+            if reader.error() != QXmlStreamReader.NoError:
+                E5MessageBox.warning(None,
+                    self.trUtf8("Loading login data"),
+                    self.trUtf8("""Error when loading login data on"""
+                                """ line {0}, column {1}:\n{2}""")\
+                        .format(reader.lineNumber(),
+                                reader.columnNumber(),
+                                reader.errorString()))
+            pass
+        
+        self.__loaded = True
+    
+    def __loadNonXml(self, loginFile):
+        """
+        Private method to load non-XML password files.
+        
+        This method is to convert from the old, non-XML format to the new
+        XML based format.
+        
+        @param loginFile name of the non-XML password file (string)
+        """
         if os.path.exists(loginFile):
             try:
                 f = open(loginFile, "r", encoding="utf-8")
@@ -260,14 +223,24 @@
                     else:
                         key = data[0]
                         form = LoginForm()
-                        form.load(data[1:])
+                        form.url = QUrl(data[1])
+                        form.name = data[2]
+                        form.hasAPassword = data[3] == "True"
+                        for element in data[4:]:
+                            name, value = element.split(" = ", 1)
+                            form.elements.append((name, value))
                         self.__loginForms[key] = form
                         data = []
                 
                 elif section == 2:
                     self.__never.append(line)
+            
+            os.remove(loginFile)
         
         self.__loaded = True
+        
+        # this does the conversion
+        self.save()
     
     def reload(self):
         """
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Helpviewer/Passwords/PasswordReader.py	Sat Mar 03 17:42:42 2012 +0100
@@ -0,0 +1,177 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class to read login data files.
+"""
+
+from PyQt4.QtCore import QXmlStreamReader, QIODevice, QFile, QCoreApplication, QUrl
+
+from .LoginForm import LoginForm
+
+
+class PasswordReader(QXmlStreamReader):
+    """
+    Class implementing a reader object for login data files.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        super().__init__()
+    
+    def read(self, fileNameOrDevice):
+        """
+        Public method to read an XBEL bookmark file.
+        
+        @param fileNameOrDevice name of the file to read (string)
+            or reference to the device to read (QIODevice)
+        @return tuple containing the logins, forms and never URLs
+        """
+        self.__logins = {}
+        self.__loginForms = {}
+        self.__never = []
+        
+        if isinstance(fileNameOrDevice, QIODevice):
+            self.setDevice(fileNameOrDevice)
+        else:
+            f = QFile(fileNameOrDevice)
+            if not f.exists():
+                return self.__logins, self.__loginForms, self.__never
+            f.open(QFile.ReadOnly)
+            self.setDevice(f)
+        
+        while not self.atEnd():
+            self.readNext()
+            if self.isStartElement():
+                version = self.attributes().value("version")
+                if self.name() == "Password" and \
+                   (not version or version == "1.0"):
+                    self.__readPasswords()
+                else:
+                    self.raiseError(QCoreApplication.translate(
+                        "PasswordReader",
+                        "The file is not a Passwords version 1.0 file."))
+        
+        return self.__logins, self.__loginForms, self.__never
+    
+    def __readPasswords(self):
+        """
+        Private method to read and parse the login data file.
+        """
+        if not self.isStartElement() and self.name() != "xbel":
+            return
+        
+        while not self.atEnd():
+            self.readNext()
+            if self.isEndElement():
+                break
+            
+            if self.isStartElement():
+                if self.name() == "Logins":
+                    self.__readLogins()
+                elif self.name() == "Forms":
+                    self.__readForms()
+                elif self.name() == "Nevers":
+                    self.__readNevers()
+                else:
+                    self.__skipUnknownElement()
+    
+    def __readLogins(self):
+        """
+        Private method to read the login information.
+        """
+        if not self.isStartElement() and self.name() != "Logins":
+            return
+        
+        while not self.atEnd():
+            self.readNext()
+            if self.isEndElement():
+                if self.name() == "Login":
+                    continue
+                else:
+                    break
+            
+            if self.isStartElement():
+                if self.name() == "Login":
+                    attributes = self.attributes()
+                    key = attributes.value("key")
+                    user = attributes.value("user")
+                    password = attributes.value("password")
+                    self.__logins[key] = (user, password)
+                else:
+                    self.__skipUnknownElement()
+    
+    def __readForms(self):
+        """
+        Private method to read the forms information.
+        """
+        if not self.isStartElement() and self.name() != "Forms":
+            return
+        
+        while not self.atEnd():
+            self.readNext()
+            if self.isStartElement():
+                if self.name() == "Form":
+                    attributes = self.attributes()
+                    key = attributes.value("key")
+                    form = LoginForm()
+                    form.url = QUrl(attributes.value("url"))
+                    form.name = attributes.value("name")
+                    form.hasAPassword = attributes.value("password") == "yes"
+                elif self.name() == "Elements":
+                    continue
+                elif self.name() == "Element":
+                    attributes = self.attributes()
+                    name = attributes.value("name")
+                    value = attributes.value("value")
+                    form.elements.append((name, value))
+                else:
+                    self.__skipUnknownElement()
+            
+            if self.isEndElement():
+                if self.name() == "Form":
+                    self.__loginForms[key] = form
+                    continue
+                elif self.name() in ["Elements", "Element"]:
+                    continue
+                else:
+                    break
+    
+    def __readNevers(self):
+        """
+        Private method to read the never URLs.
+        """
+        if not self.isStartElement() and self.name() != "Nevers":
+            return
+        
+        while not self.atEnd():
+            self.readNext()
+            if self.isEndElement():
+                if self.name() == "Never":
+                    continue
+                else:
+                    break
+            
+            if self.isStartElement():
+                if self.name() == "Never":
+                    self.__never.append(self.attributes().value("url"))
+                else:
+                    self.__skipUnknownElement()
+    
+    def __skipUnknownElement(self):
+        """
+        Private method to skip over all unknown elements.
+        """
+        if not self.isStartElement():
+            return
+        
+        while not self.atEnd():
+            self.readNext()
+            if self.isEndElement():
+                break
+            
+            if self.isStartElement():
+                self.__skipUnknownElement()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Helpviewer/Passwords/PasswordWriter.py	Sat Mar 03 17:42:42 2012 +0100
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class to write login data files.
+"""
+
+from PyQt4.QtCore import QXmlStreamWriter, QIODevice, QFile
+
+
+class PasswordWriter(QXmlStreamWriter):
+    """
+    Class implementing a writer object to generate login data files.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        super().__init__()
+        
+        self.setAutoFormatting(True)
+    
+    def write(self, fileNameOrDevice, logins, forms, nevers):
+        """
+        Public method to write an login data file.
+        
+        @param fileNameOrDevice name of the file to write (string)
+            or device to write to (QIODevice)
+        @param logins dictionary with login data (user name, password)
+        @param forms list of forms data (list of LoginForm)
+        @param nevers list of URLs to never store data for (list of strings)
+        """
+        if isinstance(fileNameOrDevice, QIODevice):
+            f = fileNameOrDevice
+        else:
+            f = QFile(fileNameOrDevice)
+            if (not logins and not forms and not nevers) or not f.open(QFile.WriteOnly):
+                return False
+        
+        self.setDevice(f)
+        return self.__write(logins, forms, nevers)
+    
+    def __write(self, logins, forms, nevers):
+        """
+        Private method to write an login data file.
+        
+        @param logins dictionary with login data (user name, password)
+        @param forms list of forms data (list of LoginForm)
+        @param nevers list of URLs to never store data for (list of strings)
+        """
+        self.writeStartDocument()
+        self.writeDTD("<!DOCTYPE passwords>")
+        self.writeStartElement("Password")
+        self.writeAttribute("version", "1.0")
+        
+        if logins:
+            self.__writeLogins(logins)
+        if forms:
+            self.__writeForms(forms)
+        if nevers:
+            self.__writeNevers(nevers)
+        
+        self.writeEndDocument()
+        return True
+    
+    def __writeLogins(self, logins):
+        """
+        Private method to write the login data.
+        
+        @param logins dictionary with login data (user name, password)
+        """
+        self.writeStartElement("Logins")
+        for key, login in logins.items():
+            self.writeEmptyElement("Login")
+            self.writeAttribute("key", key)
+            self.writeAttribute("user", login[0])
+            self.writeAttribute("password", login[1])
+        self.writeEndElement()
+    
+    def __writeForms(self, forms):
+        """
+        Private method to write forms data.
+        
+        @param forms list of forms data (list of LoginForm)
+        """
+        self.writeStartElement("Forms")
+        for key, form in forms.items():
+            self.writeStartElement("Form")
+            self.writeAttribute("key", key)
+            self.writeAttribute("url", form.url.toString())
+            self.writeAttribute("name", form.name)
+            self.writeAttribute("password", "yes" if form.hasAPassword else "no")
+            if form.elements:
+                self.writeStartElement("Elements")
+                for element in form.elements:
+                    self.writeEmptyElement("Element")
+                    self.writeAttribute("name", element[0])
+                    self.writeAttribute("value", element[1])
+                self.writeEndElement()
+            self.writeEndElement()
+        self.writeEndElement()
+    
+    def __writeNevers(self, nevers):
+        """
+        Private method to write the URLs never to store login data for.
+        
+        @param nevers list of URLs to never store data for (list of strings)
+        """
+        self.writeStartElement("Nevers")
+        for never in nevers:
+            self.writeEmptyElement("Never")
+            self.writeAttribute("url", never)
+        self.writeEndElement()
--- a/eric5.e4p	Wed Feb 29 20:09:55 2012 +0100
+++ b/eric5.e4p	Sat Mar 03 17:42:42 2012 +0100
@@ -969,6 +969,9 @@
     <Source>Helpviewer/UrlBar/BookmarkActionSelectionDialog.py</Source>
     <Source>Helpviewer/Network/EricAccessHandler.py</Source>
     <Source>Helpviewer/Sync/SyncEncryptionPage.py</Source>
+    <Source>Helpviewer/Passwords/PasswordWriter.py</Source>
+    <Source>Helpviewer/Passwords/PasswordReader.py</Source>
+    <Source>Helpviewer/Passwords/LoginForm.py</Source>
   </Sources>
   <Forms>
     <Form>PyUnit/UnittestDialog.ui</Form>
--- a/i18n/eric5_cs.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_cs.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -27736,55 +27736,66 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation>Uložit login data</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation>Nahrávání login dat</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation>&lt;b&gt;Chcete uložit toto heslo?&lt;/b&gt;&lt;br/&gt;Pro kontrolu uložených a odebraných hesel použijte dialog správce hesel v menu nastavení.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation>Nikdy pro tento web</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation>Teď ne</translation>
     </message>
     <message>
         <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
         <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Login data nelze uložit do &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Důvod: {1}&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <translation type="obsolete">&lt;p&gt;Login data nelze uložit do &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Důvod: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Login data nelze z &lt;b&gt;{0}&lt;/b&gt; nahrát&lt;/p&gt;&lt;p&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation>&lt;p&gt;Login data nelze z &lt;b&gt;{0}&lt;/b&gt; nahrát&lt;/p&gt;&lt;p&gt;Důvod: Chybný vstupní formát&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -27805,6 +27816,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_de.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_de.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -26911,55 +26911,67 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation>Anmeldedaten speichern</translation>
     </message>
     <message>
         <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
         <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Die Anmeldedaten konnten nicht in die Datei &lt;b&gt;{0}&lt;/b&gt; gespeichert werden.&lt;/p&gt;&lt;p&gt;Ursache: {1}&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <translation type="obsolete">&lt;p&gt;Die Anmeldedaten konnten nicht in die Datei &lt;b&gt;{0}&lt;/b&gt; gespeichert werden.&lt;/p&gt;&lt;p&gt;Ursache: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation>Anmeldedaten laden</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Die Anmeldedaten konnten nicht aus der Datei &lt;b&gt;{0}&lt;/b&gt; geladen werden.&lt;/p&gt;&lt;p&gt;Ursache: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation>&lt;p&gt;Die Anmeldedaten konnten nicht aus der Datei &lt;b&gt;{0}&lt;/b&gt; geladen werden.&lt;/p&gt;&lt;p&gt;Ursache: Falsches Format&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation>&lt;b&gt;Wollen sie das Kennwort speichern?&lt;/b&gt;&lt;br/&gt;Um die gespeicherten Kennworte anzusehen und zu löschen, verwenden sie den Kennwortmanagement Dialog aus dem Einstellungen Menü.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation>Niemals für diese Site</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation>Jetzt nicht</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation>Kennwort speichern</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation>Kodieren gespeicherte Kennworte neu...</translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Die Anmeldedaten konnten nicht in die Datei &lt;b&gt;{0}&lt;/b&gt; gespeichert werden.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation>Fehler beim Laden der Anmeldedaten in Zeile {0}, Spalte {1}:
+{2}</translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -26980,6 +26992,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation>Die Datei ist keine Kennwortdatei der Version 1.0.</translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_en.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_en.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -26766,55 +26766,61 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
-        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -26835,6 +26841,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_es.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_es.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -27443,55 +27443,66 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation>Guardar datos de login</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation>Cargando datos de login</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation>&lt;b&gt;¿Le gustaría almacenar esta contraseña?&lt;/b&gt;&lt;br/&gt;Para revisar las contraselas que tiene almacenadas y eliminarlas, utilice el diálogo de gestión de contraseñas del menú de Configuración.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation>Nunca para este sitio</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation>Ahora no</translation>
     </message>
     <message>
         <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
         <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Los datos de login no se han podido guardar en &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Razón: {1}&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <translation type="obsolete">&lt;p&gt;Los datos de login no se han podido guardar en &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Razón: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Los datos de login no se han podido cargar desde &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Razón: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation>&lt;p&gt;Los datos de login no se han podido cargar desde &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Razón: Formato erróneo de input&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation>Almacenar contraseña</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation>Recodificando contraseñas almacenadas...</translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -27512,6 +27523,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_fr.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_fr.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -29166,55 +29166,61 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
-        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -29235,6 +29241,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_it.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_it.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -27337,55 +27337,66 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation>Salvataggio dati di login</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation>Caricamento dati di login</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation>&lt;b&gt;Vuoi salvare questa password ?&lt;/b&gt;&lt;br/&gt;Per rivedere le password che hai salvato e rimuoverle, usa il dialogo di gestione delle password del menù Impostazioni.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation>Mai per questo sito</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation>Non adesso</translation>
     </message>
     <message>
         <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
         <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation>&lt;p&gt;I dati di login non possono essere salvati su &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Motivo: {1}&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <translation type="obsolete">&lt;p&gt;I dati di login non possono essere salvati su &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Motivo: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;I dati di login non possono essere caricati da &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Motivo: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation>&lt;p&gt;I dati di login non possono essere caricati da &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Motivo: formato in ingresso errato&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation>Salva password</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -27406,6 +27417,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_ru.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_ru.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -27464,55 +27464,66 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation>Сохранение данных учётной записи</translation>
     </message>
     <message>
         <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
         <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Невозможно сохранить учётные данные &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Причина: {1}&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <translation type="obsolete">&lt;p&gt;Невозможно сохранить учётные данные &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Причина: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation>Загрузка данных учётной записи</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Невозможно загрузить учётные данные из &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Причина: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation>&lt;p&gt;Невозможно загрузить учётные данные из &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Причина: Неправильный формат&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation>&lt;b&gt;Сохранить этот пароль?&lt;/b&gt;&lt;br/&gt;Для изменения сохранённых паролей используйте диалог управления паролями из меню настроек.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation>Никогда для этого сайта</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation>Не сейчас</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation>Сохранить пароль</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -27533,6 +27544,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_tr.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_tr.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -27642,55 +27642,66 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation>Günlük verilerini sakla</translation>
     </message>
     <message>
         <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
         <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Günlük verisi &lt;b&gt;{0}&lt;/b&gt;ne kaydedilemedi&lt;/p&gt;&lt;p&gt;Sebep: {1}&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <translation type="obsolete">&lt;p&gt;Günlük verisi &lt;b&gt;{0}&lt;/b&gt;ne kaydedilemedi&lt;/p&gt;&lt;p&gt;Sebep: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation>Günlük verileri yükleniyor</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Giriş verisi &lt;b&gt;{0}&lt;/b&gt; den okunamıyor&lt;/p&gt;&lt;p&gt;Sebep: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation>&lt;p&gt;Giriş verisi &lt;b&gt;{0}&lt;/b&gt; den okunamıyor&lt;/p&gt;&lt;p&gt;Sebep: Hatalı giriş formatı&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation>&lt;b&gt;Parolayı kaydetmeyi tercih eder misiniz?&lt;/b&gt;&lt;br/&gt;Kaydettiğiniz yada kaldırdığınız parolaları tekrar gözden geçirmek için, ayarlar meüsünden parola yönetimi diyaloğunu kullanabilirsiniz.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation>Bu site için hiçbir zaman</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation>Şimdi değil</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -27711,6 +27722,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>
--- a/i18n/eric5_zh_CN.GB2312.ts	Wed Feb 29 20:09:55 2012 +0100
+++ b/i18n/eric5_zh_CN.GB2312.ts	Sat Mar 03 17:42:42 2012 +0100
@@ -29133,55 +29133,61 @@
 <context>
     <name>PasswordManager</name>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
         <source>Saving login data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>Loading login data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>&lt;b&gt;Would you like to save this password?&lt;/b&gt;&lt;br/&gt;To review passwords you have saved and remove them, use the password management dialog of the Settings menu.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="409"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="382"/>
         <source>Never for this site</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="411"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="384"/>
         <source>Not now</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="207"/>
-        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="224"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="187"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="247"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="210"/>
         <source>&lt;p&gt;Login data could not be loaded from &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Reason: Wrong input format&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="402"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="375"/>
         <source>Save password</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Passwords/PasswordManager.py" line="609"/>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="582"/>
         <source>Re-encoding saved passwords...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="143"/>
+        <source>&lt;p&gt;Login data could not be saved to &lt;b&gt;{0}&lt;/b&gt;&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordManager.py" line="161"/>
+        <source>Error when loading login data on line {0}, column {1}:
+{2}</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>PasswordModel</name>
@@ -29202,6 +29208,14 @@
     </message>
 </context>
 <context>
+    <name>PasswordReader</name>
+    <message>
+        <location filename="Helpviewer/Passwords/PasswordReader.py" line="54"/>
+        <source>The file is not a Passwords version 1.0 file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PasswordsDialog</name>
     <message>
         <location filename="Helpviewer/Passwords/PasswordsDialog.py" line="88"/>

eric ide

mercurial