Added Mike's tester application (not ideal but easy to update)
[profile/ivi/smartdevicelink.git] / SDL_Android / SmartDeviceLinkProxyAndroid / src / com / smartdevicelink / smartDeviceLinkConnection / smartDeviceLinkConnection.java
1 package com.smartdevicelink.smartDeviceLinkConnection;\r
2 \r
3 \r
4 import com.smartdevicelink.exception.SmartDeviceLinkException;\r
5 import com.smartdevicelink.protocol.AbstractProtocol;\r
6 import com.smartdevicelink.protocol.IProtocolListener;\r
7 import com.smartdevicelink.protocol.ProtocolMessage;\r
8 import com.smartdevicelink.protocol.SmartDeviceLinkProtocol;\r
9 import com.smartdevicelink.protocol.enums.SessionType;\r
10 import com.smartdevicelink.transport.*;\r
11 \r
12 public class smartDeviceLinkConnection implements IProtocolListener, ITransportListener {\r
13 \r
14         SmartDeviceLinkTransport _transport = null;\r
15         AbstractProtocol _protocol = null;\r
16         IsmartDeviceLinkConnectionListener _connectionListener = null;\r
17 \r
18         // Thread safety locks\r
19         Object TRANSPORT_REFERENCE_LOCK = new Object();\r
20         Object PROTOCOL_REFERENCE_LOCK = new Object();\r
21         \r
22         /**\r
23          * Constructor.\r
24          * \r
25          * @param listener SmartDeviceLink connection listener.\r
26          * @param transportConfig Transport configuration for this connection.\r
27          */\r
28         public smartDeviceLinkConnection(IsmartDeviceLinkConnectionListener listener, BaseTransportConfig transportConfig) {\r
29                 _connectionListener = listener;\r
30                 \r
31                 // Initialize the transport\r
32                 synchronized(TRANSPORT_REFERENCE_LOCK) {\r
33                         // Ensure transport is null\r
34                         if (_transport != null) {\r
35                                 if (_transport.getIsConnected()) {\r
36                                         _transport.disconnect();\r
37                                 }\r
38                                 _transport = null;\r
39                         }\r
40                         \r
41                         if (transportConfig.getTransportType() == TransportType.BLUETOOTH)\r
42                         {\r
43                                 _transport = new BTTransport(this);     \r
44                         }\r
45                         else if (transportConfig.getTransportType() == TransportType.TCP)\r
46                         {\r
47                 _transport = new TCPTransport((TCPTransportConfig) transportConfig, this);\r
48             }\r
49                 }\r
50                 \r
51                 // Initialize the protocol\r
52                 synchronized(PROTOCOL_REFERENCE_LOCK) {\r
53                         // Ensure protocol is null\r
54                         if (_protocol != null) {\r
55                                 _protocol = null;\r
56                         }\r
57                         \r
58                         _protocol = new SmartDeviceLinkProtocol(this);\r
59                 }\r
60         }\r
61         \r
62         public AbstractProtocol getSmartDeviceLinkProtocolProtocol(){\r
63                 return _protocol;\r
64         }\r
65         \r
66         public void closeConnection(byte rpcSessionID) {\r
67                 synchronized(PROTOCOL_REFERENCE_LOCK) {\r
68                         if (_protocol != null) {\r
69                                 // If transport is still connected, sent EndProtocolSessionMessage\r
70                                 if (_transport != null && _transport.getIsConnected()) {\r
71                                         _protocol.EndProtocolSession(SessionType.RPC, rpcSessionID);\r
72                                 }\r
73                                 _protocol = null;\r
74                         } // end-if\r
75                 }\r
76                 \r
77                 synchronized (TRANSPORT_REFERENCE_LOCK) {\r
78                         if (_transport != null) {\r
79                                 _transport.disconnect();\r
80                         }\r
81                         _transport = null;\r
82                 }\r
83         }\r
84         \r
85         public void startTransport() throws SmartDeviceLinkException {\r
86                 _transport.openConnection();\r
87         }\r
88         \r
89         public Boolean getIsConnected() {\r
90                 \r
91                 // If _transport is null, then it can't be connected\r
92                 if (_transport == null) {\r
93                         return false;\r
94                 }\r
95                 \r
96                 return _transport.getIsConnected();\r
97         }\r
98         \r
99         public void sendMessage(ProtocolMessage msg) {\r
100                 _protocol.SendMessage(msg);\r
101         }\r
102         \r
103         @Override\r
104         public void onTransportBytesReceived(byte[] receivedBytes,\r
105                         int receivedBytesLength) {\r
106                 // Send bytes to protocol to be interpreted \r
107                 synchronized(PROTOCOL_REFERENCE_LOCK) {\r
108                         if (_protocol != null) {\r
109                                 _protocol.HandleReceivedBytes(receivedBytes, receivedBytesLength);\r
110                         }\r
111                 }\r
112         }\r
113 \r
114         @Override\r
115         public void onTransportConnected() {\r
116                 synchronized(PROTOCOL_REFERENCE_LOCK){\r
117                         if(_protocol != null){\r
118                                 _protocol.StartProtocolSession(SessionType.RPC);                                \r
119                                 }\r
120                         }\r
121         }\r
122         \r
123         @Override\r
124         public void onTransportDisconnected(String info) {\r
125                 // Pass directly to connection listener\r
126                 _connectionListener.onTransportDisconnected(info);\r
127         }\r
128 \r
129         @Override\r
130         public void onTransportError(String info, Exception e) {\r
131                 // Pass directly to connection listener\r
132                 _connectionListener.onTransportError(info, e);\r
133         }\r
134 \r
135         @Override\r
136         public void onProtocolMessageBytesToSend(byte[] msgBytes, int offset,\r
137                         int length) {\r
138                 // Protocol has packaged bytes to send, pass to transport for transmission \r
139                 synchronized(TRANSPORT_REFERENCE_LOCK) {\r
140                         if (_transport != null) {\r
141                                 _transport.sendBytes(msgBytes, offset, length);\r
142                         }\r
143                 }\r
144         }\r
145 \r
146         @Override\r
147         public void onProtocolMessageReceived(ProtocolMessage msg) {\r
148                 _connectionListener.onProtocolMessageReceived(msg);\r
149         }\r
150 \r
151         @Override\r
152         public void onProtocolSessionStarted(SessionType sessionType,\r
153                         byte sessionID, byte version, String correlationID) {\r
154                 _connectionListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);\r
155         }\r
156 \r
157         @Override\r
158         public void onProtocolSessionEnded(SessionType sessionType, byte sessionID,\r
159                         String correlationID) {\r
160                 _connectionListener.onProtocolSessionEnded(sessionType, sessionID, correlationID);\r
161         }\r
162 \r
163         @Override\r
164         public void onProtocolError(String info, Exception e) {\r
165                 _connectionListener.onProtocolError(info, e);\r
166         }\r
167         \r
168         /**\r
169          * Gets type of transport currently used by this connection.\r
170          * \r
171          * @return One of TransportType enumeration values.\r
172          * \r
173          * @see TransportType\r
174          */\r
175         public TransportType getCurrentTransportType() {\r
176                 return _transport.getTransportType();\r
177         }\r
178 }\r