Conversation.AVIMOperation operation = AVIMOperation.getAVIMOperation( intent.getExtras().getInt(Conversation.INTENT_KEY_OPERATION));
if (null == imop) { LOGGER.e("IllegalState. operation is null, excepted is QUIT / KICK, originalOp=" + operation); } else if (imop.getCode() == AVIMOperation.CONVERSATION_QUIT.getCode()) { onQuit(requestId); } else if (imop.getCode() == AVIMOperation.CONVERSATION_RM_MEMBER.getCode()) { onKicked(requestId); if (null == imop) { LOGGER.e("IllegalState. operation is null, excepted is JOIN / INVITE, originalOp=" + operation); } else if (imop.getCode() == AVIMOperation.CONVERSATION_JOIN.getCode()) { onJoined(requestId); } else if (imop.getCode() == AVIMOperation.CONVERSATION_ADD_MEMBER.getCode()) { onInvited(requestId); } else if (AVIMOperation.CONVERSATION_MUTE.getCode() == imop.getCode()) { onMuted(requestId); } else if (AVIMOperation.CONVERSATION_UNMUTE.getCode() == imop.getCode()) { onUnmuted(requestId); } else if (AVIMOperation.CONVERSATION_UPDATE.getCode() == imop.getCode()) { onInfoUpdated(requestId, convCommand.getUdate());
if (null != receiver) { LocalBroadcastManager.getInstance(AVOSCloud.getContext()).registerReceiver(receiver, new IntentFilter(operation.getOperation() + requestId)); i.putExtra(Conversation.INTENT_KEY_CONVERSATION, conversationId); i.putExtra(Conversation.INTENT_KEY_CONV_TYPE, convType); i.putExtra(Conversation.INTENT_KEY_OPERATION, operation.getCode()); i.putExtra(Conversation.INTENT_KEY_REQUESTID, requestId); try {
Operation op = session.conversationOperationCache.poll(requestKey); LOGGER.d("poll operation with requestId=" + requestKey + ", result=" + op); if (null != op && op.operation == AVIMOperation.CONVERSATION_QUERY.getCode()) { String result = convCommand.getResults().getData(); HashMap<String, Object> bundle = new HashMap<>(); if (null != op && op.operation == AVIMOperation.CONVERSATION_MUTED_MEMBER_QUERY.getCode()) { originOperation = AVIMOperation.getAVIMOperation(op.operation); conversationId = op.conversationId; } else {
Operation op = session.conversationOperationCache.poll(requestId); InternalConfiguration.getOperationTube().onOperationCompleted(op.sessionId, op.conversationId, requestId, Conversation.AVIMOperation.getAVIMOperation(op.operation), new IllegalStateException("Connection Lost"));
if (!AVConnectionManager.getInstance().isConnectionEstablished()) { RuntimeException se = new RuntimeException("Connection Lost"); sessionListener.onError(this, se, Conversation.AVIMOperation.CONVERSATION_CREATION.getCode(), requestId); return;
if (BlacklistCommandPacket.BlacklistCommandOp.QUERY_RESULT.equals(operation)) { Operation op = session.conversationOperationCache.poll(requestKey); if (null == op || op.operation != Conversation.AVIMOperation.CONVERSATION_BLOCKED_MEMBER_QUERY.getCode()) { LOGGER.w("not found requestKey: " + requestKey); } else { Conversation.AVIMOperation originOperation = Conversation.AVIMOperation.getAVIMOperation(op.operation); internalConversation.onResponse4MemberBlock(originOperation, operation, requestKey, blacklistCommand);
protected boolean sendClientCMDToPushService2(String clientId, String conversationId, int convType, final AVIMMessage message, final AVIMMessage message2, final AVIMOperation operation, BroadcastReceiver receiver) { int requestId = WindTalker.getNextIMRequestId(); if (null != receiver) { LocalBroadcastManager.getInstance(AVOSCloud.getContext()).registerReceiver(receiver, new IntentFilter(operation.getOperation() + requestId)); } Intent i = new Intent(AVOSCloud.getContext(), PushService.class); i.setAction(Conversation.AV_CONVERSATION_INTENT_ACTION); if (null != message) { i.putExtra(Conversation.INTENT_KEY_DATA, message.toJSONString()); } if (null != message2) { i.putExtra(Conversation.INTENT_KEY_MESSAGE_EX, message2.toJSONString()); } i.putExtra(Conversation.INTENT_KEY_CLIENT, clientId); i.putExtra(Conversation.INTENT_KEY_CONVERSATION, conversationId); i.putExtra(Conversation.INTENT_KEY_CONV_TYPE, convType); i.putExtra(Conversation.INTENT_KEY_OPERATION, operation.getCode()); i.putExtra(Conversation.INTENT_KEY_REQUESTID, requestId); try { AVOSCloud.getContext().startService(IntentUtil.setupIntentFlags(i)); } catch (Exception ex) { LOGGER.e("failed to startService. cause: " + ex.getMessage()); return false; } return true; }
private void processErrorCommand(String peerId, Integer requestKey, Messages.ErrorCommand errorCommand) { if (null != requestKey && requestKey != CommandPacket.UNSUPPORTED_OPERATION) { Operation op = session.conversationOperationCache.poll(requestKey); if (null != op && op.operation == AVIMOperation.CLIENT_OPEN.getCode()) { session.setSessionStatue(AVSession.Status.Closed); } int code = errorCommand.getCode(); int appCode = (errorCommand.hasAppCode() ? errorCommand.getAppCode() : 0); String reason = errorCommand.getReason(); AVIMOperation operation = (null != op)? AVIMOperation.getAVIMOperation(op.operation): null; InternalConfiguration.getOperationTube().onOperationCompleted(peerId, null, requestKey, operation, new AVIMException(code, appCode, reason)); } // 如果遇到signature failure的异常,清除缓存 if (null == requestKey) { int code = errorCommand.getCode(); // 如果遇到signature failure的异常,清除缓存 if (CODE_SESSION_SIGNATURE_FAILURE == code) { AVSessionCacheHelper.getTagCacheInstance().removeSession(session.getSelfPeerId()); } else if (CODE_SESSION_TOKEN_FAILURE == code) { // 如果遇到session token 失效或者过期的情况,先是清理缓存,然后再重新触发一次自动登录 session.updateRealtimeSessionToken("", 0); this.onWebSocketOpen(); } } }
public void close(int requestId) { try { // 都关掉了,我们需要去除Session记录 AVSessionCacheHelper.getTagCacheInstance().removeSession(getSelfPeerId()); AVSessionCacheHelper.IMSessionTokenCache.removeIMSessionToken(getSelfPeerId()); // 如果session都已不在,缓存消息静静地等到桑田沧海 this.cleanUp(); if (Status.Closed == currentStatus) { this.sessionListener.onSessionClose(this, requestId); return; } if (AVConnectionManager.getInstance().isConnectionEstablished()) { conversationOperationCache.offer(Operation.getOperation( AVIMOperation.CLIENT_DISCONNECT.getCode(), selfId, null, requestId)); CommandPacket scp = WindTalker.getInstance().assembleSessionPacket(this.selfId, null, SessionControlPacket.SessionControlOp.CLOSE, null, requestId); AVConnectionManager.getInstance().sendPacket(scp); } else { // 如果网络已经断开的时候,我们就不要管它了,直接强制关闭吧 this.sessionListener.onSessionClose(this, requestId); } } catch (Exception e) { sessionListener.onError(this, e, OPERATION_CLOSE_SESSION, requestId); } } protected void storeMessage(PendingMessageCache.Message cacheMessage, int requestId) {
@Override public void onError(Integer requestKey, Messages.ErrorCommand errorCommand) { if (null != requestKey && requestKey != CommandPacket.UNSUPPORTED_OPERATION) { Operation op = session.conversationOperationCache.poll(requestKey); if (null != op && op.operation == AVIMOperation.CLIENT_OPEN.getCode()) { session.setSessionStatue(AVSession.Status.Closed); } int code = errorCommand.getCode(); int appCode = (errorCommand.hasAppCode() ? errorCommand.getAppCode() : 0); String reason = errorCommand.getReason(); AVIMOperation operation = (null != op)? AVIMOperation.getAVIMOperation(op.operation): null; InternalConfiguration.getOperationTube().onOperationCompleted(session.getSelfPeerId(), null, requestKey, operation, new AVIMException(code, appCode, reason)); } // 如果遇到signature failure的异常,清除缓存 if (null == requestKey) { int code = errorCommand.getCode(); // 如果遇到signature failure的异常,清除缓存 if (CODE_SESSION_SIGNATURE_FAILURE == code) { AVSessionCacheHelper.getTagCacheInstance().removeSession(session.getSelfPeerId()); } else if (CODE_SESSION_TOKEN_FAILURE == code) { // 如果遇到session token 失效或者过期的情况,先是清理缓存,然后再重新触发一次自动登录 session.updateRealtimeSessionToken("", 0); this.onWebSocketOpen(); } } }
protected boolean sendClientCMDToPushService(String clientId, String dataAsString, BroadcastReceiver receiver, AVIMOperation operation) { int requestId = WindTalker.getNextIMRequestId(); if (receiver != null) { LocalBroadcastManager.getInstance(AVOSCloud.getContext()).registerReceiver(receiver, new IntentFilter(operation.getOperation() + requestId)); } Intent i = new Intent(AVOSCloud.getContext(), PushService.class); i.setAction(Conversation.AV_CONVERSATION_INTENT_ACTION); if (!StringUtil.isEmpty(dataAsString)) { i.putExtra(Conversation.INTENT_KEY_DATA, dataAsString); } i.putExtra(Conversation.INTENT_KEY_CLIENT, clientId); i.putExtra(Conversation.INTENT_KEY_REQUESTID, requestId); i.putExtra(Conversation.INTENT_KEY_OPERATION, operation.getCode()); try { AVOSCloud.getContext().startService(IntentUtil.setupIntentFlags(i)); } catch (Exception ex) { LOGGER.e("failed to startService. cause: " + ex.getMessage()); return false; } return true; }
@Override public void onError(AVSession session, Throwable e, int sessionOperation, int requestId) { LOGGER.e("session error:" + e); if (requestId > CommandPacket.UNSUPPORTED_OPERATION) { switch (sessionOperation) { case AVSession.OPERATION_OPEN_SESSION: InternalConfiguration.getOperationTube().onOperationCompleted(session.getSelfPeerId(), null, requestId, Conversation.AVIMOperation.CLIENT_OPEN, e); break; case AVSession.OPERATION_CLOSE_SESSION: InternalConfiguration.getOperationTube().onOperationCompleted(session.getSelfPeerId(), null, requestId, Conversation.AVIMOperation.CLIENT_DISCONNECT, e); break; default: break; } if (sessionOperation == AVIMOperation.CONVERSATION_CREATION.getCode()) { InternalConfiguration.getOperationTube().onOperationCompleted(session.getSelfPeerId(), null, requestId, Conversation.AVIMOperation.CONVERSATION_CREATION, e); } } }
public void patchMessage(AVIMMessage oldMessage, AVIMMessage newMessage, AVIMMessage recallMessage, Conversation.AVIMOperation operation, int requestId) { if (!checkSessionStatus(operation, requestId)) { return; } session.conversationOperationCache.offer(Operation.getOperation( operation.getCode(), session.getSelfPeerId(), conversationId, requestId)); if (operation.equals(AVIMOperation.CONVERSATION_RECALL_MESSAGE)) { String messageId = recallMessage.getMessageId(); long timeStamp = recallMessage.getTimestamp(); AVConnectionManager.getInstance().sendPacket( MessagePatchModifyPacket.getMessagePatchPacketForRecall(session.getSelfPeerId(), conversationId, messageId, timeStamp, requestId)); } else if (operation.equals(AVIMOperation.CONVERSATION_UPDATE_MESSAGE)){ String messageId = oldMessage.getMessageId(); long timeStamp = oldMessage.getTimestamp(); String data = newMessage.getContent(); boolean mentionAll = newMessage.isMentionAll(); List<String> mentionList = newMessage.getMentionList(); byte[] binaryData = null; if (newMessage instanceof AVIMBinaryMessage) { binaryData = ((AVIMBinaryMessage) newMessage).getBytes(); } AVConnectionManager.getInstance().sendPacket(MessagePatchModifyPacket.getMessagePatchPacketForUpdate(session.getSelfPeerId(), conversationId, messageId, data, binaryData, mentionAll, mentionList, timeStamp, requestId)); } }
public static void sendMap2LocalBroadcase(String clientId, String conversationId, int requestId, HashMap<String, Object> result, Throwable throwable, Conversation.AVIMOperation operation) { if (isOperationValid(operation)) { String keyHeader = operation.getOperation(); Intent callbackIntent = new Intent(keyHeader + requestId); callbackIntent.putExtra(Conversation.callbackClientKey, clientId); if (!StringUtil.isEmpty(conversationId)) { callbackIntent.putExtra(Conversation.callbackConversationKey, conversationId); } if (null != throwable) { callbackIntent.putExtra(Conversation.callbackExceptionKey, throwable); } if (null != result) { callbackIntent.putExtra(CALLBACK_RESULT_KEY, result); } LocalBroadcastManager.getInstance(AVOSCloud.getContext()).sendBroadcast(callbackIntent); } }
private static void sendIMLocalBroadcast(String clientId, String conversationId, int requestId, Bundle bundle, Throwable throwable, Conversation.AVIMOperation operation) { if (isOperationValid(operation)) { String keyHeader = operation.getOperation(); Intent callbackIntent = new Intent(keyHeader + requestId); callbackIntent.putExtra(Conversation.callbackClientKey, clientId); if (!StringUtil.isEmpty(conversationId)) { callbackIntent.putExtra(Conversation.callbackConversationKey, conversationId); } if (null != throwable) { callbackIntent.putExtra(Conversation.callbackExceptionKey, throwable); } if (null != bundle) { callbackIntent.putExtras(bundle); } LocalBroadcastManager.getInstance(AVOSCloud.getContext()).sendBroadcast(callbackIntent); } }
private void processPatchCommand(String peerId, boolean isModify, Integer requestKey, Messages.PatchCommand patchCommand) { updateLocalPatchTime(isModify, patchCommand); if (isModify) { if (patchCommand.getPatchesCount() > 0) { for (Messages.PatchItem patchItem : patchCommand.getPatchesList()) { AVIMMessage message = AVIMTypedMessage.getMessage(patchItem.getCid(), patchItem.getMid(), patchItem.getData(), patchItem.getFrom(), patchItem.getTimestamp(), 0, 0); message.setUpdateAt(patchItem.getPatchTimestamp()); AVConversationHolder conversation = session.getConversationHolder(patchItem.getCid(), Conversation.CONV_TYPE_NORMAL); conversation.onMessageUpdateEvent(message, patchItem.getRecall()); } } } else { Operation op = session.conversationOperationCache.poll(requestKey); AVIMOperation operation = AVIMOperation.getAVIMOperation(op.operation); HashMap<String, Object> bundle = new HashMap<>(); bundle.put(Conversation.PARAM_MESSAGE_PATCH_TIME, patchCommand.getLastPatchTime()); InternalConfiguration.getOperationTube().onOperationCompletedEx(session.getSelfPeerId(), null, requestKey, operation, bundle); } }
@Override public void onSignatureReady(Signature sig, AVException exception) { if (null != exception) { if (notifyListener) { sessionListener.onError(AVSession.this, exception, OPERATION_OPEN_SESSION, requestId); } LOGGER.d("failed to generate signaure. cause:", exception); } else { conversationOperationCache.offer(AVIMOperationQueue.Operation.getOperation( Conversation.AVIMOperation.CLIENT_OPEN.getCode(), getSelfPeerId(), null, requestId)); CommandPacket scp = WindTalker.getInstance().assembleSessionOpenPacket(getSelfPeerId(), tag, sig, getLastNotifyTime(), getLastPatchTime(), reconnectionFlag, requestId); AVConnectionManager.getInstance().sendPacket(scp); } }
public void queryConversations(Map<String, Object> params, int requestId) { if (Status.Closed == currentStatus) { RuntimeException se = new RuntimeException("Connection Lost"); InternalConfiguration.getOperationTube().onOperationCompleted(getSelfPeerId(), null, requestId, AVIMOperation.CONVERSATION_QUERY, se); return; } conversationOperationCache.offer(Operation.getOperation( AVIMOperation.CONVERSATION_QUERY.getCode(), selfId, null, requestId)); LOGGER.d("offer operation with requestId=" + requestId + ", selfId=" + selfId); ConversationQueryPacket packet = ConversationQueryPacket.getConversationQueryPacket(getSelfPeerId(), params, requestId); AVConnectionManager.getInstance().sendPacket(packet); }
@Override public void onSignatureReady(Signature sig, AVException e) { if (e == null) { session.conversationOperationCache.offer(Operation.getOperation( AVIMOperation.CONVERSATION_RM_MEMBER.getCode(), session.getSelfPeerId(), conversationId, requestId)); AVConnectionManager.getInstance().sendPacket(ConversationControlPacket.genConversationCommand( session.getSelfPeerId(), conversationId, members, ConversationControlOp.REMOVE, null, sig, requestId)); } else { InternalConfiguration.getOperationTube().onOperationCompleted(session.getSelfPeerId(), conversationId, requestId, AVIMOperation.CONVERSATION_RM_MEMBER, e); } }