JXMeetingObject.mm 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. #import "JXMeetingObject.h"
  2. // #import "MessagesViewController.h"
  3. //#import "ChatViewController.h"
  4. //#import "ContactsViewController.h"
  5. #import "AppDelegate.h"
  6. #import "versionManage.h"
  7. #import "acceptCallViewController.h"
  8. #import "JXAVCallViewController.h"
  9. #import "JXTalkModel.h"
  10. #ifdef Live_Version
  11. #import "JXLiveJidManager.h"
  12. #endif
  13. #undef TAG
  14. #define kTAG @"AppDelegate///: "
  15. #define TAG kTAG
  16. #define kTabBarIndex_Favorites 0
  17. #define kTabBarIndex_Recents 1
  18. #define kTabBarIndex_Contacts 2
  19. #define kTabBarIndex_Numpad 3
  20. #define kTabBarIndex_Messages 4
  21. #define kNotifKey @"key"
  22. #define kNotifKey_IncomingCall @"icall"
  23. #define kNotifKey_IncomingMsg @"imsg"
  24. #define kNotifIncomingCall_SessionId @"sid"
  25. #define kNetworkAlertMsgThreedGNotEnabled Localized(@"JXMeetingObject_3GNetWork")
  26. #define kNetworkAlertMsgNotReachable Localized(@"JXMeetingObject_NoNetWork")
  27. #define kNewMessageAlertText Localized(@"JXMeetingObject_NewMessage")
  28. #define kAlertMsgButtonOkText Localized(@"JX_Confirm")
  29. #define kAlertMsgButtonCancelText Localized(@"JX_Cencal")
  30. static UIBackgroundTaskIdentifier sBackgroundTask = UIBackgroundTaskInvalid;
  31. static dispatch_block_t sExpirationHandler = nil;
  32. @interface JXMeetingObject()
  33. @property (nonatomic, assign) BOOL isInCall;
  34. @property (nonatomic, copy) NSString *meetUrl;
  35. @end
  36. @implementation JXMeetingObject
  37. -(id)init{
  38. self = [super init];
  39. _count = 0;
  40. _lastConnectTime = 0;
  41. _showConnResult = NO;
  42. _checkCount = 0;
  43. [g_notify addObserver:self selector:@selector(newMsgCome:) name:kXMPPNewMsgNotifaction object:nil];
  44. [g_notify addObserver:self selector:@selector(callAnswerNotification:) name:kCallAnswerNotification object:nil];
  45. return self;
  46. }
  47. -(void)dealloc{
  48. [g_notify removeObserver:self];
  49. }
  50. -(void)callAnswerNotification:(NSNotification *)notifacation{
  51. self.hasAnswer = YES;
  52. }
  53. -(void)onOtherEvent:(NSNotification*)notification {
  54. NSLog(@"onOtherEvent: %@",notification.name);
  55. }
  56. -(NSString*)getVideoSize{
  57. NSString* s = [[NSUserDefaults standardUserDefaults] objectForKey:@"chatVideoSize"];
  58. if(s==nil)
  59. s = @"1";
  60. switch ([s intValue]) {
  61. case 0:
  62. s = @"11";
  63. break;
  64. case 1:
  65. s = @"9";
  66. break;
  67. case 2:
  68. s = @"5";
  69. break;
  70. case 3:
  71. s = @"2";
  72. break;
  73. default:
  74. s = @"5";
  75. break;
  76. }
  77. return s;
  78. }
  79. -(void)startMeeting{
  80. multitaskingSupported = [[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [[UIDevice currentDevice] isMultitaskingSupported];
  81. // sBackgroundTask = UIBackgroundTaskInvalid;
  82. // UIApplication* app = [UIApplication sharedApplication];
  83. // //sExpirationHandler = ^{//老代码
  84. // sBackgroundTask = [app beginBackgroundTaskWithExpirationHandler:^{
  85. // //NSLog(@"Background task completed");
  86. // [app endBackgroundTask:sBackgroundTask];
  87. // sBackgroundTask = UIBackgroundTaskInvalid;
  88. // }];
  89. if(multitaskingSupported){
  90. // NgnNSLog(TAG, @"Multitasking IS supported");
  91. }
  92. // Set media parameters if you want
  93. // MediaSessionMgr::defaultsSetAudioGain(0, 0);
  94. // Set some codec priorities
  95. /*int prio = 0;
  96. SipStack::setCodecPriority(tdav_codec_id_g722, prio++);
  97. SipStack::setCodecPriority(tdav_codec_id_speex_wb, prio++);
  98. SipStack::setCodecPriority(tdav_codec_id_pcma, prio++);
  99. SipStack::setCodecPriority(tdav_codec_id_pcmu, prio++);
  100. SipStack::setCodecPriority(tdav_codec_id_h264_bp, prio++);
  101. SipStack::setCodecPriority(tdav_codec_id_h264_mp, prio++);
  102. SipStack::setCodecPriority(tdav_codec_id_vp8, prio++);*/
  103. //...etc etc etc
  104. // [self changeLanguage];
  105. [self MicrophoneCheck];
  106. }
  107. -(void)stopMeeting{
  108. }
  109. -(void)meetingDidEnterBackground:(UIApplication *)application {
  110. }
  111. - (void)meetingWillEnterForeground:(UIApplication *)application {
  112. // check native contacts changed while app was runnig on background
  113. if(self->nativeABChangedWhileInBackground){
  114. // trigger refresh
  115. self->nativeABChangedWhileInBackground = NO;
  116. }
  117. }
  118. - (void) MicrophoneCheck{
  119. if ([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]) {
  120. [[AVAudioSession sharedInstance] performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
  121. if (granted) {
  122. // Microphone enabled code
  123. // NSLog(@"Microphone is enabled..");
  124. }
  125. else {
  126. // Microphone disabled code
  127. // NSLog(@"Microphone is disabled..");
  128. // We're in a background thread here, so jump to main thread to do UI work.
  129. dispatch_async(dispatch_get_main_queue(), ^{
  130. [g_App showAlert:Localized(@"JX_CanNotOpenMicr")];
  131. });
  132. }
  133. }];
  134. }
  135. }
  136. -(ChatViewController *)chatViewController{
  137. if(!_chatViewController){
  138. // _chatViewController = [[ChatViewController alloc] initWithNibName: @"ChatView" bundle:nil];
  139. }
  140. return _chatViewController;
  141. }
  142. - (void)doTerminate{
  143. [g_notify removeObserver:self];
  144. }
  145. - (void)clearMemory{
  146. }
  147. /*没用:
  148. - (void)setSettingToNgn:(NSDictionary*)dict{
  149. NSArray* itemArray = [dict objectForKey:@"PreferenceSpecifiers"];
  150. for(int i = 0; i < [itemArray count]; i++)
  151. {
  152. NSDictionary* identityItemDictionary = (NSDictionary*)[itemArray objectAtIndex:i];
  153. NSString* strType = (NSString*)[identityItemDictionary objectForKey:@"Type"];
  154. NSString* strKey = (NSString*)[identityItemDictionary objectForKey:@"Key"];
  155. NSString* strValue = (NSString*)[identityItemDictionary objectForKey:@"DefaultValue"];
  156. if([strType isEqualToString:@"PSTextFieldSpecifier"])
  157. [[NgnEngine sharedInstance].configurationService setStringWithKey:strKey andValue:strValue];
  158. if([strType isEqualToString:@"PSToggleSwitchSpecifier"])
  159. [[NgnEngine sharedInstance].configurationService setBoolWithKey:strKey andValue:[strValue isEqualToString:@"YES"]];
  160. }
  161. }*/
  162. -(void)loadSeeting{
  163. /*
  164. [[CSetting sharedInstance] loadSetting];
  165. NSDictionary* p = [[[CSetting sharedInstance].identityDict objectForKey:@"PreferenceSpecifiers"] objectAtIndex:2];
  166. NSString* userId = [p objectForKey:@"DefaultValue"];
  167. if([userId isEqualToString:g_server.myself.userId]){//如果已保存则赋值
  168. [self setSettingToNgn:[CSetting sharedInstance].identityDict];
  169. [self setSettingToNgn:[CSetting sharedInstance].networkDict];
  170. [self setSettingToNgn:[CSetting sharedInstance].traversalDict];
  171. [self setSettingToNgn:[CSetting sharedInstance].mediaDict];
  172. [self setSettingToNgn:[CSetting sharedInstance].codecsDict];
  173. }
  174. else
  175. [self saveMeetingId:g_server.myself];//如果未保存则保存
  176. */
  177. }
  178. //SIP掉线后提示
  179. - (void) showAutoConnect{
  180. if(_alert)
  181. return;
  182. _alert = [[UIAlertView alloc] initWithTitle:Localized(@"JXMeeting_offline") message:Localized(@"JXMeeting_reConnect") delegate:self cancelButtonTitle:Localized(@"JX_Cencal") otherButtonTitles:Localized(@"JX_Confirm"), nil];
  183. _alert.tag = 10000;
  184. [_alert show];
  185. _showConnResult = YES;
  186. }
  187. #pragma mark UIAlertView delegate
  188. - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
  189. if (buttonIndex == 1) {
  190. if (alertView.tag == 10000) { //SIP掉线
  191. [JXMyTools showTipView:Localized(@"JX_Connection")];
  192. [self connect];
  193. // [self performSelector:@selector(checkAutoConnect) withObject:nil afterDelay:60];
  194. }
  195. }
  196. _alert = nil;
  197. }
  198. -(void)showConnectFailed{
  199. [JXMyTools showTipView:[NSString stringWithFormat:@"%@%@",Localized(@"JXMeeting_connect"),Localized(@"JX_Failed")]];
  200. _showConnResult = NO;
  201. }
  202. -(void)showConnectSuccess{
  203. [JXMyTools showTipView:[NSString stringWithFormat:@"%@%@",Localized(@"JXMeeting_connect"),Localized(@"JX_Success")]];
  204. _showConnResult = NO;
  205. }
  206. -(void)checkAutoConnect{
  207. if(!self.connected)
  208. [self showAutoConnect];
  209. }
  210. -(BOOL)isConnected{
  211. }
  212. -(void)sendAsk:(int)type toUserId:(NSString*)toUserId toUserName:(NSString*)toUserName meetUrl:(NSString *)meetUrl{
  213. NSString* content=nil;
  214. self.meetUrl = meetUrl;
  215. [self doSendMsg:type content:content toUserId:toUserId toUserName:toUserName timeLen:0 objectId:nil];
  216. }
  217. -(void)sendReady:(int)type toUserId:(NSString*)toUserId toUserName:(NSString*)toUserName{
  218. NSString* content=nil;
  219. [self doSendMsg:type content:content toUserId:toUserId toUserName:toUserName timeLen:0 objectId:nil];
  220. }
  221. -(void)sendAccept:(int)type toUserId:(NSString*)toUserId toUserName:(NSString*)toUserName objectId:(NSString *)objectId{
  222. NSString* content=nil;
  223. [self doSendMsg:type content:content toUserId:toUserId toUserName:toUserName timeLen:0 objectId:objectId];
  224. }
  225. -(void)sendCancel:(int)type toUserId:(NSString*)toUserId toUserName:(NSString*)toUserName{
  226. NSString* content=nil;
  227. [self doSendMsg:type content:content toUserId:toUserId toUserName:toUserName timeLen:0 objectId:nil];
  228. }
  229. -(void)sendNoAnswer:(int)type toUserId:(NSString*)toUserId toUserName:(NSString*)toUserName{
  230. NSString* content=nil;
  231. [self doSendMsg:type content:content toUserId:toUserId toUserName:toUserName timeLen:1 objectId:nil];
  232. }
  233. -(void)sendEnd:(int)type toUserId:(NSString*)toUserId toUserName:(NSString*)toUserName timeLen:(int)timeLen{
  234. NSString* content=nil;
  235. [self doSendMsg:type content:content toUserId:toUserId toUserName:toUserName timeLen:timeLen objectId:nil];
  236. }
  237. -(void)sendMeetingInvite:(NSString*)toUserId toUserName:(NSString*)toUserName roomJid:(NSString*)roomJid callId:(NSString*)callId type:(int)type{
  238. JXMessageObject *msg=[[JXMessageObject alloc]init];
  239. if(type == kWCMessageTypeVideoMeetingInvite)
  240. msg.content = Localized(@"JXMeeting_InviteVideoMeeting");
  241. else
  242. msg.content = Localized(@"JXMeeting_InviteAudioMeeting");
  243. if (type == kWCMessageTypeTalkInvite) {
  244. msg.content = Localized(@"JX_InviteJoinWalkieTalkie");
  245. }
  246. msg.fileName = callId;
  247. msg.timeSend = [NSDate date];
  248. msg.fromUserId = MY_USER_ID;
  249. msg.fromUserName = MY_USER_NAME;
  250. msg.toUserId = toUserId;
  251. msg.toUserName = toUserName;
  252. msg.objectId = roomJid;
  253. msg.isGroup = NO;
  254. msg.type = [NSNumber numberWithInt:type];
  255. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  256. msg.isRead = [NSNumber numberWithBool:NO];
  257. msg.isReadDel = [NSNumber numberWithInt:NO];
  258. msg.sendCount = 1;
  259. [msg insert:nil];
  260. [g_xmpp sendMessage:msg roomName:nil];//发送消息
  261. [g_notify postNotificationName:kXMPPShowMsgNotifaction object:msg];//显示出来
  262. }
  263. -(void)doSendMsg:(int)type content:(NSString*)content toUserId:(NSString*)toUserId toUserName:(NSString*)toUserName timeLen:(int)timeLen objectId:(NSString *)objectId{
  264. JXMessageObject *msg=[[JXMessageObject alloc]init];
  265. msg.content = content;
  266. msg.timeSend = [NSDate date];
  267. msg.fromUserId = MY_USER_ID;
  268. msg.fromUserName = MY_USER_NAME;
  269. msg.toUserId = toUserId;
  270. msg.toUserName = toUserName;
  271. msg.isGroup = NO;
  272. msg.type = [NSNumber numberWithInt:type];
  273. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  274. msg.isRead = [NSNumber numberWithBool:NO];
  275. msg.isReadDel = [NSNumber numberWithInt:NO];
  276. msg.timeLen = [NSNumber numberWithInt:timeLen];//对方无应答标志或通话时长
  277. msg.sendCount = 1;
  278. msg.objectId = objectId;
  279. if (type == kWCMessageTypeAudioChatAsk || type == kWCMessageTypeVideoChatAsk) {
  280. msg.fileName = self.meetUrl;
  281. }
  282. [msg insert:nil];
  283. [g_xmpp sendMessage:msg roomName:nil];//发送消息
  284. [g_notify postNotificationName:kXMPPShowMsgNotifaction object:msg];//显示出来
  285. }
  286. -(void)doSendGroupMsg:(int)type content:(NSString*)content toUserId:(NSString*)toUserId{
  287. JXMessageObject *msg=[[JXMessageObject alloc]init];
  288. msg.content = content;
  289. msg.timeSend = [NSDate date];
  290. msg.fromUserId = MY_USER_ID;
  291. msg.fromUserName = MY_USER_NAME;
  292. msg.toUserId = toUserId;
  293. msg.objectId = toUserId;
  294. msg.isGroup = YES;
  295. msg.type = [NSNumber numberWithInt:type];
  296. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  297. msg.isRead = [NSNumber numberWithBool:NO];
  298. msg.isReadDel = [NSNumber numberWithInt:NO];
  299. msg.sendCount = 3;
  300. [g_xmpp sendMessage:msg roomName:toUserId];//发送消息
  301. }
  302. #pragma mark 接受新消息广播
  303. -(void)newMsgCome:(NSNotification *)notifacation
  304. {
  305. JXMessageObject *msg = notifacation.object;
  306. if ([msg.fromUserId isEqualToString:MY_USER_ID]) {
  307. if ([msg.type intValue] == kWCMessageTypeAudioChatAsk || [msg.type intValue] == kWCMessageTypeVideoChatAsk || [msg.type intValue] == kWCMessageTypeVideoMeetingInvite || [msg.type intValue] == kWCMessageTypeAudioMeetingInvite || [msg.type intValue] == kWCMessageTypeAudioChatAccept || [msg.type intValue] == kWCMessageTypeVideoChatAccept || [msg.type intValue] == kWCMessageTypeTalkInvite) {
  308. return;
  309. }
  310. }
  311. if(msg==nil)
  312. return;
  313. #ifdef Live_Version
  314. if([[JXLiveJidManager shareArray] contains:msg.toUserId] || [[JXLiveJidManager shareArray] contains:msg.fromUserId])
  315. return;
  316. #endif
  317. if([msg.toUserId isEqualToString:MY_USER_ID]){
  318. if([msg.type intValue] == kWCMessageTypeVideoChatAsk || [msg.type intValue] == kWCMessageTypeAudioChatAsk){
  319. if(g_meeting.isMeeting && ![self.roomNum isEqualToString:msg.fromUserId]){ //如果有别的通话 不弹出界面
  320. if (!msg.isMultipleRelay) {
  321. [self sendAVBusy:msg];
  322. }
  323. return; //如果有别的通话 不弹出界面
  324. }
  325. int n = ([[NSDate date] timeIntervalSince1970] + (g_server.timeDifference / 1000))-[msg.timeSend timeIntervalSince1970];
  326. if(n>30)//如果时间差超过30秒,则放弃
  327. return;
  328. self.isInCall = YES;
  329. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  330. if(g_meeting.isMeeting && ![self.roomNum isEqualToString:msg.fromUserId]){
  331. if (!msg.isMultipleRelay) {
  332. [self sendAVBusy:msg];
  333. }
  334. return; //如果有别的通话 不弹出界面
  335. }
  336. if (self.isInCall) {
  337. self.meetUrl = msg.fileName;
  338. acceptCallViewController* vc = [acceptCallViewController alloc];
  339. vc.toUserName = msg.fromUserName;
  340. vc.toUserId = msg.fromUserId;
  341. vc.type = msg.type;
  342. vc.roomNum = msg.fromUserId;
  343. NSString* s;
  344. if([msg.type intValue] == kWCMessageTypeAudioChatAsk)
  345. s = Localized(@"JXMeeting_AudioCall_title");
  346. else
  347. s = Localized(@"JXMeeting_VideoCall_title");
  348. vc.title = s;
  349. vc.delegate = self;
  350. vc.didTouch = @selector(doAudioVideoMeeting:);
  351. vc.changeVideo = @selector(doVideoMeeting:);
  352. vc.changeAudio = @selector(doAudioMeeting:);
  353. vc = [vc init];
  354. // [g_window addSubview:vc.view];
  355. [g_navigation pushViewController:vc animated:NO];
  356. _msg = msg;
  357. }
  358. });
  359. // if(self.isConnected){
  360. // [self sendReadyMsg:msg];//如果连接成功,则发ready消息
  361. // }else{
  362. // _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(checkMediaServer:) userInfo:msg repeats:YES];
  363. // [self connect];//如果不成功,则开定时器检查
  364. // }
  365. return;
  366. }
  367. if([msg.type intValue] == kWCMessageTypeAudioMeetingInvite || [msg.type intValue] == kWCMessageTypeVideoMeetingInvite || [msg.type intValue] == kWCMessageTypeTalkInvite){
  368. // if (msg.isDelay) { // 离线的会议音视频邀请不接收
  369. // return;
  370. // }
  371. int n = ([[NSDate date] timeIntervalSince1970] + (g_server.timeDifference / 1000))-[msg.timeSend timeIntervalSince1970];
  372. if(self.isMeeting) return; //如果有别的通话 不弹出界面
  373. if(n<=30){//如果时间差超过30秒,则放弃
  374. if(![current_meeting_no isEqualToString:msg.fileName]){//如果正在开会,则不弹框
  375. NSString* s;
  376. BOOL isTalk = NO;
  377. if([msg.type intValue] == kWCMessageTypeVideoMeetingInvite)
  378. s = @"邀请您视频通话...";
  379. else if ([msg.type intValue] == kWCMessageTypeTalkInvite) {
  380. s = Localized(@"JX_InviteJoinWalkieTalkie");
  381. isTalk = YES;
  382. }
  383. else
  384. s = @"邀请您语音通话...";
  385. acceptCallViewController* vc = [acceptCallViewController alloc];
  386. vc.isGroup = YES;
  387. vc.isTalk = isTalk;
  388. vc.toUserName = msg.fromUserName;
  389. vc.toUserId = msg.fromUserId;
  390. vc.roomNum = msg.objectId;
  391. vc.type = msg.type;
  392. vc.title = s;
  393. vc.delegate = self;
  394. vc.didTouch = @selector(doAudioVideoMeeting:);
  395. vc = [vc init];
  396. // [g_window addSubview:vc.view];
  397. [g_navigation pushViewController:vc animated:NO];
  398. _msg = msg;
  399. }
  400. }
  401. }
  402. }
  403. if ([msg.type intValue] == kWCMessageTypeAudioChatCancel || [msg.type intValue] == kWCMessageTypeVideoChatCancel) {
  404. self.isInCall = NO;
  405. [g_App endCall];
  406. }
  407. msg = nil;
  408. }
  409. - (void)sendOnlineMsg:(JXMessageObject *)msg1 {
  410. JXMessageObject *msg=[[JXMessageObject alloc]init];
  411. msg.content = nil;
  412. msg.timeSend = [NSDate date];
  413. msg.fromUserId = MY_USER_ID;
  414. msg.fromUserName = MY_USER_NAME;
  415. msg.toUserId = msg1.objectId;
  416. msg.isGroup = YES;
  417. msg.type = [NSNumber numberWithInt:kWCMessageTypeTalkOnline];
  418. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  419. msg.isRead = [NSNumber numberWithBool:NO];
  420. msg.isReadDel = [NSNumber numberWithInt:NO];
  421. msg.sendCount = 1;
  422. msg.objectId = msg1.objectId;
  423. [msg insert:nil];
  424. [g_xmpp sendMessage:msg roomName:msg1.objectId];//发送消息
  425. }
  426. - (void)sendAVBusy:(JXMessageObject *)meetingMsg {
  427. JXMessageObject *msg=[[JXMessageObject alloc]init];
  428. msg.timeSend = [NSDate date];
  429. msg.fromUserId = MY_USER_ID;
  430. msg.fromUserName = MY_USER_NAME;
  431. msg.toUserId = meetingMsg.fromUserId;
  432. msg.isGroup = NO;
  433. msg.type = [NSNumber numberWithInt:kWCMessageTypeAVBusy];
  434. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  435. msg.isRead = [NSNumber numberWithBool:NO];
  436. if ([meetingMsg.type intValue] == kWCMessageTypeVideoChatAsk) {
  437. msg.objectId = @"1";
  438. }else {
  439. msg.objectId = @"0";
  440. }
  441. [g_xmpp sendMessage:msg roomName:nil];//发送消息
  442. [msg insert:nil];
  443. }
  444. -(void)checkMediaServer:(NSTimer*)sender{
  445. _checkCount++;
  446. if(self.isConnected){
  447. JXMessageObject* msg = (JXMessageObject*)[sender userInfo];
  448. [self sendReadyMsg:msg];//如果连接成功,则发ready消息
  449. [_timer invalidate];
  450. _checkCount = 0;
  451. }
  452. if(_checkCount>30){//检查30次,每秒一次
  453. [_timer invalidate];
  454. _checkCount = 0;
  455. }
  456. }
  457. -(void)sendReadyMsg:(JXMessageObject*)msg{//发送准备好音视频通话的消息
  458. int n = [[NSDate date] timeIntervalSince1970]-[msg.timeSend timeIntervalSince1970];
  459. if(n>30)//如果时间差超过30秒,则放弃
  460. return;
  461. int k;
  462. if([msg.type intValue] == kWCMessageTypeVideoChatAsk)
  463. k = kWCMessageTypeVideoChatReady;
  464. else
  465. k = kWCMessageTypeAudioChatReady;
  466. [self sendReady:k toUserId:msg.fromUserId toUserName:msg.fromUserName];
  467. }
  468. -(void)doAudioVideoMeeting:(acceptCallViewController*)vc{
  469. JXAVCallViewController *avVC = [[JXAVCallViewController alloc] init];
  470. avVC.isTalk = vc.isTalk;
  471. if([_msg.type intValue] == kWCMessageTypeAudioMeetingInvite || [_msg.type intValue] == kWCMessageTypeAudioChatAsk){
  472. avVC.isAudio = YES;
  473. }
  474. if([_msg.type intValue] == kWCMessageTypeAudioMeetingInvite || [_msg.type intValue] == kWCMessageTypeVideoMeetingInvite){
  475. avVC.isGroup = YES;
  476. avVC.roomNum = _msg.objectId;
  477. }else if ([_msg.type intValue] == kWCMessageTypeAudioChatAsk) {
  478. avVC.roomNum = _msg.fromUserId;
  479. avVC.meetUrl = self.meetUrl;
  480. [g_meeting sendAccept:kWCMessageTypeAudioChatAccept toUserId:_msg.fromUserId toUserName:_msg.fromUserName objectId:_msg.objectId];
  481. }else if ([_msg.type intValue] == kWCMessageTypeVideoChatAsk) {
  482. avVC.roomNum = _msg.fromUserId;
  483. avVC.meetUrl = self.meetUrl;
  484. [g_meeting sendAccept:kWCMessageTypeVideoChatAccept toUserId:_msg.fromUserId toUserName:_msg.fromUserName objectId:_msg.objectId];
  485. }else if ([_msg.type intValue] == kWCMessageTypeTalkInvite){
  486. avVC.isGroup = YES;
  487. avVC.roomNum = _msg.objectId;
  488. }
  489. avVC.toUserId = _msg.fromUserId;
  490. avVC.toUserName = _msg.fromUserName;
  491. avVC.view.frame = [UIScreen mainScreen].bounds;
  492. // [self startVideoMeeting:_msg.fileName roomJid:_msg.objectId];
  493. // else
  494. // [self startAudioMeeting:_msg.fileName roomJid:_msg.objectId];
  495. // UIViewController *lastVC = (UIViewController *)g_navigation.lastVC;
  496. // [lastVC presentViewController:avVC animated:NO completion:nil];
  497. [g_window addSubview:avVC.view];
  498. _msg = nil;
  499. }
  500. - (void)doAudioMeeting:(acceptCallViewController *)vc{
  501. JXAVCallViewController *avVC = [[JXAVCallViewController alloc] init];
  502. avVC.isTalk = vc.isTalk;
  503. avVC.isAudio = YES;
  504. avVC.roomNum = _msg.fromUserId;
  505. avVC.meetUrl = self.meetUrl;
  506. [g_meeting sendAccept:kWCMessageTypeAudioChatAccept toUserId:_msg.fromUserId toUserName:_msg.fromUserName objectId:_msg.objectId];
  507. avVC.toUserId = _msg.fromUserId;
  508. avVC.toUserName = _msg.fromUserName;
  509. avVC.view.frame = [UIScreen mainScreen].bounds;
  510. [g_window addSubview:avVC.view];
  511. _msg = nil;
  512. }
  513. - (void)doVideoMeeting:(acceptCallViewController *)vc{
  514. JXAVCallViewController *avVC = [[JXAVCallViewController alloc] init];
  515. avVC.isTalk = vc.isTalk;
  516. avVC.roomNum = _msg.fromUserId;
  517. avVC.meetUrl = self.meetUrl;
  518. [g_meeting sendAccept:kWCMessageTypeVideoChatAccept toUserId:_msg.fromUserId toUserName:_msg.fromUserName objectId:_msg.objectId];
  519. avVC.toUserId = _msg.fromUserId;
  520. avVC.toUserName = _msg.fromUserName;
  521. avVC.view.frame = [UIScreen mainScreen].bounds;
  522. [g_window addSubview:avVC.view];
  523. _msg = nil;
  524. }
  525. /*
  526. -(BOOL)isMeeting{
  527. // return self.audioCallController.sessionId>0 || self.videoCallController.sessionId>0;
  528. return self.audioCallController || self.videoCallController;
  529. }
  530. */
  531. @end