/* * Nextcloud Talk application * * @author Mario Danic * Copyright (C) 2017-2018 Mario Danic * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.nextcloud.talk.webrtc; import android.annotation.SuppressLint; import android.util.Log; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.models.json.signaling.NCSignalingMessage; import com.nextcloud.talk.models.json.websocket.ActorWebSocketMessage; import com.nextcloud.talk.models.json.websocket.AuthParametersWebSocketMessage; import com.nextcloud.talk.models.json.websocket.AuthWebSocketMessage; import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.CallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.HelloOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.HelloWebSocketMessage; import com.nextcloud.talk.models.json.websocket.RoomOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.RoomWebSocketMessage; import com.nextcloud.talk.utils.ApiUtils; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import autodagger.AutoInjector; import okhttp3.OkHttpClient; @AutoInjector(NextcloudTalkApplication.class) public class WebSocketConnectionHelper { public static final String TAG = "WebSocketConnectionHelper"; private static Map magicWebSocketInstanceMap = new HashMap<>(); @Inject OkHttpClient okHttpClient; public WebSocketConnectionHelper() { NextcloudTalkApplication.Companion.getSharedApplication().getComponentApplication().inject(this); } @SuppressLint("LongLogTag") public static synchronized MagicWebSocketInstance getMagicWebSocketInstanceForUserId(long userId) { if (userId != -1 && magicWebSocketInstanceMap.containsKey(userId)) { return magicWebSocketInstanceMap.get(userId); } Log.d(TAG, "no magicWebSocketInstance found"); return null; } public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, User user, String webSocketTicket, boolean isGuest) { String generatedURL = url.replace("https://", "wss://").replace("http://", "ws://"); if (generatedURL.endsWith("/")) { generatedURL += "spreed"; } else { generatedURL += "/spreed"; } long userId = isGuest ? -1 : user.getId(); MagicWebSocketInstance magicWebSocketInstance; if (userId != -1 && magicWebSocketInstanceMap.containsKey(user.getId()) && (magicWebSocketInstance = magicWebSocketInstanceMap.get(user.getId())) != null) { return magicWebSocketInstance; } else { if (userId == -1) { deleteExternalSignalingInstanceForUserEntity(userId); } magicWebSocketInstance = new MagicWebSocketInstance(user, generatedURL, webSocketTicket); magicWebSocketInstanceMap.put(user.getId(), magicWebSocketInstance); return magicWebSocketInstance; } } public static synchronized void deleteExternalSignalingInstanceForUserEntity(long id) { MagicWebSocketInstance magicWebSocketInstance; if ((magicWebSocketInstance = magicWebSocketInstanceMap.get(id)) != null) { if (magicWebSocketInstance.isConnected()) { magicWebSocketInstance.sendBye(); magicWebSocketInstanceMap.remove(id); } } } HelloOverallWebSocketMessage getAssembledHelloModel(User user, String ticket) { int apiVersion = ApiUtils.getSignalingApiVersion(user, new int[] {ApiUtils.APIv3, 2, 1}); HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage(); helloOverallWebSocketMessage.setType("hello"); HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage(); helloWebSocketMessage.setVersion("1.0"); AuthWebSocketMessage authWebSocketMessage = new AuthWebSocketMessage(); authWebSocketMessage.setUrl(ApiUtils.getUrlForSignalingBackend(apiVersion, user.getBaseUrl())); AuthParametersWebSocketMessage authParametersWebSocketMessage = new AuthParametersWebSocketMessage(); authParametersWebSocketMessage.setTicket(ticket); if (!("?").equals(user.getUserId())) { authParametersWebSocketMessage.setUserid(user.getUserId()); } authWebSocketMessage.setAuthParametersWebSocketMessage(authParametersWebSocketMessage); helloWebSocketMessage.setAuthWebSocketMessage(authWebSocketMessage); helloOverallWebSocketMessage.setHelloWebSocketMessage(helloWebSocketMessage); return helloOverallWebSocketMessage; } HelloOverallWebSocketMessage getAssembledHelloModelForResume(String resumeId) { HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage(); helloOverallWebSocketMessage.setType("hello"); HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage(); helloWebSocketMessage.setVersion("1.0"); helloWebSocketMessage.setResumeid(resumeId); helloOverallWebSocketMessage.setHelloWebSocketMessage(helloWebSocketMessage); return helloOverallWebSocketMessage; } RoomOverallWebSocketMessage getAssembledJoinOrLeaveRoomModel(String roomId, String sessionId) { RoomOverallWebSocketMessage roomOverallWebSocketMessage = new RoomOverallWebSocketMessage(); roomOverallWebSocketMessage.setType("room"); RoomWebSocketMessage roomWebSocketMessage = new RoomWebSocketMessage(); roomWebSocketMessage.setRoomId(roomId); roomWebSocketMessage.setSessiondId(sessionId); roomOverallWebSocketMessage.setRoomWebSocketMessage(roomWebSocketMessage); return roomOverallWebSocketMessage; } CallOverallWebSocketMessage getAssembledCallMessageModel(NCSignalingMessage ncSignalingMessage) { CallOverallWebSocketMessage callOverallWebSocketMessage = new CallOverallWebSocketMessage(); callOverallWebSocketMessage.setType("message"); CallWebSocketMessage callWebSocketMessage = new CallWebSocketMessage(); ActorWebSocketMessage actorWebSocketMessage = new ActorWebSocketMessage(); actorWebSocketMessage.setType("session"); actorWebSocketMessage.setSessionId(ncSignalingMessage.getTo()); callWebSocketMessage.setRecipientWebSocketMessage(actorWebSocketMessage); callWebSocketMessage.setNcSignalingMessage(ncSignalingMessage); callOverallWebSocketMessage.setCallWebSocketMessage(callWebSocketMessage); return callOverallWebSocketMessage; } }