| 
									
										
										
										
											2014-07-02 00:13:50 +02:00
										 |  |  | package main | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-08-14 17:01:37 +02:00
										 |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 	"github.com/ethereum/eth-go/ethchain" | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 	"github.com/ethereum/eth-go/ethpipe" | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 	"github.com/ethereum/eth-go/ethreact" | 
					
						
							| 
									
										
										
										
											2014-07-24 12:30:41 +02:00
										 |  |  | 	"github.com/ethereum/eth-go/ethstate" | 
					
						
							| 
									
										
										
										
											2014-08-14 17:01:37 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/javascript" | 
					
						
							| 
									
										
										
										
											2014-08-15 13:27:43 +02:00
										 |  |  | 	"gopkg.in/qml.v1" | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type AppContainer interface { | 
					
						
							|  |  |  | 	Create() error | 
					
						
							|  |  |  | 	Destroy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Window() *qml.Window | 
					
						
							|  |  |  | 	Engine() *qml.Engine | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	NewBlock(*ethchain.Block) | 
					
						
							| 
									
										
										
										
											2014-05-20 16:58:13 +02:00
										 |  |  | 	NewWatcher(chan bool) | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | 	Messages(ethstate.Messages, string) | 
					
						
							| 
									
										
										
										
											2014-08-17 12:41:23 +02:00
										 |  |  | 	Post(string, int) | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ExtApplication struct { | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 	*ethpipe.JSPipe | 
					
						
							| 
									
										
										
										
											2014-08-14 17:01:37 +02:00
										 |  |  | 	eth ethchain.EthManager | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 01:13:39 +01:00
										 |  |  | 	blockChan       chan ethreact.Event | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | 	messageChan     chan ethreact.Event | 
					
						
							| 
									
										
										
										
											2014-05-20 16:58:13 +02:00
										 |  |  | 	quitChan        chan bool | 
					
						
							|  |  |  | 	watcherQuitChan chan bool | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | 	filters map[string]*ethchain.Filter | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 	container AppContainer | 
					
						
							|  |  |  | 	lib       *UiLib | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { | 
					
						
							|  |  |  | 	app := &ExtApplication{ | 
					
						
							| 
									
										
										
										
											2014-08-15 13:16:07 +02:00
										 |  |  | 		ethpipe.NewJSPipe(lib.eth), | 
					
						
							| 
									
										
										
										
											2014-08-14 17:01:37 +02:00
										 |  |  | 		lib.eth, | 
					
						
							| 
									
										
										
										
											2014-07-21 19:26:01 +01:00
										 |  |  | 		make(chan ethreact.Event, 100), | 
					
						
							|  |  |  | 		make(chan ethreact.Event, 100), | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 		make(chan bool), | 
					
						
							| 
									
										
										
										
											2014-05-20 16:58:13 +02:00
										 |  |  | 		make(chan bool), | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | 		make(map[string]*ethchain.Filter), | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 		container, | 
					
						
							|  |  |  | 		lib, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return app | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (app *ExtApplication) run() { | 
					
						
							|  |  |  | 	// Set the "eth" api on to the containers context | 
					
						
							|  |  |  | 	context := app.container.Engine().Context() | 
					
						
							|  |  |  | 	context.SetVar("eth", app) | 
					
						
							|  |  |  | 	context.SetVar("ui", app.lib) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err := app.container.Create() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-07-21 19:55:47 +01:00
										 |  |  | 		logger.Errorln(err) | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Call the main loop | 
					
						
							|  |  |  | 	go app.mainLoop() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Subscribe to events | 
					
						
							|  |  |  | 	reactor := app.lib.eth.Reactor() | 
					
						
							|  |  |  | 	reactor.Subscribe("newBlock", app.blockChan) | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | 	reactor.Subscribe("messages", app.messageChan) | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 16:58:13 +02:00
										 |  |  | 	app.container.NewWatcher(app.watcherQuitChan) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 	win := app.container.Window() | 
					
						
							|  |  |  | 	win.Show() | 
					
						
							|  |  |  | 	win.Wait() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	app.stop() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (app *ExtApplication) stop() { | 
					
						
							|  |  |  | 	// Clean up | 
					
						
							|  |  |  | 	reactor := app.lib.eth.Reactor() | 
					
						
							|  |  |  | 	reactor.Unsubscribe("newBlock", app.blockChan) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Kill the main loop | 
					
						
							|  |  |  | 	app.quitChan <- true | 
					
						
							| 
									
										
										
										
											2014-05-20 16:58:13 +02:00
										 |  |  | 	app.watcherQuitChan <- true | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	close(app.blockChan) | 
					
						
							|  |  |  | 	close(app.quitChan) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	app.container.Destroy() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (app *ExtApplication) mainLoop() { | 
					
						
							|  |  |  | out: | 
					
						
							|  |  |  | 	for { | 
					
						
							|  |  |  | 		select { | 
					
						
							|  |  |  | 		case <-app.quitChan: | 
					
						
							|  |  |  | 			break out | 
					
						
							|  |  |  | 		case block := <-app.blockChan: | 
					
						
							|  |  |  | 			if block, ok := block.Resource.(*ethchain.Block); ok { | 
					
						
							|  |  |  | 				app.container.NewBlock(block) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | 		case msg := <-app.messageChan: | 
					
						
							|  |  |  | 			if messages, ok := msg.Resource.(ethstate.Messages); ok { | 
					
						
							|  |  |  | 				for id, filter := range app.filters { | 
					
						
							|  |  |  | 					msgs := filter.FilterMessages(messages) | 
					
						
							|  |  |  | 					if len(msgs) > 0 { | 
					
						
							|  |  |  | 						app.container.Messages(msgs, id) | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | func (self *ExtApplication) Watch(filterOptions map[string]interface{}, identifier string) { | 
					
						
							|  |  |  | 	self.filters[identifier] = ethchain.NewFilterFromMap(filterOptions, self.eth) | 
					
						
							| 
									
										
										
										
											2014-04-30 01:44:02 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-08-14 17:01:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (self *ExtApplication) GetMessages(object map[string]interface{}) string { | 
					
						
							| 
									
										
										
										
											2014-08-15 00:24:14 +02:00
										 |  |  | 	filter := ethchain.NewFilterFromMap(object, self.eth) | 
					
						
							| 
									
										
										
										
											2014-08-14 17:01:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	messages := filter.Find() | 
					
						
							|  |  |  | 	var msgs []javascript.JSMessage | 
					
						
							|  |  |  | 	for _, m := range messages { | 
					
						
							|  |  |  | 		msgs = append(msgs, javascript.NewJSMessage(m)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	b, err := json.Marshal(msgs) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "{\"error\":" + err.Error() + "}" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return string(b) | 
					
						
							|  |  |  | } |