1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.directory.server.ntp.io;
22
23
24 import java.nio.ByteBuffer;
25
26 import org.apache.directory.server.ntp.messages.LeapIndicatorType;
27 import org.apache.directory.server.ntp.messages.ModeType;
28 import org.apache.directory.server.ntp.messages.NtpMessage;
29 import org.apache.directory.server.ntp.messages.ReferenceIdentifier;
30
31
32
33
34
35
36 public class NtpMessageEncoder
37 {
38
39
40
41
42
43
44 public void encode( ByteBuffer byteBuffer, NtpMessage message )
45 {
46 byte header = 0x00;
47 header = encodeLeapIndicator( message.getLeapIndicator(), header );
48 header = encodeVersionNumber( message.getVersionNumber(), header );
49 header = encodeMode( message.getMode(), header );
50 byteBuffer.put( header );
51
52 byteBuffer.put( ( byte ) ( message.getStratum().getOrdinal() & 0xFF ) );
53 byteBuffer.put( ( byte ) ( message.getPollInterval() & 0xFF ) );
54 byteBuffer.put( ( byte ) ( message.getPrecision() & 0xFF ) );
55
56 byteBuffer.putInt( message.getRootDelay() );
57 byteBuffer.putInt( message.getRootDispersion() );
58
59 encodeReferenceIdentifier( message.getReferenceIdentifier(), byteBuffer );
60
61 message.getReferenceTimestamp().writeTo( byteBuffer );
62 message.getOriginateTimestamp().writeTo( byteBuffer );
63 message.getReceiveTimestamp().writeTo( byteBuffer );
64 message.getTransmitTimestamp().writeTo( byteBuffer );
65 }
66
67
68 private byte encodeLeapIndicator( LeapIndicatorType leapIndicator, byte header )
69 {
70 byte twoBits = ( byte ) ( leapIndicator.getOrdinal() & 0x03 );
71 return ( byte ) ( ( twoBits << 6 ) | header );
72 }
73
74
75 private byte encodeVersionNumber( int versionNumber, byte header )
76 {
77 byte threeBits = ( byte ) ( versionNumber & 0x07 );
78 return ( byte ) ( ( threeBits << 3 ) | header );
79 }
80
81
82 private byte encodeMode( ModeType mode, byte header )
83 {
84 byte threeBits = ( byte ) ( mode.getOrdinal() & 0x07 );
85 return ( byte ) ( threeBits | header );
86 }
87
88
89 private void encodeReferenceIdentifier( ReferenceIdentifier identifier, ByteBuffer byteBuffer )
90 {
91 char[] characters = identifier.getCode().toCharArray();
92
93 for ( int ii = 0; ii < characters.length; ii++ )
94 {
95 byteBuffer.put( ( byte ) characters[ii] );
96 }
97 }
98 }