diff options
Diffstat (limited to 'sdl_android')
-rw-r--r-- | sdl_android/build.gradle | 6 | ||||
-rw-r--r-- | sdl_android/libs/bson_java_port-release.aar | bin | 0 -> 107159 bytes | |||
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java | 31 | ||||
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java | 34 | ||||
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/protocol/enums/BsonTags.java | 16 |
5 files changed, 81 insertions, 6 deletions
diff --git a/sdl_android/build.gradle b/sdl_android/build.gradle index b9dc7cac8..d25fae5ee 100644 --- a/sdl_android/build.gradle +++ b/sdl_android/build.gradle @@ -29,12 +29,18 @@ android { } dependencies { + compile(name:'bson_java_port-release', ext:'aar') compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' +} +repositories { + flatDir { + dirs 'libs' + } } buildscript { diff --git a/sdl_android/libs/bson_java_port-release.aar b/sdl_android/libs/bson_java_port-release.aar Binary files differnew file mode 100644 index 000000000..23b283ac6 --- /dev/null +++ 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 9c7a02852..b417e761d 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/SdlPacket.java @@ -1,7 +1,9 @@ package com.smartdevicelink.protocol; import java.nio.ByteBuffer; +import java.util.HashMap; +import com.livio.bsonjavaport.BSON.BsonEncoder; import com.smartdevicelink.protocol.enums.FrameType; import android.os.Parcel; @@ -65,6 +67,7 @@ public class SdlPacket implements Parcelable{ int messageId; int priorityCoefficient; byte[] payload = null; + HashMap<String, Object> bsonPayload = new HashMap<>(); public SdlPacket(int version, boolean encryption, int frameType, int serviceType, int frameInfo, int sessionId, @@ -186,6 +189,11 @@ public class SdlPacket implements Parcelable{ } public byte[] constructPacket(){ + if(!bsonPayload.isEmpty()){ + byte[] bsonBytes = BsonEncoder.encodeToBytes(bsonPayload); + payload = bsonBytes; + dataSize = bsonBytes.length; + } return constructPacket(version, encryption, frameType, serviceType, frameInfo, sessionId, dataSize, messageId, payload); @@ -219,6 +227,7 @@ public class SdlPacket implements Parcelable{ public static byte[] constructPacket(int version, boolean encryption, int frameType, int serviceType, int controlFrameInfo, int sessionId, int dataSize, int messageId, byte[] payload){ + ByteBuffer builder; switch(version){ case 1: @@ -344,6 +353,24 @@ public class SdlPacket implements Parcelable{ } }; - - + + public void putTag(String tag, Object data){ + bsonPayload.put(tag, data); + } + + public Object getTag(String tag){ + if(bsonPayload.isEmpty()){ + bsonPayload = BsonEncoder.decodeFromBytes(payload); + } + if(bsonPayload == null){ + return null; + } + + Object val = bsonPayload.get(tag); + if(val == null){ + return null; + }else{ + return val; + } + } } 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 af6973d2e..c456b6179 100644 --- a/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/WiProProtocol.java @@ -1,9 +1,11 @@ package com.smartdevicelink.protocol;
+import com.livio.bsonjavaport.BSON.BsonObject;
import com.smartdevicelink.SdlConnection.SdlConnection;
import com.smartdevicelink.SdlConnection.SdlSession;
import com.smartdevicelink.exception.SdlException;
import com.smartdevicelink.exception.SdlExceptionCause;
+import com.smartdevicelink.protocol.enums.BsonTags;
import com.smartdevicelink.protocol.enums.FrameDataControlFrameType;
import com.smartdevicelink.protocol.enums.FrameType;
import com.smartdevicelink.protocol.enums.MessageType;
@@ -13,11 +15,13 @@ import com.smartdevicelink.util.BitConverter; import com.smartdevicelink.util.DebugTool;
import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
import java.util.Hashtable;
public class WiProProtocol extends AbstractProtocol {
byte _version = 1;
private final static String FailurePropagating_Msg = "Failure propagating ";
+ public static String MAX_PROTOCOL_VERSION = "5.0.0";
public static final int V1_V2_MTU_SIZE = 1500;
public static final int V3_V4_MTU_SIZE = 131072;
@@ -67,11 +71,15 @@ public class WiProProtocol extends AbstractProtocol { }
public void setVersion(byte version) {
- if (version > 4) {
- this._version = 4; //protect for future, proxy only supports v4 or lower
+ if (version > 5) {
+ this._version = 5; //protect for future, proxy only supports v5 or lower
HEADER_SIZE = 12;
MAX_DATA_SIZE = V1_V2_MTU_SIZE - HEADER_SIZE; //default to lowest size since capabilities of this version are unknown
- } else if (version == 4) {
+ } else if (version == 5) {
+ this._version = version;
+ HEADER_SIZE = 12;
+ MAX_DATA_SIZE = V3_V4_MTU_SIZE; //versions 5 supports 128k MTU
+ }else if (version == 4) {
this._version = version;
HEADER_SIZE = 12;
MAX_DATA_SIZE = V3_V4_MTU_SIZE; //versions 4 supports 128k MTU
@@ -92,6 +100,9 @@ public class WiProProtocol extends AbstractProtocol { public void StartProtocolSession(SessionType sessionType) {
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);
+ }
handlePacketToSend(header);
} // end-method
@@ -394,6 +405,19 @@ public class WiProProtocol extends AbstractProtocol { else if (frameInfo == FrameDataControlFrameType.StartSession.getValue()) {
sendStartProtocolSessionACK(serviceType, (byte)packet.getSessionId());
} else if (frameInfo == FrameDataControlFrameType.StartSessionACK.getValue()) {
+ if(packet.version >= 5){
+ if(serviceType.equals(SessionType.RPC)){
+ hashID = (Integer) packet.getTag(BsonTags.HASH_ID);
+ MAX_DATA_SIZE = (Integer) packet.getTag(BsonTags.MTU);
+ MAX_PROTOCOL_VERSION = (String) packet.getTag(BsonTags.PROTOCOL_VERSION);
+ }else if(serviceType.equals(SessionType.PCM)){
+ // Not implemented
+ }else if(serviceType.equals(SessionType.NAV)){
+ // Not implemented
+ }
+ }else{
+
+ }
// Use this sessionID to create a message lock
Object messageLock = _messageLocks.get(packet.getSessionId());
if (messageLock == null) {
@@ -405,7 +429,7 @@ public class WiProProtocol extends AbstractProtocol { 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());
} else if (frameInfo == FrameDataControlFrameType.StartSessionNACK.getValue()) {
if (serviceType.eq(SessionType.NAV) || serviceType.eq(SessionType.PCM)) {
@@ -479,6 +503,8 @@ 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);
handlePacketToSend(header);
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 new file mode 100644 index 000000000..bebb9f834 --- /dev/null +++ b/sdl_android/src/main/java/com/smartdevicelink/protocol/enums/BsonTags.java @@ -0,0 +1,16 @@ +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 HEIGHT = "height"; + public static final String WIDTH = "width"; + public static final String VIDEO_PROTOCOL = "videoProtocol"; + public static final String VIDEO_CODEC = "videoCodec"; + public static final String REJECTED_PARAMS = "rejectedParams"; +} |