summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Grover <joeygrover@gmail.com>2018-08-17 15:28:43 -0400
committerJoey Grover <joeygrover@gmail.com>2018-08-17 15:28:43 -0400
commita09e16a052228bdfa7659ed43d0cf73a30721e87 (patch)
treefb9686d1ea2d97d86514aabe00669fd3daae9863
parent89bcf2426cc7976371d72910c8dba1ba79d51841 (diff)
downloadsdl_android-a09e16a052228bdfa7659ed43d0cf73a30721e87.tar.gz
Add ability for RPCs to be versioned/formated
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/marshal/JsonRPCMarshaller.java37
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/proxy/RPCStruct.java32
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java9
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/streaming/AbstractPacketizer.java22
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/streaming/StreamRPCPacketizer.java26
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java3
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/util/Version.java6
7 files changed, 112 insertions, 23 deletions
diff --git a/sdl_android/src/main/java/com/smartdevicelink/marshal/JsonRPCMarshaller.java b/sdl_android/src/main/java/com/smartdevicelink/marshal/JsonRPCMarshaller.java
index 414538a19..b206e11ca 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/marshal/JsonRPCMarshaller.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/marshal/JsonRPCMarshaller.java
@@ -11,6 +11,7 @@ import org.json.JSONObject;
import com.smartdevicelink.proxy.RPCMessage;
import com.smartdevicelink.proxy.RPCStruct;
+import com.smartdevicelink.util.Version;
import com.smartdevicelink.trace.*;
import com.smartdevicelink.trace.enums.InterfaceActivityDirection;
import com.smartdevicelink.util.DebugTool;
@@ -23,11 +24,16 @@ import com.smartdevicelink.util.DebugTool;
public class JsonRPCMarshaller {
private static final String SDL_LIB_PRIVATE_KEY = "42baba60-eb57-11df-98cf-0800200c9a66";
-
- public static byte[] marshall(RPCMessage msg, byte version) {
+
+ @Deprecated
+ public static byte[] marshall(RPCMessage msg, byte version, boolean test) {
+ return marshall(msg,new Version(version+""),null);
+ }
+
+ public static byte[] marshall(RPCMessage msg, Version protocolVersion, Version rpcMsgVersion) {
byte[] jsonBytes = null;
try {
- JSONObject jsonObject = msg.serializeJSON(version);
+ JSONObject jsonObject = msg.serializeJSON(protocolVersion, rpcMsgVersion);
jsonBytes = jsonObject.toString().getBytes();
SdlTrace.logMarshallingEvent(InterfaceActivityDirection.Transmit, jsonBytes, SDL_LIB_PRIVATE_KEY);
@@ -82,17 +88,23 @@ public class JsonRPCMarshaller {
}
@SuppressWarnings("unchecked")
- private static JSONArray serializeList(List<?> list) throws JSONException{
+ @Deprecated
+ private static JSONArray serializeList(List<?> list, boolean test) throws JSONException{
+ return serializeList(list,null);
+
+ }
+
+ private static JSONArray serializeList(List<?> list, Version rpcVersion) throws JSONException{
JSONArray toPut = new JSONArray();
Iterator<Object> valueIterator = (Iterator<Object>) list.iterator();
while(valueIterator.hasNext()){
Object anObject = valueIterator.next();
if (anObject instanceof RPCStruct) {
RPCStruct toSerialize = (RPCStruct) anObject;
- toPut.put(toSerialize.serializeJSON());
+ toPut.put(toSerialize.serializeStoreJSON(rpcVersion));
} else if(anObject instanceof Hashtable){
Hashtable<String, Object> toSerialize = (Hashtable<String, Object>)anObject;
- toPut.put(serializeHashtable(toSerialize));
+ toPut.put(serializeHashtable(toSerialize,rpcVersion));
} else {
toPut.put(anObject);
}
@@ -101,18 +113,23 @@ public class JsonRPCMarshaller {
}
@SuppressWarnings({"unchecked" })
- public static JSONObject serializeHashtable(Hashtable<String, Object> hash) throws JSONException{
+ @Deprecated
+ public static JSONObject serializeHashtable(Hashtable<String, Object> hash, boolean test) throws JSONException{
+ return serializeHashtable(hash,null);
+ }
+
+ public static JSONObject serializeHashtable(Hashtable<String, Object> hash, Version rpcVersion) throws JSONException{
JSONObject obj = new JSONObject();
Iterator<String> hashKeyIterator = hash.keySet().iterator();
while (hashKeyIterator.hasNext()){
String key = (String) hashKeyIterator.next();
Object value = hash.get(key);
if (value instanceof RPCStruct) {
- obj.put(key, ((RPCStruct) value).serializeJSON());
+ obj.put(key, ((RPCStruct) value).serializeStoreJSON(rpcVersion));
} else if (value instanceof List<?>) {
- obj.put(key, serializeList((List<?>) value));
+ obj.put(key, serializeList((List<?>) value,rpcVersion));
} else if (value instanceof Hashtable) {
- obj.put(key, serializeHashtable((Hashtable<String, Object>)value));
+ obj.put(key, serializeHashtable((Hashtable<String, Object>)value, rpcVersion));
} else {
obj.put(key, value);
}
diff --git a/sdl_android/src/main/java/com/smartdevicelink/proxy/RPCStruct.java b/sdl_android/src/main/java/com/smartdevicelink/proxy/RPCStruct.java
index 116c491df..81ddafada 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/proxy/RPCStruct.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/proxy/RPCStruct.java
@@ -1,6 +1,7 @@
package com.smartdevicelink.proxy;
import com.smartdevicelink.marshal.JsonRPCMarshaller;
+import com.smartdevicelink.util.Version;
import org.json.JSONException;
import org.json.JSONObject;
@@ -45,6 +46,7 @@ public class RPCStruct {
public void deserializeJSON(JSONObject jsonObject) throws JSONException {
store = JsonRPCMarshaller.deserializeJSONObject(jsonObject);
+
}
// deserializeJSONObject method moved to JsonRPCMarshaller for consistency
@@ -55,20 +57,38 @@ public class RPCStruct {
return JsonRPCMarshaller.deserializeJSONObject(jsonObject);
}
- public JSONObject serializeJSON() throws JSONException {
- return JsonRPCMarshaller.serializeHashtable(store);
+ public JSONObject serializeJSON(boolean test) throws JSONException {
+ return serializeStoreJSON(null);
+ }
+
+ public JSONObject serializeStoreJSON(Version rpcMsgVersion) throws JSONException {
+ format(rpcMsgVersion);
+ return JsonRPCMarshaller.serializeHashtable(store, rpcMsgVersion);
}
@SuppressWarnings("unchecked")
- public JSONObject serializeJSON(byte version) throws JSONException {
- if (version > 1) {
+ public JSONObject serializeJSON(byte protocolVersion,boolean test) throws JSONException {
+ return serializeJSON(new Version(protocolVersion+".0.0"), null);
+ }
+
+ public JSONObject serializeJSON(Version version, Version rpcMsgVersion) throws JSONException {
+ if (version.getMajor() > 1) {
String messageType = getMessageTypeName(store.keySet());
Hashtable<String, Object> function = (Hashtable<String, Object>) store.get(messageType);
Hashtable<String, Object> parameters = (Hashtable<String, Object>) function.get(RPCMessage.KEY_PARAMETERS);
- return JsonRPCMarshaller.serializeHashtable(parameters);
- } else return JsonRPCMarshaller.serializeHashtable(store);
+ return JsonRPCMarshaller.serializeHashtable(parameters,rpcMsgVersion);
+ } else return JsonRPCMarshaller.serializeHashtable(store, rpcMsgVersion);
}
+ /**
+ * This method should clean the the RPC to make sure it is compliant with the spec
+ * @param rpcVersion
+ */
+ protected void format(Version rpcVersion){
+ //Should override this method when breaking changes are made to the RPC spec
+ }
+
+
public byte[] getBulkData() {
return this._bulkData;
}
diff --git a/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java b/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java
index 7d73d36d8..8048d32cc 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java
@@ -241,6 +241,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
private final CopyOnWriteArrayList<IPutFileResponseListener> _putFileListenerList = new CopyOnWriteArrayList<IPutFileResponseListener>();
protected byte _wiproVersion = 1;
+ protected com.smartdevicelink.util.Version rpcSpecVersion;
protected SparseArray<OnRPCResponseListener> rpcResponseListeners = null;
protected SparseArray<CopyOnWriteArrayList<OnRPCNotificationListener>> rpcNotificationListeners = null;
@@ -1649,7 +1650,9 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
String sReturn;
try
{
- sReturn = msg.serializeJSON(getWiProVersion()).toString(2);
+ //sReturn = msg.serializeJSON(getWiProVersion()).toString(2);
+ sReturn = msg.serializeJSON(new com.smartdevicelink.util.Version(getWiProVersion()+".0.0"),
+ rpcSpecVersion ).toString(2);
}
catch (final Exception e)
{
@@ -1802,7 +1805,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
try {
SdlTrace.logRPCEvent(InterfaceActivityDirection.Transmit, request, SDL_LIB_TRACE_KEY);
- byte[] msgBytes = JsonRPCMarshaller.marshall(request, _wiproVersion);
+ byte[] msgBytes = JsonRPCMarshaller.marshall(request, new com.smartdevicelink.util.Version(_wiproVersion+".0.0"), rpcSpecVersion);
ProtocolMessage pm = new ProtocolMessage();
pm.setData(msgBytes);
@@ -2048,6 +2051,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
_sdlLanguage = msg.getLanguage();
_hmiDisplayLanguage = msg.getHmiDisplayLanguage();
_sdlMsgVersion = msg.getSdlMsgVersion();
+ rpcSpecVersion = new com.smartdevicelink.util.Version(_sdlMsgVersion.getMajorVersion(),_sdlMsgVersion.getMinorVersion(), _sdlMsgVersion.getPatchVersion());
_vehicleType = msg.getVehicleType();
_systemSoftwareVersion = msg.getSystemSoftwareVersion();
_proxyVersionInfo = msg.getProxyVersionInfo();
@@ -2196,6 +2200,7 @@ public abstract class SdlProxyBase<proxyListenerType extends IProxyListenerBase>
_sdlLanguage = msg.getLanguage();
_hmiDisplayLanguage = msg.getHmiDisplayLanguage();
_sdlMsgVersion = msg.getSdlMsgVersion();
+ rpcSpecVersion = new com.smartdevicelink.util.Version(_sdlMsgVersion.getMajorVersion(),_sdlMsgVersion.getMinorVersion(), _sdlMsgVersion.getPatchVersion());
_vehicleType = msg.getVehicleType();
_systemSoftwareVersion = msg.getSystemSoftwareVersion();
_proxyVersionInfo = msg.getProxyVersionInfo();
diff --git a/sdl_android/src/main/java/com/smartdevicelink/streaming/AbstractPacketizer.java b/sdl_android/src/main/java/com/smartdevicelink/streaming/AbstractPacketizer.java
index 722fa54f9..1a2c393cd 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/streaming/AbstractPacketizer.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/streaming/AbstractPacketizer.java
@@ -6,6 +6,7 @@ import java.io.InputStream;
import com.smartdevicelink.SdlConnection.SdlSession;
import com.smartdevicelink.protocol.enums.SessionType;
import com.smartdevicelink.proxy.RPCRequest;
+import com.smartdevicelink.util.Version;
abstract public class AbstractPacketizer {
@@ -19,7 +20,7 @@ abstract public class AbstractPacketizer {
protected byte[] buffer;
protected boolean upts = false;
protected RPCRequest _request = null;
- protected byte _wiproVersion = 1;
+ protected Version _wiproVersion = new Version("1.0.0");
//protected long ts = 0, intervalBetweenReports = 5000, delta = 0;
protected long intervalBetweenReports = 5000, delta = 0;
@@ -38,13 +39,30 @@ abstract public class AbstractPacketizer {
}
}
+ @Deprecated
public AbstractPacketizer(IStreamListener streamListener, InputStream is, RPCRequest request, SessionType sType, byte rpcSessionID, byte wiproVersion, SdlSession session) throws IOException, IllegalArgumentException {
this._streamListener = streamListener;
this.is = is;
_rpcSessionID = rpcSessionID;
_serviceType = sType;
_request = request;
- _wiproVersion = wiproVersion;
+ _wiproVersion = new Version(wiproVersion+".0.0");
+ this._session = session;
+ if (this._session != null) {
+ bufferSize = this._session.getMtu();
+ buffer = new byte[bufferSize];
+ }else{
+ throw new IllegalArgumentException("Session variable is null");
+ }
+ }
+
+ public AbstractPacketizer(IStreamListener streamListener, InputStream is, RPCRequest request, SessionType sType, byte rpcSessionID, Version protocolVersion, SdlSession session) throws IOException, IllegalArgumentException {
+ this._streamListener = streamListener;
+ this.is = is;
+ _rpcSessionID = rpcSessionID;
+ _serviceType = sType;
+ _request = request;
+ _wiproVersion = protocolVersion;
this._session = session;
if (this._session != null) {
bufferSize = this._session.getMtu();
diff --git a/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamRPCPacketizer.java b/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamRPCPacketizer.java
index 5652aafc3..167dbd074 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamRPCPacketizer.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamRPCPacketizer.java
@@ -22,6 +22,7 @@ import com.smartdevicelink.proxy.rpc.PutFileResponse;
import com.smartdevicelink.proxy.rpc.StreamRPCResponse;
import com.smartdevicelink.proxy.rpc.enums.Result;
import com.smartdevicelink.proxy.rpc.listeners.OnPutFileUpdateListener;
+import com.smartdevicelink.util.Version;
public class StreamRPCPacketizer extends AbstractPacketizer implements IPutFileResponseListener, Runnable{
@@ -36,7 +37,9 @@ public class StreamRPCPacketizer extends AbstractPacketizer implements IPutFileR
private Object mPauseLock;
private boolean mPaused;
private boolean isRPCProtected = false;
- private OnPutFileUpdateListener callBack;
+ private OnPutFileUpdateListener callBack;
+
+ private Version rpcSpecVersion;
public StreamRPCPacketizer(SdlProxyBase<IProxyListenerBase> proxy, IStreamListener streamListener, InputStream is, RPCRequest request, SessionType sType, byte rpcSessionID, byte wiproVersion, long lLength, SdlSession session) throws IOException {
super(streamListener, is, request, sType, rpcSessionID, wiproVersion, session);
@@ -56,6 +59,25 @@ public class StreamRPCPacketizer extends AbstractPacketizer implements IPutFileR
}
}
+ public StreamRPCPacketizer(SdlProxyBase<IProxyListenerBase> proxy, IStreamListener streamListener, InputStream is, RPCRequest request, SessionType sType, byte rpcSessionID, Version wiproVersion, Version rpcSpecVersion, long lLength, SdlSession session) throws IOException {
+ super(streamListener, is, request, sType, rpcSessionID, wiproVersion, session);
+ this.rpcSpecVersion = rpcSpecVersion;
+ lFileSize = lLength;
+ iInitialCorrID = request.getCorrelationID();
+ mPauseLock = new Object();
+ mPaused = false;
+ isRPCProtected = request.isPayloadProtected();
+ if (proxy != null)
+ {
+ _proxy = proxy;
+ _proxyListener = _proxy.getProxyListener();
+ _proxy.addPutFileResponseListener(this);
+ }
+ if(_request.getFunctionName().equalsIgnoreCase(FunctionID.PUT_FILE.toString())){
+ callBack = ((PutFile)_request).getOnPutFileUpdateListener();
+ }
+ }
+
@Override
public void start() throws IOException {
if (thread == null) {
@@ -201,7 +223,7 @@ public class StreamRPCPacketizer extends AbstractPacketizer implements IPutFileR
if (msg.getOffset() != 0)
msg.setLength((Long)null); //only need to send length when offset 0
- msgBytes = JsonRPCMarshaller.marshall(msg, _wiproVersion);
+ msgBytes = JsonRPCMarshaller.marshall(msg, _wiproVersion,rpcSpecVersion);
pm = new ProtocolMessage();
pm.setData(msgBytes);
diff --git a/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java b/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java
index 617fabcb2..832675fe4 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java
@@ -78,6 +78,7 @@ import com.smartdevicelink.transport.utl.ByteArrayMessageSpliter;
import com.smartdevicelink.util.AndroidTools;
import com.smartdevicelink.util.BitConverter;
import com.smartdevicelink.util.SdlAppInfo;
+import com.smartdevicelink.util.Version;
import static com.smartdevicelink.transport.TransportConstants.FOREGROUND_EXTRA;
import static com.smartdevicelink.transport.TransportConstants.SDL_NOTIFICATION_CHANNEL_ID;
@@ -1977,7 +1978,7 @@ public class SdlRouterService extends Service{
private byte[] createForceUnregisterApp(byte sessionId,byte version){
UnregisterAppInterface request = new UnregisterAppInterface();
request.setCorrelationID(UNREGISTER_APP_INTERFACE_CORRELATION_ID);
- byte[] msgBytes = JsonRPCMarshaller.marshall(request, version);
+ byte[] msgBytes = JsonRPCMarshaller.marshall(request, new Version(version+".0.0"), null);
ProtocolMessage pm = new ProtocolMessage();
pm.setData(msgBytes);
pm.setSessionID(sessionId);
diff --git a/sdl_android/src/main/java/com/smartdevicelink/util/Version.java b/sdl_android/src/main/java/com/smartdevicelink/util/Version.java
index 8621c8cfd..6861d1504 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/util/Version.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/util/Version.java
@@ -11,6 +11,12 @@ public class Version {
patch = 0;
}
+ public Version(int major, int minor, int patch){
+ this.major = major;
+ this.minor = minor;
+ this.patch = patch;
+ }
+
public Version(String versionString){
String[] versions = versionString.split("\\.");
if(versions.length!=3){