Merge "Copyright"
[packetcable.git] / packetcable-driver / src / main / java / org / umu / cops / stack / COPSUtil.java
1 /*
2  * Copyright (c) 2003 University of Murcia.  All rights reserved.
3  * --------------------------------------------------------------
4  * For more information, please see <http://www.umu.euro6ix.org/>.
5  */
6
7 package org.umu.cops.stack;
8
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11
12 import java.io.ByteArrayOutputStream;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.net.Socket;
16 import java.util.Arrays;
17 import java.util.Date;
18
19 /**
20  * Class to hold static utilitarian methods for streaming bytes over a Socket.
21  *
22  * @version COPSUtil.java, v 2.00 2004
23  *
24  */
25 public class COPSUtil {
26
27     private final static Logger logger = LoggerFactory.getLogger(COPSUtil.class);
28
29     /**
30      * Streams COPS data
31      * @param    socket                  a  Socket
32      * @param    data                a  byte[]
33      * @param    len                 an int
34      * @throws   IOException
35      */
36     public static void writeData(final Socket socket, final byte[] data, final int len) throws IOException {
37         logger.trace("Writing COPS data");
38         socket.getOutputStream().write(data, 0, len);
39     }
40
41     /**
42      * Returns true if the data contained within data1 + padding1 is equivalent to data2 + padding2
43      * @param data1 - the data from the first
44      * @param padding1 - the padding from the first
45      * @param data2 - the data from the second
46      * @param padding2 - the padding from the second
47      * @return - t/f
48      */
49     public static boolean copsDataPaddingEquals(final COPSData data1, final COPSData padding1,
50                                                 final COPSData data2, final COPSData padding2) {
51         final byte[] data1Bytes = data1.getData();
52         final byte[] padding1Bytes = padding1.getData();
53
54         final byte[] data2Bytes = data2.getData();
55         final byte[] padding2Bytes = padding2.getData();
56
57         if (data1Bytes.length + padding1Bytes.length != data2Bytes.length + padding2Bytes.length)
58             return false;
59
60         final ByteArrayOutputStream thisStream = new ByteArrayOutputStream();
61         final ByteArrayOutputStream thatStream = new ByteArrayOutputStream();
62         try {
63             thisStream.write(data1Bytes);
64             thisStream.write(padding1Bytes);
65             thatStream.write(data2Bytes);
66             thatStream.write(padding2Bytes);
67             return Arrays.equals(thisStream.toByteArray(), thatStream.toByteArray());
68         } catch (IOException e) {
69             return false;
70         }
71     }
72
73     /**
74      * Reads nchar from a given sockets, blocks on read untill nchar are read of conenction has error
75      * bRead returns the bytes read
76      *
77      * @param    connId              a  Socket
78      * @param    dataRead            a  byte[]
79      * @param    nchar               an int
80      *
81      * @return   an int
82      *
83      * @throws   IOException
84      *
85      */
86     @Deprecated
87     static int readData(Socket connId, byte[] dataRead, int nchar)  throws IOException {
88         InputStream input;
89         input = connId.getInputStream();
90
91         int nread = 0;
92         int startTime = (int) (new Date().getTime());
93         do {
94             if (input.available() != 0) {
95                 nread += input.read(dataRead,nread,nchar-nread);
96                 startTime = (int) (new Date().getTime());
97             } else {
98                 int nowTime = (int) (new Date().getTime());
99                 if ((nowTime - startTime) > 2000)
100                     break;
101             }
102         } while (nread != nchar);
103
104         return nread;
105     }
106 }