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

Reply via email to