<?xml version="1.0"?>
<!--
    This file is part of PySide project.
    Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
    Contact: PySide team <contact@pyside.org>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-->
<typesystem package="PySide.QtNetwork">
  <load-typesystem name="typesystem_core.xml" generate="no"/>

    <namespace-type name="QSsl">
        <enum-type name="AlternateNameEntryType"/>
        <enum-type name="EncodingFormat"/>
        <enum-type name="KeyAlgorithm"/>
        <enum-type name="KeyType"/>
        <enum-type name="SslProtocol"/>
        <extra-includes>
            <include file-name="qssl.h" location="global"/>
        </extra-includes>
    </namespace-type>

    <rejection class="QIPv6Address" field-name="c"/>

    <object-type name="QAbstractSocket">
        <enum-type name="NetworkLayerProtocol"/>
        <enum-type name="SocketError"/>
        <enum-type name="SocketOption" since="4.6"/>
        <enum-type name="SocketState"/>
        <enum-type name="SocketType"/>
        <modify-function signature="connectToHost(const QString&amp;, quint16, QFlags&lt;QIODevice::OpenModeFlag>)" allow-thread="yes" />
        <modify-function signature="connectToHost(const QHostAddress&amp;, quint16, QFlags&lt;QIODevice::OpenModeFlag>)" allow-thread="yes" />
        <modify-function signature="disconnectFromHost()" allow-thread="yes" />
        <modify-function signature="waitForConnected(int)" allow-thread="yes" />
        <modify-function signature="waitForDisconnected(int)" allow-thread="yes" />
    </object-type>

    <object-type name="QFtp">
        <enum-type name="Command"/>
        <enum-type name="Error"/>
        <enum-type name="State"/>
        <enum-type name="TransferMode"/>
        <enum-type name="TransferType"/>
        <modify-function signature="connectToHost(const QString&amp;, quint16)" allow-thread="yes" />
        <modify-function signature="login(const QString&amp;, const QString&amp;)" allow-thread="yes" />
        <modify-function signature="close()" allow-thread="yes" />
        <modify-function signature="list(const QString&amp;)" allow-thread="yes" />
        <modify-function signature="cd(const QString&amp;)" allow-thread="yes" />
        <modify-function signature="get(const QString&amp;, QIODevice*, QFtp::TransferType)" allow-thread="yes" />
        <modify-function signature="put(const QByteArray&amp;, const QString&amp;, QFtp::TransferType)" allow-thread="yes" />
        <modify-function signature="put(QIODevice*, const QString&amp;, QFtp::TransferType)" allow-thread="yes" />
        <modify-function signature="remove(const QString&amp;)" allow-thread="yes" />
        <modify-function signature="mkdir(const QString&amp;)" allow-thread="yes" />
        <modify-function signature="rmdir(const QString&amp;)" allow-thread="yes" />
        <modify-function signature="rename(const QString&amp;, const QString&amp;)" allow-thread="yes" />
        <modify-function signature="rawCommand(const QString&amp;)" allow-thread="yes" />
        <modify-function signature="readAll()" allow-thread="yes" />
        <modify-function signature="read(char*, qint64)" allow-thread="yes">
          <modify-argument index="return">
            <replace-type modified-type="QByteArray"/>
          </modify-argument>
          <modify-argument index="1">
            <remove-argument />
          </modify-argument>
          <inject-code class="target" position="beginning">
            <insert-template name="read_wrapper"/>
          </inject-code>
        </modify-function>
    </object-type>

    <object-type name="QHttp">
        <enum-type name="ConnectionMode"/>
        <enum-type name="Error"/>
        <enum-type name="State"/>
        <modify-function signature="readAll()" allow-thread="yes"/>
        <modify-function signature="read(char*, qint64)" allow-thread="yes">
          <modify-argument index="return">
            <replace-type modified-type="QByteArray"/>
          </modify-argument>
          <modify-argument index="1">
            <remove-argument />
          </modify-argument>
          <inject-code class="target" position="beginning">
            <insert-template name="read_wrapper"/>
          </inject-code>
        </modify-function>
        <!-- ### Obsolete methods -->
        <modify-function signature="closeConnection()" remove="all"/>
        <!-- ### -->
    </object-type>
    <object-type name="QTcpServer">
        <modify-function signature="waitForNewConnection(int,bool*)" allow-thread="yes">
            <!-- FIXME removing default expression means user will always have to pass a value, but he wouldn't have to -->
            <modify-argument index="1">
                <remove-default-expression/>
            </modify-argument>
            <modify-argument index="2">
                <remove-default-expression/>
                <remove-argument/>
            </modify-argument>
            <modify-argument index="return">
                <replace-type modified-type="(retval, timeOut)"/>
            </modify-argument>
            <inject-code class="target" position="beginning">
                <insert-template name="fix_args,bool*"/>
            </inject-code>
        </modify-function>
    </object-type>
    <object-type name="QTcpSocket"/>
    <object-type name="QUdpSocket">
        <enum-type name="BindFlag" flags="BindMode"/>
        <modify-function signature="readDatagram(char*, qint64, QHostAddress*, quint16*)" allow-thread="yes">
            <modify-argument index="1">
                <remove-argument/>
            </modify-argument>
            <modify-argument index="3">
                <remove-default-expression/>
                <remove-argument/>
            </modify-argument>
            <modify-argument index="4">
                <remove-default-expression/>
                <remove-argument/>
            </modify-argument>
            <modify-argument index="return">
                <replace-type modified-type="(data, address, port)"/>
            </modify-argument>
            <inject-code class="target" position="beginning">
            Shiboken::AutoArrayPointer&lt;char&gt; data(%ARGUMENT_NAMES);
            QHostAddress ha;
            quint16 port;
            %BEGIN_ALLOW_THREADS
            %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(data, %ARGUMENT_NAMES, &amp;ha, &amp;port);
            %END_ALLOW_THREADS
            QByteArray ba(data, retval);
            %PYARG_0 = PyTuple_New(3);
            PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[QByteArray](ba));
            PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QHostAddress](ha));
            PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[quint16](port));
            </inject-code>
        </modify-function>
        <modify-function signature="writeDatagram(const QByteArray&amp;, const QHostAddress&amp;, quint16)" allow-thread="yes"/>
        <!-- ### writeDatagram(QByteArray, ...) does the trick -->
        <modify-function signature="writeDatagram(const char*,qint64,const QHostAddress&amp;,quint16)" remove="all"/>
        <!-- ### -->
    </object-type>

    <object-type name="QHttpHeader" />
    <object-type name="QLocalServer">
        <modify-function signature="waitForNewConnection(int,bool*)" allow-thread="yes">
            <!-- FIXME -->
            <modify-argument index="1">
                <remove-default-expression/>
            </modify-argument>
            <modify-argument index="2">
                <remove-default-expression/>
                <remove-argument/>
            </modify-argument>
            <inject-code class="target" position="beginning">
                <insert-template name="fix_args,bool*"/>
            </inject-code>
            <modify-argument index="return">
                <replace-type modified-type="(retval, timeOut)"/>
            </modify-argument>

        </modify-function>
    </object-type>
    <object-type name="QLocalSocket">
        <enum-type name="LocalSocketError"/>
        <enum-type name="LocalSocketState"/>
    </object-type>
    <object-type name="QNetworkAccessManager">
        <enum-type name="NetworkAccessibility" since="4.7"/>
        <enum-type name="Operation"/>
        <modify-function signature="createRequest(QNetworkAccessManager::Operation, const QNetworkRequest&amp;, QIODevice *)">
          <modify-argument index="3" invalidate-after-use="yes"/>
          <modify-argument index="return">
            <define-ownership class="target" owner="default"/>
          </modify-argument>
        </modify-function>
        <modify-function signature="get(const QNetworkRequest&amp;)" allow-thread="yes"/>
        <modify-function signature="post(const QNetworkRequest &amp;, QIODevice *)" allow-thread="yes"/>
        <modify-function signature="post(const QNetworkRequest &amp;, const QByteArray &amp;)" allow-thread="yes"/>
        <modify-function signature="put(const QNetworkRequest &amp;, QIODevice *)" allow-thread="yes"/>
        <modify-function signature="put(const QNetworkRequest &amp;, const QByteArray &amp;)" allow-thread="yes"/>
        <modify-function signature="sendCustomRequest(const QNetworkRequest &amp;, const QByteArray &amp;, QIODevice *)" allow-thread="yes" since="4.7" />
        <modify-function signature="setCookieJar(QNetworkCookieJar*)">
            <modify-argument index="1">
                <define-ownership class="target" owner="c++"/>
            </modify-argument>
        </modify-function>
    </object-type>
    <object-type name="QNetworkCookieJar"/>
    <object-type name="QNetworkReply">
        <enum-type name="NetworkError"/>
    </object-type>

    <value-type name="QHostAddress" hash-function="qHash">
        <enum-type name="SpecialAddress"/>
        <!-- ### QHostAddress(QIPv6Address) does this -->
        <modify-function signature="QHostAddress(quint8*)" remove="all" />
        <!-- ### -->
        <modify-function signature="setAddress(quint8*)" remove="all" />
    </value-type>

    <value-type name="QHostInfo">
        <enum-type name="HostInfoError"/>
        <modify-function signature="lookupHost(QString,QObject*,const char*)" access="private"/>
    </value-type>

    <value-type name="QHttpRequestHeader" />

    <value-type name="QHttpResponseHeader" />

    <value-type name="QNetworkAddressEntry" />

    <value-type name="QNetworkInterface">
        <enum-type name="InterfaceFlag" flags="InterfaceFlags"/>
    </value-type>

    <value-type name="QNetworkProxy">
        <enum-type name="Capability" flags="Capabilities" />
        <enum-type name="ProxyType"/>
    </value-type>

    <object-type name="QNetworkProxyFactory" />
    <value-type name="QNetworkProxyQuery">
        <enum-type name="QueryType" />
    </value-type>

    <value-type name="QUrlInfo">
        <enum-type name="PermissionSpec"/>
    </value-type>

    <value-type name="QIPv6Address">
        <add-function signature="__len__">
            <inject-code class="target" position="beginning">
                return 16;
            </inject-code>
        </add-function>
        <add-function signature="__getitem__">
            <inject-code class="target" position="beginning">
            if (_i >= 16) {
                PyErr_SetString(PyExc_IndexError, "index out of bounds");
                return 0;
            }
            if (_i &lt; 0)
                _i = 16 - qAbs(_i);

            uint item = %CPPSELF.c[_i];
            return %CONVERTTOPYTHON[uint](item);
            </inject-code>
        </add-function>
        <add-function signature="__len__">
            <inject-code class="target" position="beginning">
                return 16;
            </inject-code>
        </add-function>
        <add-function signature="__setitem__">
            <inject-code class="target" position="beginning">
            if (_i >= 16) {
                PyErr_SetString(PyExc_IndexError, "index out of bounds");
                return -1;
            }
            if (_i &lt; 0)
                _i = 16 - qAbs(_i);
            quint8 item = %CONVERTTOCPP[quint8](_value);
            %CPPSELF.c[_i] = item;
            return 0;
            </inject-code>
        </add-function>
    </value-type>

    <value-type name="QAuthenticator" />
    <value-type name="QNetworkCookie">
        <enum-type name="RawForm"/>
        <extra-includes>
            <include file-name="QDateTime" location="global"/>
        </extra-includes>
    </value-type>
    <value-type name="QNetworkRequest">
        <enum-type name="Attribute" extensible="yes"/>
        <enum-type name="LoadControl" since="4.7"/>
        <enum-type name="Priority" since="4.7"/>
        <enum-type name="CacheLoadControl"/>
        <enum-type name="KnownHeaders"/>
    </value-type>

    <!-- TODO QSslCertificate requires QMultiMap which isn't implemented yet
    <value-type name="QSslCertificate"/>
    -->
    <enum-type name="QSslCertificate::SubjectInfo"/>

    <!-- Qt 4.7 -->
    <value-type name="QNetworkConfiguration" since="4.7">
        <enum-type name="BearerType" />
        <enum-type name="Purpose" since="4.7"/>
        <enum-type name="StateFlag" flags="StateFlags" since="4.7"/>
        <enum-type name="Type" since="4.7"/>
    </value-type>
    <object-type name="QNetworkConfigurationManager" since="4.7">
        <enum-type name="Capability" flags="Capabilities" since="4.7"/>
    </object-type>
    <object-type name="QNetworkSession" since="4.7">
        <enum-type name="SessionError" since="4.7"/>
        <enum-type name="State" since="4.7"/>
    </object-type>

    <object-type name="QAbstractNetworkCache"/>
    <object-type name="QNetworkDiskCache"/>
    <value-type name="QNetworkCacheMetaData"/>

    <suppress-warning text="Shadowing: QAbstractSocket::*"/>


    <!-- The following entries may be present in the system or not. Keep this section organized. -->
    <value-type name="QSslCertificate"/>
    <value-type name="QSslCipher"/>
    <value-type name="QSslConfiguration"/>
    <value-type name="QSslError">
        <enum-type name="SslError"/>
    </value-type>

    <value-type name="QSslKey"/>
    <object-type name="QSslSocket">
        <enum-type name="SslMode"/>
        <enum-type name="PeerVerifyMode"/>
        <modify-function signature="connectToHostEncrypted(const QString&amp;, quint16, QFlags&lt;QIODevice::OpenModeFlag>)" allow-thread="yes" />
        <modify-function signature="waitForEncrypted(int)" allow-thread="yes" />
    </object-type>
    <!-- The above entries may be present in the system or not. Keep this section organized. -->
</typesystem>

