package com.crossbow.wear.core;
import android.support.annotation.Nullable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class SerialUtil {
public static void writeMap(DataOutputStream outputStream, @Nullable Map<String, String> map) throws IOException {
if(map == null) {
map = Collections.emptyMap();
}
//Write size, then key-values
outputStream.writeInt(map.size());
Set<Map.Entry<String, String>> entries = map.entrySet();
for(Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
writeString(outputStream, key);
writeString(outputStream, value);
}
}
public static void writeString(DataOutputStream outputStream, @Nullable String data) throws IOException {
if(data == null) {
data = "";
}
outputStream.writeInt(data.getBytes().length);
outputStream.write(data.getBytes());
}
public static String readString(DataInputStream inputStream) throws IOException {
int length = inputStream.readInt();
byte[] data = new byte[length];
inputStream.read(data);
return new String(data);
}
public static void writeBytes(DataOutputStream outputStream, @Nullable byte[] data) throws IOException {
//Write size, then key-values
if(data != null) {
outputStream.writeInt(data.length);
outputStream.write(data);
}
else {
outputStream.writeInt(0);
outputStream.write(new byte[0]);
}
}
public static byte[] readBytes(DataInputStream outputStream) throws IOException {
//Read size, then key-values
int size = outputStream.readInt();
byte[] data = new byte[size];
outputStream.read(data, 0, size);
return data;
}
public static Map<String, String> readMap(DataInputStream dataInputStream) throws IOException {
//Read size, then key-values in a loop
int size = dataInputStream.readInt();
Map<String, String> map = new HashMap<>(size);
for (int i = 0; i < size; i++) {
String key = readString(dataInputStream);
String value = readString(dataInputStream);
map.put(key, value);
}
return map;
}
}