Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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  }