package com.crossbow.wear.core;
import android.os.Bundle;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Class used to flatten requests into a byte array for transmission over the wear apis
*/
public class RequestSerialUtil {
public static byte[] serializeRequest(String uuid, Request<?> request) throws AuthFailureError, IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(500);
DataOutputStream dataStream = new DataOutputStream(outputStream);
//metadata first
dataStream.writeUTF(uuid);
//byte arrays
SerialUtil.writeBytes(dataStream, request.getBody());
//Strings
dataStream.writeUTF(request.getTag() != null ? request.getTag().toString() : "");
dataStream.writeUTF(request.getUrl());
dataStream.writeUTF(request.getBodyContentType());
dataStream.writeUTF(request.getCacheKey());
//enum
dataStream.writeUTF(request.getPriority().name());
//ints
dataStream.writeInt(request.getTimeoutMs());
dataStream.writeInt(request.getMethod());
dataStream.writeInt(request.getRetryPolicy().getCurrentRetryCount());
//map of headers
SerialUtil.writeMap(dataStream, request.getHeaders());
//transformer key and bundle
if(request instanceof WearRequest) {
WearRequest wearRequest = WearRequest.class.cast(request);
ParamsBundle bundle = wearRequest.getTransformerParams();
String transformerKey = wearRequest.getTransFormerKey();
if(bundle == null) {
bundle = new ParamsBundle(0);
}
if(transformerKey == null) {
transformerKey = "";
}
dataStream.writeUTF(transformerKey);
bundle.writeToStream(dataStream);
}
else {
dataStream.writeUTF("");
new ParamsBundle(0).writeToStream(dataStream);
}
byte[] data = outputStream.toByteArray();
dataStream.close();
//gzip the data
return Gzipper.zip(data);
}
public static WearDataRequest deSerializeRequest(byte[] request) throws IOException {
//decompress the gzipped data
byte[] deCompressed = Gzipper.unzip(request);
ByteArrayInputStream inputStream = new ByteArrayInputStream(deCompressed);
DataInputStream dataStream = new DataInputStream(inputStream);
//metadata
String uuid = dataStream.readUTF();
//byte arrays
byte[] postBody = SerialUtil.readBytes(dataStream);
//Strings
String tag = dataStream.readUTF();
String url = dataStream.readUTF();
String bodyType = dataStream.readUTF();
String cacheKey = dataStream.readUTF();
//Enum
Request.Priority priority = Request.Priority.valueOf(dataStream.readUTF());
//ints
int timeout = dataStream.readInt();
int method = dataStream.readInt();
int retryies = dataStream.readInt();
//headers
Map<String, String> headers = SerialUtil.readMap(dataStream);
//transformer key, bundle
String transformerKey = dataStream.readUTF();
ParamsBundle transformerArgs = ParamsBundle.readFromStream(dataStream);
dataStream.close();
return new WearDataRequest(method, url, uuid, transformerKey,
retryies, timeout, cacheKey, tag, bodyType,
headers, postBody, priority, transformerArgs);
}
}