Source code: Freenet/message/RequestCB.java
1 package Freenet.message;
2 import Freenet.*;
3 import Freenet.node.*;
4 import Freenet.support.*;
5
6 public class RequestCB implements Callback
7 {
8 protected Node n;
9 protected long id;
10 protected MessageMemory mm;
11 protected long hopsToLive;
12
13 public RequestCB(Node n, MessageMemory mm, long id, long hopsToLive)
14 {
15 this.n = n;
16 this.mm = mm;
17 this.id = id;
18 this.hopsToLive = hopsToLive;
19 }
20
21 public void callback()
22 {
23 (new CallbackThread()).start();
24 }
25
26 private class CallbackThread extends Thread {
27
28 public void run()
29 {
30 // note that the if the send fails, the query won't be restarted, since if it can't send the notification, it probably won't be able to send the reply
31 try {
32 Logger.log("message/RequestCB.java","Restarting message " + Long.toHexString(id) + " on no reply.",Logger.DEBUGGING);
33 KeyedMM kmm = null;
34 ConnectionHandler ch;
35 if( mm instanceof KeyedMM )
36 kmm = (KeyedMM)mm;
37 if (kmm != null && kmm.replyCon != null && kmm.replyCon.isOpen()) {
38 ch = kmm.replyCon;
39 } else {
40 ch = n.makeConnection(mm.origRec);
41 }
42 QueryRestarted qrm = new QueryRestarted(id, mm.depth);
43 qrm.sending(n, ch);
44 ch.sendMessage(qrm, null, null);
45 n.timer.add(id, hopsToLive * Node.timePerHop, RequestCB.this); // HACK!, Failed needs to cancel a timer to reschedule it
46 RequestFailed rf = new RequestFailed(id, hopsToLive);
47 n.mh.handle(rf); // handle as if a failed message were received
48 } catch (SendFailedException sfe) {
49 Logger.log("message/RequestCB.java","Couldn't restart on timeout because send failed to " + sfe.peer, Logger.NORMAL);
50 } catch (ConnectFailedException sfe) {
51 Logger.log("message/RequestCB.java","Couldn't restart on timeout because connect failed to " + sfe.peer, Logger.NORMAL);
52 }
53 }
54 }
55
56 // this differs from the callback in that it sends back a requestfailed, rather then attemption to restart here. Used when pending RequestCBs are canceled because they were pushed from the MessageHandlers hashtable
57 public void sendback() {
58 (new SendbackThread()).start();
59 }
60
61 private class SendbackThread extends Thread {
62 public void run() {
63 try {
64 Logger.log("message/RequestCB.java","Failing to serve request do to overflowing MessageHandler",Logger.NORMAL);
65 RequestFailed rf = new RequestFailed(id, hopsToLive);
66 rf.sendBack(n, mm);
67 } catch (SendFailedException sfe) {
68 Logger.log("message/RequestCB.java","Failed to fail on sendback",Logger.DEBUGGING);
69 }
70 }
71 }
72 }