eric7/WebBrowser/AdBlock/AdBlockSubscription.py

branch
eric7
changeset 9162
8b75b1668583
parent 8881
54e42bc2437a
child 9165
17617e5d5473
--- a/eric7/WebBrowser/AdBlock/AdBlockSubscription.py	Mon Jun 20 13:25:14 2022 +0200
+++ b/eric7/WebBrowser/AdBlock/AdBlockSubscription.py	Mon Jun 20 19:47:39 2022 +0200
@@ -14,7 +14,7 @@
 
 from PyQt6.QtCore import (
     pyqtSignal, Qt, QObject, QByteArray, QDateTime, QUrl, QUrlQuery,
-    QCryptographicHash, QFile, QIODevice, QTextStream, QDate, QTime
+    QCryptographicHash, QDate, QTime
 )
 from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest
 
@@ -278,64 +278,69 @@
         Private method to load the rules of the subscription.
         """
         fileName = self.rulesFileName()
-        f = QFile(fileName)
-        if f.exists():
-            if not f.open(QIODevice.OpenModeFlag.ReadOnly):
+        if os.path.exists(fileName):
+            try:
+                with open(fileName, "r", encoding="utf-8") as f:
+                    header = f.readline().strip()
+                    if not header.startswith("[Adblock"):
+                        EricMessageBox.warning(
+                            None,
+                            self.tr("Load subscription rules"),
+                            self.tr("""AdBlock file '{0}' does not start"""
+                                    """ with [Adblock.""")
+                            .format(fileName))
+                        f.close()
+                        os.unlink(fileName)
+                        self.__lastUpdate = QDateTime()
+                    else:
+                        from .AdBlockRule import AdBlockRule
+                        
+                        self.__updatePeriod = 0
+                        self.__remoteModified = QDateTime()
+                        self.__rules = []
+                        self.__rules.append(AdBlockRule(header, self))
+                        for line in f.readlines():
+                            line = line.strip()
+                            if not line:
+                                continue
+                            self.__rules.append(AdBlockRule(line, self))
+                            expires = self.__expiresRe.search(line)
+                            if expires:
+                                period, kind = expires.groups()
+                                if kind:
+                                    # hours
+                                    self.__updatePeriod = int(period)
+                                else:
+                                    # days
+                                    self.__updatePeriod = int(period) * 24
+                            remoteModified = self.__remoteModifiedRe.search(
+                                line)
+                            if remoteModified:
+                                day, month, year, time, hour, minute = (
+                                    remoteModified.groups()
+                                )
+                                self.__remoteModified.setDate(
+                                    QDate(int(year),
+                                          self.__monthNameToNumber[month],
+                                          int(day))
+                                )
+                                if time:
+                                    self.__remoteModified.setTime(
+                                        QTime(int(hour), int(minute)))
+                                else:
+                                    # no time given, set it to 23:59
+                                    self.__remoteModified.setTime(
+                                        QTime(23, 59))
+                        self.changed.emit()
+            except OSError as err:
                 EricMessageBox.warning(
                     None,
                     self.tr("Load subscription rules"),
                     self.tr(
-                        """Unable to open AdBlock file '{0}' for reading.""")
-                    .format(fileName))
-            else:
-                textStream = QTextStream(f)
-                header = textStream.readLine(1024)
-                if not header.startswith("[Adblock"):
-                    EricMessageBox.warning(
-                        None,
-                        self.tr("Load subscription rules"),
-                        self.tr("""AdBlock file '{0}' does not start"""
-                                """ with [Adblock.""")
-                        .format(fileName))
-                    f.close()
-                    f.remove()
-                    self.__lastUpdate = QDateTime()
-                else:
-                    from .AdBlockRule import AdBlockRule
-                    
-                    self.__updatePeriod = 0
-                    self.__remoteModified = QDateTime()
-                    self.__rules = []
-                    self.__rules.append(AdBlockRule(header, self))
-                    while not textStream.atEnd():
-                        line = textStream.readLine()
-                        self.__rules.append(AdBlockRule(line, self))
-                        expires = self.__expiresRe.search(line)
-                        if expires:
-                            period, kind = expires.groups()
-                            if kind:
-                                # hours
-                                self.__updatePeriod = int(period)
-                            else:
-                                # days
-                                self.__updatePeriod = int(period) * 24
-                        remoteModified = self.__remoteModifiedRe.search(line)
-                        if remoteModified:
-                            day, month, year, time, hour, minute = (
-                                remoteModified.groups()
-                            )
-                            self.__remoteModified.setDate(
-                                QDate(int(year),
-                                      self.__monthNameToNumber[month],
-                                      int(day))
-                            )
-                            if time:
-                                self.__remoteModified.setTime(
-                                    QTime(int(hour), int(minute)))
-                            else:
-                                # no time given, set it to 23:59
-                                self.__remoteModified.setTime(QTime(23, 59))
-                    self.changed.emit()
+                        """Unable to read AdBlock file '{0}'\nReason: {1}.""")
+                    .format(fileName, str(err))
+                )
+        
         elif not fileName.endswith("_custom"):
             self.__lastUpdate = QDateTime()
         
@@ -389,7 +394,7 @@
         @param reply reference to the network reply
         @type QNetworkReply
         """
-        response = reply.readAll()
+        response = bytes(reply.readAll())
         reply.close()
         self.__downloading = None
         
@@ -408,7 +413,7 @@
                 self.__defaultSubscription = False
             return
         
-        if response.isEmpty():
+        if not response:
             EricMessageBox.warning(
                 None,
                 self.tr("Downloading subscription rules"),
@@ -416,47 +421,46 @@
             return
         
         fileName = self.rulesFileName()
-        QFile.remove(fileName)
-        f = QFile(fileName)
-        if not f.open(QIODevice.OpenModeFlag.ReadWrite):
+        try:
+            with open(fileName, "wb") as f:
+                from WebBrowser.WebBrowserWindow import WebBrowserWindow
+                if (
+                    WebBrowserWindow.adBlockManager().useLimitedEasyList() and
+                    self.url().toString().startswith(
+                        WebBrowserWindow.adBlockManager()
+                        .getDefaultSubscriptionUrl())
+                ):
+                    limited = True
+                    # ignore Third-party advertisers rules for performance
+                    # whitelist rules at the end will be used
+                    index = response.find(
+                        b"!---------------------------"
+                        b"Third-party advertisers"
+                        b"---------------------------!")
+                    part1 = response[:index]
+                    index = response.find(
+                        b"!-----------------------"
+                        b"Whitelists to fix broken sites"
+                        b"------------------------!")
+                    part2 = response[index:]
+                    f.write(part1)
+                    f.write(part2)
+                else:
+                    limited = False
+                    f.write(response)
+                f.close()
+                self.__lastUpdate = QDateTime.currentDateTime()
+                
+                if limited or self.__validateCheckSum(fileName):
+                    self.__loadRules()
+                else:
+                    os.unlink(fileName)
+        except OSError:
             EricMessageBox.warning(
                 None,
                 self.tr("Downloading subscription rules"),
-                self.tr(
-                    """Unable to open AdBlock file '{0}' for writing.""")
+                self.tr("""Unable to write to AdBlock file '{0}'.""")
                 .file(fileName))
-            return
-        
-        from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        if (
-            WebBrowserWindow.adBlockManager().useLimitedEasyList() and
-            self.url().toString().startswith(
-                WebBrowserWindow.adBlockManager().getDefaultSubscriptionUrl())
-        ):
-            limited = True
-            # ignore Third-party advertisers rules for performance
-            # whitelist rules at the end will be used
-            index = response.indexOf(
-                b"!---------------------------"
-                b"Third-party advertisers"
-                b"---------------------------!")
-            part1 = response.left(index)
-            index = response.indexOf(
-                b"!-----------------------"
-                b"Whitelists to fix broken sites"
-                b"------------------------!")
-            part2 = response.mid(index)
-            f.write(part1)
-            f.write(part2)
-        else:
-            limited = False
-            f.write(response)
-        f.close()
-        self.__lastUpdate = QDateTime.currentDateTime()
-        if limited or self.__validateCheckSum(fileName):
-            self.__loadRules()
-        else:
-            QFile.remove(fileName)
         self.__downloading = None
         reply.deleteLater()
     
@@ -520,22 +524,18 @@
         if not fileName:
             return
         
-        f = QFile(fileName)
-        if not f.open(QIODevice.OpenModeFlag.ReadWrite |
-                      QIODevice.OpenModeFlag.Truncate):
+        try:
+            with open(fileName, "w", encoding="utf-8") as f:
+                if not self.__rules or not self.__rules[0].isHeader():
+                    f.write("[Adblock Plus 2.0]\n")
+                for rule in self.__rules:
+                    f.write(rule.filter() + "\n")
+        except OSError:
             EricMessageBox.warning(
                 None,
                 self.tr("Saving subscription rules"),
-                self.tr(
-                    """Unable to open AdBlock file '{0}' for writing.""")
+                self.tr("""Unable to write to AdBlock file '{0}'.""")
                 .format(fileName))
-            return
-        
-        textStream = QTextStream(f)
-        if not self.__rules or not self.__rules[0].isHeader():
-            textStream << "[Adblock Plus 1.1.1]\n"
-        for rule in self.__rules:
-            textStream << rule.filter() << "\n"
     
     def rule(self, offset):
         """

eric ide

mercurial