fix for go module support + fix readData memory leak + fix docker wine support

This commit is contained in:
therecipe 2018-12-16 20:54:28 +01:00
parent 33cc660323
commit 5251d3454c
32 changed files with 252 additions and 25 deletions

View file

@ -11,6 +11,7 @@ import (
"github.com/therecipe/qt"
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/network"
"reflect"
"runtime"
"strings"
"unsafe"
@ -4460,14 +4461,14 @@ func callbackQBluetoothSocket_ReadData(ptr unsafe.Pointer, data C.struct_QtBluet
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
retS := cGoUnpackString(data)
ret := C.longlong(NewQBluetoothSocketFromPointer(ptr).ReadDataDefault(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}

13
cmd/cmd.go Normal file
View file

@ -0,0 +1,13 @@
// +build cmd
package cmd
import (
_ "github.com/therecipe/qt/cmd/qtdeploy"
_ "github.com/therecipe/qt/cmd/qtminimal"
_ "github.com/therecipe/qt/cmd/qtmoc"
_ "github.com/therecipe/qt/cmd/qtrcc"
_ "github.com/therecipe/qt/cmd/qtsetup"
_ "github.com/gopherjs/gopherjs"
)

1
cmd/go.mod Normal file
View file

@ -0,0 +1 @@
module github.com/therecipe/qt/cmd

View file

@ -9,6 +9,7 @@ package core
import "C"
import (
"github.com/therecipe/qt"
"reflect"
"runtime"
"strings"
"unsafe"
@ -7270,14 +7271,14 @@ func callbackQBuffer_ReadData(ptr unsafe.Pointer, data C.struct_QtCore_PackedStr
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(l)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
retS := cGoUnpackString(data)
ret := C.longlong(NewQBufferFromPointer(ptr).ReadDataDefault(&retS, int64(l)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
@ -16373,14 +16374,14 @@ func callbackQFileDevice_ReadData(ptr unsafe.Pointer, data C.struct_QtCore_Packe
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(l)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
retS := cGoUnpackString(data)
ret := C.longlong(NewQFileDeviceFromPointer(ptr).ReadDataDefault(&retS, int64(l)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
@ -19029,7 +19030,7 @@ func callbackQIODevice_ReadData(ptr unsafe.Pointer, data C.struct_QtCore_PackedS
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.10.0

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.11.1

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.12.0

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.6.3

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.7.0

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.7.1

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.8.0

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs/5.9.0

View file

@ -0,0 +1 @@
package mod

View file

@ -0,0 +1 @@
module github.com/therecipe/qt/internal/binding/files/docs

View file

@ -0,0 +1,12 @@
package docs
import (
_ "github.com/therecipe/qt/internal/binding/files/docs/5.10.0"
_ "github.com/therecipe/qt/internal/binding/files/docs/5.11.1"
_ "github.com/therecipe/qt/internal/binding/files/docs/5.12.0"
_ "github.com/therecipe/qt/internal/binding/files/docs/5.6.3"
_ "github.com/therecipe/qt/internal/binding/files/docs/5.7.0"
_ "github.com/therecipe/qt/internal/binding/files/docs/5.7.1"
_ "github.com/therecipe/qt/internal/binding/files/docs/5.8.0"
_ "github.com/therecipe/qt/internal/binding/files/docs/5.9.0"
)

View file

@ -353,7 +353,7 @@ func goFunctionBody(function *parser.Function) string {
if !UseJs() {
fmt.Fprint(bb, "retS := cGoUnpackString(data)\n")
fmt.Fprintf(bb, "ret := %v\n", converter.GoInput(fmt.Sprintf("signal.(%v)(%v)", converter.GoHeaderInputSignalFunction(function), converter.GoInputParametersForCallback(function)), function.Output, function, function.PureGoOutput))
fmt.Fprint(bb, "if ret > 0 {\nC.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))\n}\n")
fmt.Fprint(bb, "if ret > 0 {\nC.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))\n}\n")
fmt.Fprint(bb, "return ret")
} else {
fmt.Fprint(bb, "return 0")
@ -423,7 +423,7 @@ func goFunctionBody(function *parser.Function) string {
if !UseJs() {
fmt.Fprint(bb, "retS := cGoUnpackString(data)\n")
fmt.Fprintf(bb, "ret := %v\n", converter.GoInput(fmt.Sprintf("New%vFromPointer(ptr).%v%vDefault(%v)", strings.Title(class.Name), strings.Replace(strings.Title(function.Name), parser.TILDE, "Destroy", -1), function.OverloadNumber, converter.GoInputParametersForCallback(function)), function.Output, function, function.PureGoOutput))
fmt.Fprint(bb, "if ret > 0 {\nC.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))\n}\n")
fmt.Fprint(bb, "if ret > 0 {\nC.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))\n}\n")
fmt.Fprint(bb, "return ret")
} else {
fmt.Fprint(bb, "return 0")

View file

@ -633,7 +633,7 @@ import "C"
}
fmt.Fprint(bb, "import (\n")
for _, m := range append(parser.GetLibs(), "qt", "strings", "unsafe", "log", "runtime", "fmt", "errors", "js", "time", "hex") {
for _, m := range append(parser.GetLibs(), "qt", "strings", "unsafe", "log", "runtime", "fmt", "errors", "js", "time", "hex", "reflect") {
mlow := strings.ToLower(m)
if strings.Contains(inputString, fmt.Sprintf(" %v.", mlow)) ||
strings.Contains(inputString, fmt.Sprintf("\t%v.", mlow)) ||
@ -645,7 +645,7 @@ import "C"
strings.Contains(inputString, fmt.Sprintf(")%v.", mlow)) ||
strings.Contains(inputString, fmt.Sprintf("std_%v.", mlow)) {
switch mlow {
case "strings", "unsafe", "log", "runtime", "fmt", "errors", "time":
case "strings", "unsafe", "log", "runtime", "fmt", "errors", "time", "reflect":
fmt.Fprintf(bb, "\"%v\"\n", mlow)
case "hex":

View file

@ -13,6 +13,8 @@ import (
"github.com/sirupsen/logrus"
"github.com/therecipe/qt/internal/utils"
_ "github.com/therecipe/qt/internal/binding/files/docs"
)
var buildVersion = "no build version"

View file

@ -0,0 +1,48 @@
package main
import (
"os"
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/network"
"github.com/therecipe/qt/qml"
"github.com/therecipe/qt/quick"
"github.com/therecipe/qt/widgets"
)
func main() {
widgets.NewQApplication(len(os.Args), os.Args)
var view = quick.NewQQuickView(nil)
var (
factory = qml.NewQQmlNetworkAccessManagerFactory()
manager *network.QNetworkAccessManager
)
factory.ConnectCreate(func(parent *core.QObject) *network.QNetworkAccessManager {
if manager != nil {
return manager
}
manager = network.NewQNetworkAccessManager(parent)
manager.ConnectCreateRequest(func(op network.QNetworkAccessManager__Operation, req *network.QNetworkRequest, outgoingData *core.QIODevice) *network.QNetworkReply {
if req.Url().Scheme() != "custom" {
return manager.CreateRequestDefault(op, req, outgoingData)
}
return NewCustomReply(op, req)
})
return manager
})
view.Engine().SetNetworkAccessManagerFactory(factory)
view.SetSource(core.NewQUrl3("qrc:///qml/myfile.qml", 0)) //can be custom:/// as well
view.SetResizeMode(quick.QQuickView__SizeRootObjectToView)
view.Show()
widgets.QApplication_Exec()
}

View file

@ -0,0 +1,26 @@
import QtQuick 2.0
import "custom:///qml/"
Rectangle {
id: page
width: 320; height: 480
color: "lightblue"
Text {
id: helloText
text: "hello from qrc:///"
y: 30
anchors.horizontalCenter: page.horizontalCenter
font.pointSize: 24; font.bold: true
}
SomeClass {
height: parent.height/2
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
}
}

View file

@ -0,0 +1,89 @@
package main
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/network"
)
//the custom QNetworkReply is partially modeled after
//https://code.qt.io/cgit/qt/qtbase.git/tree/src/network/access/qnetworkreplyfileimpl.cpp?h=5.7
//and
//https://blogs.kde.org/2010/08/28/implementing-reusable-custom-qnetworkreply
func NewCustomReply(op network.QNetworkAccessManager__Operation, req *network.QNetworkRequest) *network.QNetworkReply {
var customReply = network.NewQNetworkReply(nil)
customReply.SetRequest(req)
customReply.SetUrl(req.Url())
customReply.SetOperation(op)
customReply.SetFinished(true)
//there will be at least 2 requests
//one for the qmldir file: https://doc.qt.io/qt-5/qtqml-syntax-directoryimports.html#directory-listing-qmldir-files
//and another request for each *.qml file that is exported through the qmldir file
println("requested:", req.Url().ToString(0))
var content string
if req.Url().FileName(0) == "qmldir" {
content = "SomeClass myfile.qml"
} else {
content = `import QtQuick 2.0
Rectangle {
id: page
width: 320; height: 480
color: "lightgreen"
Text {
id: helloText
text: "hello from custom:///"
y: 30
anchors.horizontalCenter: page.horizontalCenter
font.pointSize: 24; font.bold: true
}
}`
}
//in case of multiple customReply::ReadData calls for a single reply, an offset is used
var offset int64
customReply.ConnectReadData(func(data *string, maxSize int64) int64 {
if offset >= int64(len(content)) {
return -1
}
var number = func(a, b int64) int64 {
if a <= b {
return a
}
return b
}(maxSize, int64(len(content))-offset)
*data = string([]byte(content)[offset : offset+number])
offset += number
customReply.SetAttribute(network.QNetworkRequest__HttpStatusCodeAttribute, core.NewQVariant7(200))
customReply.SetAttribute(network.QNetworkRequest__HttpReasonPhraseAttribute, core.NewQVariant14("OK"))
return number
})
customReply.ConnectIsSequential(func() bool {
return true
})
customReply.ConnectBytesAvailable(func() int64 {
return int64(len(content)) - offset
})
customReply.Open(core.QIODevice__ReadOnly | core.QIODevice__Unbuffered)
customReply.SetHeader(network.QNetworkRequest__ContentLengthHeader, core.NewQVariant9(int64(len(content))))
customReply.MetaDataChanged()
customReply.DownloadProgress(int64(len(content)), int64(len(content)))
customReply.ReadyRead()
customReply.Finished()
return customReply
}

View file

@ -17,9 +17,10 @@ func main() {
object = component.Create(nil)
)
fmt.Println("Property value:", object.Property("someNumber").ToInt(false))
var someBool bool
fmt.Println("Property value:", object.Property("someNumber").ToInt(&someBool), someBool)
object.SetProperty("someNumber", core.NewQVariant7(5000))
fmt.Println("Property value:", object.Property("someNumber").ToInt(false))
fmt.Println("Property value:", object.Property("someNumber").ToInt(&someBool), someBool)
object.SetProperty("someNumber", core.NewQVariant7(200))
fmt.Println("Property value:", object.Property("someNumber").ToInt(false))
fmt.Println("Property value:", object.Property("someNumber").ToInt(&someBool), someBool)
}

View file

@ -6,6 +6,7 @@ import (
"os/exec"
"path/filepath"
"strings"
"time"
"github.com/sirupsen/logrus"
)
@ -90,7 +91,7 @@ func GoQtPkgPath(s ...string) string {
func RunCmd(cmd *exec.Cmd, name string) string {
fields := logrus.Fields{"_func": "RunCmd", "name": name, "cmd": strings.Join(cmd.Args, " "), "env": strings.Join(cmd.Env, " "), "dir": cmd.Dir}
Log.WithFields(fields).Debug("Execute")
out, err := cmd.CombinedOutput()
out, err := runCmdHelper(cmd)
if err != nil {
Log.WithError(err).WithFields(fields).Error("failed to run command")
println(string(out))
@ -103,7 +104,7 @@ func RunCmd(cmd *exec.Cmd, name string) string {
func RunCmdOptional(cmd *exec.Cmd, name string) string {
fields := logrus.Fields{"_func": "RunCmdOptional", "name": name, "cmd": strings.Join(cmd.Args, " "), "env": strings.Join(cmd.Env, " "), "dir": cmd.Dir}
Log.WithFields(fields).Debug("Execute")
out, err := cmd.CombinedOutput()
out, err := runCmdHelper(cmd)
if err != nil && !strings.Contains(string(out), "No template (-t) specified") {
Log.WithError(err).WithFields(fields).Error("failed to run command")
println(string(out))
@ -114,10 +115,23 @@ func RunCmdOptional(cmd *exec.Cmd, name string) string {
func RunCmdOptionalError(cmd *exec.Cmd, name string) (string, error) {
fields := logrus.Fields{"_func": "RunCmdOptionalError", "name": name, "cmd": strings.Join(cmd.Args, " "), "env": strings.Join(cmd.Env, " "), "dir": cmd.Dir}
Log.WithFields(fields).Debug("Execute")
out, err := cmd.CombinedOutput()
out, err := runCmdHelper(cmd)
if err != nil {
Log.WithError(err).WithFields(fields).Error("failed to run command")
println(string(out))
}
return string(out), err
}
func runCmdHelper(cmd *exec.Cmd) (out []byte, err error) {
if _, ok := os.LookupEnv("WINEDEBUG"); ok {
go func() { out, err = cmd.CombinedOutput() }()
for range time.NewTicker(250 * time.Millisecond).C {
if cmd.ProcessState != nil && cmd.ProcessState.Exited() {
break
}
}
return
}
return cmd.CombinedOutput()
}

View file

@ -10,6 +10,7 @@ import "C"
import (
"github.com/therecipe/qt"
"github.com/therecipe/qt/core"
"reflect"
"runtime"
"strings"
"unsafe"
@ -1175,14 +1176,14 @@ func callbackQAbstractSocket_ReadData(ptr unsafe.Pointer, data C.struct_QtNetwor
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
retS := cGoUnpackString(data)
ret := C.longlong(NewQAbstractSocketFromPointer(ptr).ReadDataDefault(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
@ -6350,14 +6351,14 @@ func callbackQLocalSocket_ReadData(ptr unsafe.Pointer, data C.struct_QtNetwork_P
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(c)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
retS := cGoUnpackString(data)
ret := C.longlong(NewQLocalSocketFromPointer(ptr).ReadDataDefault(&retS, int64(c)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
@ -14003,14 +14004,14 @@ func callbackQNetworkReply_ReadData(ptr unsafe.Pointer, data C.struct_QtNetwork_
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
retS := cGoUnpackString(data)
ret := C.longlong(NewQNetworkReplyFromPointer(ptr).ReadDataDefault(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}

View file

@ -10,6 +10,7 @@ import "C"
import (
"github.com/therecipe/qt"
"github.com/therecipe/qt/core"
"reflect"
"runtime"
"strings"
"unsafe"
@ -410,14 +411,14 @@ func callbackQSerialPort_ReadData(ptr unsafe.Pointer, data C.struct_QtSerialPort
retS := cGoUnpackString(data)
ret := C.longlong(signal.(func(*string, int64) int64)(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}
retS := cGoUnpackString(data)
ret := C.longlong(NewQSerialPortFromPointer(ptr).ReadDataDefault(&retS, int64(maxSize)))
if ret > 0 {
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer(C.CString(retS)), C.size_t(ret))
C.memcpy(unsafe.Pointer(data.data), unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&retS)).Data), C.size_t(ret))
}
return ret
}