李勇

新增媒体共享模块

此 diff 太大无法显示。
@@ -25,11 +25,12 @@ import Base64 from 'base64-js'; @@ -25,11 +25,12 @@ import Base64 from 'base64-js';
25 import ArrayBufferUtil from 'libs/ArrayBufferUtil'; 25 import ArrayBufferUtil from 'libs/ArrayBufferUtil';
26 import Server from "config/Server"; 26 import Server from "config/Server";
27 import MediaModule from 'apes/MediaModule'; 27 import MediaModule from 'apes/MediaModule';
  28 +import MediaSharedApe from 'apes/MediaSharedApe';
28 29
29 import UTF8 from 'utf-8'; 30 import UTF8 from 'utf-8';
30 31
31 let loger = Loger.getLoger('McuClient'); 32 let loger = Loger.getLoger('McuClient');
32 -let _sdkInfo = {"version": "v1.29.8.20170601", "author": "www.3mang.com"}; 33 +let _sdkInfo = {"version": "v1.30.3.20170602", "author": "www.3mang.com"};
33 34
34 //APE 35 //APE
35 let _sass; 36 let _sass;
@@ -42,6 +43,7 @@ let _audio_ape; @@ -42,6 +43,7 @@ let _audio_ape;
42 let _doc_ape; 43 let _doc_ape;
43 let _whiteboard_ape; 44 let _whiteboard_ape;
44 let _recordPlayback; 45 let _recordPlayback;
  46 +let _mediaShareApe;
