李勇

1.增加文档模块的对外接口,整理了文档的pdu结构

2.调整白板模块的pdu结构,和文档模块关联
此 diff 太大无法显示。
... ... @@ -102,12 +102,22 @@ export default class MessageEntrance extends Emiter {
//videoApe
this.getPlayVideoPath=this._getPlayVideoPath;
this.getPublishVideoPath=this._getPublishVideoPath;
this.publishVideo=this._publishVideo;
this.stopPublishVideo=this._stopPublishVideo;
//whiteBoradApe
this.sendInsertAnnotaion=this._sendInsertAnnotaion;
//this.sendUpdaterAnnotaion=this._sendUpdaterAnnotaion;//暂时关闭更新接口
this.sendDeleteAnnotaion=this._sendDeleteAnnotaion;
this.sendDeleteAllAnnotation=this._sendDeleteAllAnnotation;
//DocApe
this.sendDocumentUpload= this._sendDocumentUpload;//上传文档
this.sendDocumentSwitch= this._sendDocumentSwitch; //切换文档
this.sendDocumentDelete= this. _sendDocumentDelete;//删除文档
this.sendDocumentCommand= this._sendDocumentCommand;//操作文档(翻页、缩放、滚动...)
//debug
//this.setDebugData=this._setDebugData;
}
... ... @@ -295,19 +305,26 @@ export default class MessageEntrance extends Emiter {
_getPlayVideoPath(_param){
if(_video_ape){
return _video_ape.getPlayVideoPath(_param);
}else {
return {"code":1,"data":"获取播放地址失败"};
}
}
_getPublishVideoPath(_param){
if(_video_ape){
return _video_ape.getPublishVideoPath(_param);
}else {
return {"code":1,"data":"获取推流地址失败"};
}
}
_publishVideo(_param){
if(_video_ape){
return _video_ape.publishVideo(_param);
}
}
_stopPublishVideo(_param){
if(_video_ape){
return _video_ape.stopPublishVideo(_param);
}
}
//WhiteBoardApe
// 添加标注,发送信息
... ... @@ -335,6 +352,32 @@ export default class MessageEntrance extends Emiter {
}
}
//DocApe
//上传文档
_sendDocumentUpload(_param){
if(_doc_ape){
_doc_ape.documentUpload(_param);
}
}
//切换文档
_sendDocumentSwitch(_param){
if(_doc_ape){
_doc_ape.documentSwitch(_param);
}
}
//删除文档
_sendDocumentDelete(_param){
if(_doc_ape){
_doc_ape.documentDelete(_param);
}
}
//操作文档(翻页、缩放、滚动...)
_sendDocumentCommand(_param){
if(_doc_ape){
_doc_ape.documentCommand(_param);
}
}
// 白板笔记更新(svg)
annoUpdateHandler(annoInfo) {
const activeDocId = _confer_ape.activeDocId;
... ...
... ... @@ -25,5 +25,12 @@ class EngineUtils{
}
return null;
}
//生成nodeId的随机数
static generateNodeID(){
let time = new Date().getTime();
let nodeID:int = time % 1000000000;//time后9位
return nodeID;
}
}
export default EngineUtils;
\ No newline at end of file
... ...
... ... @@ -37,6 +37,7 @@ MessageTypes.CHAT_RECEIVE = 'chat.receive';
//视频模块事件定义
MessageTypes.VIDEO_RECEIVE = 'video.receive';
//文档模块事件定义
MessageTypes.DOC_SHOW = 'document.show';
MessageTypes.DOC_UPLOAD='document.upload';//上传文档
... ...
... ... @@ -54,6 +54,7 @@ class ConferApe extends Ape {
ApeConsts.CONFERENCE_OBJ_COUNTER_NAME, ApeConsts.CONFERENCE_OBJ_COUNTER_TAG, 0, new ArrayBuffer);
this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
}
_joinSessionHandler(confInfo) {
... ... @@ -155,7 +156,6 @@ class ConferApe extends Ape {
//更新人员列表数据
rosterUpdateHandler(nodeId, nodeData) {
//loger.log("更新人员列表数据 rosterUpdateHandler");
if (nodeData.role === ApeConsts.NR_MASTER ||
nodeData.role === ApeConsts.NR_SLAVE) {
... ...
... ... @@ -18,9 +18,11 @@ import ApeConsts from './ApeConsts';
import pdu from 'pdus';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
let loger = Loger.getLoger('DocApe');
let itemIdx=0;//table插入新数据的计数id,目前用时间戳
class DocApe extends Ape {
constructor() {
super(
... ... @@ -38,21 +40,176 @@ class DocApe extends Ape {
// 延迟
this._apeDelayed = true;
}
/////////////发送数据操作//////////////////////////////////////////////////////
//上传文档
documentUpload(paramInfo){
if(paramInfo==null||EngineUtils.isEmptyObject(paramInfo)){
loger.log('documentUpload失败,参数错误');
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return ;
}
itemIdx=parseInt(Date.now()/1000);
let docDataModelPdu = this.packPdu(paramInfo,itemIdx);
if(docDataModelPdu==null){
loger.log('documentUpload失败,参数错误');
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return ;
}
console.log(docDataModelPdu);
let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
tableItemPdu.itemIdx=itemIdx;//直接用时间戳作为id
tableItemPdu.registerObjId=ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定
tableItemPdu.itemData =docDataModelPdu.toArrayBuffer();
//insert
let tableInsertItemPdu = new pdu['RCRegistryTableInsertItemPdu'];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
//repeated RCRegistryTableItemPdu items = 2;
tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_INSERT_PDU;//
tableInsertItemPdu.items.push(tableItemPdu);
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
updateObjPdu.subType = tableInsertItemPdu.type;
updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
//同步
let adapterItemPdu = new pdu['RCAdapterItemPdu'];
adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
console.log("文档upload tableItemPdu.itemIdx="+tableItemPdu.itemIdx);
this.sendUniform(adapterPdu,true);
}
//切换文档
documentSwitch(paramInfo){
}
//操作文档(翻页、缩放、滚动...)
documentCommand(paramInfo){
}
//删除文档
documentDelete(paramInfo){
//{"itemIdx":itemIdx}
let tableDeleteItemPdu = new pdu['RCRegistryTableDeleteItemPdu'];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_DELETE_PDU];
// repeated uint32 item_idx = 2;
tableDeleteItemPdu.type = pdu.RCPDU_REG_TABLE_DELETE_PDU;//
tableDeleteItemPdu.itemIdx=parseInt(paramInfo.itemIdx);//这里需要设置要删除的数据的itemIdx,每条数据的这个id都不一样
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
updateObjPdu.subType = tableDeleteItemPdu.type;
updateObjPdu.userData = tableDeleteItemPdu.toArrayBuffer();
//同步
let adapterItemPdu = new pdu['RCAdapterItemPdu'];
adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
console.log("文档发送删除数据============="+tableDeleteItemPdu.itemIdx);
this.sendUniform(adapterPdu,true);
}
///////白板数据的封包和解包/////////////////////////////////////////
packPdu(_param,_itemIdx){
//验证坐标点集合数组是否合法
if(_param.pointGroup==null||_param.pointGroup.length<1){
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
/* required uint32 item_idx=1;//唯一标识
required uint32 owner=2;
optional uint32 from=3;
optional uint32 cur_page_no=4;
optional uint32 page_num =5;
required string filetype=6;
required string doc_type=7;
required string relative_url=8;//文档相对地址
optional string url =9;//文档地址
optional uint32 cur_V=10;
optional uint32 cur_H=11;
optional uint32 scale=12;
optional bool visible=13;
optional uint32 action=14;//0,无操作, 1翻页、2.显示/隐藏
optional string id=15;//文档在服务器数据库中的唯一id*/
//判断type类型,根据type设置不同的参数
let docModelPdu =new pdu['RCDocSendDataModel'];
docModelPdu.itemIdx=_itemIdx;
docModelPdu.owner=GlobalConfig.nodeId;
docModelPdu.from=GlobalConfig.nodeId;
docModelPdu.curPageNo = 1;
docModelPdu.pageNum =10;
docModelPdu.fileType=_param.fileType||"";
docModelPdu.docType="pdf2swf";
docModelPdu.url = "http://101.200.150.192/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg";
docModelPdu.relativeUrl="/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg";
docModelPdu.curV=0;
docModelPdu.curH=0;
docModelPdu.scale=1;
docModelPdu.visible=false;
docModelPdu.action=0;//0,无操作, 1翻页、2.显示/隐藏
docModelPdu.id=_param.id||"";//文档在服务器数据库中的唯一id
return docModelPdu;
}
unPackPdu(owner, itemIdx,itemData){
this.docList[itemIdx] = itemData;
try{
console.log("文档收到数据===unPackPdu ");
let docModelPdu= pdu['RCDocSendDataModel'].decode(itemData);
//console.log(whiteBoardModelPdu);
loger.log(docModelPdu);
return docModelPdu;
}catch (err){
console.log("unPackPdu Pdu解析错误,itemIdx="+itemIdx+" err:"+err.message);
}
return null;
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
tableInsertHandler(owner, itemIdx, itemData) {
//this.tableUpdateHandler(owner, tableId, itemData);
let itemDataInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
//loger.log('tableInsertHandler---',itemData);
let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
loger.log('tableInsertHandler',itemDataInfo);
}
tableDeleteHandler(itemIdx, itemData){
tableDeleteHandler(object_id, tableDeleteData){
/*const re={};
re.type=ApeConsts.DOCUMENT_DEL;
this._emit(MessageTypes.DOC_DELETE, re);*/
loger.log('tableDeleteHandler',object_id,tableDeleteData);//["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
if(tableDeleteData&&tableDeleteData.itemIdx){
let len=tableDeleteData.itemIdx.length;
let itemIdxs=tableDeleteData.itemIdx;
for (let i=0;i<len;i++){
if(this.docList[itemIdxs[i]]){
delete this.docList[itemIdxs[i]];
loger.log("删除文档数据:",itemIdxs[i],"当前剩余的文档数据",this.docList);
}
}
}
}
tableUpdateHandler(owner, itemIdx, itemData) {
let itemDataInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
//let itemDataInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
loger.log('tableUpdateHandler',itemDataInfo);
/*try {
const recordInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
... ...
... ... @@ -45,16 +45,30 @@ class VideoChat extends Ape {
// ape listeners
this.on(pdu.RCPDU_VIDEO_SEND_DATA_REQUEST, this.videoIncomingHandler.bind(this));
}
/////////////发送数据操作//////////////////////////////////////////////////////
//获取播流地址
getPlayVideoPath(_param){
loger.log('getPlayVideoPath');
return {"code":0,"data":"播放流地址XXXXXXXXXXXXXXXXXXXXX"};
}
//获取推流地址
getPublishVideoPath(_param){
loger.log('getPublishVideoPath');
return {"code":0,"data":"推流地址XXXXXXXXXXXXXXXXXXXXXXX"};
}
//推流
publishVideo(_param){
loger.log('publishVideo');
}
//停止推流
stopPublishVideo(_param){
loger.log('stopPublishVideo.');
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
// 视频消息处理
videoIncomingHandler(videoBuffer) {
let videoReceivePdu = pdu['VideoSendDataRequestPdu'].decode(videoBuffer);
... ...
... ... @@ -261,8 +261,8 @@ class WhiteBoardApe extends Ape {
whiteBoardModelPdu.type =_param.type;
whiteBoardModelPdu.itemIdx =_itemIdx;
whiteBoardModelPdu.initiator =GlobalConfig.nodeId;
whiteBoardModelPdu.parentId=ApeConsts.WHITEBOARD_OBJ_TABLE_ID;
whiteBoardModelPdu.pageNum=_param.pageNum||1;
whiteBoardModelPdu.parentId=_param.parentId||0;
whiteBoardModelPdu.curPage=_param.curPage||1;
whiteBoardModelPdu.pointGroup =EngineUtils.arrayToJsonString(_param.pointGroup);
whiteBoardModelPdu.color=_param.color||"#000000";
... ... @@ -274,7 +274,9 @@ class WhiteBoardApe extends Ape {
console.log("白板收到数据===unPackPdu ");
let whiteBoardModelPdu= pdu['RCWhiteBoardDataModel'].decode(itemData);
//console.log(whiteBoardModelPdu);
loger.log(whiteBoardModelPdu);
//loger.log(whiteBoardModelPdu);
let _pointGroup= EngineUtils.arrayFromJsonString(whiteBoardModelPdu.pointGroup);
whiteBoardModelPdu.pointGroup=_pointGroup;
return whiteBoardModelPdu;
}catch (err){
console.log("unPackPdu Pdu解析错误,itemIdx="+itemIdx+" err:"+err.message);
... ... @@ -300,6 +302,7 @@ class WhiteBoardApe extends Ape {
}*/
let whiteBoardModel=this.unPackPdu(owner, itemIdx,itemData);
loger.log('tableInsertHandler',whiteBoardModel);
this._emit(MessageTypes.WHITEBOARD_ANNOTAION_INSERT,whiteBoardModel);
}
tableUpdateHandler(owner, itemIdx, itemData) {
... ... @@ -332,6 +335,8 @@ class WhiteBoardApe extends Ape {
} else {
loger.log('白板动作忽略,类型:', ApeConsts(recordInfo.type));
}*/
this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE,whiteBoardModel);
}
tableDeleteHandler(object_id, tableDeleteData){
// console.log("白板收到数据,tableDeleteHandler object_id="+object_id);//((18<< 16) + 1)=1179649
... ... @@ -341,8 +346,10 @@ class WhiteBoardApe extends Ape {
let itemIdxs=tableDeleteData.itemIdx;
for (let i=0;i<len;i++){
if(this.annoInfos[itemIdxs[i]]){
loger.log("删除白板数据:",itemIdxs[i],"当前剩余的白板数据");
console.log(this.annoInfos); this._emit(MessageTypes.WHITEBOARD_ANNOTAION_DELETE,{ "itemIdx":itemIdxs[i]});
this._emit(MessageTypes.WHITEBOARD_ANNOTAION_DELETE,{ "itemIdx":itemIdxs[i]});
delete this.annoInfos[itemIdxs[i]];
loger.log("删除白板数据:",itemIdxs[i],"当前剩余的白板数据",this.annoInfos);
}
}
}
... ...
... ... @@ -12,6 +12,7 @@ import ConferApe from 'apes/ConferApe';
import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import Base64 from 'base64-js';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
let loger = Loger.getLoger('MCU');
... ... @@ -161,7 +162,7 @@ class MCU extends Emiter {
_confInfo.confId = parseInt(_confInfo.confId); // confId 必须整形
this.confInfo = _confInfo;
// 创建刷新nodeId
this.confInfo.nodeId = parseInt(Date.now() / 1000);
this.confInfo.nodeId =EngineUtils.generateNodeID();
GlobalConfig.nodeId=this.confInfo.nodeId;//这是标识自己身份的id
let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
... ...
... ... @@ -701,19 +701,35 @@ message RCChatSendDataRequestPdu {
}
message RCDocSendDataRequestPdu {
required int32 id = 1;
required uint32 id = 1;
required string doc_type = 2;
required string uri = 3;
optional int32 owner = 4;
optional int32 from = 5;
optional uint32 owner = 4;
optional uint32 from = 5;
optional string name = 6;
optional int32 cur_page_no = 7;
optional int32 cur_H = 8;
optional int32 cur_V = 9;
optional int32 scale = 10;
optional int32 page_num = 11;
optional uint32 cur_page_no = 7;
optional uint32 cur_H = 8;
optional uint32 cur_V = 9;
optional uint32 scale = 10;
optional uint32 page_num = 11;
}
message RCDocSendDataModel {
required uint32 item_idx=1;//唯一标识
required uint32 owner=2;
optional uint32 from=3;
optional uint32 cur_page_no=4;
optional uint32 page_num =5;
required string file_type=6;
required string doc_type=7;
required string relative_url=8;//文档相对地址
optional string url =9;//文档地址
optional uint32 cur_V=10;
optional uint32 cur_H=11;
optional uint32 scale=12;
optional bool visible=13;
optional uint32 action=14;//0,无操作, 1翻页、2.显示/隐藏
optional string id=15;//文档在服务器数据库中的唯一id
}
message RCGiftSendDataRequestPdu {
optional uint32 initiator = 1;
required uint32 peer = 2;
... ... @@ -834,7 +850,7 @@ message RCWhiteBoardDataModel {
required uint32 itemIdx= 2;//itemIdx 每一次绘制的唯一标识
required uint32 initiator=3; //绘制来自谁
required uint32 parentId=4; //父级的id
required uint32 pageNum= 5;//页码
required uint32 curPage= 5;//页码
optional string pointGroup=6; //坐标点集数组的JSON字符串
optional string color=7 [default = "#000000"]; //颜色
optional uint32 thickness= 8 ;//线条粗细
... ...