1 package com.smartdevicelink.smartDeviceLinkConnection;
\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
12 public class smartDeviceLinkConnection implements IProtocolListener, ITransportListener {
\r
14 SmartDeviceLinkTransport _transport = null;
\r
15 AbstractProtocol _protocol = null;
\r
16 IsmartDeviceLinkConnectionListener _connectionListener = null;
\r
18 // Thread safety locks
\r
19 Object TRANSPORT_REFERENCE_LOCK = new Object();
\r
20 Object PROTOCOL_REFERENCE_LOCK = new Object();
\r
25 * @param listener SmartDeviceLink connection listener.
\r
26 * @param transportConfig Transport configuration for this connection.
\r
28 public smartDeviceLinkConnection(IsmartDeviceLinkConnectionListener listener, BaseTransportConfig transportConfig) {
\r
29 _connectionListener = listener;
\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
41 if (transportConfig.getTransportType() == TransportType.BLUETOOTH)
\r
43 _transport = new BTTransport(this);
\r
45 else if (transportConfig.getTransportType() == TransportType.TCP)
\r
47 _transport = new TCPTransport((TCPTransportConfig) transportConfig, this);
\r
51 // Initialize the protocol
\r
52 synchronized(PROTOCOL_REFERENCE_LOCK) {
\r
53 // Ensure protocol is null
\r
54 if (_protocol != null) {
\r
58 _protocol = new SmartDeviceLinkProtocol(this);
\r
62 public AbstractProtocol getSmartDeviceLinkProtocolProtocol(){
\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
77 synchronized (TRANSPORT_REFERENCE_LOCK) {
\r
78 if (_transport != null) {
\r
79 _transport.disconnect();
\r
85 public void startTransport() throws SmartDeviceLinkException {
\r
86 _transport.openConnection();
\r
89 public Boolean getIsConnected() {
\r
91 // If _transport is null, then it can't be connected
\r
92 if (_transport == null) {
\r
96 return _transport.getIsConnected();
\r
99 public void sendMessage(ProtocolMessage msg) {
\r
100 _protocol.SendMessage(msg);
\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
115 public void onTransportConnected() {
\r
116 synchronized(PROTOCOL_REFERENCE_LOCK){
\r
117 if(_protocol != null){
\r
118 _protocol.StartProtocolSession(SessionType.RPC);
\r
124 public void onTransportDisconnected(String info) {
\r
125 // Pass directly to connection listener
\r
126 _connectionListener.onTransportDisconnected(info);
\r
130 public void onTransportError(String info, Exception e) {
\r
131 // Pass directly to connection listener
\r
132 _connectionListener.onTransportError(info, e);
\r
136 public void onProtocolMessageBytesToSend(byte[] msgBytes, int offset,
\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
147 public void onProtocolMessageReceived(ProtocolMessage msg) {
\r
148 _connectionListener.onProtocolMessageReceived(msg);
\r
152 public void onProtocolSessionStarted(SessionType sessionType,
\r
153 byte sessionID, byte version, String correlationID) {
\r
154 _connectionListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);
\r
158 public void onProtocolSessionEnded(SessionType sessionType, byte sessionID,
\r
159 String correlationID) {
\r
160 _connectionListener.onProtocolSessionEnded(sessionType, sessionID, correlationID);
\r
164 public void onProtocolError(String info, Exception e) {
\r
165 _connectionListener.onProtocolError(info, e);
\r
169 * Gets type of transport currently used by this connection.
\r
171 * @return One of TransportType enumeration values.
\r
173 * @see TransportType
\r
175 public TransportType getCurrentTransportType() {
\r
176 return _transport.getTransportType();
\r