View Javadoc
1   //////////////////////////////////////////////////////////////////////////////
2   // dexterIM - Instant Messaging Framework
3   // Copyright (C) 2003  Christoph Walcher
4   //
5   // This program is free software; you can redistribute it and/or modify
6   // it under the terms of the GNU General Public License as published by
7   // the Free Software Foundation; either version 2 of the License, or
8   // (at your option) any later version.
9   //
10  // This program is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  // GNU General Public License for more details.
14  //
15  // You should have received a copy of the GNU General Public License
16  // along with this program; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  //////////////////////////////////////////////////////////////////////////////
19  package net.sf.dexterim.oscar.entity;
20  
21  import java.io.ByteArrayInputStream;
22  import java.io.IOException;
23  
24  /***
25   * @author christoph
26   *
27   */
28  public class TLVLexer {
29    private static TLVLexer instance;
30    
31    private TLVLexer() {
32      
33    }
34    
35    public TLVCollection lexData(byte[] data, int offset) {
36      TLVCollection returnValue = new TLVCollection();
37      
38      ByteArrayInputStream in = new ByteArrayInputStream(data);
39  
40      in.skip(offset);
41      
42      try {
43        while (in.available() > 0) {
44          // Read type word
45          byte type[] = new byte[2];
46          in.read(type);
47          
48          // Read length word
49          byte lengthBytes[] = new byte[2];
50          in.read(lengthBytes);
51          
52          int length = new Word(lengthBytes).getValue();
53          
54          // Based on length word read data section
55          byte dataBytes[] = new byte[length];
56          
57          if (length > 0) {
58            in.read(dataBytes);
59          }
60          
61          // Add tlv
62          TLV tlv = new TLV(new Word(type));
63          
64          tlv.setData(new VariableByte(dataBytes));
65          returnValue.add(tlv);
66        }
67      } catch (IOException e) {
68        e.printStackTrace();
69      }
70      
71      return returnValue;
72    }
73    
74    public TLVCollection lexData(byte[] data) {
75    	return lexData(data, 0);
76    }
77    
78    public static synchronized TLVLexer getInstance() {
79      if (instance == null) {
80        instance = new TLVLexer();
81      }
82      
83      return instance;
84    }
85  }