4 package org.pcmm.base.impl;
6 import java.io.IOException;
7 import java.net.Socket;
8 import java.util.Arrays;
10 import org.pcmm.base.IPCMMBaseObject;
11 import org.umu.cops.stack.COPSData;
15 * Implementation of the base class {@link IPCMMBaseObject}
18 public class PCMMBaseObject /* extends COPSPrObjBase */implements
24 private COPSData copsData;
26 protected final short offset = (short) 4;
28 public PCMMBaseObject(byte[] data) {
32 public PCMMBaseObject(short len, byte sType, byte sNum) {
36 byte[] array = new byte[len - offset];
37 Arrays.fill(array, (byte) 0);
38 setData(new COPSData(array, 0, array.length));
41 protected COPSData getPadding(int len) {
42 byte[] padBuf = new byte[len];
43 Arrays.fill(padBuf, (byte) 0);
44 COPSData d = new COPSData(padBuf, 0, len);
49 * Add head padding to the specified byte array filled with zeros
57 protected byte[] headPadding(int off, byte[] array) {
58 byte[] returnArray = new byte[array.length + off];
59 Arrays.fill(returnArray, (byte) 0);
60 System.arraycopy(array, 0, returnArray, off, array.length);
64 protected void parse(byte[] data) {
65 if (data == null || data.length == 0)
66 throw new IllegalArgumentException("data could not be null");
68 len |= ((short) data[0]) << 8;
69 len |= ((short) data[1]) & 0xFF;
72 copsData = new COPSData(data, offset, data.length - offset);
75 protected void setShort(short value, short startPos) {
76 byte[] data = getData().getData();
77 data[startPos] = (byte) (value >> 8);
78 data[startPos + 1] = (byte) value;
79 setData(new COPSData(data, 0, data.length));
82 protected short getShort(short startPos) {
83 byte[] data = getData().getData();
85 retVal |= ((short) data[startPos]) << 8;
86 retVal |= ((short) data[startPos + 1]) & 0xFF;
90 protected void setInt(int value, short startPos) {
91 byte[] data = getData().getData();
92 data[startPos] = (byte) (value >> 24);
93 data[startPos + 1] = (byte) (value >> 16);
94 data[startPos + 2] = (byte) (value >> 8);
95 data[startPos + 3] = (byte) value;
96 setData(new COPSData(data, 0, data.length));
99 protected int getInt(short startPos) {
100 byte[] data = getData().getData();
102 retVal |= ((short) data[startPos]) << 24;
103 retVal |= ((short) data[startPos + 1]) << 16;
104 retVal |= ((short) data[startPos + 2]) << 8;
105 retVal |= ((short) data[startPos + 3]) & 0xFF;
109 protected void setBytes(byte[] value, short startPos) {
110 byte[] data = getData().getData();
112 data[startPos++] = b;
113 setData(new COPSData(data, 0, data.length));
116 protected byte[] getBytes(short startPos, short size) {
117 return Arrays.copyOfRange(getData().getData(), startPos, startPos
121 protected void setByte(byte value, short startPos) {
122 setBytes(new byte[] { value }, startPos);
125 protected byte getByte(short startPos) {
126 return getBytes(startPos, (short) 1)[0];
132 * @see org.pcmm.base.IPCMMBaseObject#setSType(byte)
135 public void setSType(byte stype) {
143 * @see org.pcmm.base.IPCMMBaseObject#getSType()
146 public byte getSType() {
153 * @see org.pcmm.base.IPCMMBaseObject#setSNum(byte)
156 public void setSNum(byte snum) {
163 * @see org.pcmm.base.IPCMMBaseObject#getSNum()
166 public byte getSNum() {
173 * @see org.pcmm.base.IPCMMBaseObject#setLength(short)
176 public void setLength(short len) {
183 * @see org.pcmm.base.IPCMMBaseObject#getLength()
186 public short getLength() {
187 return (short) (len + (pad != null ? pad.length() : 0));
193 * @see org.pcmm.base.IPCMMBaseObject#setData(org.umu.cops.stack.COPSData)
196 public void setData(COPSData data) {
197 this.copsData = data;
198 if (data.length() % offset != 0) {
199 int padLen = offset - (data.length() % offset);
200 pad = getPadding(padLen);
202 len = (short) (data.length() + offset);
208 * @see org.pcmm.base.IPCMMBaseObject#getData()
211 public COPSData getData() {
218 * @see org.pcmm.base.IPCMMBaseObject#writeData(java.net.Socket)
220 public void writeData(Socket id) throws IOException {
221 byte[] data = getAsBinaryArray();
222 id.getOutputStream().write(data, 0, data.length);
228 * @see org.pcmm.base.IPCMMBaseObject#getAsBinaryArray()
231 public byte[] getAsBinaryArray() {
232 byte[] array = new byte[getLength()];
233 array[0] = (byte) (len >> 8);
234 array[1] = (byte) len;
237 System.arraycopy(getData().getData(), 0, array, offset, getData()
240 System.arraycopy(pad.getData(), 0, array, offset
241 + getData().length(), pad.length());