Browse Source

Added whisper js api

obscuren 11 years ago
parent
commit
4051c0333f

+ 35 - 5
cmd/mist/assets/qml/browser.qml

@@ -59,15 +59,18 @@ Rectangle {
     }
 
     Component.onCompleted: {
-        //webview.url = "http://etherian.io"
-	webview.url = "file:///Users/jeffrey/test.html"
+        webview.url = "http://etherian.io"
     }
 
     signal messages(var messages, int id);
     onMessages: {
         // Bit of a cheat to get proper JSON
         var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
-        webview.postEvent("messages", [m, id]);
+        webview.postEvent("messages", id, m);
+    }
+
+    function onShhMessage(message, id) {
+	    webview.postEvent("shhChanged", id, message)
     }
 
     Item {
@@ -328,6 +331,33 @@ Rectangle {
                         require(1);
                         eth.uninstallFilter(data.args[0])
                         break;
+
+
+			case "shhNewFilter":
+			require(1);
+			var id = shh.watch(data.args[0], window);
+			postData(data._id, id);
+			break;
+
+			case "newIdentity":
+			postData(data._id, shh.newIdentity())
+			break
+
+			case "post":
+			require(1);
+			var params = data.args[0];
+			var fields = ["payload", "to", "from"];
+			for(var i = 0; i < fields.length; i++) {
+				params[fields[i]] = params[fields[i]] || "";
+			}
+			if(typeof params.payload === "object") { params.payload = params.payload.join(""); }
+			params.topics = params.topics || [];
+			params.priority = params.priority || 1000;
+			params.ttl = params.ttl || 100;
+
+			console.log(JSON.stringify(params))
+			shh.post(params.payload, params.to, params.from, params.topics, params.priority, params.ttl);
+			break;
                     }
                 } catch(e) {
                     console.log(data.call + ": " + e)
@@ -349,8 +379,8 @@ Rectangle {
             function postData(seed, data) {
                 webview.experimental.postMessage(JSON.stringify({data: data, _id: seed}))
             }
-            function postEvent(event, data) {
-                webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
+            function postEvent(event, id, data) {
+                webview.experimental.postMessage(JSON.stringify({data: data, _id: id, _event: event}))
             }
 
             function onWatchedCb(data, id) {

+ 1 - 1
cmd/mist/assets/qml/views/whisper.qml

@@ -24,7 +24,7 @@ Rectangle {
 		var t = shh.watch({}, root)
 	}
 
-	function onMessage(message) {
+	function onShhMessage(message, i) {
 		whisperModel.insert(0, {from: message.from, payload: eth.toAscii(message.payload)})
 	}
 

+ 32 - 32
cmd/mist/gui.go

@@ -43,38 +43,6 @@ import (
 	"gopkg.in/qml.v1"
 )
 
-/*
-func LoadExtension(path string) (uintptr, error) {
-	lib, err := ffi.NewLibrary(path)
-	if err != nil {
-		return 0, err
-	}
-
-	so, err := lib.Fct("sharedObject", ffi.Pointer, nil)
-	if err != nil {
-		return 0, err
-	}
-
-	ptr := so()
-
-		err = lib.Close()
-		if err != nil {
-			return 0, err
-		}
-
-	return ptr.Interface().(uintptr), nil
-}
-*/
-/*
-	vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
-	fmt.Printf("Fetched vec with addr: %#x\n", vec)
-	if errr != nil {
-		fmt.Println(errr)
-	} else {
-		context.SetVar("vec", (unsafe.Pointer)(vec))
-	}
-*/
-
 var guilogger = logger.NewLogger("GUI")
 
 type Gui struct {
@@ -535,3 +503,35 @@ func (gui *Gui) privateKey() string {
 func (gui *Gui) address() []byte {
 	return gui.eth.KeyManager().Address()
 }
+
+/*
+func LoadExtension(path string) (uintptr, error) {
+	lib, err := ffi.NewLibrary(path)
+	if err != nil {
+		return 0, err
+	}
+
+	so, err := lib.Fct("sharedObject", ffi.Pointer, nil)
+	if err != nil {
+		return 0, err
+	}
+
+	ptr := so()
+
+		err = lib.Close()
+		if err != nil {
+			return 0, err
+		}
+
+	return ptr.Interface().(uintptr), nil
+}
+*/
+/*
+	vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
+	fmt.Printf("Fetched vec with addr: %#x\n", vec)
+	if errr != nil {
+		fmt.Println(errr)
+	} else {
+		context.SetVar("vec", (unsafe.Pointer)(vec))
+	}
+*/

+ 77 - 85
cmd/mist/ui_lib.go

@@ -225,6 +225,83 @@ func (self *UiLib) StartDebugger() {
 	dbWindow.Show()
 }
 
+func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
+	object := mapToTxParams(params)
+
+	return self.JSXEth.Transact(
+		object["from"],
+		object["to"],
+		object["value"],
+		object["gas"],
+		object["gasPrice"],
+		object["data"],
+	)
+}
+
+func (self *UiLib) Compile(code string) (string, error) {
+	bcode, err := ethutil.Compile(code, false)
+	if err != nil {
+		return err.Error(), err
+	}
+
+	return ethutil.Bytes2Hex(bcode), err
+}
+
+func (self *UiLib) Call(params map[string]interface{}) (string, error) {
+	object := mapToTxParams(params)
+
+	return self.JSXEth.Execute(
+		object["to"],
+		object["value"],
+		object["gas"],
+		object["gasPrice"],
+		object["data"],
+	)
+}
+
+func (self *UiLib) AddLocalTransaction(to, data, gas, gasPrice, value string) int {
+	return self.miner.AddLocalTx(&miner.LocalTx{
+		To:       ethutil.Hex2Bytes(to),
+		Data:     ethutil.Hex2Bytes(data),
+		Gas:      gas,
+		GasPrice: gasPrice,
+		Value:    value,
+	}) - 1
+}
+
+func (self *UiLib) RemoveLocalTransaction(id int) {
+	self.miner.RemoveLocalTx(id)
+}
+
+func (self *UiLib) SetGasPrice(price string) {
+	self.miner.MinAcceptedGasPrice = ethutil.Big(price)
+}
+
+func (self *UiLib) ToggleMining() bool {
+	if !self.miner.Mining() {
+		self.miner.Start()
+
+		return true
+	} else {
+		self.miner.Stop()
+
+		return false
+	}
+}
+
+func (self *UiLib) ToHex(data string) string {
+	return "0x" + ethutil.Bytes2Hex([]byte(data))
+}
+
+func (self *UiLib) ToAscii(data string) string {
+	start := 0
+	if len(data) > 1 && data[0:2] == "0x" {
+		start = 2
+	}
+	return string(ethutil.Hex2Bytes(data[start:]))
+}
+
+/// Ethereum filter methods
 func (self *UiLib) NewFilter(object map[string]interface{}) (id int) {
 	filter := qt.NewFilterFromMap(object, self.eth)
 	filter.MessageCallback = func(messages state.Messages) {
@@ -312,88 +389,3 @@ func mapToTxParams(object map[string]interface{}) map[string]string {
 
 	return conv
 }
-
-func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
-	object := mapToTxParams(params)
-
-	return self.JSXEth.Transact(
-		object["from"],
-		object["to"],
-		object["value"],
-		object["gas"],
-		object["gasPrice"],
-		object["data"],
-	)
-}
-
-func (self *UiLib) Compile(code string) (string, error) {
-	bcode, err := ethutil.Compile(code, false)
-	if err != nil {
-		return err.Error(), err
-	}
-
-	return ethutil.Bytes2Hex(bcode), err
-}
-
-func (self *UiLib) Call(params map[string]interface{}) (string, error) {
-	object := mapToTxParams(params)
-
-	return self.JSXEth.Execute(
-		object["to"],
-		object["value"],
-		object["gas"],
-		object["gasPrice"],
-		object["data"],
-	)
-}
-
-func (self *UiLib) AddLocalTransaction(to, data, gas, gasPrice, value string) int {
-	return self.miner.AddLocalTx(&miner.LocalTx{
-		To:       ethutil.Hex2Bytes(to),
-		Data:     ethutil.Hex2Bytes(data),
-		Gas:      gas,
-		GasPrice: gasPrice,
-		Value:    value,
-	}) - 1
-}
-
-func (self *UiLib) RemoveLocalTransaction(id int) {
-	self.miner.RemoveLocalTx(id)
-}
-
-func (self *UiLib) SetGasPrice(price string) {
-	self.miner.MinAcceptedGasPrice = ethutil.Big(price)
-}
-
-func (self *UiLib) ToggleMining() bool {
-	if !self.miner.Mining() {
-		self.miner.Start()
-
-		return true
-	} else {
-		self.miner.Stop()
-
-		return false
-	}
-}
-
-func (self *UiLib) ToHex(data string) string {
-	return "0x" + ethutil.Bytes2Hex([]byte(data))
-}
-
-func (self *UiLib) ToAscii(data string) string {
-	start := 0
-	if len(data) > 1 && data[0:2] == "0x" {
-		start = 2
-	}
-	return string(ethutil.Hex2Bytes(data[start:]))
-}
-
-/*
-// XXX Refactor me & MOVE
-func (self *Ethereum) InstallFilter(filter *core.Filter) (id int) {
-	return self.filterManager.InstallFilter(filter)
-}
-func (self *Ethereum) UninstallFilter(id int)        { self.filterManager.UninstallFilter(id) }
-func (self *Ethereum) GetFilter(id int) *core.Filter { return self.filterManager.GetFilter(id) }
-*/

+ 2 - 2
ui/qt/qwhisper/message.go

@@ -8,7 +8,7 @@ import (
 
 type Message struct {
 	ref     *whisper.Message
-	Flags   byte
+	Flags   int32
 	Payload string
 	From    string
 }
@@ -16,7 +16,7 @@ type Message struct {
 func ToQMessage(msg *whisper.Message) *Message {
 	return &Message{
 		ref:     msg,
-		Flags:   msg.Flags,
+		Flags:   int32(msg.Flags),
 		Payload: ethutil.Bytes2Hex(msg.Payload),
 		From:    ethutil.Bytes2Hex(crypto.FromECDSAPub(msg.Recover())),
 	}

+ 5 - 4
ui/qt/qwhisper/whisper.go

@@ -33,9 +33,9 @@ func (self *Whisper) SetView(view qml.Object) {
 	self.view = view
 }
 
-func (self *Whisper) Post(data string, to, from string, topics []string, pow, ttl uint32) {
+func (self *Whisper) Post(data, to, from string, topics []string, priority, ttl uint32) {
 	msg := whisper.NewMessage(fromHex(data))
-	envelope, err := msg.Seal(time.Duration(pow), whisper.Opts{
+	envelope, err := msg.Seal(time.Duration(priority*100000), whisper.Opts{
 		Ttl:    time.Duration(ttl),
 		To:     crypto.ToECDSAPub(fromHex(to)),
 		From:   crypto.ToECDSA(fromHex(from)),
@@ -64,13 +64,14 @@ func (self *Whisper) HasIdentity(key string) bool {
 
 func (self *Whisper) Watch(opts map[string]interface{}, view *qml.Common) int {
 	filter := filterFromMap(opts)
+	var i int
 	filter.Fn = func(msg *whisper.Message) {
 		if view != nil {
-			view.Call("onMessage", ToQMessage(msg))
+			view.Call("onShhMessage", ToQMessage(msg), i)
 		}
 	}
 
-	i := self.Whisper.Watch(filter)
+	i = self.Whisper.Watch(filter)
 	self.watches[i] = &Watch{}
 
 	return i

+ 1 - 1
whisper/whisper.go

@@ -175,7 +175,7 @@ func (self *Whisper) add(envelope *Envelope) error {
 
 	if !self.expiry[envelope.Expiry].Has(hash) {
 		self.expiry[envelope.Expiry].Add(hash)
-		self.postEvent(envelope)
+		go self.postEvent(envelope)
 	}
 
 	return nil