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