李勇

1.修改文档pdu数据结构,测试文档对外接口

2.白板模块消息去掉3秒延迟
... ... @@ -116,6 +116,7 @@ export default class MessageEntrance extends Emiter {
this.sendDocumentUpload= this._sendDocumentUpload;//上传文档
this.sendDocumentSwitch= this._sendDocumentSwitch; //切换文档
this.sendDocumentDelete= this. _sendDocumentDelete;//删除文档
this.sendDocumentDeleteAll= this._documentDeleteAll;//删除所有文档
this.sendDocumentCommand= this._sendDocumentCommand;//操作文档(翻页、缩放、滚动...)
//debug
... ... @@ -371,6 +372,13 @@ export default class MessageEntrance extends Emiter {
_doc_ape.documentDelete(_param);
}
}
//删除所有文档
_documentDeleteAll(_param){
if(_doc_ape){
_doc_ape.documentDeleteAll(_param);
}
}
//操作文档(翻页、缩放、滚动...)
_sendDocumentCommand(_param){
if(_doc_ape){
... ...
... ... @@ -62,7 +62,7 @@ export default class Ape extends Emiter {
// 消息处理
_pduMessageHandler(regBuffer) {
console.log("RCPDU_REG_ADAPTER==========================================");
console.log("RCPDU_REG_ADAPTER==========================================this._apeDelayed",this._apeDelayed,this._confInfo['mcuDelay']);
if (this._apeDelayed) {
// this._apeDelayedMsgs.push(regBuffer);
// this._apeDelayedStart();
... ... @@ -98,7 +98,7 @@ export default class Ape extends Emiter {
let regPdu = pdu['RCAdapterPdu'].decode(regBuffer);
let regItems = regPdu.item;
let regItemSize = regItems.length;
loger.log(this._session_name + '数据同步消息');
//loger.log(this._session_name + '数据同步消息');
loger.log(this._session_name + '数据同步消息.同步条数', regItemSize);
//console.log(regPdu);
... ... @@ -124,7 +124,7 @@ export default class Ape extends Emiter {
let object_id = regUpdatedItem.objId;
let user_data = regUpdatedItem.userData;
loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type),regUpdatedItem);
loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type));
switch (sub_type) {
case pdu.RCPDU_REG_ROSTER_INSERT_PDU:
let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data);
... ...
... ... @@ -33,10 +33,18 @@ class ConferApe extends Ape {
);
// Attribures
this.hostNodeId = -1;
this.hostUserId = '';
this.rosters = {};
this.activeDocId = '';
this.hostNodeId = -1;//主持人的nodeId
// 用户的身份,5种类型:
// host(主持人/老师)
// presenter(主讲人)
// assistant(助教)
// normal(普通角色/学生)
// record(暂时没用.
// 默认值: normal
this.hostUserId = '';//主持人的 第三方userId
this.rosters = {};//用户列表
this.activeDocId =0;//当前激活的文档ID
this.activeDocCurPage=1;//当前激活的文档的当前页
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
... ... @@ -136,7 +144,7 @@ class ConferApe extends Ape {
const uncompressedBytes = new Zlib.Inflate(tabUpdatePdu.action.compact().view).decompress();
let tabInfo = UTF8.getStringFromBytes(uncompressedBytes);
let tabTypeMatches = tabInfo.match(/<TabType>(.+)<\/TabType>/);
loger.log("更新列表数据 tableUpdateHandler",tabInfo);
loger.log("更新列表数据 tableUpdateHandler","owner:"+owner, "itemIdx:"+itemIdx,"tabInfo:",tabInfo);
if (tabTypeMatches.length > 1 && tabTypeMatches[1] == 'show.docsharing') {
if (tabInfo.match(/<visible>(.+)<\/visible>/)[1] == 'true') {
this.activeDocId = tabInfo.match(/<TabID>(.+)<\/TabID>/)[1];
... ...
... ... @@ -30,12 +30,13 @@ class DocApe extends Ape {
ApeConsts.DOCSHARING_SESSION_NAME,
ApeConsts.DOCSHARING_SESSION_TAG
);
this.docList = {};
this.docList = {};//记录文档的数组this.docList[itemIdx]=itemIdx的数据
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5, ApeConsts.DOCSHARING_OBJ_TABLE_NAME_H5, ApeConsts.DOCSHARING_OBJ_TABLE_TAG_H5, 0, new ArrayBuffer);
this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.DOCSHARING_OBJ_TABLE_ID, ApeConsts.DOCSHARING_OBJ_TABLE_NAME, ApeConsts.DOCSHARING_OBJ_TABLE_TAG, 0, new ArrayBuffer);
//this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5, ApeConsts.DOCSHARING_OBJ_TABLE_NAME_H5, ApeConsts.DOCSHARING_OBJ_TABLE_TAG_H5, 0, new ArrayBuffer);
// 延迟
this._apeDelayed = true;
... ... @@ -56,11 +57,11 @@ class DocApe extends Ape {
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return ;
}
console.log(docDataModelPdu);
//console.log(docDataModelPdu);
let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
tableItemPdu.itemIdx=itemIdx;//直接用时间戳作为id
tableItemPdu.registerObjId=ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
tableItemPdu.registerObjId=ApeConsts.DOCSHARING_OBJ_TABLE_ID;// tableItemPdu.registerObjId=ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定
tableItemPdu.itemData =docDataModelPdu.toArrayBuffer();
... ... @@ -72,7 +73,7 @@ class DocApe extends Ape {
tableInsertItemPdu.items.push(tableItemPdu);
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID;// updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
updateObjPdu.subType = tableInsertItemPdu.type;
updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
... ... @@ -85,17 +86,89 @@ class DocApe extends Ape {
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
console.log("文档upload tableItemPdu.itemIdx="+tableItemPdu.itemIdx);
loger.log("文档upload tableItemPdu.itemIdx="+tableItemPdu.itemIdx);
this.sendUniform(adapterPdu,true);
}
updaterDoc(_docDataModel,_itemIdx){
loger.log("文档===updaterDoc ",_itemIdx);
//验证坐标点集合数组是否合法
if(_docDataModel==null||_itemIdx==null){
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
loger.log("文档===updaterDoc ",_docDataModel);
let docDataModelPdu=this.packPdu(_docDataModel,_itemIdx);
let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
tableItemPdu.itemIdx=_itemIdx;//直接用时间戳作为id
tableItemPdu.registerObjId=ApeConsts.DOCSHARING_OBJ_TABLE_ID;// tableItemPdu.registerObjId=ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定
tableItemPdu.itemData =docDataModelPdu.toArrayBuffer();
//insert
let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu'];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
//repeated RCRegistryTableItemPdu items = 2;
tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;//
tableInsertItemPdu.items.push(tableItemPdu);
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID;// 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);
loger.log("发送更新文档.itemIdx="+tableItemPdu.itemIdx);
this.sendUniform(adapterPdu,true);
}
//切换文档
documentSwitch(paramInfo){
console.log(this.docList);
//获取已经存在的数据
let docDataModel= this.docList[paramInfo.itemIdx];
if(docDataModel==null){
loger.log('documentSwitch失败,文档不存在',paramInfo);
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//更新数据的字段
docDataModel.visible=!docDataModel.visible;
this.updaterDoc(docDataModel,docDataModel.itemIdx);
}
//操作文档(翻页、缩放、滚动...)
documentCommand(paramInfo){
console.log(this.docList);
//获取已经存在的数据
let docDataModel= this.docList[paramInfo.itemIdx];
//console.log(docDataModelPdu);
//console.log(docDataModel);
if(docDataModel==null){
loger.log('documentCommand失败,文档不存在',paramInfo);
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//更新数据的字段
docDataModel.curPageNo=docDataModel.curPageNo+1;
this.updaterDoc(docDataModel,docDataModel.itemIdx);
}
//删除所有文档
documentDeleteAll(_param){
let len=0;
for (let key in this.docList){
//console.log("key:"+key);
loger.log("删除文档数据,itemIdx:"+key);
this.documentDelete({"itemIdx":key});
}
}
//删除文档
... ... @@ -108,7 +181,7 @@ class DocApe extends Ape {
tableDeleteItemPdu.itemIdx=parseInt(paramInfo.itemIdx);//这里需要设置要删除的数据的itemIdx,每条数据的这个id都不一样
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID;// updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5;
updateObjPdu.subType = tableDeleteItemPdu.type;
updateObjPdu.userData = tableDeleteItemPdu.toArrayBuffer();
... ... @@ -121,63 +194,73 @@ class DocApe extends Ape {
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
console.log("文档发送删除数据============="+tableDeleteItemPdu.itemIdx);
loger.log("文档发送删除数据============="+tableDeleteItemPdu.itemIdx);
this.sendUniform(adapterPdu,true);
}
///////白板数据的封包和解包/////////////////////////////////////////
packPdu(_param,_itemIdx){
loger.log("文档===packPdu ");
//验证坐标点集合数组是否合法
if(_param.pointGroup==null||_param.pointGroup.length<1){
if(_param==null||_itemIdx==null){
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*/
/* message RCDocSendDataModelPdu {
required uint32 item_idx=1;//唯一标识
required uint32 owner=2;
optional uint32 from=3;
optional uint32 cur_page_no=4;
optional uint32 page_num =5;
optional string file_type=6;
optional string doc_type=7;
optional 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 db_id=15;//文档在服务器数据库中的唯一id
}*/
//判断type类型,根据type设置不同的参数
let docModelPdu =new pdu['RCDocSendDataModel'];
let docModelPdu =new pdu['RCDocSendDataModelPdu'];
docModelPdu.itemIdx=_itemIdx;
docModelPdu.owner=GlobalConfig.nodeId;
docModelPdu.from=GlobalConfig.nodeId;
docModelPdu.curPageNo = 1;
docModelPdu.pageNum =10;
docModelPdu.curPageNo = _param.curPageNo||1;
docModelPdu.pageNum = _param.pageNum||1;
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
docModelPdu.docType=_param.docType||"pdf2swf";
docModelPdu.url =_param.url||"";//"http://101.200.150.192/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg";
docModelPdu.relativeUrl=_param.relativeUrl||"";//"/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg";
docModelPdu.curV=_param.curV||0;
docModelPdu.curH=_param.curH||0;
docModelPdu.scale=_param.scale||1;
docModelPdu.visible= _param.visible||false;
docModelPdu.action=_param.action||0;//0,无操作, 1翻页、2.显示/隐藏
docModelPdu.dbId=_param.dbId||"";//文档在服务器数据库中的唯一id
console.log(docModelPdu);
return docModelPdu;
}
unPackPdu(owner, itemIdx,itemData){
this.docList[itemIdx] = itemData;
loger.log("文档===unPackPdu ");
if(owner==null||itemIdx==null||itemData==null){
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
try{
console.log("文档收到数据===unPackPdu ");
let docModelPdu= pdu['RCDocSendDataModel'].decode(itemData);
let docModelPdu= pdu['RCDocSendDataModelPdu'].decode(itemData);
//console.log(whiteBoardModelPdu);
loger.log(docModelPdu);
//loger.log(docModelPdu);
return docModelPdu;
}catch (err){
console.log("unPackPdu Pdu解析错误,itemIdx="+itemIdx+" err:"+err.message);
loger.log("文档收到数据 unPackPdu Pdu解析错误,itemIdx="+itemIdx+" err:"+err.message);
}
return null;
}
... ... @@ -187,6 +270,7 @@ class DocApe extends Ape {
//this.tableUpdateHandler(owner, tableId, itemData);
//loger.log('tableInsertHandler---',itemData);
let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
this.docList[itemIdx] = itemDataInfo;
loger.log('tableInsertHandler',itemDataInfo);
}
... ... @@ -201,8 +285,8 @@ class DocApe extends Ape {
let itemIdxs=tableDeleteData.itemIdx;
for (let i=0;i<len;i++){
if(this.docList[itemIdxs[i]]){
loger.log("删除文档数据:",itemIdxs[i]);
delete this.docList[itemIdxs[i]];
loger.log("删除文档数据:",itemIdxs[i],"当前剩余的文档数据",this.docList);
}
}
}
... ... @@ -210,6 +294,31 @@ class DocApe extends Ape {
tableUpdateHandler(owner, itemIdx, itemData) {
//let itemDataInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
this.docList[itemIdx] = itemDataInfo;
if(itemDataInfo==null){
try {
let recordInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
recordInfo.type = ApeConsts.DOCUMENT_LOAD;
recordInfo.ext = recordInfo.name.substr(recordInfo.name.indexOf('.') + 1);
recordInfo.wbid = (recordInfo.id << 10) + recordInfo.curPageNo;
recordInfo.isPicture = ~['bmp', 'png', 'gif', 'jpg', 'jpeg'].indexOf(recordInfo.ext);
if (recordInfo.isPicture) {
recordInfo.namePath = recordInfo.uri.substring(0, recordInfo.uri.lastIndexOf('.'));
recordInfo.loadURL = recordInfo.namePath + '.' + recordInfo.ext;
} else {
recordInfo.namePath = recordInfo.uri.substring(0, recordInfo.uri.lastIndexOf('/'));
recordInfo.loadURL = `${recordInfo.namePath}/${recordInfo.curPageNo}.jpg`;
}
this.docList[itemIdx] = recordInfo;
// this.emit(MessageTypes.DOC_UPDATE, recordInfo);
loger.log('Doc update ->' + itemIdx,recordInfo);
} catch (e) {
loger.warn('Doc Table Update Decode包异常');
}
return;
}
loger.log('tableUpdateHandler',itemDataInfo);
/*try {
const recordInfo = pdu['RCDocSendDataRequestPdu'].decode(itemData);
... ...
... ... @@ -48,10 +48,12 @@ class WhiteBoardApe extends Ape {
ApeConsts.WHITEBOARD_OBJ_TABLE_NAME, ApeConsts.WHITEBOARD_OBJ_TABLE_TAG, 0, new ArrayBuffer);
// ape listeners
this.on(pdu.RCPDU_CONFERENCE_SEND_DATA_REQUEST, this.whiteboardMsgComingHandler.bind(this));
this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
// 白板延迟
this._apeDelayed = true;
//this.on(pdu.RCPDU_CONFERENCE_SEND_DATA_REQUEST, this.whiteboardMsgComingHandler.bind(this));//这个是会议消息类型,flash里在使用这里不再使用,各个模块的消息由模块自己来处理
// 白板延迟
//this._apeDelayed = true;
}
_joinSessionHandler(confInfo) {
... ... @@ -83,7 +85,7 @@ class WhiteBoardApe extends Ape {
return ;
}
itemIdx=parseInt(Date.now()/1000);
itemIdx=EngineUtils.generateNodeID();
let whiteBoardModelPdu = this.packPdu(_param,itemIdx);
if(whiteBoardModelPdu==null){
loger.log('sendInsetAnnotaion失败,参数错误');
... ... @@ -119,15 +121,15 @@ class WhiteBoardApe extends Ape {
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
console.log("白板insert数据======111111111111=tableItemPdu.itemIdx="+tableItemPdu.itemIdx);
console.log("添加白板数据=====itemIdx="+tableItemPdu.itemIdx);
this.sendUniform(adapterPdu,true);
}
//删除所有标注
sendDeleteAllAnnotation(_param){
let len=0;
for (let key in this.annoInfos){
console.log("key:"+key);
console.log("删除白板数据,itemIdx:"+this.annoInfos[key]);
//console.log("key:"+key);
console.log("删除白板数据,itemIdx:"+key);
this.sendDeleteAnnotaion({"itemIdx":key});
}
}
... ... @@ -285,10 +287,14 @@ class WhiteBoardApe extends Ape {
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
whiteboardMsgComingHandler(pdu) {
loger.warn('whiteboardMsgComingHandler needs to be handled.');
const recordInfo = pdu['RCWhiteboardDataRequestPdu'].decode(pdu);
loger.log("whiteboardMsgComingHandler",recordInfo);
whiteboardMsgComingHandler(_data) {
//flash RCConferenceSendDataRequestPdu
//loger.warn('whiteboardMsgComingHandler needs to be handled.');
//const recordInfo = pdu['RCWhiteboardDataRequestPdu'].decode(pdu);
//loger.log("whiteboardMsgComingHandler",recordInfo);
let receiveInfo = pdu['RCConferenceSendDataRequestPdu'].decode(_data);
loger.log("whiteboardMsgComingHandler",receiveInfo);
}
tableInsertHandler(owner, itemIdx,itemData) {
... ...
... ... @@ -713,22 +713,22 @@ message RCDocSendDataRequestPdu {
optional uint32 scale = 10;
optional uint32 page_num = 11;
}
message RCDocSendDataModel {
message RCDocSendDataModelPdu {
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 file_type=6;
optional string doc_type=7;
optional 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
optional string db_id=15;//文档在服务器数据库中的唯一id
}
message RCGiftSendDataRequestPdu {
optional uint32 initiator = 1;
... ...