LauncherGoDev/sysgo/UI/plugin.go
2019-01-08 16:56:58 +08:00

106 lines
1.7 KiB
Go

package UI
import (
"log"
goplugin "plugin"
)
var PluginPool = NewPluginPool()
type PluginInterface interface {
GetName() string
Init(screen *MainScreen)
Run(screen *MainScreen)
}
type Plugin struct {
Name string // only ID for plugin
}
func (self *Plugin) GetName() string {
return self.Name
}
func (self *Plugin) Init( screen *MainScreen) {
}
func (self *Plugin) Run( screen *MainScreen) {
}
func NewPluginPool() map[string]PluginInterface {
pp :=make( map[string]PluginInterface )
return pp
}
func PluginPoolRegister( pi PluginInterface ) bool {
name := pi.GetName()
if _,ok := PluginPool[name]; ok {
return false
}
PluginPool[name] = pi
return true
}
func LoadPlugin( pname string) (*goplugin.Plugin,error) {
return goplugin.Open(pname)
}
func InitPlugin(p *goplugin.Plugin, main_screen *MainScreen) PluginInterface {
symAPI,err := p.Lookup("APIOBJ")
if err!= nil {
log.Fatal( "init plugin failed")
return nil
}
var pi PluginInterface
pi,ok := symAPI.(PluginInterface)
if !ok {
log.Fatal("unexpected type from module symbol")
return nil
}
//PluginPoolRegister(pi)
pi.Init(main_screen)
return pi
}
func RunPlugin(p *goplugin.Plugin, main_screen *MainScreen) {
symAPI,err := p.Lookup("APIOBJ")
if err!= nil {
log.Fatal( "init plugin failed")
return
}
var pi PluginInterface
pi,ok := symAPI.(PluginInterface)
if !ok {
log.Fatal("unexpected type from module symbol")
return
}
pi.Run(main_screen)
}
const (
PluginPackage = iota
PluginSo
)
type UIPlugin struct{ //Loadable and injectable
Type int // 0 == loadable package, 1 == .so
SoFile string
FolderName string
LabelText string
EmbInterface PluginInterface
}