Qt Jambi: Accessing the content of QNetworkReply
Asked Answered
V

1

1

I'm having trouble accessing the content of QNetworkReply objects. Content appears to be empty or zero. According to the docs (translating from c++ to java) I think I've got this set up correctly, but to no avail. Additionally an "Unknown error" is being reported.

Any ideas much appreciated. Code:

public class Test extends QObject {

    private QWebPage page;

    public Test() {

        page = new QWebPage();

        QNetworkAccessManager nac = new QNetworkAccessManager();
        nac.finished.connect(this, "requestFinished(QNetworkReply)");

        page.setNetworkAccessManager(nac);

        page.loadProgress.connect(this, "loadProgress(int)");
        page.loadFinished.connect(this, "loadFinished()");

    }

    public void requestFinished(QNetworkReply reply) {

        reply.reset();
        reply.open(OpenModeFlag.ReadOnly);

        reply.readyRead.connect(this, "ready()");  // never gets called

        System.out.println("bytes: " + reply.url().toString());  // writes out asset uri no problem
        System.out.println("bytes: " + reply.bytesToWrite());  // 0
        System.out.println("At end: " + reply.atEnd());   // true
        System.out.println("Error: " + reply.errorString());   // "Unknown error"
    }

    public void loadProgress(int progress) {
        System.out.println("Loaded " + progress + "%");
    }

    public void loadFinished() {
        System.out.println("Done");
    }

    public void ready() {
        System.out.println("Ready");
    }

    public void open(String url) {
        page.mainFrame().load(new QUrl(url));
    }

    public static void main(String[] args) {

        QApplication.initialize(new String[] { });

        Test t = new Test();
        t.open("http://news.bbc.co.uk");

        QApplication.exec();
    }

}
Voorhis answered 3/6, 2010 at 17:49 Comment(5)
Just wondering why do you need web page when you can do the same with only QNetworkAccessManager?Polyclinic
@Anton: I am using the web page for 2 reasons: 1) it gives me all the assets required by the page (css, js, images - including those in css) and 2) cos I need the html rendered.Voorhis
how did you end up accessing the image data without redownloading?Stallworth
@richard - I didn't. I download them again. In Qt jambi, all the methods are final, so you can't override the relevant methods in QNetworkReply or QNetworkAccessManager. Very annoying. Short of recompiling Qt Jambi (which is apparently not trivial),I have run out of ideas.Voorhis
very annoying. I am using PyQt so should have more luckStallworth
D
3

I imagine that the QWebPage has already queried all the QNetworkReply objects as they came in. The docs say

QNetworkReply is a sequential-access QIODevice, which means that once data is read from the object, it no longer kept by the device. It is therefore the application's responsibility to keep this data if it needs to.

so resetting it isn't going to work.

Note that if you make the network request directly through QNetworkAccessManager you do get a QNetworkReply with data available. You only get one though for the actual URL whereas the QWebPage approach downloads everything else after that i.e. images, js, etc.

Diomedes answered 3/6, 2010 at 18:40 Comment(5)
yes, i am wanting everything downloaded, hence the web page approach. But yes, I think you're are right, they've been read already. So what to do....Voorhis
@Richard: I guess it depends on what data you need. If QWebPage has processed them then presumably some of the information will be available from it. Maybe that's not practical though for you?Diomedes
I'm after the images in the page - both the image/data itself (for analysis) plus render information like position in the page, visibility and so on. Hence the web page approach. I'm just hoping to try and avoid downloading the images twice as I'm going to be processing a lot of pages.Voorhis
@Richard: Sounds like you could use QWebElement to get the images but that was only introduced in 4.6 so I don't think you have that in Jambi yet? Also, I don't know how you would get the positions but then you were not going to get those from each QNetworkReply either.Diomedes
Yes QWebElement not available in 4.4, and I think jambi is being discontinued. I do all my DOM hopping and inspection in javascript to get around no QWebElement.Voorhis

© 2022 - 2024 — McMap. All rights reserved.