[PyQt] kdebindings 4.4.4 build failure with sip-4.11.1 continues

Hans-Peter Jansen hpj at urpla.net
Fri Sep 24 12:04:26 BST 2010


On Wednesday 22 September 2010, 11:25:21 Hans-Peter Jansen wrote:
>
> Unfurtunately, here's the next stumbling point:
>
> /usr/include/kio/tcpslavebase.h: In function 'PyObject*
> slot_KIO_TCPSlaveBase_SslResult___xor__(PyObject*, PyObject*)':
> /usr/include/kio/tcpslavebase.h:63: error: 'enum
> KIO::TCPSlaveBase::SslResultDetail' is protected
> /usr/share/sip/PyQt4/QtCore/qglobal.sip:320: error: within this context
> /usr/include/kio/tcpslavebase.h: In function 'PyObject*
> slot_KIO_TCPSlaveBase_SslResult___or__(PyObject*, PyObject*)':
> /usr/include/kio/tcpslavebase.h:63: error: 'enum
> KIO::TCPSlaveBase::SslResultDetail' is protected
> /usr/share/sip/PyQt4/QtCore/qglobal.sip:315: error: within this context
>
> Phil, this one is due to the logic operator changes. It's not obvious,
> what's going wrong, but related to the friend class QFlags declararation,
> where qglobal.sip got pulled in..
>
> Here's the KDE class excerpt:
>
> class KIO_EXPORT TCPSlaveBase : public SlaveBase
> {
> public:
>     /**
>      * Constructor.
>      *
>      * @param autoSsl if true, will automatically invoke startSsl() right
> after *                connecting. In the absence of errors the use of
> SSL will *                therefore be transparent to higher layers. */
>     TCPSlaveBase(const QByteArray &protocol,
>                  const QByteArray &poolSocket, const QByteArray
> &appSocket, bool autoSsl = false);
>
>     virtual ~TCPSlaveBase();
>
> protected:
>     enum SslResultDetail {
>         ResultOk = 1,
>         ResultOverridden = 2,
>         ResultFailed = 4,
>         ResultFailedEarly = 8
>     };
>     friend class QFlags<KIO::TCPSlaveBase::SslResultDetail>;
> public:
>     Q_DECLARE_FLAGS(SslResult, SslResultDetail)
> protected:
> [...]
>
> and the related sip file excerpt:
>
> %ModuleHeaderCode
> //ctscc
> #include <forwardingslavebase.h>
> #include <slavebase.h>
> #include <tcpslavebase.h>
> %End
>
> namespace KIO
> {
>
> class TCPSlaveBase : KIO::SlaveBase
> {
> %TypeHeaderCode
> #include <tcpslavebase.h>
> %End
>
>
> public:
>     TCPSlaveBase (const QByteArray& protocol, const QByteArray&
> poolSocket, const QByteArray& appSocket, bool autoSsl = 0);
>
>
> protected:
>     enum SslResultDetail
>     {
>         ResultOk,
>         ResultOverridden,
>         ResultFailed,
>         ResultFailedEarly
>     };
> [...]
>
> Both attached.

And here's the offending sip generated code (for the __xor__ method):

extern "C" {static PyObject *slot_KIO_TCPSlaveBase_SslResult___xor__(PyObject *,PyObject *);}
static PyObject *slot_KIO_TCPSlaveBase_SslResult___xor__(PyObject *sipArg0,PyObject *sipArg1)
{
    PyObject *sipParseErr = NULL;

    {
        KIO::TCPSlaveBase::SslResult * a0;
        int a0State = 0;
        KIO::TCPSlaveBase::SslResult * a1;
        int a1State = 0;

        if (sipParsePair(&sipParseErr, sipArg0, sipArg1, "J1J1", sipType_KIO_TCPSlaveBase_SslResult, &a0, &a0State, sipT
ype_KIO_TCPSlaveBase_SslResult, &a1, &a1State))
        {
            KIO::TCPSlaveBase::SslResult *sipRes;

            Py_BEGIN_ALLOW_THREADS
            sipRes = new KIO::TCPSlaveBase::SslResult((*a0 ^ *a1));
            Py_END_ALLOW_THREADS
            sipReleaseType(a0,sipType_KIO_TCPSlaveBase_SslResult,a0State);
            sipReleaseType(a1,sipType_KIO_TCPSlaveBase_SslResult,a1State);

            return sipConvertFromNewType(sipRes,sipType_KIO_TCPSlaveBase_SslResult,NULL);
        }
    }

    {
        KIO::TCPSlaveBase::SslResult * a0;
        int a0State = 0;
        int a1;

        if (sipParsePair(&sipParseErr, sipArg0, sipArg1, "J1i", sipType_KIO_TCPSlaveBase_SslResult, &a0, &a0State, &a1))
        {
            KIO::TCPSlaveBase::SslResult *sipRes = 0;

#line 320 "/usr/share/sip/PyQt4/QtCore/qglobal.sip"
        sipRes = new KIO::TCPSlaveBase::SslResult(*a0 ^ (KIO::TCPSlaveBase::SslResultDetail(a1)));
#line 7221 "sipkiopart0.cpp"
            sipReleaseType(a0,sipType_KIO_TCPSlaveBase_SslResult,a0State);

            return sipConvertFromNewType(sipRes,sipType_KIO_TCPSlaveBase_SslResult,NULL);
        }
    }

    Py_XDECREF(sipParseErr);

    if (sipParseErr == Py_None)
        return NULL;

    return sipPySlotExtend(&sipModuleAPI_kio,xor_slot,NULL,sipArg0,sipArg1);
}


The question is, why can't this method access the protected enum
KIO::TCPSlaveBase::SslResultDetail(a1)

Does it have to be declared as friend class or some such?

Any ideas anyone?

Pete


More information about the PyQt mailing list