Changed the FTP sync code in the eric web browser to use ftplib.

Sun, 23 Sep 2012 16:23:04 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 23 Sep 2012 16:23:04 +0200
changeset 2060
1f3767746974
parent 2059
52113e2f672a
child 2061
b74f1d202ba7

Changed the FTP sync code in the eric web browser to use ftplib.

Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric5.Helpviewer.Sync.FtpSyncHandler.html file | annotate | diff | comparison | revisions
Helpviewer/Sync/FtpSyncHandler.py file | annotate | diff | comparison | revisions
changelog file | annotate | diff | comparison | revisions
i18n/eric5_cs.ts file | annotate | diff | comparison | revisions
i18n/eric5_de.qm 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
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Sat Sep 22 19:40:50 2012 +0200
+++ b/Documentation/Help/source.qhp	Sun Sep 23 16:23:04 2012 +0200
@@ -4534,13 +4534,15 @@
       <keyword name="FtpSyncHandler (Constructor)" id="FtpSyncHandler (Constructor)" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__init__" />
       <keyword name="FtpSyncHandler (Module)" id="FtpSyncHandler (Module)" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html" />
       <keyword name="FtpSyncHandler.__changeToStore" id="FtpSyncHandler.__changeToStore" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__changeToStore" />
-      <keyword name="FtpSyncHandler.__checkSyncFiles" id="FtpSyncHandler.__checkSyncFiles" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__checkSyncFiles" />
-      <keyword name="FtpSyncHandler.__commandFinished" id="FtpSyncHandler.__commandFinished" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__commandFinished" />
+      <keyword name="FtpSyncHandler.__connectAndLogin" id="FtpSyncHandler.__connectAndLogin" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__connectAndLogin" />
+      <keyword name="FtpSyncHandler.__dirListCallback" id="FtpSyncHandler.__dirListCallback" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__dirListCallback" />
+      <keyword name="FtpSyncHandler.__doFtpCommands" id="FtpSyncHandler.__doFtpCommands" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__doFtpCommands" />
+      <keyword name="FtpSyncHandler.__doFtpLogin" id="FtpSyncHandler.__doFtpLogin" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__doFtpLogin" />
       <keyword name="FtpSyncHandler.__downloadFile" id="FtpSyncHandler.__downloadFile" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__downloadFile" />
+      <keyword name="FtpSyncHandler.__downloadFileCallback" id="FtpSyncHandler.__downloadFileCallback" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__downloadFileCallback" />
       <keyword name="FtpSyncHandler.__idleTimeout" id="FtpSyncHandler.__idleTimeout" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__idleTimeout" />
       <keyword name="FtpSyncHandler.__initialSync" id="FtpSyncHandler.__initialSync" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__initialSync" />
       <keyword name="FtpSyncHandler.__initialSyncFile" id="FtpSyncHandler.__initialSyncFile" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__initialSyncFile" />
-      <keyword name="FtpSyncHandler.__storeReached" id="FtpSyncHandler.__storeReached" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__storeReached" />
       <keyword name="FtpSyncHandler.__syncFile" id="FtpSyncHandler.__syncFile" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__syncFile" />
       <keyword name="FtpSyncHandler.__uploadFile" id="FtpSyncHandler.__uploadFile" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.__uploadFile" />
       <keyword name="FtpSyncHandler.initialLoadAndCheck" id="FtpSyncHandler.initialLoadAndCheck" ref="eric5.Helpviewer.Sync.FtpSyncHandler.html#FtpSyncHandler.initialLoadAndCheck" />
--- a/Documentation/Source/eric5.Helpviewer.Sync.FtpSyncHandler.html	Sat Sep 22 19:40:50 2012 +0200
+++ b/Documentation/Source/eric5.Helpviewer.Sync.FtpSyncHandler.html	Sun Sep 23 16:23:04 2012 +0200
@@ -83,15 +83,24 @@
 <td><a href="#FtpSyncHandler.__changeToStore">__changeToStore</a></td>
 <td>Private slot to change to the storage directory.</td>
 </tr><tr>
-<td><a href="#FtpSyncHandler.__checkSyncFiles">__checkSyncFiles</a></td>
-<td>Private slot called for each entry sent by the FTP list command.</td>
+<td><a href="#FtpSyncHandler.__connectAndLogin">__connectAndLogin</a></td>
+<td>Private method to connect to the FTP server and log in.</td>
+</tr><tr>
+<td><a href="#FtpSyncHandler.__dirListCallback">__dirListCallback</a></td>
+<td>Private slot handling the receipt of directory listing lines.</td>
 </tr><tr>
-<td><a href="#FtpSyncHandler.__commandFinished">__commandFinished</a></td>
-<td>Private slot handling the end of a command.</td>
+<td><a href="#FtpSyncHandler.__doFtpCommands">__doFtpCommands</a></td>
+<td>Private slot executing the sequence of FTP commands.</td>
+</tr><tr>
+<td><a href="#FtpSyncHandler.__doFtpLogin">__doFtpLogin</a></td>
+<td>Private method to do the FTP login with asking for a username and password, if the login fails with an error 530.</td>
 </tr><tr>
 <td><a href="#FtpSyncHandler.__downloadFile">__downloadFile</a></td>
 <td>Private method to downlaod the given file.</td>
 </tr><tr>
