package com.netease.nim.demo.rts.doodle;
import android.text.TextUtils;
import android.util.Log;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nimlib.sdk.rts.RTSManager;
import com.netease.nimlib.sdk.rts.model.RTSTunData;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 白板数据收发中心
* <p/>
* Created by huangjun on 2015/6/29.
*/
public class TransactionCenter {
private int index = 0;
private final String TAG = "TransactionCenter";
// sessionId to TransactionObserver
private Map<String, TransactionObserver> observers = new HashMap<>(2);
public static TransactionCenter getInstance() {
return TransactionCenterHolder.instance;
}
private static class TransactionCenterHolder {
public static final TransactionCenter instance = new TransactionCenter();
}
public void registerObserver(String sessionId, TransactionObserver o) {
this.observers.put(sessionId, o);
}
/**
* 数据发送
*/
public void sendToRemote(String sessionId, String toAccount, List<Transaction> transactions) {
if (transactions == null || transactions.isEmpty()) {
return;
}
String data = pack(transactions);
try {
RTSTunData channelData = new RTSTunData(sessionId, toAccount, data.getBytes
("UTF-8"), data.getBytes().length);
RTSManager.getInstance().sendData(channelData);
Log.i(TAG, "SEND DATA = " + index + ", BYTES = " + data.getBytes().length);
} catch (UnsupportedEncodingException e) {
LogUtil.e("Transaction", "send to remote, getBytes exception : " + data);
}
}
private String pack(List<Transaction> transactions) {
StringBuilder sb = new StringBuilder();
for (Transaction t : transactions) {
sb.append(Transaction.pack(t));
}
// 打入序号
sb.append(Transaction.packIndex(++index));
return sb.toString();
}
/**
* 数据接收
*/
public void onReceive(String sessionId, String data) {
if (observers.containsKey(sessionId)) {
observers.get(sessionId).onTransaction(unpack(data));
}
}
private List<Transaction> unpack(String data) {
if (TextUtils.isEmpty(data)) {
return null;
}
List<Transaction> transactions = new ArrayList<>();
String[] pieces = data.split(";");
for (String p : pieces) {
Transaction t = Transaction.unpack(p);
if (t != null) {
transactions.add(t);
}
}
return transactions;
}
}