diff --git a/cmd/genbindings/clang2il.go b/cmd/genbindings/clang2il.go index 9997226c..77a0f34e 100644 --- a/cmd/genbindings/clang2il.go +++ b/cmd/genbindings/clang2il.go @@ -865,6 +865,10 @@ func parseSingleTypeString(p string) CppParameter { } else if tok == "const" { insert.Const = true + } else if tok == "class" { + // QNetwork has some references to 'class QSslCertificate'. Flatten + continue + } else if tok == "&" { // U+0026 insert.ByRef = true diff --git a/cmd/genbindings/config-allowlist.go b/cmd/genbindings/config-allowlist.go index 8bdcf33d..5c7f8c96 100644 --- a/cmd/genbindings/config-allowlist.go +++ b/cmd/genbindings/config-allowlist.go @@ -244,6 +244,14 @@ func AllowType(p CppParameter, isReturnType bool) error { if err := AllowType(vType, isReturnType); err != nil { return err } + // Additionally, Go maps do not support []byte keys + // This affects qnetwork qsslconfiguration BackendConfiguration + if kType.ParameterType == "QByteArray" { + return ErrTooComplex + } + } + if p.QMultiMapOf() { + return ErrTooComplex // e.g. Qt5 QNetwork qsslcertificate.h has a QMultiMap } if !AllowClass(p.ParameterType) { @@ -379,6 +387,7 @@ func AllowType(p CppParameter, isReturnType bool) error { "char32_t", // e.g. QDebug().operator<< overload, unnecessary "wchar_t", // e.g. qstringview.h overloads, unnecessary "FILE", // e.g. qfile.h constructors + "sockaddr", // Qt network Qhostaddress. Should be possible to make this work but may be platform-specific "qInternalCallback", // e.g. qnamespace.h "QGraphicsEffectSource", // e.g. used by qgraphicseffect.h, but the definition is in ???? "QXmlStreamEntityDeclarations", // e.g. qxmlstream.h. The class definition was blacklisted for ???? reason so don't allow it as a parameter either diff --git a/cmd/genbindings/config-libraries.go b/cmd/genbindings/config-libraries.go index f124c6fe..78325d8c 100644 --- a/cmd/genbindings/config-libraries.go +++ b/cmd/genbindings/config-libraries.go @@ -66,6 +66,18 @@ func ProcessLibraries(clangBin, outDir, extraLibsDir string) { ClangMatchSameHeaderDefinitionOnly, ) + generate( + "qt/network", + []string{ + "/usr/include/x86_64-linux-gnu/qt5/QtNetwork", + }, + AllowAllHeaders, + clangBin, + pkgConfigCflags("Qt5Network"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) + // Depends on QtCore/Gui/Widgets, QPrintSupport generate( "qt-restricted-extras/qscintilla", @@ -152,4 +164,23 @@ func ProcessLibraries(clangBin, outDir, extraLibsDir string) { outDir, ClangMatchSameHeaderDefinitionOnly, ) + + // Qt 6 QtNetwork + generate( + "qt6/network", + []string{ + "/usr/include/x86_64-linux-gnu/qt6/QtNetwork", + }, + func(fullpath string) bool { + fname := filepath.Base(fullpath) + if fname == "qtnetwork-config.h" { + return false + } + return true + }, + clangBin, + "--std=c++17 "+pkgConfigCflags("Qt6Network"), + outDir, + ClangMatchSameHeaderDefinitionOnly, + ) } diff --git a/cmd/genbindings/emitcabi.go b/cmd/genbindings/emitcabi.go index 781393f8..a8582fa0 100644 --- a/cmd/genbindings/emitcabi.go +++ b/cmd/genbindings/emitcabi.go @@ -232,7 +232,13 @@ func emitCABI2CppForwarding(p CppParameter, indent string) (preamble string, for preamble += indent + "\t" + nameprefix + "_QList.push_back(" + addFwd + ");\n" preamble += indent + "}\n" - return preamble, nameprefix + "_QList" + + // Support passing QList<>* (very rare, but used in qnetwork) + if p.Pointer { + return preamble, "&" + nameprefix + "_QList" + } else { + return preamble, nameprefix + "_QList" + } } else if kType, vType, ok := p.QMapOf(); ok { preamble += indent + p.GetQtCppType().ParameterType + " " + nameprefix + "_QMap;\n" diff --git a/cmd/genbindings/intermediate.go b/cmd/genbindings/intermediate.go index 9b65782e..cfc5aee9 100644 --- a/cmd/genbindings/intermediate.go +++ b/cmd/genbindings/intermediate.go @@ -191,6 +191,15 @@ func (p CppParameter) QSetOf() (CppParameter, bool) { return CppParameter{}, false } +func (p CppParameter) QMultiMapOf() bool { + if strings.HasPrefix(p.ParameterType, `QMultiMap<`) || + strings.HasPrefix(p.ParameterType, `QMultiHash<`) { + return true + } + + return false +} + func (p CppParameter) IntType() bool { if p.IsKnownEnum() { diff --git a/cmd/genbindings/transformoptional.go b/cmd/genbindings/transformoptional.go index 8897315a..6dc318da 100644 --- a/cmd/genbindings/transformoptional.go +++ b/cmd/genbindings/transformoptional.go @@ -32,7 +32,7 @@ func astTransformOptional(parsed *CppParsedHeader) { // Add method copies for x := optionalStart; x < len(m.Parameters); x++ { - dupMethod := m // copy + dupMethod := m // shallow copy dupMethod.Rename(m.MethodName + fmt.Sprintf("%d", x+1)) dupMethod.Parameters = m.Parameters[0 : x+1] dupMethod.HiddenParams = m.Parameters[x+1:] @@ -68,7 +68,7 @@ func astTransformOptional(parsed *CppParsedHeader) { // Add ctor copies for x := optionalStart; x < len(m.Parameters); x++ { - dupCtor := m // copy + dupCtor := m // shallow copy dupCtor.Parameters = m.Parameters[0 : x+1] dupCtor.HiddenParams = m.Parameters[x+1:] c.Ctors = append(c.Ctors, dupCtor)