void rrToWire(DNSOutput out, Compression c, boolean canonical) { if (options == null) return; Iterator it = options.iterator(); while (it.hasNext()) { Option opt = (Option) it.next(); out.writeU16(opt.code); out.writeU16(opt.data.length); out.writeByteArray(opt.data); } }
/* Returns true if the message could be rendered. */ private boolean toWire(DNSOutput out, int maxLength) { if (maxLength < Header.LENGTH) return false; Header newheader = null; int tempMaxLength = maxLength; if (tsigkey != null) tempMaxLength -= tsigkey.recordLength(); OPTRecord opt = getOPT(); byte[] optBytes = null; if (opt != null) { optBytes = opt.toWire(Section.ADDITIONAL); tempMaxLength -= optBytes.length; } int startpos = out.current(); header.toWire(out); Compression c = new Compression(); int flags = header.getFlagsByte(); int additionalCount = 0; for (int i = 0; i < 4; i++) { int skipped; if (sections[i] == null) continue; skipped = sectionToWire(out, i, c, tempMaxLength); if (skipped != 0 && i != Section.ADDITIONAL) { flags = Header.setFlag(flags, Flags.TC, true); out.writeU16At(header.getCount(i) - skipped, startpos + 4 + 2 * i); for (int j = i + 1; j < Section.ADDITIONAL; j++) out.writeU16At(0, startpos + 4 + 2 * j); break; } if (i == Section.ADDITIONAL) additionalCount = header.getCount(i) - skipped; } if (optBytes != null) { out.writeByteArray(optBytes); additionalCount++; } if (flags != header.getFlagsByte()) out.writeU16At(flags, startpos + 2); if (additionalCount != header.getCount(Section.ADDITIONAL)) out.writeU16At(additionalCount, startpos + 10); if (tsigkey != null) { TSIGRecord tsigrec = tsigkey.generate(this, out.toByteArray(), tsigerror, querytsig); tsigrec.toWire(out, Section.ADDITIONAL, c); out.writeU16At(additionalCount + 1, startpos + 10); } return true; }