123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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
- }
|