10000 Merge pull request #92 from cloudwebrtc/remove_base64 · linuxerwang/flutter-webrtc@3b15175 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3b15175

Browse files
authored
Merge pull request flutter-webrtc#92 from cloudwebrtc/remove_base64
Removed base64 type for data channel on android.
2 parents 4722924 + 66bbef7 commit 3b15175

File tree

7 files changed

+39
-54
lines changed

7 files changed

+39
-54
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/DataChannelObserver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void onMessage(DataChannel.Buffer buffer) {
7979

8080
if (buffer.binary) {
8181
params.putString("type", "binary");
82-
params.putString("data", Base64.encodeToString(bytes, Base64.NO_WRAP));
82+
params.putByte("data", bytes);
8383
} else {
8484
params.putString("type", "text");
8585
params.putString("data", new String(bytes, Charset.forName("UTF-8")));

android/src/main/java/com/cloudwebrtc/webrtc/FlutterWebRTCPlugin.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
import com.cloudwebrtc.webrtc.utils.EglUtils;
1515
import com.cloudwebrtc.webrtc.utils.ObjectType;
1616

17+
import java.io.UnsupportedEncodingException;
1718
import java.io.File;
19+
import java.nio.ByteBuffer;
1820
import java.util.*;
1921

2022
import org.webrtc.AudioTrack;
@@ -207,9 +209,23 @@ public void onMethodCall(MethodCall call, Result result) {
207209
} else if (call.method.equals("dataChannelSend")) {
208210
String peerConnectionId = call.argument("peerConnectionId");
209211
int dataChannelId = call.argument("dataChannelId");
210-
String data = call.argument("data");
211212
String type = call.argument("type");
212-
dataChannelSend(peerConnectionId, dataChannelId, data, type);
213+
Boolean isBinary = type.equals("binary");
214+
ByteBuffer byteBuffer;
215+
if(isBinary){
216+
byteBuffer = ByteBuffer.wrap(call.argument("data"));
217+
}else{
218+
try {
219+
String data = call.argument("data");
220+
byteBuffer = ByteBuffer.wrap(data.getBytes("UTF-8"));
221+
} catch (UnsupportedEncodingException e) {
222+
Log.d(TAG, "Could not encode text string as UTF-8.");
223+
result.error("dataChannelSendFailed", "Could not encode text string as UTF-8.",null);
224+
return;
225+
}
226+
}
227+
dataChannelSend(peerConnectionId, dataChannelId, byteBuffer, isBinary);
228+
result.success(null);
213229
} else if (call.method.equals("dataChannelClose")) {
214230
String peerConnectionId = call.argument("peerConnectionId");
215231
int dataChannelId = call.argument("dataChannelId");
@@ -1152,15 +1168,15 @@ public void createDataChannel(final String peerConnectionId, String label, Const
11521168
}
11531169
}
11541170

1155-
public void dataChannelSend(String peerConnectionId, int dataChannelId, String data, String type) {
1171+
public void dataChannelSend(String peerConnectionId, int dataChannelId, ByteBuffer bytebuffer, Boolean isBinary) {
11561172
// Forward to PeerConnectionObserver which deals with DataChannels
11571173
// because DataChannel is owned by PeerConnection.
11581174
PeerConnectionObserver pco
11591175
= mPeerConnectionObservers.get(peerConnectionId);
11601176
if (pco == null || pco.getPeerConnection() == null) {
11611177
Log.d(TAG, "dataChannelSend() peerConnection is null");
11621178
} else {
1163-
pco.dataChannelSend(dataChannelId, data, type);
1179+
pco.dataChannelSend(dataChannelId, bytebuffer, isBinary);
11641180
}
11651181
}
11661182

android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -137,25 +137,10 @@ void dataChannelClose(int dataChannelId) {
137137
}
138138
}
139139

140-
void dataChannelSend(int dataChannelId, String data, String type) {
140+
void dataChannelSend(int dataChannelId, ByteBuffer byteBuffer, Boolean isBinary) {
141141
DataChannel dataChannel = dataChannels.get(dataChannelId);
142142
if (dataChannel != null) {
143-
byte[] byteArray;
144-
if (type.equals("text")) {
145-
try {
146-
byteArray = data.getBytes("UTF-8");
147-
} catch (UnsupportedEncodingException e) {
148-
Log.d(TAG, "Could not encode text string as UTF-8.");
149-
return;
150-
}
151-
} else if (type.equals("binary")) {
152-
byteArray = Base64.decode(data, Base64.NO_WRAP);
153-
} else {
154-
Log.e(TAG, "Unsupported data type: " + type);
155-
return;
156-
}
157-
ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
158-
DataChannel.Buffer buffer = new DataChannel.Buffer(byteBuffer, type.equals("binary"));
143+
DataChannel.Buffer buffer = new DataChannel.Buffer(byteBuffer, isBinary);
159144
dataChannel.send(buffer);
160145
} else {
161146
Log.d(TAG, "dataChannelSend() dataChannel is null");

android/src/main/java/com/cloudwebrtc/webrtc/utils/ConstraintsArray.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public String getString(int index){
3939
return (String) mArray.get(index);
4040
}
4141

42+
public Byte[] getByte(int index){
43+
return (Byte[]) mArray.get(index);
44+
}
45+
4246
public ConstraintsArray getArray(int index){
4347
return new ConstraintsArray((ArrayList<Object>)mArray.get(index));
4448
}
@@ -64,6 +68,8 @@ public ObjectType getType(int index) {
6468
return ObjectType.Array;
6569
} else if (object instanceof Map) {
6670
return ObjectType.Map;
71+
} else if (object instanceof Byte) {
72+
return ObjectType.Byte;
6773
}
6874
return ObjectType.Null;
6975
}

android/src/main/java/com/cloudwebrtc/webrtc/utils/ConstraintsMap.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public ObjectType getType(String name) {
6565
return ObjectType.Map;
6666
} else if (value instanceof ArrayList) {
6767
return ObjectType.Array;
68+
} else if (value instanceof Byte) {
69+
return ObjectType.Byte;
6870
} else {
6971
throw new IllegalArgumentException("Invalid value " + value.toString() + " for key " + name +
7072
"contained in ConstraintsMap");
@@ -87,6 +89,10 @@ public void putString(String key, String value) {
8789
mMap.put(key, value);
8890
}
8991

92+
public void putByte(String key, byte[] value) {
93+
mMap.put(key, value);
94+
}
95+
9096
public void putNull(String key) {
9197
mMap.put(key, null);
9298
}

android/src/main/java/com/cloudwebrtc/webrtc/utils/ObjectType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public enum ObjectType {
77
String,
88
Map,
99
Array,
10+
Byte
1011
}

lib/rtc_data_channel.dart

Lines changed: 3 additions & 10000 32 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,6 @@ class RTCDataChannelMessage {
5959
this._isBinary = true;
6060
}
6161

62-
/// Construct a binary message with a base64 encoded [String]
63-
/// to be decoded into binary.
64-
RTCDataChannelMessage.fromBase64Binary(String encodedBinary) {
65-
this._data = base64.decode(encodedBinary);
66-
this._isBinary = true;
67-
}
6862

6963
/// Tells whether this message contains binary.
7064
/// If this is false, it's a text message.
@@ -81,11 +75,6 @@ class RTCDataChannelMessage {
8175
/// Use only on binary messages.
8276
/// See: [isBinary].
8377
Uint8List get binary => _data;
84-
85-
/// Binary contents of this message as a base64 encoded [String].
86-
/// Use only on binary messages.
87-
/// See: [isBinary].
88-
String get binaryAsBase64 => base64.encode(_data);
8978
}
9079

9180
enum RTCDataChannelState {
@@ -160,12 +149,7 @@ class RTCDataChannel {
160149
dynamic data = map['data'];
161150
RTCDataChannelMessage message;
162151
if (type == MessageType.binary) {
163-
if (Platform.isAndroid) {
164-
message = RTCDataChannelMessage.fromBase64Binary(data);
165-
}
166-
else {
167-
message = RTCDataChannelMessage.fromBinary(data);
168-
}
152+
message = RTCDataChannelMessage.fromBinary(data);
169153
}
170154
else {
171155
message = RTCDataChannelMessage(data);
@@ -193,26 +177,13 @@ class RTCDataChannel {
193177
/// for the [message] parameter.
194178
/// To send a binary message, pass a binary [RTCDataChannelMessage]
195179
/// constructed with [RTCDataChannelMessage.fromBinary]
196-
/// or [RTCDataChannelMessage.fromBase64Binary].
197180
Future<void> send(RTCDataChannelMessage message) async {
198-
dynamic data;
199-
if (message.isBinary) {
200-
if (Platform.isAndroid) {
201-
data = message.binaryAsBase64;
202-
}
203-
else {
204-
data = message.binary;
205-
}
206-
}
207-
else {
208-
data = message.text;
209-
}
210-
await _channel.invokeMethod('dataChannelSend',
181+
await _channel.invokeMethod('dataChannelSend',
211182
<String, dynamic>{
212183
'peerConnectionId': _peerConnectionId,
213184
'dataChannelId': _dataChannelId,
214185
'type': message.isBinary ? "binary" : "text",
215-
'data': data
186+
'data': message.isBinary? message.binary : message.text,
216187
}
217188
);
218189
}

0 commit comments

Comments
 (0)
0