Merge "Remove "response" from yang."
[packetcable.git] / protocol_plugins.packetcable / src / main / java / org / umu / cops / stack / COPSDecision.java
1 /*\r
2  * Copyright (c) 2003 University of Murcia.  All rights reserved.\r
3  * --------------------------------------------------------------\r
4  * For more information, please see <http://www.umu.euro6ix.org/>.\r
5  */\r
6 \r
7 package org.umu.cops.stack;\r
8 \r
9 import java.io.IOException;\r
10 import java.io.OutputStream;\r
11 import java.net.Socket;\r
12 \r
13 /**\r
14  * COPS Decision\r
15  *\r
16  * @version COPSDecision.java, v 1.00 2003\r
17  *\r
18  */\r
19 public class COPSDecision extends COPSObjBase {\r
20 \r
21     // CType\r
22     public final static byte DEC_DEF = 1;\r
23     public final static byte DEC_STATELESS = 2;\r
24     public final static byte DEC_REPL = 3;\r
25     public final static byte DEC_CSI = 4;\r
26     public final static byte DEC_NAMED = 5;\r
27 \r
28     // Command\r
29     public final static byte DEC_NULL = 0;\r
30     public final static byte DEC_INSTALL = 1;\r
31     public final static byte DEC_REMOVE = 2;\r
32 \r
33     // Flags\r
34     public final static byte F_REQERROR = 0x1;\r
35     public final static byte F_REQSTATE = 0x2;\r
36 \r
37     protected COPSObjHeader _objHdr;\r
38     private COPSData _data;\r
39     private short _cmdCode;\r
40     private short _flags;\r
41     private COPSData _padding;\r
42 \r
43     /**\r
44       Constructor to create a Decision object. By default creates\r
45       a decision object which is of fixed length.\r
46      */\r
47     public COPSDecision(byte cType) {\r
48         _objHdr = new COPSObjHeader();\r
49         _cmdCode = 0;\r
50         _flags = 0;\r
51         _objHdr.setCNum(COPSObjHeader.COPS_DEC);\r
52         _objHdr.setCType(cType);\r
53         if (cType == DEC_DEF) _objHdr.setDataLength( (short) 4);\r
54     }\r
55 \r
56     public COPSDecision() {\r
57         _objHdr = new COPSObjHeader();\r
58         _cmdCode = 0;\r
59         _flags = 0;\r
60         _objHdr.setCNum(COPSObjHeader.COPS_DEC);\r
61         _objHdr.setCType(DEC_DEF);\r
62         _objHdr.setDataLength( (short) 4);\r
63     }\r
64 \r
65     /**\r
66           Initialize the decision object with values from COPSObj header\r
67      */\r
68     protected COPSDecision(byte[] dataPtr) {\r
69         _objHdr = new COPSObjHeader();\r
70         _objHdr.parse(dataPtr);\r
71         // _objHdr.checkDataLength();\r
72 \r
73         _cmdCode = 0;\r
74         _flags = 0;\r
75         if (_objHdr.getCType() == DEC_DEF) {\r
76             _cmdCode |= ((short) dataPtr[4]) << 8;\r
77             _cmdCode |= ((short) dataPtr[5]) & 0xFF;\r
78             _flags |= ((short) dataPtr[6]) << 8;\r
79             _flags |= ((short) dataPtr[7]) & 0xFF;\r
80 \r
81             _objHdr.setDataLength((short) 4);\r
82         } else {\r
83             int dLen = _objHdr.getDataLength() - 4;\r
84             COPSData d = new COPSData(dataPtr, 4, dLen);\r
85             setData(d);\r
86         }\r
87     }\r
88 \r
89     /**\r
90      * Method getDataLength\r
91      *\r
92      * @return   a short\r
93      *\r
94      */\r
95     public short getDataLength() {\r
96         int lpadding = 0;\r
97         if (_padding != null) lpadding = _padding.length();\r
98         return ((short) (_objHdr.getDataLength() + lpadding));\r
99     }\r
100 \r
101 \r
102 \r
103     /**\r
104      * Get the associated data if decision object is of cType 2 or higher\r
105      *\r
106      * @return   a COPSData\r
107      *\r
108      */\r
109     public COPSData getData() {\r
110         return (_data);\r
111     }\r
112 \r
113     /**\r
114      * Set the decision data if decision object is of cType 2 or higher\r
115      *\r
116      * @param    data                a  COPSData\r
117      *\r
118      */\r
119     public void setData(COPSData data) {\r
120         if (data.length() % 4 != 0) {\r
121             int padLen = 4 - data.length() % 4;\r
122             _padding = getPadding(padLen);\r
123         }\r
124         _data = data;\r
125         _objHdr.setDataLength((short) data.length());\r
126     }\r
127 \r
128     /**\r
129      * Retruns true if cType = 1\r
130      *\r
131      * @return   a boolean\r
132      *\r
133      */\r
134     public boolean isFlagSet() {\r
135         return ( _objHdr.getCType() == 1);\r
136     };\r
137 \r
138     /**\r
139      * If cType == 1 , get the flags associated\r
140      *\r
141      * @return   a short\r
142      *\r
143      */\r
144     public short getFlags() {\r
145         return (_flags);\r
146     };\r
147 \r
148     /**\r
149      * If cType == 1 ,set the cmd code\r
150      *\r
151      * @param    cCode               a  byte\r
152      *\r
153      */\r
154     public void setCmdCode(byte cCode) {\r
155         _cmdCode = (short) cCode;\r
156     }\r
157 \r
158     /**\r
159      * If cType == 1 ,set the cmd flags\r
160      *\r
161      * @param    flags               a  short\r
162      *\r
163      */\r
164     public void setFlags(short flags) {\r
165         _flags = flags;\r
166     }\r
167 \r
168     /**\r
169      * Method isNullDecision\r
170      *\r
171      * @return   a boolean\r
172      *\r
173      */\r
174     public boolean isNullDecision() {\r
175         return ( _cmdCode == 0);\r
176     };\r
177 \r
178     /**\r
179      * Method isInstallDecision\r
180      *\r
181      * @return   a boolean\r
182      *\r
183      */\r
184     public boolean isInstallDecision() {\r
185         return ( _cmdCode == 1);\r
186     };\r
187 \r
188     /**\r
189      * Method isRemoveDecision\r
190      *\r
191      * @return   a boolean\r
192      *\r
193      */\r
194     public boolean isRemoveDecision() {\r
195         return ( _cmdCode == 2);\r
196     };\r
197 \r
198     /**\r
199      * Method getTypeStr\r
200      *\r
201      * @return   a String\r
202      *\r
203      */\r
204     public String getTypeStr() {\r
205         switch (_objHdr.getCType()) {\r
206         case DEC_DEF:\r
207             return "Default";\r
208         case DEC_STATELESS:\r
209             return "Stateless data";\r
210         case DEC_REPL:\r
211             return "Replacement data";\r
212         case DEC_CSI:\r
213             return "Client specific decision data";\r
214         case DEC_NAMED:\r
215             return "Named decision data";\r
216         default:\r
217             return "Unknown";\r
218         }\r
219     }\r
220 \r
221     /**\r
222      * Method isDecision\r
223      *\r
224      * @return   a boolean\r
225      *\r
226      */\r
227     public boolean isDecision() {\r
228         return true;\r
229     };\r
230 \r
231     /**\r
232      * Method isLocalDecision\r
233      *\r
234      * @return   a boolean\r
235      *\r
236      */\r
237     public boolean isLocalDecision() {\r
238         return false;\r
239     };\r
240 \r
241     /**\r
242      * Writes data to a given network socket\r
243      *\r
244      * @param    id                  a  Socket\r
245      *\r
246      * @throws   IOException\r
247      *\r
248      */\r
249     public void writeData(Socket id) throws IOException {\r
250         _objHdr.writeData(id);\r
251 \r
252         if (_objHdr.getCType() >= 2) {\r
253             COPSUtil.writeData(id, _data.getData(), _data.length());\r
254             if (_padding != null) {\r
255                 COPSUtil.writeData(id, _padding.getData(), _padding.length());\r
256             }\r
257         } else {\r
258             byte[] buf = new byte[4];\r
259             buf[0] = (byte) (_cmdCode >> 8);\r
260             buf[1] = (byte) _cmdCode;\r
261             buf[2] = (byte) (_flags >> 8);\r
262             buf[3] = (byte) _flags;\r
263             COPSUtil.writeData(id, buf, 4);\r
264         }\r
265     }\r
266 \r
267     /**\r
268      * Write an object textual description in the output stream\r
269      *\r
270      * @param    os                  an OutputStream\r
271      *\r
272      * @throws   IOException\r
273      *\r
274      */\r
275     public void dump(OutputStream os) throws IOException {\r
276         _objHdr.dump(os);\r
277 \r
278         if (_objHdr.getCType() == 1) {\r
279             os.write(new String("Decision (" + getTypeStr() + ")\n").getBytes());\r
280             os.write(new String("Command code: " + _cmdCode + "\n").getBytes());\r
281             os.write(new String("Command flags: " + _flags + "\n").getBytes());\r
282         } else {\r
283             os.write(new String("Decision (" + getTypeStr() + ")\n").getBytes());\r
284             os.write(new String("Data: " + _data.str() + "\n").getBytes());\r
285         }\r
286     }\r
287 }\r
288 \r
289 \r
290 \r
291 \r
292 \r
293 \r
294 \r
295 \r
296 \r
297 \r