@@ -10,6 +10,10 @@ import (
10
10
11
11
type RoutingTable interface {
12
12
SeeHost (h * Host )
13
+ // may return ""
14
+ GetString () string
15
+ // may return "", subject to change
16
+ GetHTML () string
13
17
}
14
18
15
19
@@ -20,6 +24,8 @@ type BRoutingTable struct {
20
24
21
25
seehost chan * Host
22
26
quitchan chan bool
27
+ stringchan chan chan string
28
+ htmlchan chan chan string
23
29
24
30
Log bool
25
31
logger * log.Logger
@@ -67,6 +73,10 @@ func (rt *BRoutingTable) main() {
67
73
rt .seeHost (h )
68
74
case <- rt .quitchan :
69
75
return
76
+ case r := <- rt .stringchan :
77
+ r <- rt .string ()
78
+ case r := <- rt .htmlchan :
79
+ r <- rt .html ()
70
80
}
71
81
}
72
82
}
@@ -216,7 +226,8 @@ func (rt *BRoutingTable) balanceleftright(lefti uint) {
216
226
}
217
227
218
228
219
- func (rt * BRoutingTable ) String () string {
229
+ // not goroutine safe
230
+ func (rt * BRoutingTable ) string () string {
220
231
buf := bytes .NewBuffer (nil )
221
232
222
233
buf .WriteString ("BRoutingTable ===>\n " )
@@ -230,3 +241,44 @@ func (rt *BRoutingTable) String() string {
230
241
buf .WriteString ("<===\n " )
231
242
return buf .String ()
232
243
}
244
+
245
+ // not goroutine safe
246
+ func (rt * BRoutingTable ) html () string {
247
+ buf := bytes .NewBuffer (nil )
248
+
249
+ buf .WriteString ("BRoutingTable<br>\n <table>\n <tr>\n " )
250
+
251
+ for b := 0 ; b <= rt .maxbucket ; b ++ {
252
+ buf .WriteString (fmt .Sprintf ("<th>Bucket %d</th>\n " , b ))
253
+ }
254
+
255
+ buf .WriteString ("</tr>\n " )
256
+
257
+ for b := 0 ; b <= rt .maxbucket ; b ++ {
258
+ buf .WriteString ("<td>" )
259
+ for _ , rth := range rt .buckets [b ].hosts {
260
+ buf .WriteString (fmt .Sprintf ("\t %x | %v @ %v<br>\n " , rth .host .Id , XOR (rth .host .Id , rt .id )[0 :5 ], rth .host .Addr ))
261
+ }
262
+ buf .WriteString ("</td>" )
263
+ }
264
+
265
+ buf .WriteString ("</tr>" )
266
+
267
+ buf .WriteString ("</table>" )
268
+ return buf .String ()
269
+ }
270
+
271
+
272
+ // goroutine safe. not for internal use!
273
+ func (rt * BRoutingTable ) GetString () string {
274
+ r := make (chan string )
275
+ rt .stringchan <- r
276
+ return <- r
277
+ }
278
+
279
+ // goroutine safe. not for internal use!
280
+ func (rt * BRoutingTable ) GetHTML () string {
281
+ r := make (chan string )
282
+ rt .htmlchan <- r
283
+ return <- r
284
+ }
0 commit comments