正在显示
9 个修改的文件
包含
744 行增加
和
22 行删除
此 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}×tamp=${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('上传文档->失败->数据无效'); |
src/apes/MediaSharedApe.js
0 → 100644
| 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就是所有人都接收 |
-
请 注册 或 登录 后发表评论