李勇

1.会议模块增加消息广播,控制当前会议中的用户状态

2.获取加入会议信息的Sass接口joinParams.do返回的passwordRequired(只判断了学生的),老师的按true处理,但是在MD5验证的时候,这个passwordRequired必须用joinParams.do返回时的值
@@ -47,13 +47,13 @@ export default class MessageEntrance extends Emiter { @@ -47,13 +47,13 @@ export default class MessageEntrance extends Emiter {
47 constructor() { 47 constructor() {
48 super(); 48 super();
49 //sdk 信息 49 //sdk 信息
50 - this.sdkInfo=_sdkInfo; 50 + this.sdkInfo = _sdkInfo;
51 loger.log(this.sdkInfo); 51 loger.log(this.sdkInfo);
52 52
53 //初始化状态 53 //初始化状态
54 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_0); 54 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_0);
55 55
56 - this.on(MessageTypes.MCU_ERROR,this._mcuErrorHandler.bind(this)); 56 + this.on(MessageTypes.MCU_ERROR, this._mcuErrorHandler.bind(this));
57 57
58 //this.on(MessageTypes.DOC_SHOW, this.docShowHandler.bind(this)); 58 //this.on(MessageTypes.DOC_SHOW, this.docShowHandler.bind(this));
59 59
@@ -63,9 +63,9 @@ export default class MessageEntrance extends Emiter { @@ -63,9 +63,9 @@ export default class MessageEntrance extends Emiter {
63 _sass.on(_sass.SUCCESS, this._sassJoinSuccessHandler.bind(this));//通过SASS平台验证(密码和MD5) 63 _sass.on(_sass.SUCCESS, this._sassJoinSuccessHandler.bind(this));//通过SASS平台验证(密码和MD5)
64 _sass.on(_sass.CLASS_INIT_SUCCESS, this._sassInitSuccessHandler.bind(this));//获取会议初始化信息 64 _sass.on(_sass.CLASS_INIT_SUCCESS, this._sassInitSuccessHandler.bind(this));//获取会议初始化信息
65 _sass.on(_sass.CLASS_GET_CLASS_DETAIL, this._sassGetClassDetailSuccessHandler.bind(this));//获取会议的基本信息 65 _sass.on(_sass.CLASS_GET_CLASS_DETAIL, this._sassGetClassDetailSuccessHandler.bind(this));//获取会议的基本信息
66 - _sass.on(_sass.CLASS_GET_CLASS_PARAM,this._sassGetClassParamSuccessHandler.bind(this));//获取会议的最全信息和历史保存的数据  
67 - _sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS,this._sassSaveClassStatusInfoSuccessHandler.bind(this));//保存会议状态信息  
68 - _sass.on(_sass.DELETE_DOCUMENT_SUCCESS,this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功 66 + _sass.on(_sass.CLASS_GET_CLASS_PARAM, this._sassGetClassParamSuccessHandler.bind(this));//获取会议的最全信息和历史保存的数据
  67 + _sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS, this._sassSaveClassStatusInfoSuccessHandler.bind(this));//保存会议状态信息
  68 + _sass.on(_sass.DELETE_DOCUMENT_SUCCESS, this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功
69 69
70 // 底层MCU消息层 70 // 底层MCU消息层
71 _mcu = Mcu; 71 _mcu = Mcu;
@@ -77,6 +77,7 @@ export default class MessageEntrance extends Emiter { @@ -77,6 +77,7 @@ export default class MessageEntrance extends Emiter {
77 _confer_ape = new ConferApe(); 77 _confer_ape = new ConferApe();
78 _confer_ape.on('*', (type, data) => this._emit(type, data)); 78 _confer_ape.on('*', (type, data) => this._emit(type, data));
79 _confer_ape.on(MessageTypes.CLASS_CLOSE, this._doClassClose.bind(this));//会议关闭,所有人都退出 79 _confer_ape.on(MessageTypes.CLASS_CLOSE, this._doClassClose.bind(this));//会议关闭,所有人都退出
  80 + _confer_ape.on(MessageTypes.CLASS_EXIT, this._doClassExit.bind(this));//监听自己的关闭事件
80 _confer_ape.on(MessageTypes.CLASS_STATUS_INFO_CHANGE, this._onClassStatusInfoChange.bind(this));//当前会议状态信息发生改变 81 _confer_ape.on(MessageTypes.CLASS_STATUS_INFO_CHANGE, this._onClassStatusInfoChange.bind(this));//当前会议状态信息发生改变
81 82
82 _chat_ape = new ChatApe(); 83 _chat_ape = new ChatApe();
@@ -89,7 +90,7 @@ export default class MessageEntrance extends Emiter { @@ -89,7 +90,7 @@ export default class MessageEntrance extends Emiter {
89 _doc_ape.on('*', (type, data) => this._emit(type, data)); 90 _doc_ape.on('*', (type, data) => this._emit(type, data));
90 _doc_ape.on(MessageTypes.DOC_UPDATE, this.docUpdateHandler.bind(this)); 91 _doc_ape.on(MessageTypes.DOC_UPDATE, this.docUpdateHandler.bind(this));
91 _doc_ape.on(MessageTypes.DOC_DELETE, this.docDeleteHandler.bind(this)); 92 _doc_ape.on(MessageTypes.DOC_DELETE, this.docDeleteHandler.bind(this));
92 - _doc_ape.on( DocApe.DOC_JOIN_CHANNEL_SUCCESS,this.docJoinChannelSuccess.bind(this)); 93 + _doc_ape.on(DocApe.DOC_JOIN_CHANNEL_SUCCESS, this.docJoinChannelSuccess.bind(this));
93 94
94 95
95 _whiteboard_ape = new WhiteBoardApe(); 96 _whiteboard_ape = new WhiteBoardApe();
@@ -99,122 +100,129 @@ export default class MessageEntrance extends Emiter { @@ -99,122 +100,129 @@ export default class MessageEntrance extends Emiter {
99 100
100 //公开外部调用的方法 101 //公开外部调用的方法
101 //class 102 //class
102 - this.init=this._init;  
103 - this.joinClass=this._joinClass;  
104 - this.leaveClass=this._leaveClass;  
105 - this.getMcuClientStatus=this._getMcuClientStatus;  
106 - this.getClassDetail=this._getClassDetail;  
107 - this.sendStartClass=this._sendStartClass;  
108 - this.sendPauseClass=this._sendPauseClass;  
109 - this.sendCloseClass=this._sendCloseClass; 103 + this.init = this._init;
  104 + this.joinClass = this._joinClass;
  105 + this.leaveClass = this._leaveClass;
  106 + this.getMcuClientStatus = this._getMcuClientStatus;
  107 + this.getClassDetail = this._getClassDetail;
  108 + this.sendStartClass = this._sendStartClass;
  109 + this.sendPauseClass = this._sendPauseClass;
  110 + this.sendCloseClass = this._sendCloseClass;
110 111
111 //chatApe 112 //chatApe
112 - this.sendChatMsg=this._sendChatMsg; 113 + this.sendChatMsg = this._sendChatMsg;
113 114
114 //videoApe 115 //videoApe
115 - this.getPlayVideoPath=this._getPlayVideoPath;  
116 - this.getPublishVideoPath=this._getPublishVideoPath;  
117 - this.publishVideo=this._publishVideo;  
118 - this.stopPublishVideo=this._stopPublishVideo; 116 + this.getPlayVideoPath = this._getPlayVideoPath;
  117 + this.getPublishVideoPath = this._getPublishVideoPath;
  118 + this.publishVideo = this._publishVideo;
  119 + this.stopPublishVideo = this._stopPublishVideo;
119 120
120 //whiteBoradApe 121 //whiteBoradApe
121 - this.sendInsertAnnotaion=this._sendInsertAnnotaion; 122 + this.sendInsertAnnotaion = this._sendInsertAnnotaion;
122 //this.sendDeleteAnnotaion=this._sendDeleteAnnotaion; 123 //this.sendDeleteAnnotaion=this._sendDeleteAnnotaion;
123 - this.sendDeleteAllAnnotation=this._sendDeleteAllAnnotation;  
124 - this.sendDeleteCurPageAnnotation=this._sendDeleteCurPageAnnotation;  
125 - this.sendGotoPrev=this._sendGotoPrev; 124 + this.sendDeleteAllAnnotation = this._sendDeleteAllAnnotation;
  125 + this.sendDeleteCurPageAnnotation = this._sendDeleteCurPageAnnotation;
  126 + this.sendGotoPrev = this._sendGotoPrev;
126 127
127 //DocApe 128 //DocApe
128 - this.sendDocumentUpload= this._sendDocumentUpload;//上传文档  
129 - this.sendDocumentSwitchDoc= this._sendDocumentSwitchDoc; //切换文档  
130 - this.sendDocumentSwitchPage= this._sendDocumentSwitchPage;//翻页  
131 - this.sendDocumentDelete= this. _sassDeleteDocument;//删除文档,先通过Sass删除,sass删除成功之后再同步mcu 129 + this.sendDocumentUpload = this._sendDocumentUpload;//上传文档
  130 + this.sendDocumentSwitchDoc = this._sendDocumentSwitchDoc; //切换文档
  131 + this.sendDocumentSwitchPage = this._sendDocumentSwitchPage;//翻页
  132 + this.sendDocumentDelete = this._sassDeleteDocument;//删除文档,先通过Sass删除,sass删除成功之后再同步mcu
132 //this.sendDocumentDeleteAll= this._documentDeleteAll;//删除所有文档 133 //this.sendDocumentDeleteAll= this._documentDeleteAll;//删除所有文档
133 - this.sendDocumentCommand= this._sendDocumentCommand;//操作文档(翻页、缩放、滚动...) 134 + this.sendDocumentCommand = this._sendDocumentCommand;//操作文档(翻页、缩放、滚动...)
134 135
135 } 136 }
136 137
137 138
138 //mcu异常监听 139 //mcu异常监听
139 - _mcuErrorHandler(_data,_option){  
140 - if(_mcuErrorCallBackFun){  
141 - let option=_option||"";  
142 - let errorMessage={"code":_data,"reson":MessageTypes.ErrorReson[_data]+" "+option};  
143 - loger.error("MCU_ERROR",errorMessage); 140 + _mcuErrorHandler(_data, _option) {
  141 + if (_mcuErrorCallBackFun) {
  142 + let option = _option || "";
  143 + let errorMessage = {"code": _data, "reson": MessageTypes.ErrorReson[_data] + " " + option};
  144 + loger.error("MCU_ERROR", errorMessage);
144 _mcuErrorCallBackFun(errorMessage); 145 _mcuErrorCallBackFun(errorMessage);
145 } 146 }
146 } 147 }
147 148
148 //获取当前的状态 149 //获取当前的状态
149 - _getMcuClientStatus(){ 150 + _getMcuClientStatus() {
150 return GlobalConfig.getCurrentStatus(); 151 return GlobalConfig.getCurrentStatus();
151 } 152 }
  153 +
152 //获取会议信息 154 //获取会议信息
153 - _getClassDetail(){ 155 + _getClassDetail() {
154 return GlobalConfig.getClassDetail(); 156 return GlobalConfig.getClassDetail();
155 } 157 }
156 158
157 //关闭会议,所有人都退出 159 //关闭会议,所有人都退出
158 - _doClassClose(_param){ 160 + _doClassClose(_param) {
  161 + this._leaveClass();
  162 + }
  163 +
  164 + //离开会议,断开连接
  165 + _doClassExit() {
159 this._leaveClass(); 166 this._leaveClass();
160 } 167 }
  168 +
161 //当前的会议状态信息发生改变,需要保存会议状态到Sass 169 //当前的会议状态信息发生改变,需要保存会议状态到Sass
162 - _onClassStatusInfoChange(_param){ 170 + _onClassStatusInfoChange(_param) {
163 this._sassSaveClassStatusInfo(); 171 this._sassSaveClassStatusInfo();
164 } 172 }
165 173
166 //Sass 174 //Sass
167 //初始化 175 //初始化
168 - _init(_param,_onSuccess,_mcuErrorCallBack){  
169 - _initSuccessCallBackFun=_onSuccess;  
170 - _mcuErrorCallBackFun=_mcuErrorCallBack; 176 + _init(_param, _onSuccess, _mcuErrorCallBack) {
  177 + _initSuccessCallBackFun = _onSuccess;
  178 + _mcuErrorCallBackFun = _mcuErrorCallBack;
171 //{"classId":"1653304953","portal":"112.126.80.182:80","userRole":"normal","userId":0} 179 //{"classId":"1653304953","portal":"112.126.80.182:80","userRole":"normal","userId":0}
172 //判断传入的参数是否存在 180 //判断传入的参数是否存在
173 - if(_param==null||EngineUtils.isEmptyObject(_param)||_onSuccess==null||_mcuErrorCallBack==null){ 181 + if (_param == null || EngineUtils.isEmptyObject(_param) || _onSuccess == null || _mcuErrorCallBack == null) {
174 loger.error('init初始化失败,参数错误'); 182 loger.error('init初始化失败,参数错误');
175 - this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_INIT_PARAM);  
176 - return ; 183 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_PARAM);
  184 + return;
177 } 185 }
178 //判断必要的参数字段值 186 //判断必要的参数字段值
179 - if(_param.classId==null||isNaN(_param.classId)||_param.portal==null||_param.portal==""){  
180 - loger.error('init初始化失败',_param);  
181 - this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_INIT_PARAM);  
182 - return ; 187 + if (_param.classId == null || isNaN(_param.classId) || _param.portal == null || _param.portal == "") {
  188 + loger.error('init初始化失败', _param);
  189 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_PARAM);
  190 + return;
183 } 191 }
184 - loger.log('init',_param); 192 + loger.log('init', _param);
185 //保存参数 193 //保存参数
186 - GlobalConfig.classId=_param.classId;  
187 - GlobalConfig.portal=_param.portal;  
188 - GlobalConfig.userRole=_param.userRole||ApeConsts.normal;  
189 - GlobalConfig.userId=_param.userId||"0"; 194 + GlobalConfig.classId = parseInt(_param.classId);
  195 + GlobalConfig.portal = _param.portal;
  196 + GlobalConfig.userRole = _param.userRole || ApeConsts.normal;
  197 + GlobalConfig.userId = _param.userId || "0";
190 198
191 //获取课堂校验信息 199 //获取课堂校验信息
192 - if(_sass){ 200 + if (_sass) {
193 _sass.getJoinParams(GlobalConfig.getClassInfo()); 201 _sass.getJoinParams(GlobalConfig.getClassInfo());
194 } 202 }
195 } 203 }
196 204
197 //外部请求加入会议 205 //外部请求加入会议
198 - _joinClass(_param,_onSuccess){  
199 - _joinClassSuccessCallBackFun=_onSuccess; 206 + _joinClass(_param, _onSuccess) {
  207 + _joinClassSuccessCallBackFun = _onSuccess;
200 //{"userName":"名字","password":""} 208 //{"userName":"名字","password":""}
201 - if(_param==null||EngineUtils.isEmptyObject(_param)||_onSuccess==null){  
202 - this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_JOIN_PARAM);  
203 - loger.log('不能进入会议,传递的参数不对.',_param);  
204 - return ; 209 + if (_param == null || EngineUtils.isEmptyObject(_param) || _onSuccess == null) {
  210 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_PARAM);
  211 + loger.log('不能进入会议,传递的参数不对.', _param);
  212 + return;
205 } 213 }
206 //判断userName 214 //判断userName
207 - if(_param.userName==null||_param.userName==""){ 215 + if (_param.userName == null || _param.userName == "") {
208 loger.log('不能进入会议,传递的参数不对.名字不能为空'); 216 loger.log('不能进入会议,传递的参数不对.名字不能为空');
209 - this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_JOIN_PARAM);  
210 - return ; 217 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_PARAM);
  218 + return;
211 } 219 }
212 220
213 - GlobalConfig.userName=_param.userName;  
214 - GlobalConfig.password=_param.password||""; 221 + GlobalConfig.userName = _param.userName;
  222 + GlobalConfig.password = _param.password || "";
215 223
216 //开始校验 224 //开始校验
217 - if(_sass){ 225 + if (_sass) {
218 _sass.passwordAndMd5Checking(GlobalConfig.getClassInfo()); 226 _sass.passwordAndMd5Checking(GlobalConfig.getClassInfo());
219 } 227 }
220 } 228 }
@@ -223,31 +231,40 @@ export default class MessageEntrance extends Emiter { @@ -223,31 +231,40 @@ export default class MessageEntrance extends Emiter {
223 _sassInitSuccessHandler(_data) { 231 _sassInitSuccessHandler(_data) {
224 //{"siteId":"h5test","passwordRequired":true,"md5":"de399d5540b3da2fbc1eb0a770d4fd66","code":0,"msType":1} 232 //{"siteId":"h5test","passwordRequired":true,"md5":"de399d5540b3da2fbc1eb0a770d4fd66","code":0,"msType":1}
225 //储存数据 233 //储存数据
226 - GlobalConfig.md5=_data.md5||"";//这个暂时用假数据,后台接口写完就有数据了  
227 - GlobalConfig.msType=_data.msType||1;  
228 - GlobalConfig.siteId=_data.siteId||"";  
229 - GlobalConfig.classType=_data.meetingType||0;  
230 -  
231 - //host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的  
232 - if(GlobalConfig.userRole=="host"){  
233 - GlobalConfig.passwordRequired=true;  
234 - }else {  
235 - GlobalConfig.passwordRequired=_data.passwordRequired||false; 234 + GlobalConfig.md5 = _data.md5 || "";//这个暂时用假数据,后台接口写完就有数据了
  235 + GlobalConfig.msType = _data.msType || 1;
  236 + GlobalConfig.siteId = _data.siteId || "";
  237 + GlobalConfig.classType = _data.meetingType || 0;
  238 +
  239 + /*//host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的
  240 + if (GlobalConfig.userRole == "host") {
  241 + GlobalConfig.passwordRequired = true;
  242 + } else {
  243 + GlobalConfig.passwordRequired = _data.passwordRequired || false;
236 } 244 }
  245 + */
  246 + GlobalConfig.passwordRequired = _data.passwordRequired || false;//md5验证的时候需要Sass返回的值,不能更改
  247 +
237 loger.log('SASS平台获取入会验证信息成功.'); 248 loger.log('SASS平台获取入会验证信息成功.');
238 249
239 //设置当前的会议状态 250 //设置当前的会议状态
240 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_1); 251 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_1);
241 252
242 - if(_initSuccessCallBackFun){ 253 + if (_initSuccessCallBackFun) {
243 //返回给客户端初始化成功的数据 254 //返回给客户端初始化成功的数据
244 - let initSuccessCallBackData={};  
245 - initSuccessCallBackData.siteId=GlobalConfig.siteId;  
246 - initSuccessCallBackData.classId=GlobalConfig.classId;  
247 - initSuccessCallBackData.userRole=GlobalConfig.userRole;  
248 - initSuccessCallBackData.userId=GlobalConfig.userId;  
249 - initSuccessCallBackData.passwordRequired=GlobalConfig.passwordRequired;  
250 - initSuccessCallBackData.classType=GlobalConfig.classType; 255 + let initSuccessCallBackData = {};
  256 + initSuccessCallBackData.siteId = GlobalConfig.siteId;
  257 + initSuccessCallBackData.classId = GlobalConfig.classId;
  258 + initSuccessCallBackData.userRole = GlobalConfig.userRole;
  259 + initSuccessCallBackData.userId = GlobalConfig.userId;
  260 + initSuccessCallBackData.classType = GlobalConfig.classType;
  261 +
  262 + //host默认需要密码,Sass服务器只判断学生是否需要密码,没有判断老师的
  263 + if (GlobalConfig.userRole == ApeConsts.host) {
  264 + initSuccessCallBackData.passwordRequired =true;
  265 + } else {
  266 + initSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;
  267 + }
251 268
252 _initSuccessCallBackFun(initSuccessCallBackData); 269 _initSuccessCallBackFun(initSuccessCallBackData);
253 } 270 }
@@ -267,7 +284,7 @@ export default class MessageEntrance extends Emiter { @@ -267,7 +284,7 @@ export default class MessageEntrance extends Emiter {
267 rs 字符串 Rs列表 284 rs 字符串 Rs列表
268 doc 字符串 Doc列表*/ 285 doc 字符串 Doc列表*/
269 286
270 -/* { 287 + /* {
271 "record": "112.126.80.182:80", 288 "record": "112.126.80.182:80",
272 "flag": "true", 289 "flag": "true",
273 "h5Module": 1, 290 "h5Module": 1,
@@ -287,24 +304,24 @@ export default class MessageEntrance extends Emiter { @@ -287,24 +304,24 @@ export default class MessageEntrance extends Emiter {
287 GlobalConfig.MCUServerPort = server.split(":")[1]; 304 GlobalConfig.MCUServerPort = server.split(":")[1];
288 } 305 }
289 306
290 - GlobalConfig.doc=_data.doc;  
291 - GlobalConfig.h5_mcu_list=_data.h5_mcu_list;  
292 - GlobalConfig.h5Module=_data.h5Module;  
293 - GlobalConfig.mcu=_data.mcu;  
294 - GlobalConfig.ms=_data.ms;  
295 - GlobalConfig.record=_data.record;  
296 - GlobalConfig.rs=_data.rs;  
297 - GlobalConfig.maxVideoChannels=_data.maxVideoChannels;  
298 - GlobalConfig.maxAudioChannels=_data.maxAudioChannels;  
299 - GlobalConfig.maxMediaChannels= _data.maxVideoChannels + _data.maxAudioChannels; 307 + GlobalConfig.doc = _data.doc;
  308 + GlobalConfig.h5_mcu_list = _data.h5_mcu_list;
  309 + GlobalConfig.h5Module = _data.h5Module;
  310 + GlobalConfig.mcu = _data.mcu;
  311 + GlobalConfig.ms = _data.ms;
  312 + GlobalConfig.record = _data.record;
  313 + GlobalConfig.rs = _data.rs;
  314 + GlobalConfig.maxVideoChannels = _data.maxVideoChannels;
  315 + GlobalConfig.maxAudioChannels = _data.maxAudioChannels;
  316 + GlobalConfig.maxMediaChannels = _data.maxVideoChannels + _data.maxAudioChannels;
300 317
301 - if(_sass){ 318 + if (_sass) {
302 _sass.getClassDetail();//会议基本信息 319 _sass.getClassDetail();//会议基本信息
303 } 320 }
304 } 321 }
305 322
306 //获取会议所有参数 getClassH5 323 //获取会议所有参数 getClassH5
307 - _sassGetClassDetailSuccessHandler(_data){ 324 + _sassGetClassDetailSuccessHandler(_data) {
308 loger.log('获取getClassDetail完成.'); 325 loger.log('获取getClassDetail完成.');
309 /* { 326 /* {
310 "cycle": 0, 327 "cycle": 0,
@@ -327,24 +344,24 @@ export default class MessageEntrance extends Emiter { @@ -327,24 +344,24 @@ export default class MessageEntrance extends Emiter {
327 "repeatmonthweekday": 0, 344 "repeatmonthweekday": 0,
328 "endcount": 1 345 "endcount": 1
329 }*/ 346 }*/
330 - GlobalConfig.classDetail=_data;  
331 - GlobalConfig.className=_data.meetingName||"";  
332 - GlobalConfig.classBeginTime=_data.beginTime||"";  
333 - GlobalConfig.classEndTime=_data.endTime||""; 347 + GlobalConfig.classDetail = _data;
  348 + GlobalConfig.className = _data.meetingName || "";
  349 + GlobalConfig.classBeginTime = _data.beginTime || "";
  350 + GlobalConfig.classEndTime = _data.endTime || "";
334 351
335 //获取会议所有信息和以前保存的会议状态信息 352 //获取会议所有信息和以前保存的会议状态信息
336 - if(_sass){ 353 + if (_sass) {
337 _sass.getClassParam(); 354 _sass.getClassParam();
338 } 355 }
339 } 356 }
340 357
341 //获取会议所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do 358 //获取会议所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do
342 - _sassGetClassParamSuccessHandler(_data){ 359 + _sassGetClassParamSuccessHandler(_data) {
343 //console.log(GlobalConfig.classStatusInfo) 360 //console.log(GlobalConfig.classStatusInfo)
344 loger.log('获取api/meeting/detail.do完成.'); 361 loger.log('获取api/meeting/detail.do完成.');
345 // console.log(_data); 362 // console.log(_data);
346 //包含整个会议最全的信息,储存数据 363 //包含整个会议最全的信息,储存数据
347 - if(_data){ 364 + if (_data) {
348 GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表 365 GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表
349 GlobalConfig.setDocRecordList(_data.docRecordList);// 366 GlobalConfig.setDocRecordList(_data.docRecordList);//
350 GlobalConfig.setDocList(_data.docList);// 367 GlobalConfig.setDocList(_data.docList);//
@@ -355,7 +372,7 @@ export default class MessageEntrance extends Emiter { @@ -355,7 +372,7 @@ export default class MessageEntrance extends Emiter {
355 GlobalConfig.setRsList(_data.rsList);// 372 GlobalConfig.setRsList(_data.rsList);//
356 373
357 } 374 }
358 - if(_data.currentInfo){ 375 + if (_data.currentInfo) {
359 //根据从Sass获取的数据信息,同步最后一次保存的会议状态信息 376 //根据从Sass获取的数据信息,同步最后一次保存的会议状态信息
360 loger.log("同步最后一次保存过的会议状态信息"); 377 loger.log("同步最后一次保存过的会议状态信息");
361 378
@@ -372,7 +389,7 @@ export default class MessageEntrance extends Emiter { @@ -372,7 +389,7 @@ export default class MessageEntrance extends Emiter {
372 //console.log(_data.currentInfo); 389 //console.log(_data.currentInfo);
373 GlobalConfig.setClassStatusInfo(_data.currentInfo); 390 GlobalConfig.setClassStatusInfo(_data.currentInfo);
374 console.log(GlobalConfig.classStatusInfo) 391 console.log(GlobalConfig.classStatusInfo)
375 - }else { 392 + } else {
376 loger.log("还没有保存过会议状信息"); 393 loger.log("还没有保存过会议状信息");
377 } 394 }
378 395
@@ -381,75 +398,82 @@ export default class MessageEntrance extends Emiter { @@ -381,75 +398,82 @@ export default class MessageEntrance extends Emiter {
381 } 398 }
382 399
383 //保存会议状态信息 400 //保存会议状态信息
384 - _sassSaveClassStatusInfo(){  
385 - if(GlobalConfig.isHost){ 401 + _sassSaveClassStatusInfo() {
  402 + if (GlobalConfig.isHost) {
386 //用get保存数据,数据内容需要转为BASE64 403 //用get保存数据,数据内容需要转为BASE64
387 //let _classStatusInfo=EngineUtils.objectToBase64(GlobalConfig.classStatusInfo); 404 //let _classStatusInfo=EngineUtils.objectToBase64(GlobalConfig.classStatusInfo);
388 //loger.log("保存会议状态信息",_classStatusInfo); 405 //loger.log("保存会议状态信息",_classStatusInfo);
389 //_sass.saveClassStatusInfo({"classStatusInfo":_classStatusInfo});//保存会议状态信息 406 //_sass.saveClassStatusInfo({"classStatusInfo":_classStatusInfo});//保存会议状态信息
390 407
  408 + //只有加入会议之后才能保存数据
  409 + if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) {
391 //POST 保存数据 410 //POST 保存数据
392 - _sass.saveClassStatusInfo({"classStatusInfo":GlobalConfig.classStatusInfo});//保存会议状态信息  
393 - }else {  
394 - loger.log("没有保存会议状态信息的权限 isHost",GlobalConfig.isHost); 411 + _sass.saveClassStatusInfo({"classStatusInfo": GlobalConfig.classStatusInfo});//保存会议状态信息
  412 + } else {
  413 + loger.error("不能保存会议数据", GlobalConfig.getCurrentStatus());
  414 + }
  415 + } else {
  416 + loger.log("没有保存会议状态信息的权限 isHost", GlobalConfig.isHost);
395 } 417 }
396 } 418 }
  419 +
397 //保存会态信息成功 420 //保存会态信息成功
398 - _sassSaveClassStatusInfoSuccessHandler(_data){  
399 - loger.log('保存会议状态信息成功.',_data); 421 + _sassSaveClassStatusInfoSuccessHandler(_data) {
  422 + loger.log('保存会议状态信息成功.', _data);
400 } 423 }
401 424
402 //Sass校验流程结束之后,开始加入MCU 425 //Sass校验流程结束之后,开始加入MCU
403 - _joinMCU(){ 426 + _joinMCU() {
404 loger.log('加入底层MCU会议.'); 427 loger.log('加入底层MCU会议.');
405 - if(_mcu){ 428 + if (_mcu) {
406 _mcu.joinMCU(GlobalConfig.getClassInfo()); 429 _mcu.joinMCU(GlobalConfig.getClassInfo());
407 } 430 }
408 } 431 }
  432 +
409 // MCU 会议成功 433 // MCU 会议成功
410 _joinClassSuccessHandler(_data) { 434 _joinClassSuccessHandler(_data) {
411 loger.log('MCU 会议成功.'); 435 loger.log('MCU 会议成功.');
412 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_2); 436 GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_2);
413 437
414 //返回给客户数据 438 //返回给客户数据
415 - if(_joinClassSuccessCallBackFun){ 439 + if (_joinClassSuccessCallBackFun) {
416 //返回给客户端初始化成功的数据 440 //返回给客户端初始化成功的数据
417 - let initSuccessCallBackData={}; 441 + let initSuccessCallBackData = {};
418 442
419 //GlobalConfig.MCUServerIP=_data.MCUServerIP; 443 //GlobalConfig.MCUServerIP=_data.MCUServerIP;
420 // GlobalConfig.MCUServerPort=_data.MCUServerPort; 444 // GlobalConfig.MCUServerPort=_data.MCUServerPort;
421 445
422 - initSuccessCallBackData.doc=GlobalConfig.doc;//文档服务器地址  
423 - initSuccessCallBackData.classId=GlobalConfig.classId;  
424 - initSuccessCallBackData.className=GlobalConfig.className;  
425 - initSuccessCallBackData.h5Module=GlobalConfig.h5Module;  
426 - initSuccessCallBackData.isHost=GlobalConfig.isHost;  
427 - initSuccessCallBackData.maxAudioChannels=GlobalConfig.maxAudioChannels;  
428 - initSuccessCallBackData.maxVideoChannels=GlobalConfig.maxVideoChannels;  
429 - initSuccessCallBackData.maxMediaChannels=GlobalConfig.maxMediaChannels;  
430 - initSuccessCallBackData.mcuDelay=GlobalConfig.mcuDelay;  
431 -  
432 - initSuccessCallBackData.msType=GlobalConfig.msType;  
433 - initSuccessCallBackData.nodeId=GlobalConfig.nodeId;  
434 - initSuccessCallBackData.password=GlobalConfig.password;  
435 - initSuccessCallBackData.passwordRequired=GlobalConfig.passwordRequired;// 老师的默认是true 446 + initSuccessCallBackData.doc = GlobalConfig.doc;//文档服务器地址
  447 + initSuccessCallBackData.classId = GlobalConfig.classId;
  448 + initSuccessCallBackData.className = GlobalConfig.className;
  449 + initSuccessCallBackData.h5Module = GlobalConfig.h5Module;
  450 + initSuccessCallBackData.isHost = GlobalConfig.isHost;
  451 + initSuccessCallBackData.maxAudioChannels = GlobalConfig.maxAudioChannels;
  452 + initSuccessCallBackData.maxVideoChannels = GlobalConfig.maxVideoChannels;
  453 + initSuccessCallBackData.maxMediaChannels = GlobalConfig.maxMediaChannels;
  454 + initSuccessCallBackData.mcuDelay = GlobalConfig.mcuDelay;
  455 +
  456 + initSuccessCallBackData.msType = GlobalConfig.msType;
  457 + initSuccessCallBackData.nodeId = GlobalConfig.nodeId;
  458 + initSuccessCallBackData.password = GlobalConfig.password;
  459 + initSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;// 老师的默认是true
436 //GlobalConfig.passwordRequired 老师的默认是true 460 //GlobalConfig.passwordRequired 老师的默认是true
437 //GlobalConfig.portal=_data.portal; 461 //GlobalConfig.portal=_data.portal;
438 - initSuccessCallBackData.role=GlobalConfig.role;  
439 - initSuccessCallBackData.siteId=GlobalConfig.siteId;  
440 - initSuccessCallBackData.topNodeID=GlobalConfig.topNodeID;  
441 - initSuccessCallBackData.userId=GlobalConfig.userId;  
442 - initSuccessCallBackData.userName=GlobalConfig.userName;  
443 - initSuccessCallBackData.userRole=GlobalConfig.userRole;  
444 - initSuccessCallBackData.userType=GlobalConfig.userType;  
445 -  
446 - initSuccessCallBackData.siteId=GlobalConfig.siteId;  
447 - initSuccessCallBackData.classId=GlobalConfig.classId;  
448 - initSuccessCallBackData.userRole=GlobalConfig.userRole;  
449 - initSuccessCallBackData.userId=GlobalConfig.userId;  
450 - initSuccessCallBackData.passwordRequired=GlobalConfig.passwordRequired;  
451 - initSuccessCallBackData.classType=GlobalConfig.classType||ApeConsts.CLASS_TYPE_INTERACT;  
452 - loger.log('加入会议成功',initSuccessCallBackData); 462 + initSuccessCallBackData.role = GlobalConfig.role;
  463 + initSuccessCallBackData.siteId = GlobalConfig.siteId;
  464 + initSuccessCallBackData.topNodeID = GlobalConfig.topNodeID;
  465 + initSuccessCallBackData.userId = GlobalConfig.userId;
  466 + initSuccessCallBackData.userName = GlobalConfig.userName;
  467 + initSuccessCallBackData.userRole = GlobalConfig.userRole;
  468 + initSuccessCallBackData.userType = GlobalConfig.userType;
  469 +
  470 + initSuccessCallBackData.siteId = GlobalConfig.siteId;
  471 + initSuccessCallBackData.classId = GlobalConfig.classId;
  472 + initSuccessCallBackData.userRole = GlobalConfig.userRole;
  473 + initSuccessCallBackData.userId = GlobalConfig.userId;
  474 + initSuccessCallBackData.passwordRequired = GlobalConfig.passwordRequired;
  475 + initSuccessCallBackData.classType = GlobalConfig.classType || ApeConsts.CLASS_TYPE_INTERACT;
  476 + loger.log('加入会议成功', initSuccessCallBackData);
453 _joinClassSuccessCallBackFun(initSuccessCallBackData); 477 _joinClassSuccessCallBackFun(initSuccessCallBackData);
454 } 478 }
455 479
@@ -528,28 +552,29 @@ export default class MessageEntrance extends Emiter { @@ -528,28 +552,29 @@ export default class MessageEntrance extends Emiter {
528 } 552 }
529 553
530 //Sass删除文档数据 554 //Sass删除文档数据
531 - _sassDeleteDocument(_param){ 555 + _sassDeleteDocument(_param) {
532 //判断传入的参数是否存在 556 //判断传入的参数是否存在
533 - if(_param==null||EngineUtils.isEmptyObject(_param)){  
534 - loger.error('sassDeleteDocument失败,参数错误',_param);  
535 - this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);  
536 - return ; 557 + if (_param == null || EngineUtils.isEmptyObject(_param)) {
  558 + loger.error('sassDeleteDocument失败,参数错误', _param);
  559 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);
  560 + return;
537 } 561 }
538 //判断必要的参数字段值 562 //判断必要的参数字段值
539 - if(_param.itemIdx==null||isNaN(_param.itemIdx)||_param.docId==null||_param.docId==""){  
540 - loger.error('sassDeleteDocument失败',_param);  
541 - this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);  
542 - return ; 563 + if (_param.itemIdx == null || isNaN(_param.itemIdx) || _param.docId == null || _param.docId == "") {
  564 + loger.error('sassDeleteDocument失败', _param);
  565 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED_PARAM);
  566 + return;
543 } 567 }
544 - loger.log('_sassDeleteDocument',_param); 568 + loger.log('_sassDeleteDocument', _param);
545 569
546 - if(_sass){ 570 + if (_sass) {
547 _sass.sassDeleteDocument(_param); 571 _sass.sassDeleteDocument(_param);
548 } 572 }
549 } 573 }
  574 +
550 //Sass删除文档成功之后,同步删除MCU数据 575 //Sass删除文档成功之后,同步删除MCU数据
551 - _sassDeleteDocumentSuccess(_param){  
552 - loger.log('sassDeleteDocumentSuccess',_param); 576 + _sassDeleteDocumentSuccess(_param) {
  577 + loger.log('sassDeleteDocumentSuccess', _param);
553 this._sendDocumentDelete(_param); 578 this._sendDocumentDelete(_param);
554 } 579 }
555 580
@@ -724,7 +749,8 @@ export default class MessageEntrance extends Emiter { @@ -724,7 +749,8 @@ export default class MessageEntrance extends Emiter {
724 749
725 //// 文档变更,白板也需要做处理 750 //// 文档变更,白板也需要做处理
726 docUpdateHandler(_data) { 751 docUpdateHandler(_data) {
727 - loger.log('Doc UpdateId ->',_data); 752 + loger.log('Doc UpdateId ->');
  753 + console.log(_data);
728 if(_whiteboard_ape){ 754 if(_whiteboard_ape){
729 _whiteboard_ape.docUpdateHandler(_data); 755 _whiteboard_ape.docUpdateHandler(_data);
730 } 756 }
@@ -19,6 +19,10 @@ ApeConsts.CLASS_PAUSING = "class.pause";//暂停 @@ -19,6 +19,10 @@ ApeConsts.CLASS_PAUSING = "class.pause";//暂停
19 ApeConsts.CLASS_PAUSING = "class.closed";//关闭 19 ApeConsts.CLASS_PAUSING = "class.closed";//关闭
20 ApeConsts.CLASS_PAUSING = "class.update";//更新当前的状态信息 20 ApeConsts.CLASS_PAUSING = "class.update";//更新当前的状态信息
21 21
  22 +
  23 +//课堂控制
  24 +ApeConsts.CLASS_ACTION_CLOSE_ALL=1;//所有人关闭会议
  25 +
22 //课堂类型 26 //课堂类型
23 ApeConsts.CLASS_TYPE_INTERACT= 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 27 ApeConsts.CLASS_TYPE_INTERACT= 1; // 互动课堂,通过MS转发音视频,不能进行H5观看
24 ApeConsts.CLASS_TYPE_LIVE= 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动 28 ApeConsts.CLASS_TYPE_LIVE= 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动
@@ -61,7 +61,7 @@ class ChatApe extends Ape { @@ -61,7 +61,7 @@ class ChatApe extends Ape {
61 chatSendPdu.fromRole = this._classInfo.userRole;// classRole已经废弃 61 chatSendPdu.fromRole = this._classInfo.userRole;// classRole已经废弃
62 chatSendPdu.isPublic = true; 62 chatSendPdu.isPublic = true;
63 // if (!(chatSendPdu.isPublic || 0 === chatSendPdu.peer)) { 63 // if (!(chatSendPdu.isPublic || 0 === chatSendPdu.peer)) {
64 - if (!chatSendPdu && 0!=chatSendPdu.peer) { 64 + if (!chatSendPdu.isPublic && 0!=chatSendPdu.peer) {
65 //发送给制定的人 65 //发送给制定的人
66 loger.log('发送私聊消息.'); 66 loger.log('发送私聊消息.');
67 this.send(chatSendPdu); 67 this.send(chatSendPdu);
@@ -11,6 +11,8 @@ import UTF8 from 'utf-8'; @@ -11,6 +11,8 @@ import UTF8 from 'utf-8';
11 import Loger from 'Loger'; 11 import Loger from 'Loger';
12 import GlobalConfig from 'GlobalConfig'; 12 import GlobalConfig from 'GlobalConfig';
13 import EngineUtils from 'EngineUtils'; 13 import EngineUtils from 'EngineUtils';
  14 +
  15 +
14 let loger = Loger.getLoger('ConferApe'); 16 let loger = Loger.getLoger('ConferApe');
15 let itemIdx=0;//table插入新数据的计数id,目前用时间戳 17 let itemIdx=0;//table插入新数据的计数id,目前用时间戳
16 let timerCounter; 18 let timerCounter;
@@ -57,6 +59,7 @@ class ConferApe extends Ape { @@ -57,6 +59,7 @@ class ConferApe extends Ape {
57 59
58 this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this)); 60 this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
59 61
  62 + this.on(pdu.RCPDU_CONFERENCE_SEND_DATA_REQUEST, this.conferMsgComingHandler.bind(this));//这个是会议消息类型,flash里在使用这里不再使用,各个模块的消息由模块自己来处理
60 } 63 }
61 64
62 65
@@ -96,6 +99,48 @@ class ConferApe extends Ape { @@ -96,6 +99,48 @@ class ConferApe extends Ape {
96 this.sendUniform(adapterPdu, true); 99 this.sendUniform(adapterPdu, true);
97 } 100 }
98 101
  102 + sendConferMsg(_messageInfo) {
  103 + if(this._classInfo===null||EngineUtils.isEmptyObject(this._classInfo)){
  104 + loger.log('不能发送会议消息.McuClient还未初始化数据!');
  105 + if(GlobalConfig.getCurrentStatus().code==0||GlobalConfig.getCurrentStatus().code==1){
  106 + this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
  107 + return;
  108 + }
  109 + return ;
  110 + }
  111 +
  112 + // to, message
  113 + loger.log('发送会议消息.', _messageInfo);
  114 +
  115 +/* message RCConferenceSendDataRequestPdu {
  116 + optional uint32 initiator = 1;
  117 + optional uint32 peer = 2;
  118 + required bool is_public = 3;
  119 + required bytes user_data = 4;
  120 + }
  121 + */
  122 +
  123 + let chatSendPdu = new pdu['RCConferenceSendDataRequestPdu'];
  124 + chatSendPdu.type = pdu.RCPDU_CONFERENCE_SEND_DATA_REQUEST;
  125 + chatSendPdu.initiator = this._classInfo.nodeId;//发起人
  126 + chatSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
  127 +
  128 + chatSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message);
  129 + //chatSendPdu.userData =UTF8.setBytesFromString(_messageInfo.message);
  130 + chatSendPdu.isPublic = true;
  131 + chatSendPdu.actionType=_messageInfo.actionType;
  132 + // if (!(chatSendPdu.isPublic || 0 === chatSendPdu.peer)) {
  133 + if (!chatSendPdu.isPublic && 0!=chatSendPdu.peer) {
  134 + //发送给制定的人
  135 + loger.log('发送私聊会议消息.');
  136 + this.send(chatSendPdu);
  137 + } else {
  138 + //发送给所有人
  139 + loger.log('发送公聊会议消息.');
  140 + this.sendChatUniform(chatSendPdu);
  141 + }
  142 + }
  143 +
99 //主动离开会议,发送通知到服务器 144 //主动离开会议,发送通知到服务器
100 leaveClass(){ 145 leaveClass(){
101 let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self; 146 let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;
@@ -132,6 +177,13 @@ class ConferApe extends Ape { @@ -132,6 +177,13 @@ class ConferApe extends Ape {
132 } 177 }
133 178
134 179
  180 + //还原课堂状态
  181 + restorClass(){
  182 + GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_WAIT;
  183 + GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();
  184 + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
  185 + this.sendUpdaterClassStatusInfo({"actionType":0});
  186 + }
135 187
136 //开始上课 188 //开始上课
137 startClass(_param){ 189 startClass(_param){
@@ -145,7 +197,7 @@ class ConferApe extends Ape { @@ -145,7 +197,7 @@ class ConferApe extends Ape {
145 GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_STARTED; 197 GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_STARTED;
146 //_param.actionType=ACTION_TYPE_1; 198 //_param.actionType=ACTION_TYPE_1;
147 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 199 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
148 - this.sendUpdaterClassStatusInfo(_param); 200 + this.sendUpdaterClassStatusInfo({"actionType":1});
149 } 201 }
150 //暂停上课 202 //暂停上课
151 pauseClass(_param){ 203 pauseClass(_param){
@@ -158,7 +210,7 @@ class ConferApe extends Ape { @@ -158,7 +210,7 @@ class ConferApe extends Ape {
158 GlobalConfig.classStopTime=EngineUtils.creatTimestampStr(); 210 GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();
159 //_param.actionType=ACTION_TYPE_2; 211 //_param.actionType=ACTION_TYPE_2;
160 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 212 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
161 - this.sendUpdaterClassStatusInfo(_param); 213 + this.sendUpdaterClassStatusInfo({"actionType":2});
162 } 214 }
163 //关闭课堂 215 //关闭课堂
164 closeClass(_param){ 216 closeClass(_param){
@@ -167,12 +219,8 @@ class ConferApe extends Ape { @@ -167,12 +219,8 @@ class ConferApe extends Ape {
167 return; 219 return;
168 } 220 }
169 221
170 - //把所有人都踢出课堂,然后把状态值还原为1  
171 - GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_WAIT;//  
172 - GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();  
173 - //_param.actionType=ACTION_TYPE_3;  
174 - this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);  
175 - this.sendUpdaterClassStatusInfo(_param); 222 + //把所有人都踢出课堂
  223 + this.sendConferMsg({"to":0,"message":"所有人退出会议","actionType":ApeConsts.CLASS_ACTION_CLOSE_ALL});
176 } 224 }
177 225
178 226
@@ -302,13 +350,86 @@ class ConferApe extends Ape { @@ -302,13 +350,86 @@ class ConferApe extends Ape {
302 try { 350 try {
303 let model=this.unPackPdu(owner, itemIdx,itemData); 351 let model=this.unPackPdu(owner, itemIdx,itemData);
304 loger.log('tableUpdateHandler',model); 352 loger.log('tableUpdateHandler',model);
  353 +
305 //处理会议更新的信息 354 //处理会议更新的信息
  355 + if(model&&model.classStatusInfo){
  356 + GlobalConfig.setClassStatusInfo(model.classStatusInfo);
  357 + }
  358 +
  359 + switch(GlobalConfig.classStatus){
  360 + case ApeConsts.CLASS_STATUS_WAIT:
  361 + break;
  362 + case ApeConsts.CLASS_STATUS_STARTED:
  363 + break;
  364 + case ApeConsts.CLASS_STATUS_PAUSE:
  365 + break;
  366 + case ApeConsts.CLASS_STATUS_CLOSE:
  367 + break;
  368 + default:
  369 + break;
  370 +
  371 + }
  372 + //_confer_ape.on(MessageTypes.CLASS_CLOSE, this._doClassClose.bind(this));//会议关闭,所有人都退出
  373 + /*{
  374 + "itemIdx": 720899,
  375 + "from": 161770995,
  376 + "owner": 161770995,
  377 + "actionType": null,
  378 + "classStatusInfo": {
  379 + "nodeId": 161770995,
  380 + "userId": "0",
  381 + "userName": "mcuTest1487161768",
  382 + "siteId": "h5test",
  383 + "classId": 1730033559,
  384 + "className": "mcuClient",
  385 + "classType": 1,
  386 + "classStatus": 0,
  387 + "classStartTime": "2017-2-15-20-30-11",
  388 + "classStopTime": "2017-2-15-20-30-28",
  389 + "classTimestamp": 0,
  390 + "classBeginTime": "2017-02-13 10:00:00",
  391 + "classEndTime": "2017-02-22 12:00:00",
  392 + "recordStatus": false,
  393 + "recordTimestamp": 0,
  394 + "recordFileName": "",
  395 + "recordDownloadUrl": "xxxxxxxxxxxxxxxxxxxxx",
  396 + "serverTimestamp": 161828290,
  397 + "activeDocId": 0,
  398 + "activeDocCurPage": 1
  399 + }
  400 + }*/
  401 +
306 } catch (e) { 402 } catch (e) {
307 loger.warn('ConferApe table update got exception. itemIdx',itemIdx); 403 loger.warn('ConferApe table update got exception. itemIdx',itemIdx);
308 } 404 }
309 } 405 }
310 406
311 407
  408 + conferMsgComingHandler(_data) {
  409 + //flash RCConferenceSendDataRequestPdu
  410 + //loger.warn('conferMsgComingHandler needs to be handled.');
  411 + //const recordInfo = pdu['RCWhiteboardDataRequestPdu'].decode(pdu);
  412 + //loger.log("conferMsgComingHandler",recordInfo);
  413 +
  414 + var chatReceivePdu = pdu['RCConferenceSendDataRequestPdu'].decode(_data);
  415 +
  416 + var chatMsg = {};
  417 + chatMsg.fromNodeID = chatReceivePdu.initiator;
  418 + chatMsg.toNodeID = chatReceivePdu.peer;
  419 + chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2);
  420 + chatMsg.actionType=chatReceivePdu.actionType;
  421 + loger.log("conferMsgComingHandler",chatMsg);
  422 + switch (chatMsg.ctionType){
  423 + case ApeConsts.CLASS_ACTION_CLOSE_ALL:
  424 + loger.log(chatMsg.message);
  425 + //会议关闭,所有人都退出
  426 + this._emit(MessageTypes.CLASS_CLOSE);
  427 + break;
  428 + default:
  429 + break;
  430 + }
  431 + }
  432 +
312 rosterInsertHandler(nodeId, nodeData) { 433 rosterInsertHandler(nodeId, nodeData) {
313 if(GlobalConfig.nodeId==nodeId){ 434 if(GlobalConfig.nodeId==nodeId){
314 loger.log("自己加入 rosterInsertHandler"); 435 loger.log("自己加入 rosterInsertHandler");
@@ -188,7 +188,7 @@ class DocApe extends Ape { @@ -188,7 +188,7 @@ class DocApe extends Ape {
188 } 188 }
189 //更新数据的字段 189 //更新数据的字段
190 docDataModel.action=ApeConsts.DOC_ACTION_COMMAND; 190 docDataModel.action=ApeConsts.DOC_ACTION_COMMAND;
191 - docDataModel.scale=parseInt(paramInfo.scale)||100;//默认是100(百分比) 191 + //docDataModel.scale=parseInt(paramInfo.scale)||100;//默认是100(百分比)
192 this.updaterDoc(docDataModel,docDataModel.itemIdx); 192 this.updaterDoc(docDataModel,docDataModel.itemIdx);
193 } 193 }
194 194
@@ -234,14 +234,13 @@ class DocApe extends Ape { @@ -234,14 +234,13 @@ class DocApe extends Ape {
234 //loger.log('tableInsertHandler---',itemData); 234 //loger.log('tableInsertHandler---',itemData);
235 let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData); 235 let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
236 this.docList[itemIdx] = itemDataInfo; 236 this.docList[itemIdx] = itemDataInfo;
237 - loger.log('tableInsertHandler',itemDataInfo);  
238 - //this._emit(MessageTypes.DOC_UPLOAD,itemDataInfo);  
239 237
240 - if(itemDataInfo.visible=="true"||itemDataInfo.visible==true){ 238 + if(itemDataInfo.visible==="true"||itemDataInfo.visible===true){
241 GlobalConfig.activeDocId=itemDataInfo.itemIdx;//当前激活的文档ID 239 GlobalConfig.activeDocId=itemDataInfo.itemIdx;//当前激活的文档ID
242 GlobalConfig.activeDocCurPage=itemDataInfo.curPageNo;//当前激活的文档的当前页 240 GlobalConfig.activeDocCurPage=itemDataInfo.curPageNo;//当前激活的文档的当前页
243 } 241 }
244 - 242 + loger.log('tableInsertHandler 发送给客户端');
  243 + console.log(itemDataInfo);
245 this._emit(MessageTypes.DOC_UPDATE,itemDataInfo);//用添加和更新都统一DOC_UPDATE 244 this._emit(MessageTypes.DOC_UPDATE,itemDataInfo);//用添加和更新都统一DOC_UPDATE
246 } 245 }
247 246
@@ -268,7 +267,7 @@ class DocApe extends Ape { @@ -268,7 +267,7 @@ class DocApe extends Ape {
268 let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData); 267 let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
269 if(itemDataInfo!=null){ 268 if(itemDataInfo!=null){
270 this.docList[itemIdx] = itemDataInfo; 269 this.docList[itemIdx] = itemDataInfo;
271 - loger.log('tableUpdateHandler',itemDataInfo); 270 +
272 /* switch (itemDataInfo.action){ 271 /* switch (itemDataInfo.action){
273 case DOC_ACTION_SWITCH_DOC: 272 case DOC_ACTION_SWITCH_DOC:
274 break; 273 break;
@@ -281,12 +280,14 @@ class DocApe extends Ape { @@ -281,12 +280,14 @@ class DocApe extends Ape {
281 }*/ 280 }*/
282 GlobalConfig.activeDocId=0;//默认id 281 GlobalConfig.activeDocId=0;//默认id
283 GlobalConfig.activeDocCurPage=1;//默认页数 282 GlobalConfig.activeDocCurPage=1;//默认页数
284 -  
285 - if(itemDataInfo.visible=="true"||itemDataInfo.visible==true){ 283 + if(itemDataInfo&&(itemDataInfo.visible==="true"||itemDataInfo.visible===true)){
286 GlobalConfig.activeDocId=itemDataInfo.itemIdx;//当前激活的文档ID 284 GlobalConfig.activeDocId=itemDataInfo.itemIdx;//当前激活的文档ID
287 GlobalConfig.activeDocCurPage=itemDataInfo.curPageNo;//当前激活的文档的当前页 285 GlobalConfig.activeDocCurPage=itemDataInfo.curPageNo;//当前激活的文档的当前页
288 } 286 }
  287 + loger.log('tableUpdateHandler 发送给客户端');
  288 + console.log(itemDataInfo);
289 this._emit(MessageTypes.DOC_UPDATE,itemDataInfo); 289 this._emit(MessageTypes.DOC_UPDATE,itemDataInfo);
  290 +
290 }else { 291 }else {
291 loger.log('tableUpdateHandler 数据无效--> itemIdx',itemIdx); 292 loger.log('tableUpdateHandler 数据无效--> itemIdx',itemIdx);
292 } 293 }
@@ -409,8 +410,7 @@ class DocApe extends Ape { @@ -409,8 +410,7 @@ class DocApe extends Ape {
409 410
410 try{ 411 try{
411 let docModelPdu= pdu['RCDocSendDataModelPdu'].decode(itemData); 412 let docModelPdu= pdu['RCDocSendDataModelPdu'].decode(itemData);
412 - //console.log(whiteBoardModelPdu);  
413 - //loger.log(docModelPdu); 413 + loger.log(docModelPdu);
414 return docModelPdu; 414 return docModelPdu;
415 }catch (err){ 415 }catch (err){
416 loger.log("文档收到数据 unPackPdu Pdu解析错误,itemIdx="+itemIdx+" err:"+err.message); 416 loger.log("文档收到数据 unPackPdu Pdu解析错误,itemIdx="+itemIdx+" err:"+err.message);
@@ -233,7 +233,8 @@ class WhiteBoardApe extends Ape { @@ -233,7 +233,8 @@ class WhiteBoardApe extends Ape {
233 233
234 tableInsertHandler(owner, itemIdx,itemData) { 234 tableInsertHandler(owner, itemIdx,itemData) {
235 let whiteBoardModel=this.unPackPdu(owner, itemIdx,itemData); 235 let whiteBoardModel=this.unPackPdu(owner, itemIdx,itemData);
236 - loger.log('tableInsertHandler',whiteBoardModel); 236 + loger.log('tableInsertHandler');
  237 + console.log(whiteBoardModel);
237 if(whiteBoardModel){ 238 if(whiteBoardModel){
238 if(GlobalConfig.activeDocId==whiteBoardModel.parentId&&GlobalConfig.activeDocCurPage==whiteBoardModel.curPageNo){ 239 if(GlobalConfig.activeDocId==whiteBoardModel.parentId&&GlobalConfig.activeDocCurPage==whiteBoardModel.curPageNo){
239 loger.log('WHITEBOARD_ANNOTAION_INSERT 显示到界面上',whiteBoardModel); 240 loger.log('WHITEBOARD_ANNOTAION_INSERT 显示到界面上',whiteBoardModel);
@@ -244,7 +245,8 @@ class WhiteBoardApe extends Ape { @@ -244,7 +245,8 @@ class WhiteBoardApe extends Ape {
244 } 245 }
245 tableUpdateHandler(owner, itemIdx, itemData) { 246 tableUpdateHandler(owner, itemIdx, itemData) {
246 let whiteBoardModel=this.unPackPdu(owner, itemIdx,itemData); 247 let whiteBoardModel=this.unPackPdu(owner, itemIdx,itemData);
247 - loger.log('tableUpdateHandler',whiteBoardModel); 248 + loger.log('tableUpdateHandler');
  249 + console.log(whiteBoardModel);
248 if(whiteBoardModel&&whiteBoardModel.parentId==GlobalConfig.activeDocId&&whiteBoardModel.curPageNo==GlobalConfig.activeDocCurPage){ 250 if(whiteBoardModel&&whiteBoardModel.parentId==GlobalConfig.activeDocId&&whiteBoardModel.curPageNo==GlobalConfig.activeDocCurPage){
249 this.updateAandShowAnnotaion(); 251 this.updateAandShowAnnotaion();
250 } 252 }
@@ -267,7 +269,8 @@ class WhiteBoardApe extends Ape { @@ -267,7 +269,8 @@ class WhiteBoardApe extends Ape {
267 } 269 }
268 //文档更新,白板也要更新 270 //文档更新,白板也要更新
269 docUpdateHandler(_data){ 271 docUpdateHandler(_data){
270 - loger.log("白板收到文档更新的消息docUpdateHandler",_data); 272 + loger.log("白板收到文档更新的消息docUpdateHandler");
  273 + console.log(_data);
271 274
272 //如果切换了文档或翻页,清除之前的添加步骤记录 275 //如果切换了文档或翻页,清除之前的添加步骤记录
273 if(_data.action==ApeConsts.DOC_ACTION_SWITCH_DOC){ 276 if(_data.action==ApeConsts.DOC_ACTION_SWITCH_DOC){
@@ -688,6 +688,7 @@ message RCConferenceSendDataRequestPdu { @@ -688,6 +688,7 @@ message RCConferenceSendDataRequestPdu {
688 optional uint32 peer = 2; 688 optional uint32 peer = 2;
689 required bool is_public = 3; 689 required bool is_public = 3;
690 required bytes user_data = 4; 690 required bytes user_data = 4;
  691 + optional uint32 action_type = 5;//消息的指令类型
691 } 692 }
692 693
693 message RCChatSendDataRequestPdu { 694 message RCChatSendDataRequestPdu {