示例#1
0
  public void run() {
    synchronized (this.jmDNSImpl.getIoLock()) {
      DNSOutgoing out = null;
      try {
        // send probes for JmDNS itself
        if (this.jmDNSImpl.getState() == taskState && this.jmDNSImpl.getTask() == this) {
          if (out == null) {
            out = new DNSOutgoing(DNSConstants.FLAGS_QR_QUERY);
          }
          out.addQuestion(
              new DNSQuestion(
                  this.jmDNSImpl.getLocalHost().getName(),
                  DNSConstants.TYPE_ANY,
                  DNSConstants.CLASS_IN));

          this.jmDNSImpl.getLocalHost().addAddressRecords(out, true);
          this.jmDNSImpl.advanceState();
        }
        // send probes for services
        // Defensively copy the services into a local list,
        // to prevent race conditions with methods registerService
        // and unregisterService.
        List list;
        synchronized (this.jmDNSImpl) {
          list = new LinkedList(this.jmDNSImpl.getServices().values());
        }
        for (Iterator i = list.iterator(); i.hasNext(); ) {
          ServiceInfoImpl info = (ServiceInfoImpl) i.next();

          synchronized (info) {
            if (info.getState() == taskState && info.getTask() == this) {
              info.advanceState();
              if (out == null) {
                out = new DNSOutgoing(DNSConstants.FLAGS_QR_QUERY);
                out.addQuestion(
                    new DNSQuestion(
                        info.getQualifiedName(), DNSConstants.TYPE_ANY, DNSConstants.CLASS_IN));
              }
              // the "unique" flag should be not set here because these
              // answers haven't been proven unique yet
              // this means the record will not exactly match the
              // announcement record
              out.addAuthorativeAnswer(
                  new DNSRecord.Service(
                      info.getQualifiedName(),
                      DNSConstants.TYPE_SRV,
                      DNSConstants.CLASS_IN,
                      DNSConstants.DNS_TTL,
                      info.getPriority(),
                      info.getWeight(),
                      info.getPort(),
                      this.jmDNSImpl.getLocalHost().getName()));
            }
          }
        }
        if (out != null) {
          this.jmDNSImpl.send(out);
        } else {
          // If we have nothing to send, another timer taskState ahead
          // of us has done the job for us. We can cancel.
          cancel();
          return;
        }
      } catch (Throwable e) {
        this.jmDNSImpl.recover();
      }

      taskState = taskState.advance();
      if (!taskState.isProbing()) {
        cancel();

        this.jmDNSImpl.startAnnouncer();
      }
    }
  }