/** * Initiate a pre-recorded video sharing session * * @param contact Remote contact * @param content Video content to share * @param player Media player * @return CSh session * @throws CoreException */ public VideoStreamingSession initiatePreRecordedVideoSharingSession( String contact, VideoContent content, IMediaPlayer player) throws CoreException { if (logger.isActivated()) { logger.info( "Initiate a pre-recorded video sharing session with contact " + contact + ", file " + content.toString()); } // Test if call is established if (!getImsModule().getCallManager().isCallConnected()) { if (logger.isActivated()) { logger.debug("Rich call not established: cancel the initiation"); } throw new CoreException("Call not established"); } // Reject if there are already 2 bidirectional sessions with a given contact boolean rejectInvitation = false; Vector<ContentSharingSession> currentSessions = getCShSessions(); if (currentSessions.size() >= 2) { // Already a bidirectional session if (logger.isActivated()) { logger.debug("Max sessions reached"); } rejectInvitation = true; } else if (currentSessions.size() == 1) { ContentSharingSession currentSession = currentSessions.elementAt(0); if (!(currentSession instanceof TerminatingVideoStreamingSession)) { // Originating session already used if (logger.isActivated()) { logger.debug("Max originating sessions reached"); } rejectInvitation = true; } else if (!PhoneUtils.compareNumbers(contact, currentSession.getRemoteContact())) { // Not the same contact if (logger.isActivated()) { logger.debug("Only bidirectional session with same contact authorized"); } rejectInvitation = true; } } if (rejectInvitation) { if (logger.isActivated()) { logger.debug("The max number of sharing sessions is achieved: cancel the initiation"); } throw new CoreException("Max content sharing sessions achieved"); } // Create a new session OriginatingPreRecordedVideoStreamingSession session = new OriginatingPreRecordedVideoStreamingSession( this, player, content, PhoneUtils.formatNumberToSipUri(contact)); // Start the session session.startSession(); return session; }
/** * Add a participant to the session * * @param participant Participant */ public void addParticipant(String participant) { try { if (logger.isActivated()) { logger.debug("Add one participant (" + participant + ") to the session"); } // Re-use INVITE dialog path SessionAuthenticationAgent authenticationAgent = getAuthenticationAgent(); // Increment the Cseq number of the dialog path getDialogPath().incrementCseq(); // Send REFER request if (logger.isActivated()) { logger.debug("Send REFER"); } String contactUri = PhoneUtils.formatNumberToSipUri(participant); SipRequest refer = SipMessageFactory.createRefer(getDialogPath(), contactUri); SipTransactionContext ctx = getImsService() .getImsModule() .getSipManager() .sendSubsequentRequest(getDialogPath(), refer); // Wait response if (logger.isActivated()) { logger.debug("Wait response"); } ctx.waitResponse(SipManager.TIMEOUT); // Analyze received message if (ctx.getStatusCode() == 407) { // 407 response received if (logger.isActivated()) { logger.debug("407 response received"); } // Set the Proxy-Authorization header authenticationAgent.readProxyAuthenticateHeader(ctx.getSipResponse()); // Increment the Cseq number of the dialog path getDialogPath().incrementCseq(); // Create a second REFER request with the right token if (logger.isActivated()) { logger.info("Send second REFER"); } refer = SipMessageFactory.createRefer(getDialogPath(), contactUri); // Set the Authorization header authenticationAgent.setProxyAuthorizationHeader(refer); // Send REFER request ctx = getImsService() .getImsModule() .getSipManager() .sendSubsequentRequest(getDialogPath(), refer); // Wait response if (logger.isActivated()) { logger.debug("Wait response"); } ctx.waitResponse(SipManager.TIMEOUT); // Analyze received message if ((ctx.getStatusCode() >= 200) && (ctx.getStatusCode() < 300)) { // 200 OK response if (logger.isActivated()) { logger.debug("200 OK response received"); } // Notify listeners for (int i = 0; i < getListeners().size(); i++) { ((ChatSessionListener) getListeners().get(i)).handleAddParticipantSuccessful(); } } else { // Error if (logger.isActivated()) { logger.debug("REFER has failed (" + ctx.getStatusCode() + ")"); } // Notify listeners for (int i = 0; i < getListeners().size(); i++) { ((ChatSessionListener) getListeners().get(i)) .handleAddParticipantFailed(ctx.getReasonPhrase()); } } } else if ((ctx.getStatusCode() >= 200) && (ctx.getStatusCode() < 300)) { // 200 OK received if (logger.isActivated()) { logger.debug("200 OK response received"); } // Notify listeners for (int i = 0; i < getListeners().size(); i++) { ((ChatSessionListener) getListeners().get(i)).handleAddParticipantSuccessful(); } } else { // Error responses if (logger.isActivated()) { logger.debug("No response received"); } // Notify listeners for (int i = 0; i < getListeners().size(); i++) { ((ChatSessionListener) getListeners().get(i)) .handleAddParticipantFailed(ctx.getReasonPhrase()); } } } catch (Exception e) { if (logger.isActivated()) { logger.error("REFER request has failed", e); } // Notify listeners for (int i = 0; i < getListeners().size(); i++) { ((ChatSessionListener) getListeners().get(i)).handleAddParticipantFailed(e.getMessage()); } } }