45 47
46 //MCUClient 外部实例化主类 48 //MCUClient 外部实例化主类
47 export default class MessageEntrance extends Emiter { 49 export default class MessageEntrance extends Emiter {
@@ -72,6 +74,7 @@ export default class MessageEntrance extends Emiter { @@ -72,6 +74,7 @@ export default class MessageEntrance extends Emiter {
72 _sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS, this._sassSaveClassStatusInfoSuccessHandler.bind(this));//保存课堂状态信息 74 _sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS, this._sassSaveClassStatusInfoSuccessHandler.bind(this));//保存课堂状态信息
73 _sass.on(_sass.CLASS_SAVE_RECORD_INFO_SUCCESS, this._sassSaveClassRecordInfoSuccessHandler.bind(this));//保存课堂录制信息 75 _sass.on(_sass.CLASS_SAVE_RECORD_INFO_SUCCESS, this._sassSaveClassRecordInfoSuccessHandler.bind(this));//保存课堂录制信息
74 _sass.on(_sass.DELETE_DOCUMENT_SUCCESS, this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功 76 _sass.on(_sass.DELETE_DOCUMENT_SUCCESS, this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功
  77 + _sass.on(_sass.DELETE_MEDIASHARE_SUCCESS, this._sassDeleteMediaShareSuccess.bind(this));//sass删除媒体文件成功
75 78
76 //选点模块 79 //选点模块
77 _ipManager = new IpManager(); 80 _ipManager = new IpManager();
@@ -115,9 +118,12 @@ export default class MessageEntrance extends Emiter { @@ -115,9 +118,12 @@ export default class MessageEntrance extends Emiter {
115 _audio_ape.on(MessageTypes.AUDIO_UPDATE, this.audioUpdate.bind(this));//这个监听事件不能删除,需要通知课堂模块,检查channel占用 118 _audio_ape.on(MessageTypes.AUDIO_UPDATE, this.audioUpdate.bind(this));//这个监听事件不能删除,需要通知课堂模块,检查channel占用
116 _audio_ape.on(MessageTypes.USER_DEVICE_STATUS_CHAANGE, this.userDeviecStatusChange.bind(this));//监听摄像头和麦克风的开启状态 119 _audio_ape.on(MessageTypes.USER_DEVICE_STATUS_CHAANGE, this.userDeviecStatusChange.bind(this));//监听摄像头和麦克风的开启状态
117 120
  121 + _mediaShareApe=new MediaSharedApe();
  122 + _mediaShareApe.on('*', (type, data) => this._emit(type, data));
  123 + _mediaShareApe.on(MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS, this.mediaShareApeJoinChannelSuccess.bind(this));
  124 +
118 _whiteboard_ape = new WhiteBoardApe(); 125 _whiteboard_ape = new WhiteBoardApe();
119 _whiteboard_ape.on('*', (type, data) => this._emit(type, data)); 126 _whiteboard_ape.on('*', (type, data) => this._emit(type, data));
120 - //_whiteboard_ape.on(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE, this.annoUpdateHandler.bind(this));  
121 127
122 _doc_ape = new DocApe(); 128 _doc_ape = new DocApe();
123 _doc_ape.on('*', (type, data) => this._emit(type, data)); 129 _doc_ape.on('*', (type, data) => this._emit(type, data));
@@ -193,6 +199,16 @@ export default class MessageEntrance extends Emiter { @@ -193,6 +199,16 @@ export default class MessageEntrance extends Emiter {
193 this.getDocFullAddress = this._getDocFullAddress.bind(this);//获取文档资源地址 199 this.getDocFullAddress = this._getDocFullAddress.bind(this);//获取文档资源地址
194 200
195 201
  202 + //媒体共享模块
  203 + this.mediaSharedUpload = this._sendMediaSharedUpload.bind(this);//上传
  204 + this.mediaSharedDelete = this._sassDeletMediaShare.bind(this);//删除,先通过Sass删除,删除成功之后才删除MCU的
  205 +
  206 + this.mediaSharedPlay = this._sendMediaSharedPlay.bind(this); //播放
  207 + this.mediaSharedStop = this._sendMediaSharedStop.bind(this);//停止
  208 + this.mediaSharedPause=this._sendMediaSharedPause.bind(this);//暂停
  209 + this.mediaSharedSeek=this._sendMediaSharedSeek.bind(this);//seek
  210 +
  211 +
196 this.setDeviceInfo = this._setDeviceInfo.bind(this);//设置设备信息(麦克风,摄像头等等.....) 212 this.setDeviceInfo = this._setDeviceInfo.bind(this);//设置设备信息(麦克风,摄像头等等.....)
197 this.setMessageDelay = this._setMessageDelay.bind(this);//设置是否延迟消息 213 this.setMessageDelay = this._setMessageDelay.bind(this);//设置是否延迟消息
198 this.switchServer = this._switchMcuIpHandler.bind(this);//切换mcu服务器 214 this.switchServer = this._switchMcuIpHandler.bind(this);//切换mcu服务器
@@ -501,6 +517,8 @@ export default class MessageEntrance extends Emiter { @@ -501,6 +517,8 @@ export default class MessageEntrance extends Emiter {
501 GlobalConfig.setMusicList(_data.musicList);// 517 GlobalConfig.setMusicList(_data.musicList);//
502 GlobalConfig.setMusicListPrepare(_data.musicListPrepare);//提前上传的声音文件列表 518 GlobalConfig.setMusicListPrepare(_data.musicListPrepare);//提前上传的声音文件列表
503 GlobalConfig.setVideoCDNAddr(_data.videoCDNAddr);//cdn加速的拉流地址,直播的时候才使用 519 GlobalConfig.setVideoCDNAddr(_data.videoCDNAddr);//cdn加速的拉流地址,直播的时候才使用
  520 + GlobalConfig.setMediaShareList(_data.sharedMediaList); //提前上传的媒体共享文件列表
  521 +
504 522
505 //MCU地址 523 //MCU地址
506 if (_data.mcuList && _data.mcuList.length > 0) { 524 if (_data.mcuList && _data.mcuList.length > 0) {
@@ -970,7 +988,7 @@ export default class MessageEntrance extends Emiter { @@ -970,7 +988,7 @@ export default class MessageEntrance extends Emiter {
970 } 988 }
971 989
972 990
973 - //Sass删除文档数据 991 + //先通过Sass删除文档数据,删除成功之后才能删除MCU的
974 _sassDeleteDocument(_param) { 992 _sassDeleteDocument(_param) {
975 if (!_mcu.connected) { 993 if (!_mcu.connected) {
976 loger.warn(GlobalConfig.getCurrentStatus()); 994 loger.warn(GlobalConfig.getCurrentStatus());
@@ -1011,6 +1029,10 @@ export default class MessageEntrance extends Emiter { @@ -1011,6 +1029,10 @@ export default class MessageEntrance extends Emiter {
1011 loger.log('删除文档成功->', _param); 1029 loger.log('删除文档成功->', _param);
1012 this._sendDocumentDelete(_param); 1030 this._sendDocumentDelete(_param);
1013 } 1031 }
  1032 + _sassDeleteMediaShareSuccess(_param){
  1033 + loger.log('删除媒体文件成功->', _param);
  1034 + this._sendMediaSharedDelete(_param);
  1035 + }
1014 1036
1015 //ConferApe 1037 //ConferApe
1016 //开始上课 1038 //开始上课
@@ -1465,6 +1487,120 @@ export default class MessageEntrance extends Emiter { @@ -1465,6 +1487,120 @@ export default class MessageEntrance extends Emiter {
1465 } 1487 }
1466 } 1488 }
1467 1489
  1490 + //媒体共享模块的接口
  1491 + //上传
  1492 + _sendMediaSharedUpload(_param){
  1493 + if (!_mcu.connected) {
  1494 + loger.warn(GlobalConfig.getCurrentStatus());
  1495 + return;
  1496 + }
  1497 + if (_mediaShareApe) {
  1498 + _mediaShareApe.mediaSharedUpload(_param);
  1499 + }
  1500 + }
  1501 + //Sass删除媒体文件数据
  1502 + _sassDeletMediaShare(_param){
  1503 + if (!_mcu.connected) {
  1504 + loger.warn(GlobalConfig.getCurrentStatus());
  1505 + return;
  1506 + }
  1507 +
  1508 + //判断传入的参数是否存在
  1509 + if (_param == null || EngineUtils.isEmptyObject(_param)) {
  1510 + loger.error('删除媒体文件失败->参数错误', _param);
  1511 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED_PARAM);
  1512 + return;
  1513 + }
  1514 + //判断必要的参数字段值
  1515 + if (_param.itemIdx == null || isNaN(_param.itemIdx) || _param.fileId == null || _param.fileId == "") {
  1516 + loger.error('删除媒体文件失败->', _param);
  1517 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED_PARAM);
  1518 + return;
  1519 + }
  1520 + loger.log('删除媒体文件->', _param);
  1521 +
  1522 + if (_sass) {
  1523 + _sass.sassDeletMediaShare(_param);
  1524 + }
  1525 + }
  1526 + //删除
  1527 + _sendMediaSharedDelete(_param){
  1528 + if (!_mcu.connected) {
  1529 + loger.warn(GlobalConfig.getCurrentStatus());
  1530 + return;
  1531 + }
  1532 + if (_mediaShareApe) {
  1533 + _mediaShareApe.mediaSharedDelete(_param);
  1534 + }
  1535 + }
  1536 + //播放
  1537 + _sendMediaSharedPlay(_param){
  1538 + if (!_mcu.connected) {
  1539 + loger.warn(GlobalConfig.getCurrentStatus());
  1540 + return;
  1541 + }
  1542 + if (_mediaShareApe) {
  1543 + _mediaShareApe.mediaSharedDelete(_param);
  1544 + }
  1545 + }
  1546 + //停止
  1547 + _sendMediaSharedStop(_param){
  1548 + if (!_mcu.connected) {
  1549 + loger.warn(GlobalConfig.getCurrentStatus());
  1550 + return;
  1551 + }
  1552 + if (_mediaShareApe) {
  1553 + _mediaShareApe.mediaSharedStop(_param);
  1554 + }
  1555 + }
  1556 + //暂停
  1557 + _sendMediaSharedPause(_param){
  1558 + if (!_mcu.connected) {
  1559 + loger.warn(GlobalConfig.getCurrentStatus());
  1560 + return;
  1561 + }
  1562 + if (_mediaShareApe) {
  1563 + _mediaShareApe.mediaSharedPause(_param);
  1564 + }
  1565 + }
  1566 + //seek
  1567 + _sendMediaSharedSeek(_param){
  1568 + if (!_mcu.connected) {
  1569 + loger.warn(GlobalConfig.getCurrentStatus());
  1570 + return;
  1571 + }
  1572 + if (_mediaShareApe) {
  1573 + _mediaShareApe.mediaSharedSeek(_param);
  1574 + }
  1575 + }
  1576 +
  1577 + //媒体共享模块加入频道成功,同步到MCU服务器上的数据
  1578 + mediaShareApeJoinChannelSuccess() {
  1579 + loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMediaList.length);
  1580 + console.log("媒体共享模数据->", GlobalConfig.sharedMediaList);
  1581 + //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
  1582 + /* if (GlobalConfig.isHost && GlobalConfig.sharedMediaList.length > 0) {
  1583 + for (let i = 0; i < GlobalConfig.sharedMediaList.length; i++) {
  1584 + let value = GlobalConfig.sharedMediaList[i];
  1585 + if (value) {
  1586 + //loger.log("判断是否需要把提前上传的文档上传到mcu", value);
  1587 + let paramInfo = {
  1588 + "pageNum": value.pdfSize,
  1589 + "fileName": value.name,
  1590 + "fileType": value.type,
  1591 + "relativeUrl": value.relativeLocation,
  1592 + "url": value.absoluteLocation,
  1593 + "creatUserId": value.createUserID,
  1594 + "docId": value.id,
  1595 + "md5": value.MD5,
  1596 + "visible": false
  1597 + };
  1598 + this._sendDocumentUpload(paramInfo);
  1599 + }
  1600 + }
  1601 + }*/
  1602 + }
  1603 +
1468 //录制回放相关的处理------------------------------------------------ 1604 //录制回放相关的处理------------------------------------------------
1469 //录制回放初始化 1605 //录制回放初始化
1470 _initRecordPlayback(_param) { 1606 _initRecordPlayback(_param) {
@@ -185,6 +185,15 @@ class GlobalConfig { @@ -185,6 +185,15 @@ class GlobalConfig {
185 static getDocListPrepare(){ 185 static getDocListPrepare(){
186 return this.docListPrepare; 186 return this.docListPrepare;
187 } 187 }
  188 + //储存已经提前上传的媒体共享文件列表
  189 + static setMediaShareList(_data){
  190 + if(_data==null) return;
  191 + this.sharedMediaList=_data;
  192 + }
  193 + static getMediaShareList(){
  194 + return this.sharedMediaList;
  195 + }
  196 +
188 //储存录制列表 197 //储存录制列表
189 static setRecordList(_data){ 198 static setRecordList(_data){
190 if(_data==null) return; 199 if(_data==null) return;
@@ -404,11 +413,15 @@ GlobalConfig.msDynamicChooseIpDelay=15;//(秒)MS动态选点的间隔 @@ -404,11 +413,15 @@ GlobalConfig.msDynamicChooseIpDelay=15;//(秒)MS动态选点的间隔
404 GlobalConfig.activeDocId=0;//当前激活的文档ID 413 GlobalConfig.activeDocId=0;//当前激活的文档ID
405 GlobalConfig.activeDocCurPage=1;//当前激活的文档的当前页 414 GlobalConfig.activeDocCurPage=1;//当前激活的文档的当前页
406 415
  416 +GlobalConfig.activeMediaId=0;//当前显示的媒体文件的id
  417 +GlobalConfig.activeMediaSeek=1;//当前的媒体文件的播放进度seek点
  418 +
407 419
408 GlobalConfig.classAllParam={};//Sass直接返回的所有课堂信息(最全) 420 GlobalConfig.classAllParam={};//Sass直接返回的所有课堂信息(最全)
409 GlobalConfig.classDetail={};//Sass直接返回的当前课堂基本信息 421 GlobalConfig.classDetail={};//Sass直接返回的当前课堂基本信息
410 422
411 //从Sass获取的 423 //从Sass获取的
  424 +GlobalConfig.sharedMediaList=[]; // 已经提前上传的媒体文件列表,进入课堂后需要自动加载
412 GlobalConfig.docListPrepare=[]; // 已经提前上传的文档,进入课堂后需要自动加载 425 GlobalConfig.docListPrepare=[]; // 已经提前上传的文档,进入课堂后需要自动加载
413 GlobalConfig.recordList=[];//录制服务器地址集合 426 GlobalConfig.recordList=[];//录制服务器地址集合
414 GlobalConfig.docList=[];//文档服务器地址集合 427 GlobalConfig.docList=[];//文档服务器地址集合
@@ -84,19 +84,13 @@ MessageTypes.DOC_DELETE="document_delete";//'document.delete';//鍒犻櫎鏂囨。 @@ -84,19 +84,13 @@ MessageTypes.DOC_DELETE="document_delete";//'document.delete';//鍒犻櫎鏂囨。
84 MessageTypes.DOC_UPDATE ="document_update";// 'document.update';//更新文档(添加、变更) 84 MessageTypes.DOC_UPDATE ="document_update";// 'document.update';//更新文档(添加、变更)
85 MessageTypes.DOC_BROADCAST= "doc_broadcast";// 85 MessageTypes.DOC_BROADCAST= "doc_broadcast";//
86 86
87 -//MessageTypes.DOC_SHOW = 'document.show';  
88 -//MessageTypes.DOC_UPLOAD='document.upload';//上传文档  
89 -//MessageTypes.DOC_COMMAND='document.command';//操作文档  
90 -//MessageTypes.DOC_SWITCH = 'document.switch';//切换文档  
91 -//MessageTypes.DOC_DELETE='document.delete';//删除文档  
92 -//MessageTypes.DOC_ANNOTATION = 'document.annotation';//笔记 87 +//媒体共享
  88 +MessageTypes.MEDIA_SHARED_DELETE="media_shared_delete";//删除媒体文件
  89 +MessageTypes.MEDIA_SHARED_UPDATE ="media_shared_update";//更新媒体文件(添加、变更)
  90 +
93 91
94 //白板笔记事件定义 92 //白板笔记事件定义
95 MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'whiteboard.annotation.update'; 93 MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'whiteboard.annotation.update';
96 -//MessageTypes.WHITEBOARD_ANNOTAION_INSERT = 'whiteboard.annotation.insert';  
97 -//MessageTypes.WHITEBOARD_ANNOTAION_DELETE = 'whiteboard.annotation.delete';  
98 -//MessageTypes.WHITEBOARD_ANNOTATION_CLEAR = 'whiteboard.annotation.clear';  
99 -  
100 94
101 //MCU MS 95 //MCU MS
102 MessageTypes.SWITCH_MCU_IP ="switch_mcu_ip";//切换mcu 重新选点 96 MessageTypes.SWITCH_MCU_IP ="switch_mcu_ip";//切换mcu 重新选点
@@ -146,7 +140,9 @@ MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG=501;//APE鍦ㄦ帴鍙h皟鐢ㄦ椂鍙傛暟閿欒 @@ -146,7 +140,9 @@ MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG=501;//APE鍦ㄦ帴鍙h皟鐢ㄦ椂鍙傛暟閿欒
146 //DOC 140 //DOC
147 MessageTypes.ERR_DOC_DELETE_FAILED=600;//删除文档失败 141 MessageTypes.ERR_DOC_DELETE_FAILED=600;//删除文档失败
148 MessageTypes.ERR_DOC_DELETE_FAILED_PARAM=601;//删除文档失败,参数错误 142 MessageTypes.ERR_DOC_DELETE_FAILED_PARAM=601;//删除文档失败,参数错误
149 - 143 +//媒体共享
  144 +MessageTypes.ERR_MEDIASHARE_DELETE_FAILED=620;//删除媒体共享文件失败
  145 +MessageTypes.ERR_MEDIASHARE_DELETE_FAILED_PARAM=621;//删除媒体共享文件,参数错误
150 146
151 MessageTypes.ERR_SDK_FAILED=700;// sdk还没初始化 147 MessageTypes.ERR_SDK_FAILED=700;// sdk还没初始化
152 MessageTypes.ERR_INTERFACE_NONE=701;//调用的接口不存在 148 MessageTypes.ERR_INTERFACE_NONE=701;//调用的接口不存在
@@ -199,6 +195,12 @@ MessageTypes.ErrorReson[MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG]="APE鍦ㄦ帴鍙 @@ -199,6 +195,12 @@ MessageTypes.ErrorReson[MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG]="APE鍦ㄦ帴鍙
199 MessageTypes.ErrorReson[MessageTypes.ERR_DOC_DELETE_FAILED]="删除文档失败"; 195 MessageTypes.ErrorReson[MessageTypes.ERR_DOC_DELETE_FAILED]="删除文档失败";
200 MessageTypes.ErrorReson[MessageTypes.ERR_DOC_DELETE_FAILED_PARAM]="删除文档失败,参数错误"; 196 MessageTypes.ErrorReson[MessageTypes.ERR_DOC_DELETE_FAILED_PARAM]="删除文档失败,参数错误";
201 197
  198 +
  199 +//mediaShare
  200 +MessageTypes.ErrorReson[MessageTypes.ERR_MEDIASHARE_DELETE_FAILED]="删除媒体共享文件失败";
  201 +MessageTypes.ErrorReson[MessageTypes.ERR_MEDIASHARE_DELETE_FAILED_PARAM]="删除媒体共享文件,参数错误";
  202 +
  203 +
202 MessageTypes.ErrorReson[MessageTypes.ERR_SDK_FAILED]="sdk还没初始化"; 204 MessageTypes.ErrorReson[MessageTypes.ERR_SDK_FAILED]="sdk还没初始化";
203 MessageTypes.ErrorReson[MessageTypes.ERR_INTERFACE_NONE]="调用的接口不存在"; 205 MessageTypes.ErrorReson[MessageTypes.ERR_INTERFACE_NONE]="调用的接口不存在";
204 MessageTypes.ErrorReson[MessageTypes.ERR_INTERFACE_PARAMS_ERROR]="调用的接口,传递的参数不正确"; 206 MessageTypes.ErrorReson[MessageTypes.ERR_INTERFACE_PARAMS_ERROR]="调用的接口,传递的参数不正确";
@@ -310,7 +310,7 @@ class Sass extends Emiter { @@ -310,7 +310,7 @@ class Sass extends Emiter {
310 if (ret.ok) { 310 if (ret.ok) {
311 return ret.json(); 311 return ret.json();
312 } else { 312 } else {
313 - loger.error(`sassDeleteDocument-网络异常.状态码:${ret.status}`); 313 + loger.error(`删除文档-网络异常.状态码:${ret.status}`);
314 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED); 314 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED);
315 315
316 throw ''; 316 throw '';
@@ -318,19 +318,60 @@ class Sass extends Emiter { @@ -318,19 +318,60 @@ class Sass extends Emiter {
318 }) 318 })
319 .then(ret => { 319 .then(ret => {
320 if (ret.code === 0) { 320 if (ret.code === 0) {
321 - loger.log('sassDeleteDocument 完成'); 321 + loger.log('删除文档-完成');
322 this._emit(Sass.DELETE_DOCUMENT_SUCCESS, _param); 322 this._emit(Sass.DELETE_DOCUMENT_SUCCESS, _param);
323 } else { 323 } else {
324 - loger.warn('sassDeleteDocumnt 失败.'); 324 + loger.warn('删除文档-失败.')
325 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED); 325 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED);
326 } 326 }
327 }) 327 })
328 .catch(err => { 328 .catch(err => {
329 - loger.error(`sassDeleteDocument异常.状态码:${err}`); 329 + loger.error(`删除文档-异常.状态码:${err}`);
330 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED); 330 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED);
331 }); 331 });
332 } 332 }
333 333
  334 + //删除媒体共享文件
  335 + sassDeletMediaShare(_param) {
  336 + if(GlobalConfig.isRecordPlayBack){
  337 + loger.log('录制回放中,能删除文件');
  338 + return;
  339 + }
  340 + var timestamp = new Date().getTime();
  341 + var authId = MD5(_param.fileId + "" + _param.classId + "" + timestamp);// docId+classId+timestamp的字符串,转成MD5
  342 + let url = `http://${GlobalConfig.portal}/3m/api/sharedMedia/deleteRelation.do?fileId=${_param.fileId}&classId=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;
  343 + loger.log('删除媒体共享文件', url);
  344 +
  345 + fetch(url, {
  346 + timeout: 5000
  347 + })
  348 + .then(ret => {
  349 + if (ret.ok) {
  350 + return ret.json();
  351 + } else {
  352 + loger.error(`删除媒体共享文件-网络异常.状态码:${ret.status}`);
  353 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED);
  354 +
  355 + throw '';
  356 + }
  357 + })
  358 + .then(ret => {
  359 + //code 0 成功, 1 验证信息错误
  360 + if (ret.code === 0) {
  361 + loger.log('删除媒体共享文件 完成');
  362 + this._emit(Sass.DELETE_MEDIASHARE_SUCCESS, _param);
  363 + } else {
  364 + loger.warn('删除媒体共享文件 失败.');
  365 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED);
  366 + }
  367 + })
  368 + .catch(err => {
  369 + loger.error(`删除媒体共享文件-异常.状态码:${err}`);
  370 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED);
  371 + });
  372 + }
  373 +
  374 +
334 //保存课堂的当前信息------------------------------------------------------------------------------------------------- 375 //保存课堂的当前信息-------------------------------------------------------------------------------------------------
335 /*保存课堂的当前信息,首次是插入,后面是更新 376 /*保存课堂的当前信息,首次是插入,后面是更新
336 /api/meeting/saveInfo.do 377 /api/meeting/saveInfo.do
@@ -504,6 +545,7 @@ Sass.prototype.CLASS_INIT_SUCCESS = Sass.CLASS_INIT_SUCCESS = 'sass_class_init_s @@ -504,6 +545,7 @@ Sass.prototype.CLASS_INIT_SUCCESS = Sass.CLASS_INIT_SUCCESS = 'sass_class_init_s
504 Sass.prototype.CLASS_GET_CLASS_PARAM = Sass.CLASS_GET_CLASS_PARAM = 'sass_class_getClassParam.message'; 545 Sass.prototype.CLASS_GET_CLASS_PARAM = Sass.CLASS_GET_CLASS_PARAM = 'sass_class_getClassParam.message';
505 Sass.prototype.CLASS_GET_CLASS_DETAIL = Sass.CLASS_GET_CLASS_DETAIL = 'sass_class_getClassDetail_message'; 546 Sass.prototype.CLASS_GET_CLASS_DETAIL = Sass.CLASS_GET_CLASS_DETAIL = 'sass_class_getClassDetail_message';
506 Sass.prototype.DELETE_DOCUMENT_SUCCESS = Sass.DELETE_DOCUMENT_SUCCESS = 'sass_class_deleteDocumentSuccess_message';//删除文档成功 547 Sass.prototype.DELETE_DOCUMENT_SUCCESS = Sass.DELETE_DOCUMENT_SUCCESS = 'sass_class_deleteDocumentSuccess_message';//删除文档成功
  548 +Sass.prototype.DELETE_MEDIASHARE_SUCCESS = Sass.DELETE_MEDIASHARE_SUCCESS = 'sass_class_deleteMediaShareSuccess_message';//删除文档成功
507 549
508 Sass.prototype.CLASS_SAVE_STATUS_INFO_SUCCESS = Sass.CLASS_SAVE_STATUS_INFO_SUCCESS = 'sass_class_saveClassStatusInfoSuccess_message';//保存课堂状态信息 550 Sass.prototype.CLASS_SAVE_STATUS_INFO_SUCCESS = Sass.CLASS_SAVE_STATUS_INFO_SUCCESS = 'sass_class_saveClassStatusInfoSuccess_message';//保存课堂状态信息
509 Sass.prototype.CLASS_SAVE_RECORD_INFO_SUCCESS = Sass.CLASS_SAVE_RECORD_INFO_SUCCESS = 'sass_class_saveClassRecordInfoSuccess_message';//保存录制课堂信息 551 Sass.prototype.CLASS_SAVE_RECORD_INFO_SUCCESS = Sass.CLASS_SAVE_RECORD_INFO_SUCCESS = 'sass_class_saveClassRecordInfoSuccess_message';//保存录制课堂信息
@@ -22,7 +22,7 @@ import GlobalConfig from 'GlobalConfig'; @@ -22,7 +22,7 @@ import GlobalConfig from 'GlobalConfig';
22 import EngineUtils from 'EngineUtils'; 22 import EngineUtils from 'EngineUtils';
23 23
24 let loger = Loger.getLoger('DocApe'); 24 let loger = Loger.getLoger('DocApe');
25 -let itemIdx = 0;//table插入新数据的计数id,目前用时间戳 25 +//let itemIdx = 0;//table插入新数据的计数id,目前用时间戳
26 26
27 class DocApe extends Ape { 27 class DocApe extends Ape {
28 constructor() { 28 constructor() {
@@ -53,7 +53,7 @@ class DocApe extends Ape { @@ -53,7 +53,7 @@ class DocApe extends Ape {
53 return; 53 return;
54 } 54 }
55 55
56 - itemIdx = EngineUtils.creatSoleNumberFromTimestamp();// 56 + let itemIdx = EngineUtils.creatSoleNumberFromTimestamp();//
57 let docDataModelPdu = this.packPdu(paramInfo, itemIdx); 57 let docDataModelPdu = this.packPdu(paramInfo, itemIdx);
58 if (docDataModelPdu == null) { 58 if (docDataModelPdu == null) {
59 loger.log('上传文档->失败->数据无效'); 59 loger.log('上传文档->失败->数据无效');
  1 +// //////////////////////////////////////////////////////////////////////////////
  2 +//
  3 +// 媒体共享模块
  4 +// //////////////////////////////////////////////////////////////////////////////
  5 +
  6 +import Ape from './Ape';
  7 +import ApeConsts from './ApeConsts';
  8 +import pdu from 'pdus';
  9 +import Loger from 'Loger';
  10 +import MessageTypes from 'MessageTypes';
  11 +import GlobalConfig from 'GlobalConfig';
  12 +import EngineUtils from 'EngineUtils';
  13 +
  14 +let loger = Loger.getLoger('MediaSharedApe');
  15 +
  16 +class MediaSharedApe extends Ape {
  17 + constructor() {
  18 + super(
  19 + ApeConsts.MEDIA_SESSION_ID,
  20 + ApeConsts.MEDIA_SESSION_NAME,
  21 + ApeConsts.MEDIA_SESSION_TAG
  22 + );
  23 +
  24 + this.mediaSharedList = {};//记录媒体数据
  25 + // Ape Models
  26 + this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
  27 + this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.MEDIA_OBJ_TABLE_ID, ApeConsts.MEDIA_OBJ_TABLE_NAME, ApeConsts.MEDIA_OBJ_TABLE_TAG, 0, new ArrayBuffer);
  28 + }
  29 +
  30 + /////////////发送数据操作//////////////////////////////////////////////////////
  31 + //上传媒体文件
  32 + mediaSharedUpload(paramInfo) {
  33 + if (paramInfo == null || EngineUtils.isEmptyObject(paramInfo)) {
  34 + loger.warn('上传媒体文件->失败->参数错误->',paramInfo);
  35 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  36 + return;
  37 + }
  38 + //判断媒体文件是否已经存在,每个媒体文件都有唯一的fileId,如果已经同步的媒体文件中存在相同的fileId就不需要再同步
  39 + if (this.checkMediaSharedId(paramInfo.fileId)) {
  40 + //媒体文件已经存在相同的fileId,不需要同步上传
  41 + loger.warn('上传媒体文件->失败->媒体文件档的fileId无效或已经存在相同的fileId不需要上传');
  42 + return;
  43 + }
  44 +
  45 + let itemIdx = EngineUtils.creatSoleNumberFromTimestamp();//
  46 + let pduDataModel = this.packPdu(paramInfo, itemIdx);
  47 + if (pduDataModel == null) {
  48 + loger.log('上传媒体文件->失败->数据无效');
  49 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  50 + return;
  51 + }
  52 +
  53 + let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
  54 + tableItemPdu.itemIdx = itemIdx;//直接用时间戳作为id
  55 + tableItemPdu.registerObjId = ApeConsts.MEDIA_OBJ_TABLE_ID;
  56 + tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定
  57 + tableItemPdu.itemData = pduDataModel.toArrayBuffer();
  58 +
  59 + //insert
  60 + let tableInsertItemPdu = new pdu['RCRegistryTableInsertItemPdu'];
  61 + //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
  62 + //repeated RCRegistryTableItemPdu items = 2;
  63 + tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_INSERT_PDU;//
  64 + tableInsertItemPdu.items.push(tableItemPdu);
  65 +
  66 + let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
  67 + updateObjPdu.objId = ApeConsts.MEDIA_OBJ_TABLE_ID;
  68 + updateObjPdu.subType = tableInsertItemPdu.type;
  69 + updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
  70 +
  71 + //同步
  72 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  73 + adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
  74 + adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
  75 +
  76 + let adapterPdu = new pdu['RCAdapterPdu'];
  77 + adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
  78 + adapterPdu.item.push(adapterItemPdu);
  79 +
  80 + loger.log("上传媒体文件->发送->itemIdx=" + tableItemPdu.itemIdx);
  81 + this.sendUniform(adapterPdu, true);
  82 + }
  83 +
  84 +
  85 + //删除媒体文件
  86 + mediaSharedDelete(paramInfo) {
  87 + let tableDeleteItemPdu = new pdu['RCRegistryTableDeleteItemPdu'];
  88 + tableDeleteItemPdu.type = pdu.RCPDU_REG_TABLE_DELETE_PDU;//
  89 + tableDeleteItemPdu.itemIdx = parseInt(paramInfo.itemIdx);//这里需要设置要删除的数据的itemIdx,每条数据的这个id都不一样
  90 +
  91 + let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
  92 + updateObjPdu.objId = ApeConsts.MEDIA_OBJ_TABLE_ID;
  93 + updateObjPdu.subType = tableDeleteItemPdu.type;
  94 + updateObjPdu.userData = tableDeleteItemPdu.toArrayBuffer();
  95 +
  96 + //同步
  97 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  98 + adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
  99 + adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
  100 +
  101 + let adapterPdu = new pdu['RCAdapterPdu'];
  102 + adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
  103 + adapterPdu.item.push(adapterItemPdu);
  104 +
  105 + loger.log("媒体文件发送删除数据=============>" + tableDeleteItemPdu.itemIdx);
  106 + this.sendUniform(adapterPdu, true);
  107 + }
  108 +
  109 + //更新
  110 + updaterMediaShared(_pduDataModel, _itemIdx) {
  111 + //验证坐标点集合数组是否合法
  112 + if (_pduDataModel == null || _itemIdx == null) {
  113 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  114 + return null;
  115 + }
  116 + loger.log("媒体文件->updaterMediaShared ", _pduDataModel);
  117 +
  118 + let pduDataModel = this.packPdu(_pduDataModel, _itemIdx);
  119 + let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
  120 + tableItemPdu.itemIdx = _itemIdx;//直接用时间戳作为id
  121 + tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定
  122 + tableItemPdu.itemData = pduDataModel.toArrayBuffer();
  123 +
  124 + //insert
  125 + let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu'];
  126 + //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
  127 + //repeated RCRegistryTableItemPdu items = 2;
  128 + tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;//
  129 + tableInsertItemPdu.items.push(tableItemPdu);
  130 +
  131 + let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
  132 + updateObjPdu.objId = ApeConsts.MEDIA_OBJ_TABLE_ID;
  133 + updateObjPdu.subType = tableInsertItemPdu.type;
  134 + updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
  135 +
  136 + //同步
  137 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  138 + adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
  139 + adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
  140 +
  141 + let adapterPdu = new pdu['RCAdapterPdu'];
  142 + adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
  143 + adapterPdu.item.push(adapterItemPdu);
  144 +
  145 + loger.log("发送更新媒体文件.itemIdx=" + tableItemPdu.itemIdx);
  146 + this.sendUniform(adapterPdu, true);
  147 + }
  148 +
  149 + //获取媒体文件的完整地址和所有图片
  150 + getMediaSharedAddress(_param){
  151 + if (_param == null || _param.url == null || _param.itemIdx ==null) {
  152 + loger.warn('获取媒体文件完整地址->传递的参数不正确->', _param);
  153 + return {"code":ApeConsts.RETURN_FAILED, "data": "获取媒体文件时传递的参数不对"};
  154 + }
  155 + let fullPath='';//媒体文件路径地址
  156 + let pageNum=1;//总页数
  157 + let docType="";//媒体文件地址的后缀类型
  158 + let fileType="";//媒体文件的原始类型
  159 + let docItem=this.mediaSharedList[_param.itemIdx];
  160 + if(docItem){
  161 + fullPath=docItem.url||"";
  162 + pageNum=docItem.pageNum||1;
  163 + fileType=docItem.fileType||""
  164 + }else {
  165 + fullPath =_param.url;
  166 + }
  167 +
  168 + //获取当前媒体文件的后缀名
  169 + docType=this._getMediaType(fullPath);
  170 + let substrFullPath=this._getMediaPath(fullPath);//获取去掉后缀和文件名的地址,需要获取同目录下其他文件
  171 + let imagesArr=[];
  172 + let htmlPath="";
  173 + let pdfPath="";
  174 +
  175 + //根据文件后缀名,生成对应的访问地址
  176 + if(docType=="jpg"||docType=="png"||docType=="swf"||docType=="pdf"||docType=="doc"||docType=="pptx"){
  177 + //页数从1开始
  178 + for (let i = 1; i <=pageNum; i++) {
  179 + imagesArr.push(substrFullPath + "/" + i + ".jpg");
  180 + }
  181 + }
  182 + if(docType=="swf"||docType=="pdf"||docType=="doc"||docType=="pptx"){
  183 + pdfPath=fullPath.replace(/\.swf/g, ".pdf")||"";
  184 + }
  185 + //动态PPT
  186 + if(docType=="html"){
  187 + htmlPath=fullPath;
  188 + }
  189 + //返回媒体文件第所有地址
  190 + return {'code':ApeConsts.RETURN_SUCCESS, 'data': '','docFullAddress':{
  191 + 'images':imagesArr,
  192 + 'pdf':pdfPath,
  193 + 'html':htmlPath
  194 + }};
  195 + }
  196 +
  197 + _getMediaType(_fullPath){
  198 + if(!_fullPath){
  199 + return "";
  200 + }
  201 + if(_fullPath.lastIndexOf(".jpg")>=0){
  202 + return "jpg";
  203 + }
  204 + if(_fullPath.lastIndexOf(".png")>=0){
  205 + return "png";
  206 + }
  207 + if(_fullPath.lastIndexOf(".swf")>=0){
  208 + return "swf";
  209 + }
  210 + if(_fullPath.lastIndexOf(".pdf")>=0){
  211 + return "pdf";
  212 + }
  213 + if(_fullPath.lastIndexOf(".doc")>=0){
  214 + return "doc";
  215 + }
  216 + if(_fullPath.lastIndexOf(".html")>=0){
  217 + return "html";
  218 + }
  219 + if(_fullPath.lastIndexOf(".pptx")>=0){
  220 + return "pptx";
  221 + }
  222 + return "";
  223 + }
  224 + //获取去掉文件名和后缀名的地址 http://www.xxx.xxx/image/aa.jpg -->http://www.xxx.xxx/image/
  225 + _getMediaPath(_fullPath){
  226 + if(!_fullPath){
  227 + return "";
  228 + }
  229 + var lastIndex = _fullPath.lastIndexOf("/");
  230 + if (lastIndex > 0) {
  231 + return _fullPath.substr(0, lastIndex);
  232 + }
  233 + return _fullPath;
  234 + }
  235 +
  236 + //组织完整的媒体文件信息,包含上传时的信息和转换后的完整地址信息
  237 + _mediaSharedPackFullInfo(_itemDataInfo){
  238 + let itemDataInfo=_itemDataInfo;
  239 + let getDocAddress=this.getMediaSharedAddress(_itemDataInfo);
  240 + if(getDocAddress.code==ApeConsts.RETURN_SUCCESS){
  241 + itemDataInfo.images=getDocAddress.docFullAddress.images||[];
  242 + itemDataInfo.pdf=getDocAddress.docFullAddress.pdf||"";
  243 + itemDataInfo.html=getDocAddress.docFullAddress.html||"";
  244 + }else {
  245 + itemDataInfo.images=[];
  246 + itemDataInfo.pdf='';
  247 + itemDataInfo.html='';
  248 + }
  249 + loger.log('docPackFullInfo->', itemDataInfo);
  250 + return itemDataInfo;
  251 + }
  252 + //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
  253 + updaterRecordStatus(_param){
  254 + if(GlobalConfig.isHost&&!GlobalConfig.isRecordPlayBack&&GlobalConfig.activeMediaId>0){
  255 + loger.log("开启录制成功->更新当前的媒体文件数据->fileId:", GlobalConfig.activeMediaId, 'page:',GlobalConfig.activeMediaSeek);
  256 + this.mediaSharedSeek({
  257 + "itemIdx": GlobalConfig.activeMediaId,
  258 + "seek":GlobalConfig.activeMediaSeek
  259 + });
  260 + }
  261 + }
  262 + //清除当前媒体文件模块的数据
  263 + clearData(){
  264 + loger.log("clearData->")
  265 + this.mediaSharedList={};
  266 + GlobalConfig.activeMediaId=0;
  267 + GlobalConfig.activeMediaSeek=1;
  268 +
  269 + }
  270 + //播放媒体文件
  271 + mediaSharedPlay(paramInfo) {
  272 + loger.log('切换媒体文件->', paramInfo);
  273 + if (GlobalConfig.isRecordPlayBack) {
  274 + loger.warn('录制回放状态不允许切换媒体文件');
  275 + return;
  276 + }
  277 +
  278 + if (paramInfo == null || paramInfo.itemIdx == null) {
  279 + loger.warn('切换媒体文件失败,参数错误', paramInfo);
  280 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  281 + return;
  282 + }
  283 +
  284 + if (paramInfo.itemIdx == GlobalConfig.activeMediaId && GlobalConfig.activeMediaId != 0) {
  285 + loger.warn('媒体文件已经显示', paramInfo.itemIdx, GlobalConfig.activeMediaId);
  286 + return;
  287 + }
  288 +
  289 + //更新切换之前的媒体文件的数据,要显示当前切换的媒体文件,上一个媒体文件需要隐藏
  290 + let oldPduDataModel;
  291 + if (GlobalConfig.activeMediaId != 0) {
  292 + oldPduDataModel = this.mediaSharedList[GlobalConfig.activeMediaId];
  293 + if (oldPduDataModel) {
  294 + oldPduDataModel.status = 1;//设置为不可见
  295 + }
  296 + }
  297 +
  298 + //获取已经存在的数据
  299 + let pduDataModel = this.mediaSharedList[paramInfo.itemIdx];
  300 + if (pduDataModel == null) {
  301 + loger.warn('切换媒体文件失败,媒体文件不存在', paramInfo);
  302 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  303 + return;
  304 + }
  305 +
  306 + //更新当前选择的媒体文件数据的字段
  307 + pduDataModel.status = paramInfo.status || 0;//默认是0
  308 +
  309 + //loger.log('切换媒体文件,当前媒体文件和上一个显示的媒体文件都需要更新状态');
  310 + loger.log({"oldDoc": oldPduDataModel, "nowDoc": pduDataModel});
  311 + //更新当前选择的媒体文件
  312 + this.updaterMediaShared(pduDataModel, pduDataModel.itemIdx);
  313 +
  314 + //更新上一个媒体文件 隐藏
  315 + if (oldPduDataModel) {
  316 + this.updaterMediaShared(oldPduDataModel, oldPduDataModel.itemIdx);
  317 + }
  318 + }
  319 +
  320 + //停止媒体文件
  321 + mediaSharedStop(paramInfo) {
  322 +
  323 + }
  324 + //暂停媒体文件
  325 + mediaSharedPause(paramInfo) {
  326 +
  327 + }
  328 + //媒体文件SEEK
  329 + mediaSharedSeek(paramInfo) {
  330 + loger.log('媒体文件SEEK->',paramInfo);
  331 + //获取已经存在的数据
  332 + let pduDataModel = this.mediaSharedList[paramInfo.itemIdx];
  333 + //console.log(pduDataModel);
  334 + //console.log(pduDataModel);
  335 + if (pduDataModel == null) {
  336 + loger.log('媒体文件SEEK->媒体文件不存在', paramInfo);
  337 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  338 + return;
  339 + }
  340 + //更新数据的字段
  341 + pduDataModel.seek = parseInt(paramInfo.seek) || 1;
  342 + if (pduDataModel.seek < 1) {
  343 + pduDataModel.seek = 1;//默认值最小是1
  344 + }
  345 + this.updaterMediaShared(pduDataModel, pduDataModel.itemIdx);
  346 + }
  347 +
  348 +
  349 + /////收到消息处理/////////////////////////////////////////////////////////////////////////////////
  350 + tableInsertHandler(owner, itemIdx, itemData) {
  351 +
  352 + }
  353 + //添加媒体文件
  354 + tableInsertApeHandler(_tableUpdateItems, _seekTime) {
  355 + let tableInsertItems =_tableUpdateItems;
  356 + let tableInsertItemsLen = tableInsertItems.length;
  357 + loger.log('添加媒体文件->', "activeDocId->", GlobalConfig.activeMediaId, "tableUpdateItemsLen->", tableInsertItemsLen);
  358 + for (let i = 0; i < tableInsertItemsLen; ++i) {
  359 + let insertItem = tableInsertItems[i];
  360 + //this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
  361 + let itemDataInfo = this.unPackPdu(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
  362 + if(itemDataInfo){
  363 + this.mediaSharedList[insertItem.itemIdx] = itemDataInfo;
  364 + if (itemDataInfo.status == 1) {
  365 + GlobalConfig.activeMediaId = itemDataInfo.itemIdx;//当前激活的媒体文件ID
  366 + GlobalConfig.activeMediaSeek = itemDataInfo.seek;//当前激活的媒体文件的当前页
  367 + loger.log('添加媒体文件->设置当前激活的媒体文件id');
  368 + }
  369 + let getMediaPackFullInfo= this._mediaSharedPackFullInfo(itemDataInfo);
  370 + this._emit(MessageTypes.MEDIA_SHARED_UPDATE, getMediaPackFullInfo);
  371 + }
  372 + }
  373 + //媒体文件数据更新完毕,如果当前没有显示的媒体文件,默认选择一个显示
  374 + this._showDefaultMeida();
  375 + }
  376 + tableDeleteHandler(object_id, tableDeleteData) {
  377 + loger.log('删除媒体文件数据->', object_id, tableDeleteData);//["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
  378 + if (tableDeleteData && tableDeleteData.itemIdx) {
  379 + let len = tableDeleteData.itemIdx.length;
  380 + let itemIdxs = tableDeleteData.itemIdx;
  381 + for (let i = 0; i < len; i++) {
  382 + if (this.mediaSharedList[itemIdxs[i]]) {
  383 + loger.log("删除媒体文件数据:", itemIdxs[i]);
  384 + let itemDataInfo = this.mediaSharedList[itemIdxs[i]];
  385 + if (itemDataInfo && itemDataInfo.status ==1) {
  386 + GlobalConfig.activeMediaId = 0;//当前激活的媒体文件ID
  387 + GlobalConfig.activeMediaSeek = 1;//当前激活的媒体文件的当前页
  388 + loger.log('删除媒体文件数据->清除当前显示的媒体文件');
  389 + }
  390 + this._emit(MessageTypes.MEDIA_SHARED_DELETE, {"itemIdx": itemIdxs[i]});
  391 + delete this.mediaSharedList[itemIdxs[i]];
  392 + }
  393 + }
  394 + }
  395 + }
  396 +
  397 + tableUpdateHandler(owner, itemIdx, itemData) {
  398 +
  399 + }
  400 + tableUpdateApeHandler(_tableUpdateItems, _seekTime) {
  401 + let tableUpdateItemsLen = _tableUpdateItems.length;
  402 + loger.log('更新媒体文件->', "activeDocId->", GlobalConfig.activeMediaId, "更新的数量->", tableUpdateItemsLen);
  403 + for (let i = 0; i < tableUpdateItemsLen; ++i) {
  404 + let tableItem = _tableUpdateItems[i];
  405 + let itemDataInfo = this.unPackPdu(tableItem.owner, tableItem.itemIdx, tableItem.itemData);
  406 + if (itemDataInfo != null) {
  407 + this.mediaSharedList[tableItem.itemIdx] = itemDataInfo;
  408 + if (itemDataInfo && itemDataInfo.status ==1) {
  409 + GlobalConfig.activeMediaId = itemDataInfo.itemIdx;//当前激活的媒体文件ID
  410 + GlobalConfig.activeMediaSeek = itemDataInfo.seek;//当前激活的媒体文件的当前页
  411 + loger.log('更新媒体文件->设置当前激活的媒体文件id->', GlobalConfig.activeMediaId, "curPageNum->", GlobalConfig.activeMediaSeek);
  412 + }
  413 + let getMediaPackFullInfo= this._mediaSharedPackFullInfo(itemDataInfo);
  414 + this._emit(MessageTypes.MEDIA_SHARED_UPDATE, getMediaPackFullInfo);
  415 + } else {
  416 + loger.log('更新媒体文件-> 数据无效--> itemIdx', itemIdx);
  417 + }
  418 + }
  419 + this._showDefaultMeida();
  420 + }
  421 +
  422 + //果当前没有显示的媒体文件,默认选择一个显示媒体文件
  423 + _showDefaultMeida() {
  424 + //显示默认媒体文件条件->1.非录制回放状态下 2.只有host有权限操作 3.当前激活的媒体文件id不为0
  425 + if (GlobalConfig.isRecordPlayBack || !GlobalConfig.isHost || GlobalConfig.activeMediaId > 0) {
  426 + return;
  427 + }
  428 +
  429 + let tempDocItemIdx;//临时记录媒体文件数据,用于显示默认媒体文件
  430 + for (let key in this.mediaSharedList) {
  431 + tempDocItemIdx= this.mediaSharedList[key];
  432 + if (tempDocItemIdx) {
  433 + loger.log("选择一个媒体文件作为默认媒体文件显示->", tempDocItemIdx);
  434 + let paramInfo = {
  435 + "itemIdx": tempDocItemIdx.itemIdx,
  436 + "status": 1
  437 + };
  438 + this.mediaSharedPlay(paramInfo);
  439 + //选择完成就跳出循环
  440 + return;
  441 + }
  442 + }
  443 + }
  444 +
  445 + onJoinChannelHandlerSuccess() {
  446 + loger.log(this._session_name + ' 媒体共享加入频道成功');
  447 + if (this._apeDelayed) {
  448 + setTimeout(() => {
  449 + this._emit(MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS);
  450 + }, (GlobalConfig.mcuDelay + GlobalConfig.docDelay) || 12000 + GlobalConfig.docDelay);
  451 + } else {
  452 + setTimeout(() => {
  453 + this._emit(MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS);
  454 + }, GlobalConfig.docDelay);
  455 + }
  456 + }
  457 +
  458 + //检查媒体文件是否已经存在,如果存在 返回true,否则返回false
  459 + checkMediaSharedId(_fileId) {
  460 + if (_fileId == null) {
  461 + loger.warn('查找媒体文件->失败->参数为null');
  462 + return true;
  463 + }
  464 + //遍历查找
  465 + for (let key in this.mediaSharedList) {
  466 + let item = this.mediaSharedList[key];
  467 + if (item && item.fileId == _fileId) {
  468 + loger.log('查找媒体文件->已经存在->',_fileId);
  469 + return true;
  470 + }
  471 + }
  472 + loger.log('查找媒体文件->没有查找到媒体文件->',_fileId);
  473 + //储存的数据中没有查找到
  474 + return false;
  475 + }
  476 +
  477 + ///////数据的封包和解包/////////////////////////////////////////
  478 + packPdu(_param, _itemIdx) {
  479 + loger.log("媒体文件->packPdu");
  480 + //验证坐标点集合数组是否合法
  481 + if (_param == null || _itemIdx == null) {
  482 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  483 + return null;
  484 + }
  485 + //判断type类型,根据type设置不同的参数
  486 + let pduDataModel = new pdu['RCMediaSharedSendDataModelPdu'];
  487 + pduDataModel.itemIdx = _itemIdx;
  488 + pduDataModel.owner = GlobalConfig.nodeId;
  489 + pduDataModel.from = GlobalConfig.nodeId;
  490 + pduDataModel.fileType = _param.fileType || "";
  491 + pduDataModel.creatUserId = _param.creatUserId || "0";
  492 + pduDataModel.url = _param.url||"";//这个地址没用到,数据太长占用资源 暂停使用//"http://101.200.150.192/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg";
  493 + pduDataModel.status = _param.status || 0;
  494 + pduDataModel.fileId = _param.fileId || "";//媒体文件在服务器数据库中的唯一id,必须有
  495 + pduDataModel.fileName = _param.fileName || "media_" + _itemIdx;//媒体文件的名字
  496 + return pduDataModel;
  497 + }
  498 +
  499 + unPackPdu(owner, itemIdx, itemData) {
  500 + if (owner == null || itemIdx == null || itemData == null) {
  501 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  502 + return null;
  503 + }
  504 + try {
  505 + let pduDataModel = pdu['RCMediaSharedSendDataModelPdu'].decode(itemData);
  506 + loger.log("媒体文件===>unPackPdu");
  507 + return pduDataModel;
  508 + } catch (err) {
  509 + loger.log("媒体文件===>unPackPdu->Pdu解析错误->itemIdx=" + itemIdx + "->err:" + err.message);
  510 + }
  511 + return null;
  512 + }
  513 +
  514 +}
  515 +MediaSharedApe.prototype.MEDIASHARED_JOIN_CHANNEL_SUCCESS = MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS = 'mediaShared_join_channel_success';
  516 +export default MediaSharedApe;
  517 +
@@ -25,7 +25,7 @@ import EngineUtils from 'EngineUtils'; @@ -25,7 +25,7 @@ import EngineUtils from 'EngineUtils';
25 25
26 let loger = Loger.getLoger('WhiteBoardApe'); 26 let loger = Loger.getLoger('WhiteBoardApe');
27 27
28 -let itemIdx = 0;//table插入新数据的计数id,目前用时间戳 28 +//let itemIdx = 0;//table插入新数据的计数id,目前用时间戳
29 const TYPE_BIGHT = 0;//任意线段 29 const TYPE_BIGHT = 0;//任意线段
30 const TYPE_LINE = 1;//直线 30 const TYPE_LINE = 1;//直线
31 const TYPE_RECT = 2;//矩形 31 const TYPE_RECT = 2;//矩形
@@ -92,7 +92,7 @@ class WhiteBoardApe extends Ape { @@ -92,7 +92,7 @@ class WhiteBoardApe extends Ape {
92 return; 92 return;
93 } 93 }
94 94
95 - itemIdx = EngineUtils.creatSoleNumberFromTimestamp();//创建时间戳,保证每条数据的唯一 95 + let itemIdx = EngineUtils.creatSoleNumberFromTimestamp();//创建时间戳,保证每条数据的唯一
96 let whiteBoardModelPdu = this.packPdu(_param, itemIdx); 96 let whiteBoardModelPdu = this.packPdu(_param, itemIdx);
97 if (whiteBoardModelPdu == null) { 97 if (whiteBoardModelPdu == null) {
98 loger.warn('添加标注失败-->参数错误->',_param); 98 loger.warn('添加标注失败-->参数错误->',_param);
@@ -744,6 +744,18 @@ message RCDocSendDataModelPdu { @@ -744,6 +744,18 @@ message RCDocSendDataModelPdu {
744 744
745 } 745 }
746 746
  747 +message RCMediaSharedSendDataModelPdu {
  748 + optional uint32 item_idx=1;//唯一标识
  749 + optional uint32 owner=2;
  750 + optional uint32 from=3;
  751 + optional string file_type=4;
  752 + optional string creat_user_id=5;//创建文件userid
  753 + optional string url =6;//文件地址
  754 + optional uint32 status=7;//状态0停止 1播放 2暂停
  755 + optional string fileId=8;//文件在服务器数据库中的唯一id
  756 + optional string file_name=9;//文件的名字
  757 +}
  758 +
747 message RCDocBroadcastDataRequestPdu { 759 message RCDocBroadcastDataRequestPdu {
748 optional uint32 from_node_id = 1;//发起人 760 optional uint32 from_node_id = 1;//发起人
749 optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收 761 optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收