mirror of
https://gitee.com/energye/energy.git
synced 2024-11-30 10:47:57 +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)
|
||||
argsBytes = nil
|
||||
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
|
||||
//if isCallback {
|
||||
// //处理回复消息
|
||||
|
@ -35,6 +35,9 @@ func main() {
|
||||
server.Assets = &resources
|
||||
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) {
|
||||
argument := context.ArgumentList()
|
||||
fmt.Println("testEmitName", argument.Size(), context.BrowserId(), context.FrameId())
|
||||
|
92
ipc/ipc.go
92
ipc/ipc.go
@ -12,6 +12,8 @@ package ipc
|
||||
|
||||
import (
|
||||
"github.com/energye/energy/common"
|
||||
"github.com/energye/energy/consts"
|
||||
"reflect"
|
||||
"sync"
|
||||
)
|
||||
|
||||
@ -19,25 +21,95 @@ var (
|
||||
browser *browserIPC
|
||||
)
|
||||
|
||||
type EmitContextCallback func(context IContext)
|
||||
type EmitArgumentCallback any
|
||||
|
||||
// browserIPC 主进程 IPC
|
||||
type browserIPC struct {
|
||||
onEvent map[string]EmitCallback
|
||||
onEvent map[string]*callback
|
||||
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() {
|
||||
if common.Args.IsMain() {
|
||||
browser = &browserIPC{onEvent: make(map[string]EmitCallback)}
|
||||
browser = &browserIPC{onEvent: make(map[string]*callback)}
|
||||
}
|
||||
}
|
||||
|
||||
//On
|
||||
// IPC GO 监听事件
|
||||
func On(name string, fn EmitCallback) {
|
||||
// IPC GO 监听事件, 上下文参数
|
||||
func On(name string, fn EmitContextCallback) {
|
||||
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
|
||||
// IPC 检查 GO 中监听的事件是存在, 并返回回调函数
|
||||
func CheckOnEvent(name string) EmitCallback {
|
||||
func CheckOnEvent(name string) *callback {
|
||||
if browser == nil || name == "" {
|
||||
return nil
|
||||
}
|
||||
browser.lock.Lock()
|
||||
defer browser.lock.Unlock()
|
||||
if callback, ok := browser.onEvent[name]; ok {
|
||||
return callback
|
||||
if fn, ok := browser.onEvent[name]; ok {
|
||||
return fn
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// addOnEvent 添加监听事件
|
||||
func (m *browserIPC) addOnEvent(name string, fn EmitCallback) {
|
||||
func (m *browserIPC) addOnEvent(name string, fn *callback) {
|
||||
if m == nil || name == "" || fn == nil {
|
||||
return
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user