+<td><a href="#FtpSyncHandler.__downloadFileCallback">__downloadFileCallback</a></td>
+<td>Private method receiving the downloaded data.</td>
+</tr><tr>
 <td><a href="#FtpSyncHandler.__idleTimeout">__idleTimeout</a></td>
 <td>Private slot to prevent a disconnect from the server.</td>
 </tr><tr>
@@ -101,9 +110,6 @@
 <td><a href="#FtpSyncHandler.__initialSyncFile">__initialSyncFile</a></td>
 <td>Private method to do the initial synchronization of the given file.</td>
 </tr><tr>
-<td><a href="#FtpSyncHandler.__storeReached">__storeReached</a></td>
-<td>Private slot executed, when the storage directory was reached.</td>
-</tr><tr>
 <td><a href="#FtpSyncHandler.__syncFile">__syncFile</a></td>
 <td>Private method to synchronize the given file.</td>
 </tr><tr>
@@ -152,29 +158,53 @@
 <p>
         Private slot to change to the storage directory.
 </p><p>
-        This action might cause the storage path to be created on the server.
-</p><a NAME="FtpSyncHandler.__checkSyncFiles" ID="FtpSyncHandler.__checkSyncFiles"></a>
-<h4>FtpSyncHandler.__checkSyncFiles</h4>
-<b>__checkSyncFiles</b>(<i>info</i>)
+        This action will create the storage path on the server, if it
+        does not exist. Upon return, the current directory of the server
+        is the sync directory.
+</p><a NAME="FtpSyncHandler.__connectAndLogin" ID="FtpSyncHandler.__connectAndLogin"></a>
+<h4>FtpSyncHandler.__connectAndLogin</h4>
+<b>__connectAndLogin</b>(<i></i>)
 <p>
-        Private slot called for each entry sent by the FTP list command.
+        Private method to connect to the FTP server and log in.
 </p><dl>
-<dt><i>info</i></dt>
+<dt>Returns:</dt>
 <dd>
-info about the entry (QUrlInfo)
+flag indicating a successful log in (boolean)
+</dd>
+</dl><a NAME="FtpSyncHandler.__dirListCallback" ID="FtpSyncHandler.__dirListCallback"></a>
+<h4>FtpSyncHandler.__dirListCallback</h4>
+<b>__dirListCallback</b>(<i>line</i>)
+<p>
+        Private slot handling the receipt of directory listing lines.
+</p><dl>
+<dt><i>line</i></dt>
+<dd>
+the received line of the directory listing (string)
 </dd>
-</dl><a NAME="FtpSyncHandler.__commandFinished" ID="FtpSyncHandler.__commandFinished"></a>
-<h4>FtpSyncHandler.__commandFinished</h4>
-<b>__commandFinished</b>(<i>id, error</i>)
+</dl><a NAME="FtpSyncHandler.__doFtpCommands" ID="FtpSyncHandler.__doFtpCommands"></a>
+<h4>FtpSyncHandler.__doFtpCommands</h4>
+<b>__doFtpCommands</b>(<i></i>)
 <p>
-        Private slot handling the end of a command.
+        Private slot executing the sequence of FTP commands.
+</p><a NAME="FtpSyncHandler.__doFtpLogin" ID="FtpSyncHandler.__doFtpLogin"></a>
+<h4>FtpSyncHandler.__doFtpLogin</h4>
+<b>__doFtpLogin</b>(<i>username, password</i>)
+<p>
+        Private method to do the FTP login with asking for a username and password,
+        if the login fails with an error 530.
 </p><dl>
-<dt><i>id</i></dt>
+<dt><i>username</i></dt>
+<dd>
+user name to use for the login (string)
+</dd><dt><i>password</i></dt>
 <dd>
-id of the finished command (integer)
-</dd><dt><i>error</i></dt>
+password to use for the login (string)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
 <dd>
-flag indicating an error situation (boolean)
+tuple of two flags indicating a successful login and
+            if the login should be retried (boolean, boolean)
 </dd>
 </dl><a NAME="FtpSyncHandler.__downloadFile" ID="FtpSyncHandler.__downloadFile"></a>
 <h4>FtpSyncHandler.__downloadFile</h4>
@@ -193,6 +223,24 @@
 <dd>
 time stamp in seconds of the file to be downloaded (int)
 </dd>
+</dl><a NAME="FtpSyncHandler.__downloadFileCallback" ID="FtpSyncHandler.__downloadFileCallback"></a>
+<h4>FtpSyncHandler.__downloadFileCallback</h4>
+<b>__downloadFileCallback</b>(<i>buffer, data</i>)
+<p>
+        Private method receiving the downloaded data.
+</p><dl>
+<dt><i>buffer</i></dt>
+<dd>
+reference to the buffer (io.BytesIO)
+</dd><dt><i>data</i></dt>
+<dd>
+byte string to store in the buffer (bytes)
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+number of bytes written to the buffer (integer)
+</dd>
 </dl><a NAME="FtpSyncHandler.__idleTimeout" ID="FtpSyncHandler.__idleTimeout"></a>
 <h4>FtpSyncHandler.__idleTimeout</h4>
 <b>__idleTimeout</b>(<i></i>)
