2 // Copyright (c) 2013 Ford Motor Company
4 package com.smartdevicelink.syncConnection;
6 import com.smartdevicelink.exception.SmartDeviceLinkException;
7 import com.smartdevicelink.protocol.AbstractProtocol;
8 import com.smartdevicelink.protocol.IProtocolListener;
9 import com.smartdevicelink.protocol.ProtocolMessage;
10 import com.smartdevicelink.protocol.SmartDeviceLinkProtocol;
11 import com.smartdevicelink.protocol.enums.SessionType;
12 import com.smartdevicelink.transport.BTTransport;
13 import com.smartdevicelink.transport.BaseTransportConfig;
14 import com.smartdevicelink.transport.ITransportListener;
15 import com.smartdevicelink.transport.SmartDeviceLinkTransport;
16 import com.smartdevicelink.transport.TCPTransport;
17 import com.smartdevicelink.transport.TCPTransportConfig;
18 import com.smartdevicelink.transport.TransportType;
20 public class SmartDeviceLinkConnection implements IProtocolListener, ITransportListener {
22 SmartDeviceLinkTransport _transport = null;
23 AbstractProtocol _protocol = null;
24 ISmartDeviceLinkConnectionListener _connectionListener = null;
26 // Thread safety locks
27 Object TRANSPORT_REFERENCE_LOCK = new Object();
28 Object PROTOCOL_REFERENCE_LOCK = new Object();
30 public SmartDeviceLinkConnection(ISmartDeviceLinkConnectionListener listener, BaseTransportConfig transportConfig) {
31 _connectionListener = listener;
33 // Initialize the transport
34 synchronized(TRANSPORT_REFERENCE_LOCK) {
35 // Ensure transport is null
36 if (_transport != null) {
37 if (_transport.getIsConnected()) {
38 _transport.disconnect();
43 if (transportConfig.getTransportType() == TransportType.BLUETOOTH)
45 _transport = new BTTransport(this);
47 else if (transportConfig.getTransportType() == TransportType.TCP)
49 _transport = new TCPTransport((TCPTransportConfig) transportConfig, this);
53 // Initialize the protocol
54 synchronized(PROTOCOL_REFERENCE_LOCK) {
55 // Ensure protocol is null
56 if (_protocol != null) {
60 _protocol = new SmartDeviceLinkProtocol(this);
64 public void closeConnection(byte rpcSessionID) {
65 synchronized(PROTOCOL_REFERENCE_LOCK) {
66 if (_protocol != null) {
67 // If transport is still connected, sent EndProtocolSessionMessage
68 if (_transport != null && _transport.getIsConnected()) {
69 _protocol.EndProtocolSession(SessionType.RPC, rpcSessionID);
75 synchronized (TRANSPORT_REFERENCE_LOCK) {
76 if (_transport != null) {
77 _transport.disconnect();
83 public void startTransport() throws SmartDeviceLinkException {
84 _transport.openConnection();
87 public Boolean getIsConnected() {
89 // If _transport is null, then it can't be connected
90 if (_transport == null) {
94 return _transport.getIsConnected();
97 public void sendMessage(ProtocolMessage msg) {
98 _protocol.SendMessage(msg);
102 public void onTransportBytesReceived(byte[] receivedBytes,
103 int receivedBytesLength) {
104 // Send bytes to protocol to be interpreted
105 synchronized(PROTOCOL_REFERENCE_LOCK) {
106 if (_protocol != null) {
107 _protocol.HandleReceivedBytes(receivedBytes, receivedBytesLength);
113 public void onTransportConnected() {
114 synchronized(PROTOCOL_REFERENCE_LOCK){
115 if(_protocol != null){
116 _protocol.StartProtocolSession(SessionType.RPC);
122 public void onTransportDisconnected(String info) {
123 // Pass directly to connection listener
124 _connectionListener.onTransportDisconnected(info);
128 public void onTransportError(String info, Exception e) {
129 // Pass directly to connection listener
130 _connectionListener.onTransportError(info, e);
134 public void onProtocolMessageBytesToSend(byte[] msgBytes, int offset,
136 // Protocol has packaged bytes to send, pass to transport for transmission
137 synchronized(TRANSPORT_REFERENCE_LOCK) {
138 if (_transport != null) {
139 _transport.sendBytes(msgBytes, offset, length);
145 public void onProtocolMessageReceived(ProtocolMessage msg) {
146 _connectionListener.onProtocolMessageReceived(msg);
150 public void onProtocolSessionStarted(SessionType sessionType,
151 byte sessionID, byte version, String correlationID) {
152 _connectionListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);
156 public void onProtocolSessionEnded(SessionType sessionType, byte sessionID,
157 String correlationID) {
158 _connectionListener.onProtocolSessionEnded(sessionType, sessionID, correlationID);
162 public void onProtocolError(String info, Exception e) {
163 _connectionListener.onProtocolError(info, e);
166 public TransportType getCurrentTransportType() {
167 return _transport.getTransportType();