diff --git a/bluetooth/bluetooth.go b/bluetooth/bluetooth.go index 1213cf60..6d03a690 100644 --- a/bluetooth/bluetooth.go +++ b/bluetooth/bluetooth.go @@ -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 } diff --git a/cmd/cmd.go b/cmd/cmd.go new file mode 100644 index 00000000..2eeb6144 --- /dev/null +++ b/cmd/cmd.go @@ -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" +) diff --git a/cmd/go.mod b/cmd/go.mod new file mode 100644 index 00000000..802af5c5 --- /dev/null +++ b/cmd/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/cmd diff --git a/core/core.go b/core/core.go index 23d720e2..9f088f8d 100644 --- a/core/core.go +++ b/core/core.go @@ -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 } diff --git a/internal/binding/files/docs/5.10.0/go.mod b/internal/binding/files/docs/5.10.0/go.mod new file mode 100644 index 00000000..ddd22893 --- /dev/null +++ b/internal/binding/files/docs/5.10.0/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.10.0 diff --git a/internal/binding/files/docs/5.10.0/mod.go b/internal/binding/files/docs/5.10.0/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.10.0/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/5.11.1/go.mod b/internal/binding/files/docs/5.11.1/go.mod new file mode 100644 index 00000000..4a332fbc --- /dev/null +++ b/internal/binding/files/docs/5.11.1/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.11.1 diff --git a/internal/binding/files/docs/5.11.1/mod.go b/internal/binding/files/docs/5.11.1/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.11.1/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/5.12.0/go.mod b/internal/binding/files/docs/5.12.0/go.mod new file mode 100644 index 00000000..4e29ba22 --- /dev/null +++ b/internal/binding/files/docs/5.12.0/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.12.0 diff --git a/internal/binding/files/docs/5.12.0/mod.go b/internal/binding/files/docs/5.12.0/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.12.0/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/5.6.3/go.mod b/internal/binding/files/docs/5.6.3/go.mod new file mode 100644 index 00000000..e50d6a5f --- /dev/null +++ b/internal/binding/files/docs/5.6.3/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.6.3 diff --git a/internal/binding/files/docs/5.6.3/mod.go b/internal/binding/files/docs/5.6.3/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.6.3/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/5.7.0/go.mod b/internal/binding/files/docs/5.7.0/go.mod new file mode 100644 index 00000000..24e4e897 --- /dev/null +++ b/internal/binding/files/docs/5.7.0/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.7.0 diff --git a/internal/binding/files/docs/5.7.0/mod.go b/internal/binding/files/docs/5.7.0/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.7.0/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/5.7.1/go.mod b/internal/binding/files/docs/5.7.1/go.mod new file mode 100644 index 00000000..9c687619 --- /dev/null +++ b/internal/binding/files/docs/5.7.1/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.7.1 diff --git a/internal/binding/files/docs/5.7.1/mod.go b/internal/binding/files/docs/5.7.1/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.7.1/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/5.8.0/go.mod b/internal/binding/files/docs/5.8.0/go.mod new file mode 100644 index 00000000..71eb7483 --- /dev/null +++ b/internal/binding/files/docs/5.8.0/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.8.0 diff --git a/internal/binding/files/docs/5.8.0/mod.go b/internal/binding/files/docs/5.8.0/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.8.0/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/5.9.0/go.mod b/internal/binding/files/docs/5.9.0/go.mod new file mode 100644 index 00000000..6677c5aa --- /dev/null +++ b/internal/binding/files/docs/5.9.0/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs/5.9.0 diff --git a/internal/binding/files/docs/5.9.0/mod.go b/internal/binding/files/docs/5.9.0/mod.go new file mode 100644 index 00000000..0c751fae --- /dev/null +++ b/internal/binding/files/docs/5.9.0/mod.go @@ -0,0 +1 @@ +package mod diff --git a/internal/binding/files/docs/go.mod b/internal/binding/files/docs/go.mod new file mode 100644 index 00000000..c92daae5 --- /dev/null +++ b/internal/binding/files/docs/go.mod @@ -0,0 +1 @@ +module github.com/therecipe/qt/internal/binding/files/docs diff --git a/internal/binding/files/docs/mod.go b/internal/binding/files/docs/mod.go new file mode 100644 index 00000000..5555ee2d --- /dev/null +++ b/internal/binding/files/docs/mod.go @@ -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" +) diff --git a/internal/binding/templater/function_go.go b/internal/binding/templater/function_go.go index b4dd222f..20287a33 100644 --- a/internal/binding/templater/function_go.go +++ b/internal/binding/templater/function_go.go @@ -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") diff --git a/internal/binding/templater/template_go.go b/internal/binding/templater/template_go.go index cea2e81e..a2c0a8fb 100644 --- a/internal/binding/templater/template_go.go +++ b/internal/binding/templater/template_go.go @@ -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": diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go index 3f72a820..83ca1614 100644 --- a/internal/cmd/cmd.go +++ b/internal/cmd/cmd.go @@ -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" diff --git a/internal/examples/qml/custom_scheme/main.go b/internal/examples/qml/custom_scheme/main.go new file mode 100644 index 00000000..78ad0d62 --- /dev/null +++ b/internal/examples/qml/custom_scheme/main.go @@ -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() +} diff --git a/internal/examples/qml/custom_scheme/qml/myfile.qml b/internal/examples/qml/custom_scheme/qml/myfile.qml new file mode 100755 index 00000000..cae6c499 --- /dev/null +++ b/internal/examples/qml/custom_scheme/qml/myfile.qml @@ -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 + } + } +} diff --git a/internal/examples/qml/custom_scheme/reply.go b/internal/examples/qml/custom_scheme/reply.go new file mode 100644 index 00000000..90532870 --- /dev/null +++ b/internal/examples/qml/custom_scheme/reply.go @@ -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 +} diff --git a/internal/examples/qml/prop/prop.go b/internal/examples/qml/prop/prop.go index b6afe77e..9311d3b0 100644 --- a/internal/examples/qml/prop/prop.go +++ b/internal/examples/qml/prop/prop.go @@ -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) } diff --git a/internal/utils/utils.go b/internal/utils/utils.go index e058abcc..5b66c26a 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -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() +} diff --git a/network/network.go b/network/network.go index 329f5c73..be5d9ee9 100644 --- a/network/network.go +++ b/network/network.go @@ -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 } diff --git a/serialport/serialport.go b/serialport/serialport.go index d6351e17..3ce76fac 100644 --- a/serialport/serialport.go +++ b/serialport/serialport.go @@ -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 }