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 public class NtpMessageEncoder
36 {
37
38
39
40
41
42
43 public void encode( ByteBuffer byteBuffer, NtpMessage message )
44 {
45 byte header = 0x00;
46 header = encodeLeapIndicator( message.getLeapIndicator(), header );
47 header = encodeVersionNumber( message.getVersionNumber(), header );
48 header = encodeMode( message.getMode(), header );
49 byteBuffer.put( header );
50
51 byteBuffer.put( ( byte ) ( message.getStratum().getOrdinal() & 0xFF ) );
52 byteBuffer.put( ( byte ) ( message.getPollInterval() & 0xFF ) );
53 byteBuffer.put( ( byte ) ( message.getPrecision() & 0xFF ) );
54
55 byteBuffer.putInt( message.getRootDelay() );
56 byteBuffer.putInt( message.getRootDispersion() );
57
58 encodeReferenceIdentifier( message.getReferenceIdentifier(), byteBuffer );
59
60 message.getReferenceTimestamp().writeTo( byteBuffer );
61 message.getOriginateTimestamp().writeTo( byteBuffer );
62 message.getReceiveTimestamp().writeTo( byteBuffer );
63 message.getTransmitTimestamp().writeTo( byteBuffer );
64 }
65
66
67 private byte encodeLeapIndicator( LeapIndicatorType leapIndicator, byte header )
68 {
69 byte twoBits = ( byte ) ( leapIndicator.getOrdinal() & 0x03 );
70 return ( byte ) ( ( twoBits << 6 ) | header );
71 }
72
73
74 private byte encodeVersionNumber( int versionNumber, byte header )
75 {
76 byte threeBits = ( byte ) ( versionNumber & 0x07 );
77 return ( byte ) ( ( threeBits << 3 ) | header );
78 }
79
80
81 private byte encodeMode( ModeType mode, byte header )
82 {
83 byte threeBits = ( byte ) ( mode.getOrdinal() & 0x07 );
84 return ( byte ) ( threeBits | header );
85 }
86
87
88 private void encodeReferenceIdentifier( ReferenceIdentifier identifier, ByteBuffer byteBuffer )
89 {
90 char[] characters = identifier.getCode().toCharArray();
91
92 for ( int ii = 0; ii < characters.length; ii++ )
93 {
94 byteBuffer.put( ( byte ) characters[ii] );
95 }
96 }
97 }