On Tue, May 4, 2010 at 9:13 AM, Jack Wootton <[email protected]> wrote:
> > > On Tue, May 4, 2010 at 7:00 AM, Martin Jones <[email protected]>wrote: > >> On Thu, 29 Apr 2010 11:11:42 pm ext Jack Wootton wrote: >> > Hi, >> > >> > It is now working. It seemed to be a combination of problems: >> > >> > 1. There was a problem with the proxy I was using which has now been >> fixed. >> > >> > 2. When the proxy contained "http://" it did not work. Instead I >> changed >> > it back to just "my.proxy.com<http://my.proxy.com>" and set >> QNetworkProxy >> > type to HttpProxy. >> > >> > My final code for the create method looked like this: >> > >> > QNetworkProxy proxy; >> > proxy.setHostName("my.proxy.com<http://my.proxy.com>"); >> > proxy.setPort(3128); >> > proxy.setType(QNetworkProxy::HttpProxy); >> >> I'm surprised that works. I would have thought that the proxy host should >> be >> "my.proxy.com" without the URL in the angle brackets. >> > > Some formatting has taken place along the way, I don't use any angle > brackets. i use a single proxy address which excludes http:// > > >> > I still have one unanswered question from before :) >> > >> > I removed a call to the static method >> > >> > QNetworkProxy::setApplicationProxy(proxy); >> > >> > ... because of the need for create(QObject* parent) to be re-entrant. >> > Is it OK to call this static method from a re-entrant method? If so, >> > should the documentation make this clear? >> >> That method appears to be protected by a mutex, so it should be safe. You >> can >> file a bug at http://bugreports.qt.nokia.com if the documentation is >> insufficient > > > Thank you > For completeness, I have created a "suggestion" on the bug tracking database: http://bugreports.qt.nokia.com/browse/QTBUG-10390 > > >> . >> >> Martin. >> >> >> > Thank you for your help too :) >> > >> > On Thu, Apr 29, 2010 at 7:01 AM, Martin Jones >> > <[email protected]<mailto:[email protected]>> wrote: >> > >> > On Wed, 28 Apr 2010 11:12:11 pm ext Jack Wootton wrote: >> > > To follow up on this. I have been reading the documentation for >> > > QNetworkProxyFactory: >> > > http://doc.qt.nokia.com/4.7-snapshot/qnetworkproxyfactory.html >> > > >> > > For the method >> > > >> > > QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery ( const >> > > QNetworkProxyQuery & query = QNetworkProxyQuery() ) [static] >> > > >> > > it is documented that: "On Windows, this function will use the WinHTTP >> > > DLL functions. Despite its name, Microsoft suggests using it for all >> > > applications that require network connections, not just HTTP. This >> will >> > > respect the proxy settings set on the registry with the proxycfg.exe >> > > tool. If those settings are not found, this function will attempt to >> > > obtain Internet Explorer's settings and use them." >> > > >> > > I'm have set my proxy using proxycfg tool on Windows, however I still >> get >> > > no proxy results from QNetworkProxyFactory::systemProxyForQuery >> > >> > QNetworkProxyFactory::systemProxyForQuery() requires a >> QNetworkProxyQuery >> > to be passed to it. This would also require using a >> QNetworkProxyFactory, >> > rather than simply setting a proxy for the QNetworkAccessManager. If >> you >> > want to do this then you can see the qml runtime source for inspiration >> - >> > tools/qml/qmlruntime.cpp (search for SystemProxyFactory). >> > >> > To begin, I think you should get the code below working, though. I >> suspect >> > the reason it does not work is that you have not provided a valid host >> > name: >> > >> > >> > proxy.setHostName("my.proxy.com<http://my.proxy.com>< >> http://my.proxy.com>" >> > ); >> > >> > changing it to this should make it work: >> > >> > proxy.setHostName("my.proxy.com<http://my.proxy.com>"); >> > >> > assuming my.proxy.com<http://my.proxy.com> is a valid proxy. >> > >> > I've added a simple example to examples/declarative/proxyviewer, >> > illustrating how to use a QDeclarativeNetworkAccessManagerFactory >> (should >> > appear on gitorious within 24hrs). The code is essentially the same as >> > you have below, so with a correct proxy set this should work. >> > >> > Martin. >> > >> > > On Tue, Apr 27, 2010 at 2:35 PM, Jack Wootton >> > > <[email protected]<mailto:[email protected]><mailto: >> jackwoot...@g >> > > mail.com<mailto:[email protected]>>> wrote: Hello, >> > > >> > > I have modifed the my implementation of >> > > QDeclarativeNetworkAccessManagerFactory (question follows code) :) >> > > >> > > MyNetworkAccessManagerFactory.h >> > > =========================== >> > > class MyNetworkAccessManagerFactory : public >> > > QDeclarativeNetworkAccessManagerFactory { >> > > >> > > public: >> > > MyNetworkAccessManagerFactory(); >> > > ~MyNetworkAccessManagerFactory(); >> > > >> > > public: >> > > QNetworkAccessManager* create ( QObject * parent ); >> > > >> > > }; >> > > >> > > >> > > MyNetworkAccessManagerFactory.cpp >> > > ============================= >> > > MyNetworkAccessManagerFactory::MyNetworkAccessManagerFactory() >> > > { >> > > } >> > > >> > > MyNetworkAccessManagerFactory::~MyNetworkAccessManagerFactory() >> > > >> > > { >> > > } >> > > >> > > QNetworkAccessManager* MyNetworkAccessManagerFactory::create ( >> QObject* >> > > parent ) { >> > > >> > > QNetworkProxy proxy; >> > > proxy.setHostName("my.proxy.com<http://my.proxy.com>< >> http://my.proxy >> > > .com>"); >> > > >> > > proxy.setPort(3128); >> > > >> > > // Is this static method call acceptable for a re-entrant method? >> > > // QNetworkProxy::setApplicationProxy(proxy); >> > > >> > > QNetworkAccessManager* nam = new QNetworkAccessManager(parent); >> > > >> > > >> > > nam->setProxy(proxy); >> > > return nam; >> > > >> > > } >> > > >> > > >> > > >> > > I have a question about ensuring the method create(QObject* parent) is >> > > thread safe / re-entrant: I assumed the method call >> > > 'QNetworkProxy::setApplicationProxy(proxy);' is not ok since it is >> static >> > > and should not be called from a re-entrant function. Is this the >> case? >> > > If so, is it a problem that it is not called? >> > > >> > > I made the changes, but I still don't see the webpage loaded in the >> QML >> > > document, but I'll deal with that after I know my code is correct >> first >> > > :) >> > > >> > > >> > > >> > > On Tue, Apr 27, 2010 at 2:19 AM, Martin Jones >> > > <[email protected]<mailto:[email protected]><mailto: >> martin.jone >> > > [email protected]<mailto:[email protected]>>> wrote: >> > > >> > > On Tue, 27 Apr 2010 01:18:56 am ext Jack Wootton wrote: >> > > > Hi, >> > > > >> > > > I'm trying to set some proxy settings for a QML application - it's >> not >> > > > working as expected. I'm unsure the API is being used correctly, >> can >> > > > someone check my code makes sense? There are 3 files: main.cpp, >> > > > MyNetworkAccessManagerFactory.h and >> MyNetworkAccessManagerFactory.cpp >> > > > >> > > > I'm using qt 4.7 and followed the documentation >> > > > ( >> http://doc.qt.nokia.com/4.7-snapshot/qdeclarativenetworkaccessmanagerf >> > > > ac t ory.html) when writing the code. The method >> > > > MyNetworkAccessManagerFactory::create(QObject* parent) does get >> called >> > > > when the QML document is loaded using the QDeclarativeView, so the >> > > > framework is definitely picking up the new proxy settings. >> > > > >> > > > The questions I have are: >> > > > >> > > > 1. Is the implementation of MyNetworkAccessManagerFactory::create >> > > > correct? I assumed because I was subclassing from a class with >> > > > 'factory' in its name, that it was ok to return the same pointer to >> > > > NetworkAccessManager. >> > > > >> > > > 2. How do I know if the method that calls "create" takes ownership >> of >> > > > the returned pointer or not? I assumed it didn't, hence cleaning up >> > > > in ~MyNetworkAccessManagerFactory(); >> > > > >> > > > 3. Is there anything obviously wrong with the way I'm using the >> > > > NetworkAccessManager? >> > > >> > > The factory must create a new NAM each time it is called. This is >> > > because QML creates multiple threads and each must have its own NAM. >> It >> > > is important that you set the parent of the NAM created to the parent >> > > passed in the create() method (which you already do). The NAM will be >> > > destroyed when its parent is destroyed. I will update the >> documentation >> > > to make this clear. >> > > >> > > Also take special note of this line from the documentation: >> > > >> > > "Note: the create() method may be called by multiple threads, so >> ensure >> > > the implementation of this method is reentrant." >> > > >> > > -- >> > > Martin >> > > >> > > >> > > >> > > -- >> > > Regards >> > > Jack >> > > >> > > >> > > >> > > -- >> > > Regards >> > > Jack >> > >> > -- >> > Martin >> > >> > >> > >> > -- >> > Regards >> > Jack >> >> -- >> Martin >> > > > > -- > Regards > Jack > -- Regards Jack
_______________________________________________ Qt-qml mailing list [email protected] http://lists.trolltech.com/mailman/listinfo/qt-qml
