diff options
author | Joey Grover <joeygrover@gmail.com> | 2016-06-09 14:59:04 -0400 |
---|---|---|
committer | Joey Grover <joeygrover@gmail.com> | 2016-06-09 14:59:04 -0400 |
commit | 778fe5c9477b4a4e3bc44a0f3d9833ea5093ce9b (patch) | |
tree | e345fd08a656577beef6b8c7e9e8617315e79a6d | |
parent | 3619704e391b696fe0559a5743c65531f5c04697 (diff) | |
parent | b72572664e9bab13eaa9936b5944deab5f7c7b57 (diff) | |
download | sdl_android-778fe5c9477b4a4e3bc44a0f3d9833ea5093ce9b.tar.gz |
Merge branch 'develop' of https://github.com/smartdevicelink/sdl_android into feature/multiplexing
# Conflicts:
# sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java
# sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java
# sdl_android_lib/src/com/smartdevicelink/protocol/ProtocolFrameHeaderFactory.java
# sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java
# sdl_android_lib/src/com/smartdevicelink/proxy/rpc/enums/SdlDisconnectedReason.java
10 files changed, 58 insertions, 39 deletions
diff --git a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java index 57fb15e50..2f9eff800 100644 --- a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java +++ b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/ISdlConnectionListener.java @@ -15,7 +15,7 @@ public interface ISdlConnectionListener { byte sessionID, byte version, String correlationID);
public void onProtocolSessionStarted(SessionType sessionType,
- byte sessionID, byte version, String correlationID);
+ byte sessionID, byte version, String correlationID, int hashID);
public void onProtocolSessionEnded(SessionType sessionType,
byte sessionID, String correlationID);
diff --git a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java index 02d6b45e0..60d6e5362 100644 --- a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java +++ b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlConnection.java @@ -145,13 +145,13 @@ public class SdlConnection implements IProtocolListener, ITransportListener, ISt - private void closeConnection(boolean willRecycle, byte rpcSessionID) {
+ private void closeConnection(boolean willRecycle, byte rpcSessionID, int sessionHashId) {
synchronized(PROTOCOL_REFERENCE_LOCK) {
if (_protocol != null) {
// If transport is still connected, sent EndProtocolSessionMessage
if (_transport != null && _transport.getIsConnected()) {
- _protocol.EndProtocolSession(SessionType.RPC, rpcSessionID);
+ _protocol.EndProtocolSession(SessionType.RPC, rpcSessionID, sessionHashId);
}
if (willRecycle) {
_protocol = null;
@@ -261,8 +261,8 @@ public class SdlConnection implements IProtocolListener, ITransportListener, ISt @Override
public void onProtocolSessionStarted(SessionType sessionType,
- byte sessionID, byte version, String correlationID) {
- _connectionListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);
+ byte sessionID, byte version, String correlationID, int hashID) {
+ _connectionListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID, hashID);
}
@Override
@@ -494,7 +494,7 @@ public class SdlConnection implements IProtocolListener, ITransportListener, ISt public void endService (SessionType sessionType, byte sessionID) {
synchronized(PROTOCOL_REFERENCE_LOCK){
if(_protocol != null){
- _protocol.EndProtocolSession(sessionType, sessionID);
+ _protocol.EndProtocolService(sessionType, sessionID);
}
}
}
@@ -519,8 +519,8 @@ public class SdlConnection implements IProtocolListener, ITransportListener, ISt boolean didRemove = listenerList.remove(registerListener);
if(didRemove && _transport !=null && _transport.getTransportType()== TransportType.MULTIPLEX){ //If we're connected we can request the extra session now
((MultiplexTransport)_transport).removeSession(registerListener.getSessionId());
- }
- closeConnection(listenerList.size() == 0, registerListener.getSessionId());
+ }
+ closeConnection(listenerList.size() == 0, registerListener.getSessionId(), registerListener.getSessionHashId());
}
@@ -594,17 +594,17 @@ public class SdlConnection implements IProtocolListener, ITransportListener, ISt @Override
public void onProtocolSessionStarted(SessionType sessionType,
- byte sessionID, byte version, String correlationID) {
+ byte sessionID, byte version, String correlationID, int hashID) {
for (SdlSession session : listenerList) {
if (session.getSessionId() == 0) {
- session.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);
+ session.onProtocolSessionStarted(sessionType, sessionID, version, correlationID, hashID);
break;
}
}
if (sessionType.equals(SessionType.NAV) || sessionType.equals(SessionType.PCM)){
SdlSession session = findSessionById(sessionID);
if (session != null) {
- session.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);
+ session.onProtocolSessionStarted(sessionType, sessionID, version, correlationID, hashID);
}
}
}
diff --git a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java index d4e9212ba..7f1359963 100644 --- a/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java +++ b/sdl_android_lib/src/com/smartdevicelink/SdlConnection/SdlSession.java @@ -27,6 +27,7 @@ public class SdlSession implements ISdlConnectionListener, IHeartbeatMonitorList IHeartbeatMonitor _incomingHeartbeatMonitor = null;
private static final String TAG = "SdlSession";
private LockScreenManager lockScreenMan = new LockScreenManager();
+ private int sessionHashId = 0;
@@ -70,7 +71,10 @@ public class SdlSession implements ISdlConnectionListener, IHeartbeatMonitorList _incomingHeartbeatMonitor.setListener(this);
}
-
+ public int getSessionHashId() {
+ return this.sessionHashId;
+ }
+
public byte getSessionId() {
return this.sessionId;
}
@@ -174,12 +178,15 @@ public class SdlSession implements ISdlConnectionListener, IHeartbeatMonitorList @Override
public void onProtocolSessionStarted(SessionType sessionType,
- byte sessionID, byte version, String correlationID) {
+ byte sessionID, byte version, String correlationID, int hashID) {
this.sessionId = sessionID;
lockScreenMan.setSessionID(sessionID);
- this.sessionListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);Log.d(TAG, "session - on pro start");
+ this.sessionListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID, hashID);
//if (version == 3)
- initialiseSession();Log.d(TAG, "inited");
+ initialiseSession();
+ if (sessionType.eq(SessionType.RPC)){
+ sessionHashId = hashID;
+ }
}
@Override
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java b/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java index 4db9383f1..bcc2e1df5 100644 --- a/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java +++ b/sdl_android_lib/src/com/smartdevicelink/protocol/AbstractProtocol.java @@ -45,7 +45,9 @@ public abstract class AbstractProtocol { // This method ends a protocol session. A corresponding call to the protocol
// listener onProtocolSessionEnded() method will be made when the protocol
// session has ended.
- public abstract void EndProtocolSession(SessionType sessionType, byte sessionID);
+ public abstract void EndProtocolSession(SessionType sessionType, byte sessionID, int hashID);
+
+ public abstract void EndProtocolService(SessionType serviceType, byte sessionID);
// TODO REMOVE
// This method sets the interval at which heartbeat protocol messages will be
// sent to SDL.
@@ -122,8 +124,8 @@ public abstract class AbstractProtocol { // This method handles the startup of a protocol session. A callback is sent
// to the protocol listener.
protected void handleProtocolSessionStarted(SessionType sessionType,
- byte sessionID, byte version, String correlationID) {
- _protocolListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID);
+ byte sessionID, byte version, String correlationID, int hashID) {
+ _protocolListener.onProtocolSessionStarted(sessionType, sessionID, version, correlationID, hashID);
}
protected void handleProtocolSessionNACKed(SessionType sessionType,
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java b/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java index 0e3ff6842..47317a086 100644 --- a/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java +++ b/sdl_android_lib/src/com/smartdevicelink/protocol/IProtocolListener.java @@ -12,7 +12,7 @@ public interface IProtocolListener { void onProtocolMessageReceived(ProtocolMessage msg);
// Called to indicate that a protocol session has been started (from either side)
- void onProtocolSessionStarted(SessionType sessionType, byte sessionID, byte version, String correlationID);
+ void onProtocolSessionStarted(SessionType sessionType, byte sessionID, byte version, String correlationID, int hashID);
void onProtocolSessionNACKed(SessionType sessionType, byte sessionID, byte version, String correlationID);
diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/SdlPacketFactory.java b/sdl_android_lib/src/com/smartdevicelink/protocol/SdlPacketFactory.java index 8f9faefd8..1fff2b1a2 100644 --- a/sdl_android_lib/src/com/smartdevicelink/protocol/SdlPacketFactory.java +++ b/sdl_android_lib/src/com/smartdevicelink/protocol/SdlPacketFactory.java @@ -47,10 +47,10 @@ public class SdlPacketFactory { 0,messageID,null); } - public static SdlPacket createEndSession(SessionType serviceType, byte sessionID, int messageID, byte version) { + public static SdlPacket createEndSession(SessionType serviceType, byte sessionID, int messageID, byte version, byte[] payload) { return new SdlPacket(version,false,SdlPacket.FRAME_TYPE_CONTROL, serviceType.getValue(),SdlPacket.FRAME_INFO_END_SERVICE,sessionID, - 0,messageID,null); + payload.length,messageID,payload); } public static SdlPacket createSingleSendData(SessionType serviceType, byte sessionID, diff --git a/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java b/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java index 413ab61d8..284f04574 100644 --- a/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java +++ b/sdl_android_lib/src/com/smartdevicelink/protocol/WiProProtocol.java @@ -76,9 +76,10 @@ public class WiProProtocol extends AbstractProtocol { handlePacketToSend(header);
} // end-method
- public void EndProtocolSession(SessionType sessionType, byte sessionID) {
- SdlPacket header = SdlPacketFactory.createEndSession(sessionType, sessionID, hashID, _version);
+ public void EndProtocolSession(SessionType sessionType, byte sessionID, int hashId) {
+ SdlPacket header = SdlPacketFactory.createEndSession(sessionType, sessionID, hashID, _version, BitConverter.intToByteArray(hashId));
handlePacketToSend(header);
+
} // end-method
public void SendMessage(ProtocolMessage protocolMsg) {
@@ -301,24 +302,22 @@ public class WiProProtocol extends AbstractProtocol { messageLock = new Object();
_messageLocks.put((byte)packet.getSessionId(), messageLock);
}
- //hashID = BitConverter.intFromByteArray(data, 0); + int hashID = 0;
if (_version > 1){
- hashID = packet.getMessageId();
- }
- handleProtocolSessionStarted(serviceType,(byte) packet.getSessionId(), _version, "");
+ if (packet.payload!= null && packet.dataSize == 4){ //hashid will be 4 bytes in length
+ hashID = BitConverter.intFromByteArray(packet.payload, 0);
+ }
+ }
+ handleProtocolSessionStarted(serviceType,(byte) packet.getSessionId(), _version, "", hashID);
} else if (frameInfo == FrameDataControlFrameType.StartSessionNACK.getValue()) {
if (serviceType.eq(SessionType.NAV) || serviceType.eq(SessionType.PCM)) {
handleProtocolSessionNACKed(serviceType, (byte)packet.getSessionId(), _version, "");
- } else {
handleProtocolError("Got StartSessionNACK for protocol sessionID=" + packet.getSessionId(), null);
}
} else if (frameInfo == FrameDataControlFrameType.EndSession.getValue()) {
- //if (hashID == BitConverter.intFromByteArray(data, 0))
if (_version > 1) {
- if (hashID == packet.getMessageId()){
- handleProtocolSessionEnded(serviceType, (byte)packet.getSessionId(), "");
- }//else...nothing
+ handleProtocolSessionEnded(serviceType, (byte)packet.getSessionId(), "");
} else {
handleProtocolSessionEnded(serviceType, (byte)packet.getSessionId(), "");
}
@@ -327,7 +326,7 @@ public class WiProProtocol extends AbstractProtocol { } else if (frameInfo == FrameDataControlFrameType.EndSessionNACK.getValue()) {
handleProtocolSessionEndedNACK(serviceType, (byte)packet.getSessionId(), "");
} else if (frameInfo == FrameDataControlFrameType.ServiceDataACK.getValue()) {
- handleProtocolServiceDataACK(serviceType, (byte)packet.getSessionId ()); + handleProtocolServiceDataACK(serviceType, (byte)packet.getSessionId ());
}
} // end-method
@@ -401,4 +400,11 @@ public class WiProProtocol extends AbstractProtocol { final SdlPacket heartbeat = SdlPacketFactory.createHeartbeatACK(SessionType.CONTROL, sessionID, _version);
handlePacketToSend(heartbeat);
}
+
+ @Override
+ public void EndProtocolService(SessionType serviceType, byte sessionID) {
+ SdlPacket header = SdlPacketFactory.createEndSession(serviceType, sessionID, hashID, _version, new byte[4]);
+ handlePacketToSend(header);
+
+ }
} // end-class
\ No newline at end of file diff --git a/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java b/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java index 9268648ed..470cb6a14 100644 --- a/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java +++ b/sdl_android_lib/src/com/smartdevicelink/proxy/SdlProxyBase.java @@ -295,7 +295,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> @Override
public void onProtocolSessionStarted(SessionType sessionType,
- byte sessionID, byte version, String correlationID) {
+ byte sessionID, byte version, String correlationID, int hashID) {
Intent sendIntent = createBroadcastIntent();
updateBroadcastIntent(sendIntent, "FUNCTION_NAME", "onProtocolSessionStarted");
@@ -323,7 +323,9 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase> NavServiceStarted();
} else if (sessionType.eq(SessionType.PCM)) {
AudioServiceStarted();
- }
+ } else if (sessionType.eq(SessionType.RPC)){
+ cycleProxy(SdlDisconnectedReason.RPC_SESSION_ENDED);
+ }
else if (_wiproVersion > 1) {
//If version is 2 or above then don't need to specify a Session Type
startRPCProtocolSession(sessionID, correlationID);
diff --git a/sdl_android_lib/src/com/smartdevicelink/proxy/rpc/enums/SdlDisconnectedReason.java b/sdl_android_lib/src/com/smartdevicelink/proxy/rpc/enums/SdlDisconnectedReason.java index d1e69f744..0d1902e3a 100644 --- a/sdl_android_lib/src/com/smartdevicelink/proxy/rpc/enums/SdlDisconnectedReason.java +++ b/sdl_android_lib/src/com/smartdevicelink/proxy/rpc/enums/SdlDisconnectedReason.java @@ -24,8 +24,10 @@ public enum SdlDisconnectedReason { /**
* This only occurs when multiplexing is running and it is found to be on an old gen 1 system.
*/
- LEGACY_BLUETOOTH_MODE_ENABLED
+ LEGACY_BLUETOOTH_MODE_ENABLED,
+ RPC_SESSION_ENDED
;
+
public static SdlDisconnectedReason valueForString(String value) {
try{
diff --git a/sdl_android_lib/src/com/smartdevicelink/transport/SdlRouterService.java b/sdl_android_lib/src/com/smartdevicelink/transport/SdlRouterService.java index 914a4f292..2bf9efce6 100644 --- a/sdl_android_lib/src/com/smartdevicelink/transport/SdlRouterService.java +++ b/sdl_android_lib/src/com/smartdevicelink/transport/SdlRouterService.java @@ -1214,7 +1214,7 @@ public class SdlRouterService extends Service{ removeSessionFromMap(session); byte[] uai = createForceUnregisterApp((byte)session, (byte)packet.getVersion()); manuallyWriteBytes(uai,0,uai.length); - byte[] stopService = (SdlPacketFactory.createEndSession(SessionType.RPC, (byte)session, 0, (byte)packet.getVersion())).constructPacket(); + byte[] stopService = (SdlPacketFactory.createEndSession(SessionType.RPC, (byte)session, 0, (byte)packet.getVersion(),new byte[4])).constructPacket(); manuallyWriteBytes(stopService,0,stopService.length); return false; } @@ -1298,7 +1298,7 @@ public class SdlRouterService extends Service{ Log.i(TAG, "Attempting to stop session " + session); byte[] uai = createForceUnregisterApp((byte)session, (byte)version); manuallyWriteBytes(uai,0,uai.length); - byte[] stopService = (SdlPacketFactory.createEndSession(SessionType.RPC, (byte)session, 0, (byte)version)).constructPacket(); + byte[] stopService = (SdlPacketFactory.createEndSession(SessionType.RPC, (byte)session, 0, (byte)version,new byte[4])).constructPacket(); manuallyWriteBytes(stopService,0,stopService.length); } @@ -1316,7 +1316,7 @@ public class SdlRouterService extends Service{ sessionId = sessions.get(i).intValue(); unregister = createForceUnregisterApp((byte)sessionId,version); manuallyWriteBytes(unregister,0,unregister.length); - stopService = (SdlPacketFactory.createEndSession(SessionType.RPC, (byte)sessionId, 0, version)).constructPacket(); + stopService = (SdlPacketFactory.createEndSession(SessionType.RPC, (byte)sessionId, 0, version,new byte[4])).constructPacket(); manuallyWriteBytes(stopService,0,stopService.length); synchronized(SESSION_LOCK){ this.sessionMap.remove(sessionId); |