You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by er...@apache.org on 2005/01/13 03:32:05 UTC
svn commit: r125019 - /incubator/directory/dns/trunk/core/src/java/org/apache/dns/io/DnsMessageEncoder.java
Author: erodriguez
Date: Wed Jan 12 18:32:04 2005
New Revision: 125019
URL: http://svn.apache.org/viewcvs?view=rev&rev=125019
Log:
DNS message encoder.
Added:
incubator/directory/dns/trunk/core/src/java/org/apache/dns/io/DnsMessageEncoder.java
Added: incubator/directory/dns/trunk/core/src/java/org/apache/dns/io/DnsMessageEncoder.java
Url: http://svn.apache.org/viewcvs/incubator/directory/dns/trunk/core/src/java/org/apache/dns/io/DnsMessageEncoder.java?view=auto&rev=125019
==============================================================================
--- (empty file)
+++ incubator/directory/dns/trunk/core/src/java/org/apache/dns/io/DnsMessageEncoder.java Wed Jan 12 18:32:04 2005
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.dns.io;
+
+import java.nio.ByteBuffer;
+
+import org.apache.dns.messages.DnsMessage;
+import org.apache.dns.messages.MessageType;
+import org.apache.dns.messages.OpCode;
+import org.apache.dns.messages.ResponseCode;
+import org.apache.dns.records.QuestionRecord;
+import org.apache.dns.records.ResourceRecord;
+
+public class DnsMessageEncoder
+{
+ public void encode( ByteBuffer byteBuffer, DnsMessage message )
+ {
+ byteBuffer.putShort( message.getTransactionId() );
+
+ byte header = (byte)0x00;
+ header = encodeMessageType( message.getMessageType(), header );
+ header = encodeOpCode( message.getOpCode(), header );
+ header = encodeAuthoritativeAnswer( message.isAuthoritativeAnswer(), header );
+ header = encodeTruncated( message.isTruncated(), header );
+ header = encodeRecursionDesired( message.isRecursionDesired(), header );
+ byteBuffer.put( header );
+
+ header = (byte)0x00;
+ header = encodeRecursionAvailable( message.isRecursionAvailable(), header );
+ header = encodeResponseCode( message.getResponseCode(), header );
+ byteBuffer.put( header );
+
+ byteBuffer.putShort( (short)message.getQuestionRecords().length );
+ byteBuffer.putShort( (short)message.getAnswerRecords().length );
+ byteBuffer.putShort( (short)message.getAuthorityRecords().length );
+ byteBuffer.putShort( (short)message.getAdditionalRecords().length );
+
+ encodeQuestions( message.getQuestionRecords(), byteBuffer );
+ encodeRecords( message.getAnswerRecords(), byteBuffer );
+ encodeRecords( message.getAuthorityRecords(), byteBuffer );
+ encodeRecords( message.getAdditionalRecords(), byteBuffer );
+ }
+
+ private void encodeRecords( ResourceRecord[] records, ByteBuffer byteBuffer )
+ {
+ for ( int ii = 0; ii < records.length; ii++ )
+ {
+ encodeDomainName( records[ ii ].getDomainName(), byteBuffer );
+
+ byteBuffer.putShort( (short)records[ ii ].getRecordType().getOrdinal() );
+ byteBuffer.putShort( (short)records[ ii ].getRecordClass().getOrdinal() );
+
+ byteBuffer.putInt( records[ ii ].getTimeToLive() );
+ byteBuffer.putShort( (short)records[ ii ].getResourceDataLength() );
+
+ records[ ii ].writeTo( byteBuffer );
+ }
+ }
+
+ private void encodeQuestions( QuestionRecord[] records, ByteBuffer byteBuffer )
+ {
+ for ( int ii = 0; ii < records.length; ii++ )
+ {
+ encodeDomainName( records[ ii ].getDomainName(), byteBuffer );
+
+ byteBuffer.putShort( (short)records[ ii ].getRecordType().getOrdinal() );
+ byteBuffer.putShort( (short)records[ ii ].getRecordClass().getOrdinal() );
+ }
+ }
+
+ private void encodeDomainName( String domainName, ByteBuffer byteBuffer )
+ {
+ String[] labels = domainName.split("\\.");
+
+ for ( int ii = 0; ii < labels.length; ii++ )
+ {
+ byteBuffer.put( (byte)labels[ ii ].length() );
+
+ char[] characters = labels[ ii ].toCharArray();
+ for ( int jj = 0; jj < characters.length; jj++ )
+ {
+ byteBuffer.put( (byte)characters[ jj ] );
+ }
+ }
+
+ byteBuffer.put( (byte)0x00 );
+ }
+
+ private byte encodeMessageType( MessageType messageType, byte header )
+ {
+ byte oneBit = (byte)( messageType.getOrdinal() & 0x01 );
+ return (byte)( ( oneBit << 7 ) | header );
+ }
+
+ private byte encodeOpCode( OpCode opCode, byte header )
+ {
+ byte fourBits = (byte)( opCode.getOrdinal() & 0x0F );
+ return (byte)( ( fourBits << 3 ) | header );
+ }
+
+ private byte encodeAuthoritativeAnswer( boolean authoritative, byte header )
+ {
+ if ( authoritative )
+ {
+ header = (byte)( ( (byte)0x01 << 2 ) | header );
+ }
+ return header;
+ }
+
+ private byte encodeTruncated( boolean truncated, byte header )
+ {
+ if ( truncated )
+ {
+ header = (byte)( ( (byte)0x01 << 1 ) | header );
+ }
+ return header;
+ }
+
+ private byte encodeRecursionDesired( boolean recursionDesired, byte header )
+ {
+ if ( recursionDesired )
+ {
+ header = (byte)( ( (byte)0x01 ) | header );
+ }
+ return header;
+ }
+
+ private byte encodeRecursionAvailable( boolean recursionAvailable, byte header )
+ {
+ if ( recursionAvailable )
+ {
+ header = (byte)( ( (byte)0x01 << 7 ) | header );
+ }
+ return header;
+ }
+
+ private byte encodeResponseCode( ResponseCode responseCode, byte header )
+ {
+ byte fourBits = (byte)( responseCode.getOrdinal() & 0x0F );
+ return (byte)( fourBits | header );
+ }
+}
+