@@ -217,12 +265,7 @@
 <dd>
 name of the file to be synchronized (string)
 </dd>
-</dl><a NAME="FtpSyncHandler.__storeReached" ID="FtpSyncHandler.__storeReached"></a>
-<h4>FtpSyncHandler.__storeReached</h4>
-<b>__storeReached</b>(<i></i>)
-<p>
-        Private slot executed, when the storage directory was reached.
-</p><a NAME="FtpSyncHandler.__syncFile" ID="FtpSyncHandler.__syncFile"></a>
+</dl><a NAME="FtpSyncHandler.__syncFile" ID="FtpSyncHandler.__syncFile"></a>
 <h4>FtpSyncHandler.__syncFile</h4>
 <b>__syncFile</b>(<i>type_, fileName</i>)
 <p>
--- a/Helpviewer/Sync/FtpSyncHandler.py	Sat Sep 22 19:40:50 2012 +0200
+++ b/Helpviewer/Sync/FtpSyncHandler.py	Sun Sep 23 16:23:04 2012 +0200
@@ -7,9 +7,14 @@
 Module implementing a synchronization handler using FTP.
 """
 
-from PyQt4.QtCore import pyqtSignal, QUrl, QIODevice, QTime, QThread, QTimer, QBuffer, \
-    QFileInfo
-from PyQt4.QtNetwork import QFtp, QNetworkProxyQuery, QNetworkProxy, QNetworkProxyFactory
+import ftplib
+import io
+
+from PyQt4.QtCore import pyqtSignal, QUrl, QTimer, QFileInfo, QCoreApplication, QByteArray
+from PyQt4.QtNetwork import QNetworkProxyQuery, QNetworkProxy, QAuthenticator
+
+from E5Network.E5NetworkProxyFactory import E5NetworkProxyFactory, \
+    proxyAuthenticationRequired
 
 from .SyncHandler import SyncHandler
 
@@ -17,6 +22,8 @@
 
 import Preferences
 
+from Utilities.FtpUtilities import FtpDirLineParser, FtpDirLineParserError
+
 
 class FtpSyncHandler(SyncHandler):
     """
@@ -46,6 +53,7 @@
         
         self.__state = "idle"
         self.__forceUpload = False
+        self.__connected = False
         
         self.__remoteFilesFound = {}
     
@@ -61,24 +69,23 @@
         self.__state = "initializing"
         self.__forceUpload = forceUpload
         
+        self.__dirLineParser = FtpDirLineParser()
         self.__remoteFilesFound = {}
-        self.__syncIDs = {}
         
         self.__idleTimer = QTimer(self)
         self.__idleTimer.setInterval(Preferences.getHelp("SyncFtpIdleTimeout") * 1000)
         self.__idleTimer.timeout.connect(self.__idleTimeout)
         
-        self.__ftp = QFtp(self)
-        self.__ftp.commandFinished.connect(self.__commandFinished)
-        self.__ftp.listInfo.connect(self.__checkSyncFiles)
+        self.__ftp = ftplib.FTP()
         
         # do proxy setup
+        self.__proxy = None
         url = QUrl("ftp://{0}:{1}".format(
             Preferences.getHelp("SyncFtpServer"),
             Preferences.getHelp("SyncFtpPort")
         ))
         query = QNetworkProxyQuery(url)
-        proxyList = QNetworkProxyFactory.proxyForQuery(query)
+        proxyList = E5NetworkProxyFactory().queryProxy(query)
         ftpProxy = QNetworkProxy()
         for proxy in proxyList:
             if proxy.type() == QNetworkProxy.NoProxy or \
@@ -89,96 +96,133 @@
             self.syncError.emit(self.trUtf8("No suitable proxy found."))
             return
         elif ftpProxy.type() == QNetworkProxy.FtpCachingProxy:
