diff options
author | Jeffrey Wilcke <obscuren@users.noreply.github.com> | 2014-10-23 22:46:18 +0800 |
---|---|---|
committer | Jeffrey Wilcke <obscuren@users.noreply.github.com> | 2014-10-23 22:46:18 +0800 |
commit | 119c5b40a7ed1aea1c871c0cb56956b8ef9303d9 (patch) | |
tree | b021423da04c9ff319a77549b473b6bad4930dd4 /cmd/mist/ext_app.go | |
parent | 50fd46924900869e7210217c6a07979b544991c8 (diff) | |
parent | 184055b3e2995894ccaba364484223e488730627 (diff) | |
download | go-tangerine-119c5b40a7ed1aea1c871c0cb56956b8ef9303d9.tar go-tangerine-119c5b40a7ed1aea1c871c0cb56956b8ef9303d9.tar.gz go-tangerine-119c5b40a7ed1aea1c871c0cb56956b8ef9303d9.tar.bz2 go-tangerine-119c5b40a7ed1aea1c871c0cb56956b8ef9303d9.tar.lz go-tangerine-119c5b40a7ed1aea1c871c0cb56956b8ef9303d9.tar.xz go-tangerine-119c5b40a7ed1aea1c871c0cb56956b8ef9303d9.tar.zst go-tangerine-119c5b40a7ed1aea1c871c0cb56956b8ef9303d9.zip |
Merge pull request #150 from fjl/develop
Merge eth-go repo into go-ethereum
Diffstat (limited to 'cmd/mist/ext_app.go')
-rw-r--r-- | cmd/mist/ext_app.go | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/cmd/mist/ext_app.go b/cmd/mist/ext_app.go new file mode 100644 index 000000000..7680106f0 --- /dev/null +++ b/cmd/mist/ext_app.go @@ -0,0 +1,142 @@ +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA + +package main + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/ethchain" + "github.com/ethereum/go-ethereum/ethpipe" + "github.com/ethereum/go-ethereum/ethstate" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/javascript" + "github.com/ethereum/go-ethereum/ui/qt" + "gopkg.in/qml.v1" +) + +type AppContainer interface { + Create() error + Destroy() + + Window() *qml.Window + Engine() *qml.Engine + + NewBlock(*ethchain.Block) + NewWatcher(chan bool) + Messages(ethstate.Messages, string) + Post(string, int) +} + +type ExtApplication struct { + *ethpipe.JSPipe + eth ethchain.EthManager + + events event.Subscription + watcherQuitChan chan bool + + filters map[string]*ethchain.Filter + + container AppContainer + lib *UiLib +} + +func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { + return &ExtApplication{ + JSPipe: ethpipe.NewJSPipe(lib.eth), + eth: lib.eth, + watcherQuitChan: make(chan bool), + filters: make(map[string]*ethchain.Filter), + container: container, + lib: lib, + } +} + +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 { + logger.Errorln(err) + return + } + + // Subscribe to events + mux := app.lib.eth.EventMux() + app.events = mux.Subscribe(ethchain.NewBlockEvent{}, ethstate.Messages(nil)) + + // Call the main loop + go app.mainLoop() + + app.container.NewWatcher(app.watcherQuitChan) + + win := app.container.Window() + win.Show() + win.Wait() + + app.stop() +} + +func (app *ExtApplication) stop() { + app.events.Unsubscribe() + + // Kill the main loop + app.watcherQuitChan <- true + + app.container.Destroy() +} + +func (app *ExtApplication) mainLoop() { + for ev := range app.events.Chan() { + switch ev := ev.(type) { + case ethchain.NewBlockEvent: + app.container.NewBlock(ev.Block) + + case ethstate.Messages: + for id, filter := range app.filters { + msgs := filter.FilterMessages(ev) + if len(msgs) > 0 { + app.container.Messages(msgs, id) + } + } + } + } +} + +func (self *ExtApplication) Watch(filterOptions map[string]interface{}, identifier string) { + self.filters[identifier] = qt.NewFilterFromMap(filterOptions, self.eth) +} + +func (self *ExtApplication) GetMessages(object map[string]interface{}) string { + filter := qt.NewFilterFromMap(object, self.eth) + + 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) +} |