aboutsummaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
committerobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
commit3983dd2428137211f84f299f9ce8690c22f50afd (patch)
tree3a2dc53b365e6f377fc82a3514150d1297fe549c /ui
parent7daa8c2f6eb25511c6a54ad420709af911fc6748 (diff)
parent0a9dc1536c5d776844d6947a0090ff7e1a7c6ab4 (diff)
downloadgo-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.gz
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.zst
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.zip
Merge branch 'release/v0.7.10'vv0.7.10
Diffstat (limited to 'ui')
-rw-r--r--ui/filter.go75
-rw-r--r--ui/qt/filter.go38
-rw-r--r--ui/qt/qwhisper/whisper.go70
3 files changed, 183 insertions, 0 deletions
diff --git a/ui/filter.go b/ui/filter.go
new file mode 100644
index 000000000..88faad5ca
--- /dev/null
+++ b/ui/filter.go
@@ -0,0 +1,75 @@
+package ui
+
+import (
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/ethutil"
+)
+
+func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
+ filter := core.NewFilter(eth)
+
+ if object["earliest"] != nil {
+ val := ethutil.NewValue(object["earliest"])
+ filter.SetEarliestBlock(val.Int())
+ }
+
+ if object["latest"] != nil {
+ val := ethutil.NewValue(object["latest"])
+ filter.SetLatestBlock(val.Int())
+ }
+
+ if object["to"] != nil {
+ val := ethutil.NewValue(object["to"])
+ filter.AddTo(ethutil.Hex2Bytes(val.Str()))
+ }
+
+ if object["from"] != nil {
+ val := ethutil.NewValue(object["from"])
+ filter.AddFrom(ethutil.Hex2Bytes(val.Str()))
+ }
+
+ if object["max"] != nil {
+ val := ethutil.NewValue(object["max"])
+ filter.SetMax(int(val.Uint()))
+ }
+
+ if object["skip"] != nil {
+ val := ethutil.NewValue(object["skip"])
+ filter.SetSkip(int(val.Uint()))
+ }
+
+ if object["altered"] != nil {
+ filter.Altered = makeAltered(object["altered"])
+ }
+
+ return filter
+}
+
+// Conversion methodn
+func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) {
+ if str, ok := m["id"].(string); ok {
+ d.Address = ethutil.Hex2Bytes(str)
+ }
+
+ if str, ok := m["at"].(string); ok {
+ d.StateAddress = ethutil.Hex2Bytes(str)
+ }
+
+ return
+}
+
+// data can come in in the following formats:
+// ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"}
+func makeAltered(v interface{}) (d []core.AccountChange) {
+ if str, ok := v.(string); ok {
+ d = append(d, core.AccountChange{ethutil.Hex2Bytes(str), nil})
+ } else if obj, ok := v.(map[string]interface{}); ok {
+ d = append(d, mapToAccountChange(obj))
+ } else if slice, ok := v.([]interface{}); ok {
+ for _, item := range slice {
+ d = append(d, makeAltered(item)...)
+ }
+ }
+
+ return
+}
diff --git a/ui/qt/filter.go b/ui/qt/filter.go
new file mode 100644
index 000000000..c68936401
--- /dev/null
+++ b/ui/qt/filter.go
@@ -0,0 +1,38 @@
+package qt
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/ui"
+ "gopkg.in/qml.v1"
+)
+
+func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
+ filter := ui.NewFilterFromMap(object, eth)
+
+ if object["altered"] != nil {
+ filter.Altered = makeAltered(object["altered"])
+ }
+
+ return filter
+}
+
+func makeAltered(v interface{}) (d []core.AccountChange) {
+ if qList, ok := v.(*qml.List); ok {
+ var s []interface{}
+ qList.Convert(&s)
+
+ fmt.Println(s)
+
+ d = makeAltered(s)
+ } else if qMap, ok := v.(*qml.Map); ok {
+ var m map[string]interface{}
+ qMap.Convert(&m)
+ fmt.Println(m)
+
+ d = makeAltered(m)
+ }
+
+ return
+}
diff --git a/ui/qt/qwhisper/whisper.go b/ui/qt/qwhisper/whisper.go
new file mode 100644
index 000000000..bed23c8a7
--- /dev/null
+++ b/ui/qt/qwhisper/whisper.go
@@ -0,0 +1,70 @@
+package qwhisper
+
+import (
+ "time"
+
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/whisper"
+)
+
+func fromHex(s string) []byte {
+ if len(s) > 1 {
+ return ethutil.Hex2Bytes(s[2:])
+ }
+ return nil
+}
+func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) }
+
+type Whisper struct {
+ *whisper.Whisper
+}
+
+func New(w *whisper.Whisper) *Whisper {
+ return &Whisper{w}
+}
+
+func (self *Whisper) Post(data string, pow, ttl uint32, to, from string) {
+ msg := whisper.NewMessage(fromHex(data))
+ envelope, err := msg.Seal(time.Duration(pow), whisper.Opts{
+ Ttl: time.Duration(ttl),
+ To: crypto.ToECDSAPub(fromHex(to)),
+ From: crypto.ToECDSA(fromHex(from)),
+ })
+ if err != nil {
+ // handle error
+ return
+ }
+
+ if err := self.Whisper.Send(envelope); err != nil {
+ // handle error
+ return
+ }
+}
+
+func (self *Whisper) NewIdentity() string {
+ return toHex(self.Whisper.NewIdentity().D.Bytes())
+}
+
+func (self *Whisper) HasIdentify(key string) bool {
+ return self.Whisper.HasIdentity(crypto.ToECDSA(fromHex(key)))
+}
+
+func (self *Whisper) Watch(opts map[string]interface{}) {
+ filter := filterFromMap(opts)
+ filter.Fn = func(msg *whisper.Message) {
+ // TODO POST TO QT WINDOW
+ }
+ self.Whisper.Watch(filter)
+}
+
+func filterFromMap(opts map[string]interface{}) (f whisper.Filter) {
+ if to, ok := opts["to"].(string); ok {
+ f.To = crypto.ToECDSA(fromHex(to))
+ }
+ if from, ok := opts["from"].(string); ok {
+ f.From = crypto.ToECDSAPub(fromHex(from))
+ }
+
+ return
+}