-            self.__ftp.setProxy(ftpProxy.hostName(), ftpProxy.port())
+            self.__proxy = ftpProxy
+        
+        QTimer.singleShot(0, self.__doFtpCommands)
+    
+    def __doFtpCommands(self):
+        """
+        Private slot executing the sequence of FTP commands.
+        """
+        try:
+            ok = self.__connectAndLogin()
+            if ok:
+                self.__changeToStore()
+                self.__ftp.retrlines("LIST", self.__dirListCallback)
+                self.__initialSync()
+                self.__state = "idle"
+                self.__idleTimer.start()
+        except ftplib.all_errors as err:
+            self.syncError.emit(str(err))
+    
+    def __connectAndLogin(self):
+        """
+        Private method to connect to the FTP server and log in.
         
-        self.__ftp.connectToHost(Preferences.getHelp("SyncFtpServer"),
-                                 Preferences.getHelp("SyncFtpPort"))
-        self.__ftp.login(Preferences.getHelp("SyncFtpUser"),
-                         Preferences.getHelp("SyncFtpPassword"))
+        @return flag indicating a successful log in (boolean)
+        """
+        retry = True
+        while retry:
+            if self.__proxy:
+                self.__ftp.connect(
+                    self.__proxy.hostName(),
+                    self.__proxy.port(),
+                    timeout=10)
+            else:
+                self.__ftp.connect(
+                    Preferences.getHelp("SyncFtpServer"),
+                    Preferences.getHelp("SyncFtpPort"),
+                    timeout=10)
+            ok, retry = self.__doFtpLogin(
+                Preferences.getHelp("SyncFtpUser"),
+                Preferences.getHelp("SyncFtpPassword"))
+        self.__connected = ok
+        if not ok:
+            self.syncError.emit(self.trUtf8("Cannot log in to FTP host."))
+        
+        return ok
+    
+    def __doFtpLogin(self, username, password):
+        """
+        Private method to do the FTP login with asking for a username and password,
+        if the login fails with an error 530.
+        
+        @param username user name to use for the login (string)
+        @param password password to use for the login (string)
+        @return tuple of two flags indicating a successful login and
+            if the login should be retried (boolean, boolean)
+        """
+        # 1. do proxy login, if a proxy is used
+        if self.__proxy:
+            try:
+                self.__ftp.login(self.__proxy.user(), self.__proxy.password())
+            except ftplib.error_perm as err:
+                code, msg = err.args[0].split(None, 1)
+                if code.strip() == "530":
+                    auth = QAuthenticator()
+                    auth.setOption("realm", self.__proxy.hostName())
+                    proxyAuthenticationRequired(self.__proxy, auth)
+                    if not auth.isNull() and auth.user():
+                        self.__proxy.setUser(auth.user())
+                        self.__proxy.setPassword(auth.password())
+                        return False, True
+                return False, False
+        
+        # 2. do the real login
+        if self.__proxy:
+            loginName = "{0}@{1}".format(
+                username, Preferences.getHelp("SyncFtpServer"))
+            if Preferences.getHelp("SyncFtpPort") != ftplib.FTP_PORT:
+                loginName = "{0}:{1}".format(
+                    loginName, Preferences.getHelp("SyncFtpPort"))
+        else:
+            loginName = username
+        self.__ftp.login(loginName, password)
+        return True, False
     
     def __changeToStore(self):
         """
         Private slot to change to the storage directory.
         
-        This action might cause the storage path to be created on the server.
-        """
-        self.__storePathList = \
-            Preferences.getHelp("SyncFtpPath").replace("\\", "/").split("/")
-        if self.__storePathList[0] == "":
-            del self.__storePathList[0]
-            self.__ftp.cd(self.__storePathList[0])
-    
-    def __commandFinished(self, id, error):
-        """
-        Private slot handling the end of a command.
-        
-        @param id id of the finished command (integer)
-        @param error flag indicating an error situation (boolean)
+        This action will create the storage path on the server, if it
+        does not exist. Upon return, the current directory of the server
+        is the sync directory.
         """
-        if error:
-            if self.__ftp.currentCommand() in [
-                QFtp.ConnectToHost, QFtp.Login, QFtp.Mkdir, QFtp.List]:
-                self.syncError.emit(self.__ftp.errorString())
-            elif self.__ftp.currentCommand() == QFtp.Cd:
-                self.__ftp.mkdir(self.__storePathList[0])
-                self.__ftp.cd(self.__storePathList[0])
-            else:
-                if id in self.__syncIDs:
-                    if self.__ftp.currentCommand() == QFtp.Get:
-                        self.__syncIDs[id][1].close()
-                    self.syncStatus.emit(self.__syncIDs[id][0], self.__ftp.errorString())
-                    self.syncFinished.emit(self.__syncIDs[id][0], False,
-                        self.__syncIDs[id][2])
-                    del self.__syncIDs[id]
-                    if not self.__syncIDs:
-                        self.__state = "idle"
-                        self.syncMessage.emit(self.trUtf8("Synchronization finished"))
-        else:
-            if self.__ftp.currentCommand() == QFtp.Login:
-                self.__changeToStore()
-            elif self.__ftp.currentCommand() == QFtp.Cd:
-                del self.__storePathList[0]
-                if self.__storePathList:
-                    self.__ftp.cd(self.__storePathList[0])
+        storePathList = \
+            Preferences.getHelp("SyncFtpPath").replace("\\", "/").split("/")
+        if storePathList[0] == "":
+            storePathList.pop(0)
+        while storePathList:
+            path = storePathList[0]
+            try:
+                self.__ftp.cwd(path)
+            except ftplib.error_perm as err:
+                code, msg = err.args[0].split(None, 1)
+                if code.strip() == "550":
+                    # path does not exist, create it
+                    self.__ftp.mkd(path)
+                    self.__ftp.cwd(path)
                 else:
