| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-17 16:22:35 +02:00
										 |  |  | package comms | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-06-17 16:33:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-17 16:22:35 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/rpc/codec" | 
					
						
							| 
									
										
										
										
											2015-06-17 16:33:34 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/rpc/shared" | 
					
						
							| 
									
										
										
										
											2015-06-17 16:22:35 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type InProcClient struct { | 
					
						
							| 
									
										
										
										
											2015-06-22 12:47:32 +02:00
										 |  |  | 	api         shared.EthereumApi | 
					
						
							| 
									
										
										
										
											2015-06-17 16:33:34 +02:00
										 |  |  | 	codec       codec.Codec | 
					
						
							|  |  |  | 	lastId      interface{} | 
					
						
							| 
									
										
										
										
											2015-06-17 16:22:35 +02:00
										 |  |  | 	lastJsonrpc string | 
					
						
							| 
									
										
										
										
											2015-06-17 16:33:34 +02:00
										 |  |  | 	lastErr     error | 
					
						
							|  |  |  | 	lastRes     interface{} | 
					
						
							| 
									
										
										
										
											2015-06-17 16:22:35 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Create a new in process client | 
					
						
							|  |  |  | func NewInProcClient(codec codec.Codec) *InProcClient { | 
					
						
							|  |  |  | 	return &InProcClient{ | 
					
						
							|  |  |  | 		codec: codec, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *InProcClient) Close() { | 
					
						
							|  |  |  | 	// do nothing | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Need to setup api support | 
					
						
							| 
									
										
										
										
											2015-06-22 12:47:32 +02:00
										 |  |  | func (self *InProcClient) Initialize(offeredApi shared.EthereumApi) { | 
					
						
							|  |  |  | 	self.api = offeredApi | 
					
						
							| 
									
										
										
										
											2015-06-17 16:22:35 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *InProcClient) Send(req interface{}) error { | 
					
						
							|  |  |  | 	if r, ok := req.(*shared.Request); ok { | 
					
						
							|  |  |  | 		self.lastId = r.Id | 
					
						
							|  |  |  | 		self.lastJsonrpc = r.Jsonrpc | 
					
						
							|  |  |  | 		self.lastRes, self.lastErr = self.api.Execute(r) | 
					
						
							|  |  |  | 		return self.lastErr | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return fmt.Errorf("Invalid request (%T)", req) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *InProcClient) Recv() (interface{}, error) { | 
					
						
							| 
									
										
										
										
											2015-08-07 09:56:49 +02:00
										 |  |  | 	return *shared.NewRpcResponse(self.lastId, self.lastJsonrpc, self.lastRes, self.lastErr), nil | 
					
						
							| 
									
										
										
										
											2015-06-17 16:22:35 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-18 18:23:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (self *InProcClient) SupportedModules() (map[string]string, error) { | 
					
						
							|  |  |  | 	req := shared.Request{ | 
					
						
							|  |  |  | 		Id:      1, | 
					
						
							|  |  |  | 		Jsonrpc: "2.0", | 
					
						
							|  |  |  | 		Method:  "modules", | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if res, err := self.api.Execute(&req); err == nil { | 
					
						
							|  |  |  | 		if result, ok := res.(map[string]string); ok { | 
					
						
							|  |  |  | 			return result, nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil, fmt.Errorf("Invalid response") | 
					
						
							|  |  |  | } |