mirror of
https://gitee.com/energye/energy.git
synced 2024-12-02 11:47:37 +08:00
upgrade-dev v2.1.45
This commit is contained in:
parent
ed8ce1b262
commit
e33dca6409
@ -158,7 +158,13 @@ func (m *mainRun) ipcEmitMessage(browser *ICefBrowser, frame *ICefFrame, sourceP
|
|||||||
ipcContext := ipc.NewContext(browser.Identifier(), frame.Identifier(), argsBytes, isCallback)
|
ipcContext := ipc.NewContext(browser.Identifier(), frame.Identifier(), argsBytes, isCallback)
|
||||||
argsBytes = nil
|
argsBytes = nil
|
||||||
fmt.Println("ipcEmitMessage", isCallback, ipcContext)
|
fmt.Println("ipcEmitMessage", isCallback, ipcContext)
|
||||||
eventCallback(ipcContext)
|
if ctxCallback := eventCallback.ContextCallback(); ctxCallback != nil {
|
||||||
|
ctxCallback(ipcContext)
|
||||||
|
} else if argsCallback := eventCallback.ArgumentCallback(); argsCallback != nil {
|
||||||
|
//rv := argsCallback.Callback()
|
||||||
|
//rv.Call()
|
||||||
|
ipcContext.ArgumentList()
|
||||||
|
}
|
||||||
return
|
return
|
||||||
//if isCallback {
|
//if isCallback {
|
||||||
// //处理回复消息
|
// //处理回复消息
|
||||||
|
@ -35,6 +35,9 @@ func main() {
|
|||||||
server.Assets = &resources
|
server.Assets = &resources
|
||||||
go server.StartHttpServer()
|
go server.StartHttpServer()
|
||||||
})
|
})
|
||||||
|
ipc.OnArgument("testArgsEmitName", func(s string, v int, b bool, sarr []string, smap map[string]string) (string, int, bool) {
|
||||||
|
return "", 0, false
|
||||||
|
})
|
||||||
ipc.On("testEmitName", func(context ipc.IContext) {
|
ipc.On("testEmitName", func(context ipc.IContext) {
|
||||||
argument := context.ArgumentList()
|
argument := context.ArgumentList()
|
||||||
fmt.Println("testEmitName", argument.Size(), context.BrowserId(), context.FrameId())
|
fmt.Println("testEmitName", argument.Size(), context.BrowserId(), context.FrameId())
|
||||||
|
92
ipc/ipc.go
92
ipc/ipc.go
@ -12,6 +12,8 @@ package ipc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/energye/energy/common"
|
"github.com/energye/energy/common"
|
||||||
|
"github.com/energye/energy/consts"
|
||||||
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -19,25 +21,95 @@ var (
|
|||||||
browser *browserIPC
|
browser *browserIPC
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type EmitContextCallback func(context IContext)
|
||||||
|
type EmitArgumentCallback any
|
||||||
|
|
||||||
// browserIPC 主进程 IPC
|
// browserIPC 主进程 IPC
|
||||||
type browserIPC struct {
|
type browserIPC struct {
|
||||||
onEvent map[string]EmitCallback
|
onEvent map[string]*callback
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
type EmitCallback func(context IContext)
|
type callback struct {
|
||||||
|
context *contextCallback
|
||||||
|
argument *argumentCallback
|
||||||
|
}
|
||||||
|
|
||||||
|
type contextCallback struct {
|
||||||
|
callback EmitContextCallback //带上下文的回调函数
|
||||||
|
}
|
||||||
|
|
||||||
|
type argumentCallback struct {
|
||||||
|
callback *reflect.Value //带参数的回调函数
|
||||||
|
inArgumentType []consts.GO_VALUE_TYPE //入参类型
|
||||||
|
outArgumentType []consts.GO_VALUE_TYPE //出参类型
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *callback) ContextCallback() EmitContextCallback {
|
||||||
|
if m.context == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return m.context.callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *callback) ArgumentCallback() *argumentCallback {
|
||||||
|
if m.argument == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return m.argument
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *argumentCallback) Callback() *reflect.Value {
|
||||||
|
return m.callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *argumentCallback) InArgumentType() []consts.GO_VALUE_TYPE {
|
||||||
|
return m.inArgumentType
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *argumentCallback) OutArgumentType() []consts.GO_VALUE_TYPE {
|
||||||
|
return m.outArgumentType
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
if common.Args.IsMain() {
|
if common.Args.IsMain() {
|
||||||
browser = &browserIPC{onEvent: make(map[string]EmitCallback)}
|
browser = &browserIPC{onEvent: make(map[string]*callback)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//On
|
//On
|
||||||
// IPC GO 监听事件
|
// IPC GO 监听事件, 上下文参数
|
||||||
func On(name string, fn EmitCallback) {
|
func On(name string, fn EmitContextCallback) {
|
||||||
if browser != nil {
|
if browser != nil {
|
||||||
browser.addOnEvent(name, fn)
|
browser.addOnEvent(name, &callback{context: &contextCallback{callback: fn}})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//OnArgument
|
||||||
|
// IPC GO 监听事件, 自定义参数,仅支持对应 JavaScript 中的常用类型
|
||||||
|
//
|
||||||
|
// 支持类型: int, bool, float, string, slice, map, struct
|
||||||
|
func OnArgument(name string, fn EmitArgumentCallback) {
|
||||||
|
if browser != nil {
|
||||||
|
v := reflect.ValueOf(fn)
|
||||||
|
// f must be a function
|
||||||
|
if v.Kind() != reflect.Func {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
vt := v.Type()
|
||||||
|
inArgumentType := make([]consts.GO_VALUE_TYPE, vt.NumIn())
|
||||||
|
outArgumentType := make([]consts.GO_VALUE_TYPE, vt.NumOut())
|
||||||
|
for i := 0; i < len(inArgumentType); i++ {
|
||||||
|
it := vt.In(i)
|
||||||
|
gv, _ := common.FieldReflectType(it)
|
||||||
|
inArgumentType[i] = gv
|
||||||
|
}
|
||||||
|
for i := 0; i < len(outArgumentType); i++ {
|
||||||
|
ot := vt.Out(i)
|
||||||
|
gv, _ := common.FieldReflectType(ot)
|
||||||
|
inArgumentType[i] = gv
|
||||||
|
}
|
||||||
|
browser.addOnEvent(name, &callback{argument: &argumentCallback{callback: &v, inArgumentType: inArgumentType, outArgumentType: outArgumentType}})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,20 +132,20 @@ func Emit(name string) {
|
|||||||
|
|
||||||
//CheckOnEvent
|
//CheckOnEvent
|
||||||
// IPC 检查 GO 中监听的事件是存在, 并返回回调函数
|
// IPC 检查 GO 中监听的事件是存在, 并返回回调函数
|
||||||
func CheckOnEvent(name string) EmitCallback {
|
func CheckOnEvent(name string) *callback {
|
||||||
if browser == nil || name == "" {
|
if browser == nil || name == "" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
browser.lock.Lock()
|
browser.lock.Lock()
|
||||||
defer browser.lock.Unlock()
|
defer browser.lock.Unlock()
|
||||||
if callback, ok := browser.onEvent[name]; ok {
|
if fn, ok := browser.onEvent[name]; ok {
|
||||||
return callback
|
return fn
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// addOnEvent 添加监听事件
|
// addOnEvent 添加监听事件
|
||||||
func (m *browserIPC) addOnEvent(name string, fn EmitCallback) {
|
func (m *browserIPC) addOnEvent(name string, fn *callback) {
|
||||||
if m == nil || name == "" || fn == nil {
|
if m == nil || name == "" || fn == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user