-                    self.__storeReached()
-            elif self.__ftp.currentCommand() == QFtp.List:
-                self.__initialSync()
-            else:
-                if id in self.__syncIDs:
-                    ok = True
-                    if self.__ftp.currentCommand() == QFtp.Get:
-                        self.__syncIDs[id][1].close()
-                        ok, error = self.writeFile(self.__syncIDs[id][1].buffer(),
-                                                   self.__syncIDs[id][3],
-                                                   self.__syncIDs[id][0],
-                                                   self.__syncIDs[id][4])
-                        if not ok:
-                            self.syncStatus.emit(self.__syncIDs[id][0], error)
-                    self.syncFinished.emit(self.__syncIDs[id][0], ok,
-                        self.__syncIDs[id][2])
-                    del self.__syncIDs[id]
-                    if not self.__syncIDs:
-                        self.__state = "idle"
-                        self.syncMessage.emit(self.trUtf8("Synchronization finished"))
+                    raise
+            storePathList.pop(0)
     
-    def __storeReached(self):
+    def __dirListCallback(self, line):
         """
-        Private slot executed, when the storage directory was reached.
+        Private slot handling the receipt of directory listing lines.
+        
+        @param line the received line of the directory listing (string)
         """
-        if self.__state == "initializing":
-            self.__ftp.list()
-            self.__idleTimer.start()
-    
-    def __checkSyncFiles(self, info):
-        """
-        Private slot called for each entry sent by the FTP list command.
+        try:
+            urlInfo = self.__dirLineParser.parseLine(line)
+        except FtpDirLineParserError:
+            # silently ignore parser errors
+            urlInfo = None
         
-        @param info info about the entry (QUrlInfo)
-        """
-        if info.isValid() and info.isFile():
-            if info.name() in self._remoteFiles.values():
-                self.__remoteFilesFound[info.name()] = info.lastModified()
+        if urlInfo and urlInfo.isValid() and urlInfo.isFile():
+            if urlInfo.name() in self._remoteFiles.values():
+                self.__remoteFilesFound[urlInfo.name()] = urlInfo.lastModified()
+        
+        QCoreApplication.processEvents()
     
     def __downloadFile(self, type_, fileName, timestamp):
         """
@@ -190,10 +234,31 @@
         @param timestamp time stamp in seconds of the file to be downloaded (int)
         """
         self.syncStatus.emit(type_, self._messages[type_]["RemoteExists"])
-        buffer = QBuffer(self)
-        buffer.open(QIODevice.WriteOnly)
-        id = self.__ftp.get(self._remoteFiles[type_], buffer)
-        self.__syncIDs[id] = (type_, buffer, True, fileName, timestamp)
+        buffer = io.BytesIO()
+        try:
+            self.__ftp.retrbinary(
+                "RETR {0}".format(self._remoteFiles[type_]),
+                lambda x: self.__downloadFileCallback(buffer, x))
+            ok, error = self.writeFile(
+                QByteArray(buffer.getvalue()), fileName, type_, timestamp)
+            if not ok:
+                self.syncStatus.emit(type_, error)
+            self.syncFinished.emit(type_, ok, True)
+        except ftplib.all_errors as err:
+            self.syncStatus.emit(type_, str(err))
+            self.syncFinished.emit(type_, False, True)
+    
+    def __downloadFileCallback(self, buffer, data):
+        """
+        Private method receiving the downloaded data.
+        
+        @param buffer reference to the buffer (io.BytesIO)
+        @param data byte string to store in the buffer (bytes)
+        @return number of bytes written to the buffer (integer)
+        """
+        res = buffer.write(data)
+        QCoreApplication.processEvents()
+        return res
     
     def __uploadFile(self, type_, fileName):
         """
@@ -208,8 +273,16 @@
             self.syncStatus.emit(type_, self._messages[type_]["LocalMissing"])
             self.syncFinished(type_, False, False)
         else:
-            id = self.__ftp.put(data, self._remoteFiles[type_])
-            self.__syncIDs[id] = (type_, data, False)
+            buffer = io.BytesIO(data.data())
+            try:
+                self.__ftp.storbinary(
+                    "STOR {0}".format(self._remoteFiles[type_]),
+                    buffer,
+                    callback=lambda x: QCoreApplication.processEvents())
+                self.syncFinished.emit(type_, True, False)
+            except ftplib.all_errors as err:
+                self.syncStatus.emit(type_, str(err))
+                self.syncFinished.emit(type_, False, False)
     
     def __initialSyncFile(self, type_, fileName):
         """
@@ -220,11 +293,11 @@
         @param fileName name of the file to be synchronized (string)
         """
         if not self.__forceUpload and \
-           self._remoteFiles[type_] in self.__remoteFilesFound and \
-           QFileInfo(fileName).lastModified() <= \
-                self.__remoteFilesFound[self._remoteFiles[type_]]:
-            self.__downloadFile(type_, fileName,
-                self.__remoteFilesFound[self._remoteFiles[type_]].toTime_t())
+           self._remoteFiles[type_] in self.__remoteFilesFound:
+            if QFileInfo(fileName).lastModified() < \
+               self.__remoteFilesFound[self._remoteFiles[type_]]:
+                self.__downloadFile(type_, fileName,
+                    self.__remoteFilesFound[self._remoteFiles[type_]].toTime_t())
         else:
             if self._remoteFiles[type_] not in self.__remoteFilesFound:
                 self.syncStatus.emit(type_, self._messages[type_]["RemoteMissing"])
@@ -274,9 +347,21 @@
         if self.__state == "initializing":
             return
         
+        # use idle timeout to check, if we are still connected
+        if self.__connected:
+            self.__idleTimeout()
+            if not self.__connected:
+                ok = self.__connectAndLogin()
+                if not ok:
+                    self.syncStatus.emit(type_, self.trUtf8("Cannot log in to FTP host."))
+                    return
+        
+        # upload the changed file
         self.__state = "uploading"
         self.syncStatus.emit(type_, self._messages[type_]["Uploading"])
         self.__uploadFile(type_, fileName)
+        self.syncStatus.emit(type_, self.trUtf8("Synchronization finished."))
+        self.__state = "idle"
     
     def syncBookmarks(self):
         """
