1 package org.eclipse.jetty.websocket;
2
3 import java.io.IOException;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import org.eclipse.jetty.io.Buffer;
8 import org.eclipse.jetty.util.QuotedStringTokenizer;
9 import org.eclipse.jetty.util.TypeUtil;
10 import org.eclipse.jetty.websocket.WebSocketParser.FrameHandler;
11
12 public class AbstractExtension implements Extension
13 {
14 private static final int[] __mask = { -1, 0x04, 0x02, 0x01};
15 private final String _name;
16 private final Map<String,String> _parameters=new HashMap<String, String>();
17 private FrameHandler _inbound;
18 private WebSocketGenerator _outbound;
19 private WebSocket.FrameConnection _connection;
20
21 public AbstractExtension(String name)
22 {
23 _name = name;
24 }
25
26 public WebSocket.FrameConnection getConnection()
27 {
28 return _connection;
29 }
30
31 public boolean init(Map<String, String> parameters)
32 {
33 _parameters.putAll(parameters);
34 return true;
35 }
36
37 public String getInitParameter(String name)
38 {
39 return _parameters.get(name);
40 }
41
42 public String getInitParameter(String name,String dft)
43 {
44 if (!_parameters.containsKey(name))
45 return dft;
46 return _parameters.get(name);
47 }
48
49 public int getInitParameter(String name, int dft)
50 {
51 String v=_parameters.get(name);
52 if (v==null)
53 return dft;
54 return Integer.valueOf(v);
55 }
56
57
58 public void bind(WebSocket.FrameConnection connection, FrameHandler incoming, WebSocketGenerator outgoing)
59 {
60 _connection=connection;
61 _inbound=incoming;
62 _outbound=outgoing;
63 }
64
65 public String getName()
66 {
67 return _name;
68 }
69
70 public String getParameterizedName()
71 {
72 StringBuilder name = new StringBuilder();
73 name.append(_name);
74 for (String param : _parameters.keySet())
75 name.append(';').append(param).append('=').append(QuotedStringTokenizer.quoteIfNeeded(_parameters.get(param),";="));
76 return name.toString();
77 }
78
79 public void onFrame(byte flags, byte opcode, Buffer buffer)
80 {
81
82 _inbound.onFrame(flags,opcode,buffer);
83 }
84
85 public void close(int code, String message)
86 {
87 _inbound.close(code,message);
88 }
89
90 public int flush() throws IOException
91 {
92 return _outbound.flush();
93 }
94
95 public boolean isBufferEmpty()
96 {
97 return _outbound.isBufferEmpty();
98 }
99
100 public void addFrame(byte flags, byte opcode, byte[] content, int offset, int length) throws IOException
101 {
102
103 _outbound.addFrame(flags,opcode,content,offset,length);
104 }
105
106 public byte setFlag(byte flags,int rsv)
107 {
108 if (rsv<1||rsv>3)
109 throw new IllegalArgumentException("rsv"+rsv);
110 byte b=(byte)(flags | __mask[rsv]);
111 return b;
112 }
113
114 public byte clearFlag(byte flags,int rsv)
115 {
116 if (rsv<1||rsv>3)
117 throw new IllegalArgumentException("rsv"+rsv);
118 return (byte)(flags & ~__mask[rsv]);
119 }
120
121 public boolean isFlag(byte flags,int rsv)
122 {
123 if (rsv<1||rsv>3)
124 throw new IllegalArgumentException("rsv"+rsv);
125 return (flags & __mask[rsv])!=0;
126 }
127
128 public String toString()
129 {
130 return getParameterizedName();
131 }
132 }