diff options
Diffstat (limited to 'ui/qt')
-rw-r--r-- | ui/qt/filter.go | 6 | ||||
-rw-r--r-- | ui/qt/qwhisper/whisper.go | 98 | ||||
-rw-r--r-- | ui/qt/qwhisper/whisper_test.go | 15 |
3 files changed, 116 insertions, 3 deletions
diff --git a/ui/qt/filter.go b/ui/qt/filter.go index 96c3ab3a3..c68936401 100644 --- a/ui/qt/filter.go +++ b/ui/qt/filter.go @@ -3,12 +3,12 @@ package qt import ( "fmt" - "github.com/ethereum/go-ethereum/chain" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/ui" "gopkg.in/qml.v1" ) -func NewFilterFromMap(object map[string]interface{}, eth chain.EthManager) *chain.Filter { +func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter { filter := ui.NewFilterFromMap(object, eth) if object["altered"] != nil { @@ -18,7 +18,7 @@ func NewFilterFromMap(object map[string]interface{}, eth chain.EthManager) *chai return filter } -func makeAltered(v interface{}) (d []chain.AccountChange) { +func makeAltered(v interface{}) (d []core.AccountChange) { if qList, ok := v.(*qml.List); ok { var s []interface{} qList.Convert(&s) diff --git a/ui/qt/qwhisper/whisper.go b/ui/qt/qwhisper/whisper.go new file mode 100644 index 000000000..8f05c0695 --- /dev/null +++ b/ui/qt/qwhisper/whisper.go @@ -0,0 +1,98 @@ +package qwhisper + +import ( + "fmt" + "time" + "unsafe" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/whisper" + "gopkg.in/qml.v1" +) + +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 Watch struct { +} + +func (self *Watch) Arrived(v unsafe.Pointer) { + fmt.Println(v) +} + +type Whisper struct { + *whisper.Whisper + view qml.Object + + watches map[int]*Watch +} + +func New(w *whisper.Whisper) *Whisper { + return &Whisper{w, nil, make(map[int]*Watch)} +} + +func (self *Whisper) SetView(view qml.Object) { + self.view = view +} + +func (self *Whisper) Post(data string, to, from string, topics []string, pow, ttl uint32) { + 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)), + Topics: whisper.TopicsFromString(topics...), + }) + if err != nil { + fmt.Println(err) + // handle error + return + } + + if err := self.Whisper.Send(envelope); err != nil { + fmt.Println(err) + // handle error + return + } +} + +func (self *Whisper) NewIdentity() string { + return toHex(self.Whisper.NewIdentity().D.Bytes()) +} + +func (self *Whisper) HasIdentity(key string) bool { + return self.Whisper.HasIdentity(crypto.ToECDSA(fromHex(key))) +} + +func (self *Whisper) Watch(opts map[string]interface{}) *Watch { + filter := filterFromMap(opts) + filter.Fn = func(msg *whisper.Message) { + fmt.Println(msg) + } + i := self.Whisper.Watch(filter) + self.watches[i] = &Watch{} + + return self.watches[i] +} + +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)) + } + if topicList, ok := opts["topics"].(*qml.List); ok { + var topics []string + topicList.Convert(&topics) + f.Topics = whisper.TopicsFromString(topics...) + } + + return +} diff --git a/ui/qt/qwhisper/whisper_test.go b/ui/qt/qwhisper/whisper_test.go new file mode 100644 index 000000000..efa4e6238 --- /dev/null +++ b/ui/qt/qwhisper/whisper_test.go @@ -0,0 +1,15 @@ +package qwhisper + +import ( + "testing" + + "github.com/ethereum/go-ethereum/whisper" +) + +func TestHasIdentity(t *testing.T) { + qw := New(whisper.New()) + id := qw.NewIdentity() + if !qw.HasIdentity(id) { + t.Error("expected to have identity") + } +} |