diff --git a/src/main/java/com/github/nkzawa/hasbinarydata/HasBinaryData.java b/src/main/java/com/github/nkzawa/hasbinarydata/HasBinaryData.java new file mode 100644 index 0000000..b29a5a4 --- /dev/null +++ b/src/main/java/com/github/nkzawa/hasbinarydata/HasBinaryData.java @@ -0,0 +1,44 @@ +package com.github.nkzawa.hasbinarydata; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.Iterator; + +public class HasBinaryData { + + private HasBinaryData() {} + + public static boolean hasBinary(Object data) { + return recursiveCheckForBinary(data); + } + + private static boolean recursiveCheckForBinary(Object obj) { + if (obj == null) return false; + + if (obj instanceof byte[]) { + return true; + } + + if (obj instanceof JSONArray) { + JSONArray _obj = (JSONArray)obj; + int length = _obj.length(); + for (int i = 0; i < length; i++) { + if (recursiveCheckForBinary(_obj.get(i))) { + return true; + } + } + } else if (obj instanceof JSONObject) { + JSONObject _obj = (JSONObject)obj; + Iterator keys = _obj.keys(); + while (keys.hasNext()) { + String key = (String)keys.next(); + if (recursiveCheckForBinary(_obj.get(key))) { + return true; + } + } + } + + return false; + } +} diff --git a/src/main/java/com/github/nkzawa/socketio/client/Socket.java b/src/main/java/com/github/nkzawa/socketio/client/Socket.java index 706ac57..07090de 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Socket.java @@ -1,6 +1,7 @@ package com.github.nkzawa.socketio.client; import com.github.nkzawa.emitter.Emitter; +import com.github.nkzawa.hasbinarydata.HasBinaryData; import com.github.nkzawa.socketio.parser.Packet; import com.github.nkzawa.socketio.parser.Parser; import com.github.nkzawa.thread.EventThread; @@ -133,25 +134,26 @@ public class Socket extends Emitter { * @return a reference to this object. */ @Override - public Emitter emit(final String event, final Object... args) { + public Emitter emit(final String event, final Object... arguments) { EventThread.exec(new Runnable() { @Override public void run() { if (events.containsKey(event)) { - Socket.super.emit(event, args); + Socket.super.emit(event, arguments); return; } - List _args = new ArrayList(args.length + 1); - _args.add(event); - _args.addAll(Arrays.asList(args)); + List args = new ArrayList(arguments.length + 1); + args.add(event); + args.addAll(Arrays.asList(arguments)); + JSONArray _args = new JSONArray(args); int parserType = Parser.EVENT; - // TODO: hasBin(_args) - Packet packet = new Packet(parserType, new JSONArray(_args)); + if (HasBinaryData.hasBinary(_args)) { parserType = Parser.BINARY_EVENT; } + Packet packet = new Packet(parserType, _args); - if (_args.get(_args.size() - 1) instanceof Ack) { + if (args.get(args.size() - 1) instanceof Ack) { logger.fine(String.format("emitting packet with ack id %d", Socket.this.ids)); - Socket.this.acks.put(Socket.this.ids, (Ack)_args.remove(_args.size() - 1)); + Socket.this.acks.put(Socket.this.ids, (Ack)args.remove(args.size() - 1)); packet.id = Socket.this.ids++; }