Generates a new Name to be used when following a DNAME. @param dname The DNAME record to follow. @return The constructed name. @throws NameTooLongException The resulting name is too long.
(DNAMERecord dname)
| 505 | * @throws NameTooLongException The resulting name is too long. |
| 506 | */ |
| 507 | public Name |
| 508 | fromDNAME(DNAMERecord dname) throws NameTooLongException { |
| 509 | Name dnameowner = dname.getName(); |
| 510 | Name dnametarget = dname.getTarget(); |
| 511 | if (!subdomain(dnameowner)) |
| 512 | return null; |
| 513 | |
| 514 | int plabels = labels() - dnameowner.labels(); |
| 515 | int plength = length() - dnameowner.length(); |
| 516 | int pstart = offset(0); |
| 517 | |
| 518 | int dlabels = dnametarget.labels(); |
| 519 | int dlength = dnametarget.length(); |
| 520 | |
| 521 | if (plength + dlength > MAXNAME) |
| 522 | throw new NameTooLongException(); |
| 523 | |
| 524 | Name newname = new Name(); |
| 525 | newname.setlabels(plabels + dlabels); |
| 526 | newname.name = new byte[plength + dlength]; |
| 527 | System.arraycopy(name, pstart, newname.name, 0, plength); |
| 528 | System.arraycopy(dnametarget.name, 0, newname.name, plength, dlength); |
| 529 | |
| 530 | for (int i = 0, pos = 0; i < MAXOFFSETS && i < plabels + dlabels; i++) { |
| 531 | newname.setoffset(i, pos); |
| 532 | pos += (newname.name[pos] + 1); |
| 533 | } |
| 534 | return newname; |
| 535 | } |
| 536 | |
| 537 | /** |
| 538 | * Is this name a wildcard? |