Added manual triggering of filters
This commit is contained in:
		| @@ -150,7 +150,7 @@ var shhWatchMethods = function () { | |||||||
|     return [ |     return [ | ||||||
|     { name: 'newFilter', call: 'shh_newFilter' }, |     { name: 'newFilter', call: 'shh_newFilter' }, | ||||||
|     { name: 'uninstallFilter', call: 'shh_uninstallFilter' }, |     { name: 'uninstallFilter', call: 'shh_uninstallFilter' }, | ||||||
|     { name: 'getMessage', call: 'shh_getMessages' } |     { name: 'getMessages', call: 'shh_getMessages' } | ||||||
|     ]; |     ]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -310,7 +310,7 @@ Rectangle { | |||||||
|                         postData(data._id, id); |                         postData(data._id, id); | ||||||
|                         break; |                         break; | ||||||
|  |  | ||||||
|                         case "eth_messages": |                         case "eth_filterLogs": | ||||||
|                         require(1); |                         require(1); | ||||||
|  |  | ||||||
|                         var messages = eth.messages(data.args[0]); |                         var messages = eth.messages(data.args[0]); | ||||||
| @@ -352,6 +352,13 @@ Rectangle { | |||||||
|  |  | ||||||
| 				shh.post(params.payload, params.to, params.from, params.topics, params.priority, params.ttl); | 				shh.post(params.payload, params.to, params.from, params.topics, params.priority, params.ttl); | ||||||
|  |  | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 			case "shh_getMessages": | ||||||
|  | 				require(1); | ||||||
|  |  | ||||||
|  | 				shh.trigger(data.args[0]); | ||||||
|  |  | ||||||
| 				break; | 				break; | ||||||
|                     } |                     } | ||||||
|                 } catch(e) { |                 } catch(e) { | ||||||
|   | |||||||
| @@ -68,3 +68,11 @@ out: | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (self *Filters) Match(a, b Filter) bool { | ||||||
|  | 	return reflect.TypeOf(a) == reflect.TypeOf(b) && a.Compare(b) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (self *Filters) Get(i int) Filter { | ||||||
|  | 	return self.watchers[i] | ||||||
|  | } | ||||||
|   | |||||||
| @@ -84,6 +84,10 @@ func (self *Whisper) Watch(opts map[string]interface{}, view *qml.Common) int { | |||||||
| 	return i | 	return i | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (self *Whisper) Trigger(id int) { | ||||||
|  | 	go self.Whisper.Trigger(id) | ||||||
|  | } | ||||||
|  |  | ||||||
| func filterFromMap(opts map[string]interface{}) (f whisper.Filter) { | func filterFromMap(opts map[string]interface{}) (f whisper.Filter) { | ||||||
| 	if to, ok := opts["to"].(string); ok { | 	if to, ok := opts["to"].(string); ok { | ||||||
| 		f.To = crypto.ToECDSA(fromHex(to)) | 		f.To = crypto.ToECDSA(fromHex(to)) | ||||||
|   | |||||||
| @@ -126,6 +126,20 @@ func (self *Whisper) Watch(opts Filter) int { | |||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (self *Whisper) Trigger(id int) { | ||||||
|  | 	filter := self.filters.Get(id) | ||||||
|  | 	if filter != nil { | ||||||
|  | 		for _, e := range self.messages { | ||||||
|  | 			if msg, key := self.open(e); msg != nil { | ||||||
|  | 				f := createFilter(msg, e.Topics, key) | ||||||
|  | 				if self.filters.Match(filter, f) { | ||||||
|  | 					self.filters.Notify(f, msg) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // Main handler for passing whisper messages to whisper peer objects | // Main handler for passing whisper messages to whisper peer objects | ||||||
| func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { | func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { | ||||||
| 	wpeer := NewPeer(self, peer, ws) | 	wpeer := NewPeer(self, peer, ws) | ||||||
| @@ -227,19 +241,28 @@ func (self *Whisper) envelopes() (envelopes []*Envelope) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (self *Whisper) postEvent(envelope *Envelope) { | func (self *Whisper) postEvent(envelope *Envelope) { | ||||||
|  | 	if message, key := self.open(envelope); message != nil { | ||||||
|  | 		self.filters.Notify(createFilter(message, envelope.Topics, key), message) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (self *Whisper) open(envelope *Envelope) (*Message, *ecdsa.PrivateKey) { | ||||||
| 	for _, key := range self.keys { | 	for _, key := range self.keys { | ||||||
| 		if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) { | 		if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) { | ||||||
| 			self.filters.Notify(filter.Generic{ | 			return message, key | ||||||
| 				Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), |  | ||||||
| 				Data: bytesToMap(envelope.Topics), |  | ||||||
| 			}, message) |  | ||||||
| 			break |  | ||||||
| 		} else { |  | ||||||
| 			wlogger.Infoln(err) |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (self *Whisper) Protocol() p2p.Protocol { | func (self *Whisper) Protocol() p2p.Protocol { | ||||||
| 	return self.protocol | 	return self.protocol | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func createFilter(message *Message, topics [][]byte, key *ecdsa.PrivateKey) filter.Filter { | ||||||
|  | 	return filter.Generic{ | ||||||
|  | 		Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), | ||||||
|  | 		Data: bytesToMap(topics), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user