UNPKG

5.15 kBJavaScriptView Raw
1/*
2Copyright 2011 Timothy J Fontaine <tjfontaine@gmail.com>
3
4Permission is hereby granted, free of charge, to any person obtaining a copy
5of this software and associated documentation files (the "Software"), to deal
6in the Software without restriction, including without limitation the rights
7to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8copies of the Software, and to permit persons to whom the Software is
9furnished to do so, subject to the following conditions:
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
21*/
22
23"use strict";
24
25var ipaddr = require('ipaddr.js'),
26 name = require('./name');
27
28var Struct = exports.Struct = function (field_name, format) {
29 var size, write, read;
30
31 switch (format) {
32 case 'B':
33 write = 'writeUInt8';
34 read = 'readUInt8';
35 size = 1;
36 break;
37 case 'H':
38 write = 'writeUInt16BE';
39 read = 'readUInt16BE';
40 size = 2;
41 break;
42 case 'I':
43 write = 'writeUInt32BE';
44 read = 'readUInt32BE';
45 size = 4;
46 break;
47 case 'i':
48 write = 'writeInt32BE';
49 read = 'readInt32BE';
50 size = 4;
51 break;
52 };
53
54 var field = {
55 name: field_name,
56 default: 0,
57 pack: function (value, buf, pos) {
58 buf[write](value, pos);
59 return size;
60 },
61 unpack: function (buff, pos) {
62 var value = buff[read](pos);
63 return {
64 read: size,
65 value: value,
66 };
67 },
68 size: size,
69 };
70
71 return field;
72};
73
74var SubField = exports.SubField = function (field_name, parent, shift, mask) {
75 var field = {
76 name: field_name,
77 default: 0,
78 get: function (self) {
79 var v = self[parent];
80 return (v & mask) >> shift;
81 },
82 set: function (self, value) {
83 var cval = self[parent] - (self[parent] & mask);
84 cval += (value << shift) & mask;
85 self[parent] = cval;
86 },
87 };
88 return field;
89};
90
91var Label = exports.Label = function (field_name) {
92 var field = {
93 name: field_name,
94 default: '',
95 pack: function (value, buf, pos) {
96 return name.pack(value, buf, pos, this.parent.label_index_);
97 },
98 unpack: name.unpack,
99 size: function (value) {
100 return value.length;
101 },
102 };
103
104 return field;
105};
106
107var IPAddress = exports.IPAddress = function (field_name, byte_length) {
108 var size;
109
110 switch (byte_length) {
111 case 4:
112 size = 4;
113 break;
114 case 6:
115 size = 16;
116 break;
117 };
118
119 var field = {
120 name: field_name,
121 size: size,
122 pack: function (value, buf, pos) {
123 var i, bytes, ret;
124 bytes = ipaddr.parse(value).toByteArray();
125
126 bytes.forEach(function (b, i) {
127 buf.writeUInt8(b, i + pos);
128 });
129
130 return bytes.length;
131 },
132 unpack: function (buff, pos) {
133 var i, Kind, read = 0, bytes = [];
134
135 switch (byte_length) {
136 case 4:
137 Kind = ipaddr.IPv4;
138 for (i = 0; i < byte_length; i++) {
139 bytes.push(buff.readUInt8(pos));
140 read += 1;
141 pos += 1;
142 }
143 break;
144 case 6:
145 Kind = ipaddr.IPv6;
146 for (i = 0; i < 8; i++) {
147 bytes.push(buff.readUInt16BE(pos));
148 read += 2;
149 pos += 2;
150 }
151 break;
152 }
153
154 return {
155 read: read,
156 value: new Kind(bytes).toString(),
157 };
158 },
159 };
160
161 return field;
162};
163
164var BufferField = exports.BufferField = function (field_name, format) {
165 var field = {
166 name: field_name,
167 pack: function (value, buf, pos) {
168 var len = 2;
169 buf.writeUInt16BE(value.length, pos);
170 value.copy(buf, pos + len, 0, value.length);
171 return len + value.length;
172 },
173 unpack: function (buff, pos) {
174 var value_len, value, size, field_pos, start = pos;
175
176 value_len = buff.readUInt16BE(pos);
177 size = 2;
178
179 pos += size;
180 field_pos = pos;
181
182 value = buff.slice(pos, pos + value_len);
183 pos += value_len;
184
185 return {
186 read: pos - start,
187 value: value,
188 field_position: field_pos,
189 };
190 },
191 size: function (value) {
192 return value.length;
193 },
194 };
195
196 return field;
197};
198
199var CharString = exports.CharString = function (field_name) {
200 var field = {
201 name: field_name,
202 value: '',
203 get: function (self) {
204 return self.rdata.toString('ascii', 1, self.rdata.readUInt8(0) + 1);
205 },
206 set: function (self, value) {
207 var v = new Buffer(value.length + 1);
208 v.writeUInt8(value.length, 0);
209 v.write(value, 1);
210 self.rdata = v;
211 },
212 size: function (value) {
213 return value.length;
214 },
215 };
216
217 return field;
218};