@@ -320,17 +405,20 @@
         if self.__idleTimer.isActive():
             self.__idleTimer.stop()
         
-        t = QTime.currentTime()
-        t.start()
-        while t.elapsed() < 5000 and self.__ftp.hasPendingCommands():
-            QThread.msleep(200)
-        if self.__ftp.hasPendingCommands():
-            self.__ftp.clearPendingCommands()
-        if self.__ftp.currentCommand() != 0:
-            self.__ftp.abort()
+        try:
+            self.__ftp.quit()
+        except ftplib.all_errors:
+            pass    # ignore FTP errors because we are shutting down anyway
+        self.__connected = False
     
     def __idleTimeout(self):
         """
         Private slot to prevent a disconnect from the server.
         """
-        self.__ftp.rawCommand("NOOP")
+        if self.__state == "idle" and self.__connected:
+            try:
+                self.__ftp.voidcmd("NOOP")
+            except ftplib.Error as err:
+                code, msg = err.args[0].split(None, 1)
+                if code.strip() == "421":
+                    self.__connected = False
--- a/changelog	Sat Sep 22 19:40:50 2012 +0200
+++ b/changelog	Sun Sep 23 16:23:04 2012 +0200
@@ -35,6 +35,8 @@
   -- added support for AdBlock exceptions
   -- added support for AdBlock checksum checking when downloading a subscription
   -- added support for variable AdBlock update periods (given in subscription)
+  -- changed FTP support to use Python's ftplib instead of QFtp because the later
+     is not supported in Qt5 anymore
 
 Version 5.3-snapshot-20120624:
 - bug fixes
--- a/i18n/eric5_cs.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_cs.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6489,7 +6489,7 @@
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
         <source>Info</source>
-        <translation type="unfinished">Info</translation>
+        <translation type="obsolete">Info</translation>
     </message>
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
@@ -6522,37 +6522,37 @@
         <translation type="obsolete">&lt;p&gt;Chystáte se stáhnout soubor &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Co chcete udělat?&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation type="unfinished">Download zrušen: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation type="unfinished">Uložit soubor</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation type="unfinished">Chyba při otvírání uloženého souboru: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation type="unfinished">Chyba při ukládání: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation type="unfinished">Chyba sítě: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation type="unfinished">?</translation>
     </message>
