private int invokeInternal(String methodName, Vector<String> methodArgs) {
    s_replyId++;
    methodArgs.insertElementAt(s_replyId.toString(), 0);
    m_node.callMethod(m_addr, methodName, methodArgs, s_replyId, this);
    m_pendingReplies.put(s_replyId, methodName);

    // Wait up to 9 ticks for an RPC reply to arrive
    Callback cb = new Callback(m_timeoutMethod, this, new Object[] {s_replyId});
    m_node.addTimeout(cb, 3 + 6 + 9);

    return s_replyId;
  }
 public void onMethodReply(int sender, Integer replyId, int result, String content) {
   if (m_pendingReplies.containsKey(replyId)) {
     String methodName = m_pendingReplies.get(replyId);
     m_pendingReplies.remove(replyId);
     dispatchReply(replyId, methodName, sender, result, content);
   } else {
     // Unexpected reply
     m_node.error(String.format("Unexpected reply id: %d", replyId));
   }
 }