plugin.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package UI
  2. import (
  3. "log"
  4. goplugin "plugin"
  5. )
  6. var PluginPool = NewPluginPool()
  7. type PluginInterface interface {
  8. GetName() string
  9. Init(screen *MainScreen)
  10. Run(screen *MainScreen)
  11. }
  12. type Plugin struct {
  13. Name string // only ID for plugin
  14. }
  15. func (self *Plugin) GetName() string {
  16. return self.Name
  17. }
  18. func (self *Plugin) Init(screen *MainScreen) {
  19. }
  20. func (self *Plugin) Run(screen *MainScreen) {
  21. }
  22. func NewPluginPool() map[string]PluginInterface {
  23. pp := make(map[string]PluginInterface)
  24. return pp
  25. }
  26. func PluginPoolRegister(pi PluginInterface) bool {
  27. name := pi.GetName()
  28. if _, ok := PluginPool[name]; ok {
  29. return false
  30. }
  31. PluginPool[name] = pi
  32. return true
  33. }
  34. func LoadPlugin(pname string) (*goplugin.Plugin, error) {
  35. return goplugin.Open(pname)
  36. }
  37. func InitPlugin(p *goplugin.Plugin, main_screen *MainScreen) PluginInterface {
  38. symAPI, err := p.Lookup("APIOBJ")
  39. if err != nil {
  40. log.Fatal("init plugin failed")
  41. return nil
  42. }
  43. var pi PluginInterface
  44. pi, ok := symAPI.(PluginInterface)
  45. if !ok {
  46. log.Fatal("unexpected type from module symbol")
  47. return nil
  48. }
  49. //PluginPoolRegister(pi)
  50. pi.Init(main_screen)
  51. return pi
  52. }
  53. func RunPlugin(p *goplugin.Plugin, main_screen *MainScreen) {
  54. symAPI, err := p.Lookup("APIOBJ")
  55. if err != nil {
  56. log.Fatal("init plugin failed")
  57. return
  58. }
  59. var pi PluginInterface
  60. pi, ok := symAPI.(PluginInterface)
  61. if !ok {
  62. log.Fatal("unexpected type from module symbol")
  63. return
  64. }
  65. pi.Run(main_screen)
  66. }
  67. const (
  68. PluginPackage = iota
  69. PluginSo
  70. )
  71. type UIPlugin struct { //Loadable and injectable
  72. Type int // 0 == loadable package, 1 == .so
  73. SoFile string
  74. FolderName string
  75. LabelText string
  76. EmbInterface PluginInterface
  77. }