diff options
author | Austin Kirk <askirk@umich.edu> | 2017-07-27 16:41:29 -0400 |
---|---|---|
committer | Austin Kirk <askirk@umich.edu> | 2017-08-03 10:24:38 -0400 |
commit | a66b5c98f2f87b1bd7865dc739e904db2e907902 (patch) | |
tree | 9ff9a2f9bc14cf5343fef4ea58b77ad2563fcbb2 | |
parent | cded5b37298b9693227cf48ffcb0683686cc93f4 (diff) | |
download | sdl_android-a66b5c98f2f87b1bd7865dc739e904db2e907902.tar.gz |
StartService, StartServiceACK implemented for RPC Service
-rw-r--r-- | sdl_android/build.gradle | 2 | ||||
-rw-r--r-- | sdl_android/libs/bson_java_port-release.aar | bin | 107159 -> 107237 bytes | |||
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java | 5 | ||||
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java | 94 | ||||
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/protocol/enums/BsonTags.java | 6 |
5 files changed, 76 insertions, 31 deletions
diff --git a/sdl_android/build.gradle b/sdl_android/build.gradle index d25fae5ee..bb1933442 100644 --- a/sdl_android/build.gradle +++ b/sdl_android/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 19 + compileSdkVersion 22 buildToolsVersion "25.0.2" defaultConfig { minSdkVersion 8 diff --git a/sdl_android/libs/bson_java_port-release.aar b/sdl_android/libs/bson_java_port-release.aar Binary files differindex 23b283ac6..57f43bd50 100644 --- a/sdl_android/libs/bson_java_port-release.aar +++ b/sdl_android/libs/bson_java_port-release.aar diff --git a/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java b/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java index b417e761d..1947b207c 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java @@ -359,9 +359,12 @@ public class SdlPacket implements Parcelable{ } public Object getTag(String tag){ - if(bsonPayload.isEmpty()){ + if(payload == null){ + return null; + }else if(bsonPayload.isEmpty()){ bsonPayload = BsonEncoder.decodeFromBytes(payload); } + if(bsonPayload == null){ return null; } diff --git a/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java b/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java index c456b6179..a7d1d5539 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java @@ -1,6 +1,8 @@ package com.smartdevicelink.protocol;
-import com.livio.bsonjavaport.BSON.BsonObject;
+
+import android.util.Log;
+
import com.smartdevicelink.SdlConnection.SdlConnection;
import com.smartdevicelink.SdlConnection.SdlSession;
import com.smartdevicelink.exception.SdlException;
@@ -15,8 +17,10 @@ import com.smartdevicelink.util.BitConverter; import com.smartdevicelink.util.DebugTool;
import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
+import java.util.List;
public class WiProProtocol extends AbstractProtocol {
byte _version = 1;
@@ -29,6 +33,7 @@ public class WiProProtocol extends AbstractProtocol { public static final int V2_HEADER_SIZE = 12;
private static int HEADER_SIZE = 8;
private static int MAX_DATA_SIZE = V1_V2_MTU_SIZE - HEADER_SIZE;
+ private static long DYNAMIC_MTU_SIZE = MAX_DATA_SIZE;
private static int TLS_MAX_RECORD_SIZE = 16384;
int hashID = 0;
@@ -43,6 +48,7 @@ public class WiProProtocol extends AbstractProtocol { Hashtable<Integer, MessageFrameAssembler> _assemblerForMessageID = new Hashtable<Integer, MessageFrameAssembler>();
Hashtable<Byte, Hashtable<Integer, MessageFrameAssembler>> _assemblerForSessionID = new Hashtable<Byte, Hashtable<Integer, MessageFrameAssembler>>();
Hashtable<Byte, Object> _messageLocks = new Hashtable<Byte, Object>();
+ private HashMap<SessionType, Long> mtus = new HashMap<SessionType,Long>();
// Hide no-arg ctor
private WiProProtocol() {
@@ -56,6 +62,7 @@ public class WiProProtocol extends AbstractProtocol { {
sdlconn = (SdlConnection) protocolListener;
}
+ mtus.put(SessionType.RPC, new Long(V1_V2_MTU_SIZE - HEADER_SIZE));
} // end-ctor
/**
@@ -63,7 +70,15 @@ public class WiProProtocol extends AbstractProtocol { * @return the max transfer unit
*/
public int getMtu(){
- return MAX_DATA_SIZE;
+ return mtus.get(SessionType.RPC).intValue();//'MAX_DATA_SIZE;
+ }
+
+ public long getMtu(SessionType type){
+ Long mtu = mtus.get(type);
+ if(mtu == null){
+ mtu = mtus.get(SessionType.RPC);
+ }
+ return mtu;
}
public byte getVersion() {
@@ -78,7 +93,7 @@ public class WiProProtocol extends AbstractProtocol { } else if (version == 5) {
this._version = version;
HEADER_SIZE = 12;
- MAX_DATA_SIZE = V3_V4_MTU_SIZE; //versions 5 supports 128k MTU
+ MAX_DATA_SIZE = getMtu(); //versions 5 supports 128k MTU
}else if (version == 4) {
this._version = version;
HEADER_SIZE = 12;
@@ -102,6 +117,7 @@ public class WiProProtocol extends AbstractProtocol { SdlPacket header = SdlPacketFactory.createStartSession(sessionType, 0x00, _version, (byte) 0x00, false);
if(sessionType.equals(SessionType.RPC)){ // check for RPC session
header.putTag(BsonTags.PROTOCOL_VERSION, MAX_PROTOCOL_VERSION);
+ Log.i(sessionType.getName(), "Sending PROTOCOL_VERSION: "+MAX_PROTOCOL_VERSION);
}
handlePacketToSend(header);
} // end-method
@@ -113,6 +129,10 @@ public class WiProProtocol extends AbstractProtocol { public void EndProtocolSession(SessionType sessionType, byte sessionID, int hashId) {
SdlPacket header = SdlPacketFactory.createEndSession(sessionType, sessionID, hashID, _version, BitConverter.intToByteArray(hashId));
+ if(sessionType.equals(SessionType.RPC)){ // check for RPC session
+ header.putTag(BsonTags.HASH_ID, hashID);
+ Log.i(sessionType.getName(), "Sending " + BsonTags.HASH_ID + " : "+hashID);
+ }
handlePacketToSend(header);
} // end-method
@@ -256,7 +276,7 @@ public class WiProProtocol extends AbstractProtocol { protected MessageFrameAssembler getFrameAssemblerForFrame(SdlPacket packet) {
Integer iSessionId = Integer.valueOf(packet.getSessionId());
Byte bySessionId = iSessionId.byteValue();
-
+
Hashtable<Integer, MessageFrameAssembler> hashSessionID = _assemblerForSessionID.get(bySessionId);
if (hashSessionID == null) {
hashSessionID = new Hashtable<Integer, MessageFrameAssembler>();
@@ -405,33 +425,46 @@ public class WiProProtocol extends AbstractProtocol { else if (frameInfo == FrameDataControlFrameType.StartSession.getValue()) {
sendStartProtocolSessionACK(serviceType, (byte)packet.getSessionId());
} else if (frameInfo == FrameDataControlFrameType.StartSessionACK.getValue()) {
+ // Use this sessionID to create a message lock
+ Object messageLock = _messageLocks.get(packet.getSessionId());
+ if (messageLock == null) {
+ messageLock = new Object();
+ _messageLocks.put((byte)packet.getSessionId(), messageLock);
+ }
if(packet.version >= 5){
if(serviceType.equals(SessionType.RPC)){
hashID = (Integer) packet.getTag(BsonTags.HASH_ID);
- MAX_DATA_SIZE = (Integer) packet.getTag(BsonTags.MTU);
+ mtus.put(SessionType.RPC,(Long) packet.getTag(BsonTags.MTU));
MAX_PROTOCOL_VERSION = (String) packet.getTag(BsonTags.PROTOCOL_VERSION);
+
+ Log.i(serviceType.getName(), "Receiving hashID: "+hashID);
+ Log.i(serviceType.getName(), "Receiving mtu: "+packet.getTag(BsonTags.MTU));
+ Log.i(serviceType.getName(), "Receiving MAX_PROTOCOL_VERSION: "+MAX_PROTOCOL_VERSION);
}else if(serviceType.equals(SessionType.PCM)){
- // Not implemented
+ hashID = (Integer) packet.getTag(BsonTags.HASH_ID);
+ mtus.put(SessionType.PCM,(Long) packet.getTag(BsonTags.MTU));
+
+ Log.i(serviceType.getName(), "Receiving hashID: "+hashID);
+ Log.i(serviceType.getName(), "Receiving mtu: "+packet.getTag(BsonTags.MTU));
}else if(serviceType.equals(SessionType.NAV)){
- // Not implemented
+ // TODO: Implement Bson Tags
}
}else{
-
- }
- // Use this sessionID to create a message lock
- Object messageLock = _messageLocks.get(packet.getSessionId());
- if (messageLock == null) {
- messageLock = new Object();
- _messageLocks.put((byte)packet.getSessionId(), messageLock);
- }
- int hashID = 0;
- if (_version > 1){
- if (packet.payload!= null && packet.dataSize == 4){ //hashid will be 4 bytes in length
- hashID = BitConverter.intFromByteArray(packet.payload, 0);
+ if (_version > 1){
+ 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, packet.isEncrypted());
+ handleProtocolSessionStarted(serviceType,(byte) packet.getSessionId(), _version, "", hashID, packet.isEncrypted());
} else if (frameInfo == FrameDataControlFrameType.StartSessionNACK.getValue()) {
+ if(packet.version >= 5){
+ if(serviceType.equals(SessionType.RPC) || serviceType.equals(SessionType.PCM) ||
+ serviceType.equals(SessionType.NAV)) {
+ List<String> rejectedParams = (List<String>) packet.getTag(BsonTags.REJECTED_PARAMS);
+ Log.i(serviceType.getName(), "Receiving rejectedParams: " + rejectedParams.toString());
+ }
+ }
if (serviceType.eq(SessionType.NAV) || serviceType.eq(SessionType.PCM)) {
handleProtocolSessionNACKed(serviceType, (byte)packet.getSessionId(), _version, "");
} else {
@@ -446,6 +479,13 @@ public class WiProProtocol extends AbstractProtocol { } else if (frameInfo == FrameDataControlFrameType.EndSessionACK.getValue()) {
handleProtocolSessionEnded(serviceType, (byte)packet.getSessionId(), "");
} else if (frameInfo == FrameDataControlFrameType.EndSessionNACK.getValue()) {
+ if(packet.version >= 5){
+ if(serviceType.equals(SessionType.RPC) || serviceType.equals(SessionType.PCM) ||
+ serviceType.equals(SessionType.NAV)) {
+ List<String> rejectedParams = (List<String>) packet.getTag(BsonTags.REJECTED_PARAMS);
+ Log.i(serviceType.getName(), "Receiving rejectedParams: " + rejectedParams.toString());
+ }
+ }
handleProtocolSessionEndedNACK(serviceType, (byte)packet.getSessionId(), "");
} else if (frameInfo == FrameDataControlFrameType.ServiceDataACK.getValue()) {
if (packet.getPayload() != null && packet.getDataSize() == 4) //service data ack will be 4 bytes in length
@@ -503,11 +543,14 @@ public class WiProProtocol extends AbstractProtocol { @Override
public void StartProtocolService(SessionType sessionType, byte sessionID, boolean isEncrypted) {
- // TODO: Add bson tags based on sessionType
-
SdlPacket header = SdlPacketFactory.createStartSession(sessionType, 0x00, _version, sessionID, isEncrypted);
+ if(sessionType.equals(SessionType.PCM)){ // check for RPC session
+ header.putTag(BsonTags.HASH_ID, hashID);
+ Log.i(sessionType.getName(), "Sending hashID: "+hashID);
+ header.putTag(BsonTags.MTU, Long.parseLong(""+ MAX_DATA_SIZE));
+ Log.i(sessionType.getName(), "Sending MTU: "+MAX_DATA_SIZE);
+ }
handlePacketToSend(header);
-
}
@Override
@@ -538,7 +581,10 @@ public class WiProProtocol extends AbstractProtocol { public void EndProtocolService(SessionType serviceType, byte sessionID) {
SdlPacket header = SdlPacketFactory.createEndSession(serviceType, sessionID, hashID, _version, new byte[4]);
handlePacketToSend(header);
-
+ if(serviceType.equals(SessionType.PCM) || serviceType.equals(SessionType.NAV)){ // check for RPC session
+ header.putTag(BsonTags.HASH_ID, hashID);
+ Log.i(serviceType.getName(), "Sending " + BsonTags.HASH_ID + " : "+hashID);
+ }
}
} // end-class
diff --git a/sdl_android/src/main/java/com/smartdevicelink/protocol/enums/BsonTags.java b/sdl_android/src/main/java/com/smartdevicelink/protocol/enums/BsonTags.java index bebb9f834..60d850b77 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/enums/BsonTags.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/enums/BsonTags.java @@ -1,13 +1,9 @@ package com.smartdevicelink.protocol.enums; -/** - * Created by austinkirk on 7/24/17. - */ - public class BsonTags { public static final String PROTOCOL_VERSION = "protocolVersion"; public static final String HASH_ID = "hashId"; - public static final String MTU = "MTU"; + public static final String MTU = "mtu"; public static final String HEIGHT = "height"; public static final String WIDTH = "width"; public static final String VIDEO_PROTOCOL = "videoProtocol"; |