@@ -6562,12 +6562,12 @@
         <translation type="obsolete">{0} staženo</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation type="unfinished">{0} z {1} - zastaveno</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6577,13 +6577,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -13616,24 +13616,24 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -13643,7 +13643,7 @@
         <translation type="obsolete">&lt;b&gt;Zadejte uživatelské jméno a heslo pro &apos;{0}&apos;&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -13651,13 +13651,18 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -28147,12 +28152,12 @@
         <translation>Certifikáty</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Zadejte uživatelské jméno a heslo pro &apos;{0}&apos;&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Zadejte uživatelské jméno a heslo pro {0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</translation>
     </message>
Binary file i18n/eric5_de.qm has changed
--- a/i18n/eric5_de.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_de.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6262,11 +6262,6 @@
         <translation>Dateiname</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
-        <source>Info</source>
-        <translation>Info</translation>
-    </message>
-    <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
         <source>Press to repeat the download</source>
         <translation>Drücken, um den Download zu wiederholen</translation>
@@ -6282,47 +6277,47 @@
         <translation>Drücken, um die geladenen Datei zu öffnen</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation>Download abgebrochen: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation>Datei speichern</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation>Das Downloadverzeichnis ({0}) konnte nicht erzeugt werden.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation>Fehler beim Öffnen der zu speichernden Datei: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation>Fehler beim Speichern: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation>Netzwerkfehler: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation>?</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation>{0} von {1} - Angehalten</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation>Prüfung mit VirusTotal beauftragt: {0}</translation>
     </message>
@@ -6332,14 +6327,14 @@
         <translation>Drücken, um den Download zu pausieren</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation>{0} von {1} ({2}/s)
 {3}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -13283,30 +13278,30 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;In den übergeordneten Ordner wechseln&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Größe&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Zuletzt verändert&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation>Index von {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation>Kein geeigneter Proxy gefunden.</translation>
     </message>
@@ -13314,14 +13309,19 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation>Kein geeigneter Proxy gefunden.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
-        <translation>Synchronisation beendet</translation>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation>Anmeldung am FTP Server fehlgeschlagen.</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
+        <translation>Synchronisation beendet.</translation>
     </message>
 </context>
 <context>
@@ -27092,12 +27092,12 @@
 <context>
     <name>NetworkAccessManager</name>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Gib Nutzernamen und Kennwort für &apos;{0}&apos; ein&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Gib Nutzernamen und Kennwort für &apos;{0}&apos; und Realm &apos;{1}&apos; ein&lt;/b&gt;</translation>
     </message>
--- a/i18n/eric5_en.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_en.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6206,11 +6206,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
-        <source>Info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
         <source>Press to repeat the download</source>
         <translation type="unfinished"></translation>
@@ -6226,47 +6221,47 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6276,13 +6271,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -13198,29 +13193,29 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -13228,13 +13223,18 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -26944,12 +26944,12 @@
 <context>
     <name>NetworkAccessManager</name>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>
--- a/i18n/eric5_es.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_es.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6313,7 +6313,7 @@
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
         <source>Info</source>
-        <translation>Información</translation>
+        <translation type="obsolete">Información</translation>
     </message>
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
@@ -6331,47 +6331,47 @@
         <translation>Pulse para abrir el archivo descargado</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation>Descarga cancelada: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation>Guardar archivo</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation>El directorio de descargas ({0}) no ha podido ser creado.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation>Error al abrir el fichero a guardar: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation>Error al guardar: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation>Error de Red: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation>?</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation>{0} de {1} - Parado</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation>Scan de VirusTotal programado: {0}</translation>
     </message>
@@ -6381,14 +6381,14 @@
         <translation>Pulse para pausar la descarga</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation>{0} de {1} ({2}/sec)
 {3}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -13339,30 +13339,30 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished">No se ha encontrado ningún proxy adecuado.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Cambiar al directorio superior&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Nombre&lt;/th&gt;&lt;th&gt;Tamaño&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Última modificación&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation>Listado de {0}</translation>
     </message>
@@ -13375,14 +13375,24 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation>¡El archivo remoto de marcadores ya existe! Sincronizando copia local...</translation>
     </message>
     <message>
         <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
         <source>Synchronization finished</source>
-        <translation>Subiendo archivo local de marcadores...</translation>
+        <translation type="obsolete">Subiendo archivo local de marcadores...</translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -27275,12 +27285,12 @@
         <translation>Certificados</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Introduzca nombre de usuario y contraseña para &apos;{0}&apos;&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Introduzca nombre de usuario y contraseña para &apos;{0}&apos;, reino {1}&apos;&lt;/b&gt;</translation>
     </message>
--- a/i18n/eric5_fr.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_fr.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6812,7 +6812,7 @@
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
         <source>Info</source>
-        <translation type="unfinished">Info</translation>
+        <translation type="obsolete">Info</translation>
     </message>
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
@@ -6835,47 +6835,47 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation type="unfinished">?</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6885,13 +6885,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -14444,29 +14444,29 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -14474,13 +14474,18 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -29399,12 +29404,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>
--- a/i18n/eric5_it.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_it.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6386,7 +6386,7 @@
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
         <source>Info</source>
-        <translation>Info</translation>
+        <translation type="obsolete">Info</translation>
     </message>
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
@@ -6409,32 +6409,32 @@
         <translation>Premi per aprire il file scaricato</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation>Download cancellato: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation>Salva file</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation>La directory ({0}) per il download non può essere creata.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation>Errore nell&apos;apertura del file: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation>Errore nel salvataggio di: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation>Errore di rete: {0}</translation>
     </message>
@@ -6444,7 +6444,7 @@
         <translation type="obsolete">{0} di {1} ({2}/sec) - {3}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation>?</translation>
     </message>
@@ -6454,12 +6454,12 @@
         <translation type="obsolete">{0} scaricato</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation>{0} di {1} - Fermati</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6469,13 +6469,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -13450,30 +13450,30 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished">Nessun proxy utilizzabile trovato.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Cambia alla directory superiore&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Nome&lt;/th&gt;&lt;th&gt;Dimensione&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Ultima modifica&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation>Elenco di {0}</translation>
     </message>
@@ -13486,13 +13486,18 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished">Nessun proxy utilizzabile trovato.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -27758,12 +27763,12 @@
         <translation>Certificati</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Inserisci utente e password per &apos;{0}&apos;&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Inserisci utente e password per &apos;{0}&apos;, dominio &apos;{1}&apos;&lt;/b&gt;</translation>
     </message>
--- a/i18n/eric5_ru.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_ru.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6418,7 +6418,7 @@
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
         <source>Info</source>
-        <translation>Информация</translation>
+        <translation type="obsolete">Информация</translation>
     </message>
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
@@ -6451,32 +6451,32 @@
         <translation type="obsolete">&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/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation>Скачивание прервано: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation>Сохранить файл</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation>Невозможно создать каталог ({0}) для загрузки.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation>Ошибка сохранения файла: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation>Ошибка при сохранении: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation>Сетевая ошибка: {0}</translation>
     </message>
@@ -6486,7 +6486,7 @@
         <translation type="obsolete">{0} of {1} ({2}/sec) - {3}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation>?</translation>
     </message>
@@ -6496,12 +6496,12 @@
         <translation type="obsolete">{0} скачано</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation>{0} из {1} - остановлено</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6511,13 +6511,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -13548,30 +13548,30 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Перейти в родительский каталог&lt;/a&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Имя&lt;/th&gt;&lt;th&gt;Размер&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Последнее изменение&lt;/th&gt;&lt;/tr&gt;
 </translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation>{0} {1}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation>Список {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished">Не найдено подходящего прокси.</translation>
     </message>
@@ -13584,13 +13584,18 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished">Не найдено подходящего прокси.</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -27875,12 +27880,12 @@
 <context>
     <name>NetworkAccessManager</name>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Введите имя пользователя и пароль для &apos;{0}&apos;&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt;Введите имя пользователя и пароль для &apos;{0}&apos;; realm &apos;{1}&apos;&lt;/b&gt;</translation>
     </message>
--- a/i18n/eric5_tr.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_tr.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6497,7 +6497,7 @@
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
         <source>Info</source>
-        <translation>Bilgi</translation>
+        <translation type="obsolete">Bilgi</translation>
     </message>
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
@@ -6530,37 +6530,37 @@
         <translation type="obsolete">&lt;p&gt;İndirdiğiniz &lt;b&gt;{0}&lt;/b&gt; doyası hakkında bilgin var.&lt;/p&gt;&lt;p&gt;Bununla ne yapmak istiyorsunuz?&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation>İndirme iptal edildi: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation>Dosyayı Kaydet</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation>kaydedilen dosyanın açılışında hata:{0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation>Kaydederken hata: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation>Ağ hatası: {0}</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation>?</translation>
     </message>
@@ -6570,12 +6570,12 @@
         <translation type="obsolete">{0} indirildi</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation>{0} nın{1} - Durdu</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6585,13 +6585,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -13628,24 +13628,24 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -13655,7 +13655,7 @@
         <translation type="obsolete">&lt;b&gt; &apos;{0}&apos; için kullanıcı adını ve parolayı giriniz&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -13663,13 +13663,18 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -27948,12 +27953,12 @@
 <context>
     <name>NetworkAccessManager</name>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt; &apos;{0}&apos; için kullanıcı adını ve parolayı giriniz&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation>&lt;b&gt; &apos;{1}&apos; alanı, &apos;{0}&apos; için kullanıcı adı ve parola giriniz&lt;/b&gt;</translation>
     </message>
--- a/i18n/eric5_zh_CN.GB2312.ts	Sat Sep 22 19:40:50 2012 +0200
+++ b/i18n/eric5_zh_CN.GB2312.ts	Sun Sep 23 16:23:04 2012 +0200
@@ -6806,7 +6806,7 @@
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="63"/>
         <source>Info</source>
-        <translation type="unfinished">信息</translation>
+        <translation type="obsolete">信息</translation>
     </message>
     <message>
         <location filename="Helpviewer/Download/DownloadItem.ui" line="78"/>
@@ -6829,47 +6829,47 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="206"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="219"/>
         <source>Download canceled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="196"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="209"/>
         <source>Save File</source>
         <translation type="unfinished">保存文件</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="225"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="238"/>
         <source>Download directory ({0}) couldn&apos;t be created.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="395"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="412"/>
         <source>Error opening save file: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="407"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="424"/>
         <source>Error saving: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="419"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="436"/>
         <source>Network Error: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="528"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="545"/>
         <source>?</source>
         <translation type="unfinished">?</translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="541"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="558"/>
         <source>{0} of {1} - Stopped</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="184"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="197"/>
         <source>VirusTotal scan scheduled: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6879,13 +6879,13 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="527"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="544"/>
         <source>{0} of {1} ({2}/sec)
 {3}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Download/DownloadItem.py" line="536"/>
+        <location filename="Helpviewer/Download/DownloadItem.py" line="553"/>
         <source>{0} downloaded
 SHA1: {1}
 MD5: {2}</source>
@@ -14391,29 +14391,29 @@
 <context>
     <name>FtpReply</name>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="395"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="386"/>
         <source>  &lt;p&gt;&lt;a class=&quot;link_parent&quot; href=&quot;{0}&quot;&gt;Change to parent directory&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="408"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="399"/>
         <source>    &lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Last modified&lt;/th&gt;&lt;/tr&gt;
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="434"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="425"/>
         <source>{0} {1}</source>
         <comment>size unit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="458"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="449"/>
         <source>Listing of {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/FtpReply.py" line="155"/>
+        <location filename="Helpviewer/Network/FtpReply.py" line="141"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -14421,13 +14421,18 @@
 <context>
     <name>FtpSyncHandler</name>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="89"/>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="96"/>
         <source>No suitable proxy found.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="163"/>
-        <source>Synchronization finished</source>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="356"/>
+        <source>Cannot log in to FTP host.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="Helpviewer/Sync/FtpSyncHandler.py" line="363"/>
+        <source>Synchronization finished.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -29371,12 +29376,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="200"/>
+        <location filename="Helpviewer/Network/NetworkAccessManager.py" line="197"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
     </message>

eric ide

mercurial