On Mon, 2 Mar 2009 19:31:26 +0100, Detlev Offenbach <det...@die-offenbachs.de> wrote: > On Montag, 2. März 2009, Phil Thompson wrote: >> On Mon, 2 Mar 2009 18:33:01 +0100, Detlev Offenbach >> >> <det...@die-offenbachs.de> wrote: >> > On Montag, 2. März 2009, Phil Thompson wrote: >> >> On Mon, 2 Mar 2009 18:19:57 +0100, Detlev Offenbach >> >> >> >> <det...@die-offenbachs.de> wrote: >> >> > Hi, >> >> > >> >> > I am trying to write a subclass of QNetworkReply. This subclass >> >> > needs >> >> > to >> >> > have >> >> > it's own variant of the readData protected method. However, it >> >> > seems, >> >> >> >> that >> >> >> >> > this method doesn't work correctly. How do I have to do this >> >> correctly. >> >> >> My >> >> >> >> > code is shown below. >> >> > >> >> > -------------- >> >> > class HelpNetworkReply(QNetworkReply): >> >> > def __init__(self, request, fileData): >> >> > QNetworkReply.__init__(self) >> >> > >> >> > self.__data = QBuffer(fileData) >> >> > >> >> > self.setRequest(request) >> >> > self.setOpenMode(QIODevice.ReadOnly) >> >> > >> >> > self.setHeader(QNetworkRequest.ContentTypeHeader, >> >> > QVariant("text/html")) >> >> > self.setHeader(QNetworkRequest.ContentLengthHeader, >> >> > QVariant(QByteArray.number(fileData.length()))) >> >> > QTimer.singleShot(0, self, SIGNAL("metaDataChanged()")) >> >> > QTimer.singleShot(0, self, SIGNAL("readyRead()")) >> >> > >> >> > def abort(self): >> >> > # do nothing >> >> > pass >> >> > >> >> > def readData(self, buffer, maxlen): >> >> > l = self.__data.readData(buffer, maxlen) >> >> > if self.__data.bytesAvailable() == 0: >> >> > QTimer.singleShot(0, self, SIGNAL("finished()")) >> >> > return l >> >> > -------------- >> >> >> >> The Python signature is slightly different as Python strings aren't >> >> mutable. There is no buffer argument and you should return the data as >> >> a >> >> Python string. >> >> >> >> Phil >> >> _______________________________________________ >> >> PyQt mailing list PyQt@riverbankcomputing.com >> >> http://www.riverbankcomputing.com/mailman/listinfo/pyqt >> > >> > So I have to "return l, buffer" with buffer being a Python string. >> >> No, just buffer. The handwritten code for readData() gets the length from >> the buffer. > > That works now. However, I am facing a new problem. After several requests > with a "qthelp" scheme, my application is crashing with a segfault. If I > keep > the references to the reply objects (i.e. never clean the array), it works > (but leaks memory). What is wrong? > > Note: engine is a reference to a QHelpEngine object. > > --------------- > class HelpNetworkAccessManager(QNetworkAccessManager): > def __init__(self, engine, parent = None): > QNetworkAccessManager.__init__(self, parent) > > self.__engine = engine > self.__helpreplies = [] > > def createRequest(self, op, request, outgoingData): > for reply in self.__helpreplies[:]: > if reply.isFinished(): > self.__helpreplies.remove(reply) > del reply > > scheme = request.url().scheme() > if scheme == "qthelp": > reply = HelpNetworkReply(request, > self.__engine.fileData(request.url())) > self.__helpreplies.append(reply) > print len(self.__helpreplies) > return reply > > return QNetworkAccessManager.createRequest(self, op, request, > outgoingData) > ---------------
Possibly a missing /Factory/ on QNetworkAccessManager.createRequest(). Can you add it and see if it makes a difference - or send me a complete test that demonstrates the problem. Phil _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt