2018-01-08 00:51:46 +00:00
|
|
|
package application
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/s-rah/go-ricochet/channels"
|
|
|
|
"github.com/s-rah/go-ricochet/connection"
|
|
|
|
)
|
|
|
|
|
2018-01-10 01:31:54 +00:00
|
|
|
// ApplicationInstance is a concrete instance of a ricochet application, encapsulating a connection
|
2018-01-08 00:51:46 +00:00
|
|
|
type ApplicationInstance struct {
|
|
|
|
connection.AutoConnectionHandler
|
|
|
|
Connection *connection.Connection
|
|
|
|
RemoteHostname string
|
|
|
|
}
|
|
|
|
|
2018-01-10 01:31:54 +00:00
|
|
|
// ApplicationInstanceFactory
|
2018-01-08 00:51:46 +00:00
|
|
|
type ApplicationInstanceFactory struct {
|
|
|
|
handlerMap map[string]func(*ApplicationInstance) func() channels.Handler
|
|
|
|
}
|
|
|
|
|
2018-01-10 01:31:54 +00:00
|
|
|
// Init sets up an Application Factory
|
2018-01-08 00:51:46 +00:00
|
|
|
func (af *ApplicationInstanceFactory) Init() {
|
|
|
|
af.handlerMap = make(map[string]func(*ApplicationInstance) func() channels.Handler)
|
|
|
|
}
|
|
|
|
|
2018-01-10 01:31:54 +00:00
|
|
|
// AddHandler defines a channel type -> handler construct function
|
2018-01-08 00:51:46 +00:00
|
|
|
func (af *ApplicationInstanceFactory) AddHandler(ctype string, chandler func(*ApplicationInstance) func() channels.Handler) {
|
|
|
|
af.handlerMap[ctype] = chandler
|
|
|
|
}
|
|
|
|
|
2018-05-30 17:51:40 +00:00
|
|
|
// GetApplicationInstance builds a new application instance using a connection as a base.
|
2018-01-08 00:51:46 +00:00
|
|
|
func (af *ApplicationInstanceFactory) GetApplicationInstance(rc *connection.Connection) *ApplicationInstance {
|
|
|
|
rai := new(ApplicationInstance)
|
|
|
|
rai.Init()
|
|
|
|
rai.RemoteHostname = rc.RemoteHostname
|
|
|
|
rai.Connection = rc
|
|
|
|
for t, h := range af.handlerMap {
|
|
|
|
rai.RegisterChannelHandler(t, h(rai))
|
|
|
|
}
|
|
|
|
return rai
|
|
|
|
}
|