blob: 9752ab22c12f25504381e0b712931c77b8f2441d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.web.room.wb;
import static org.apache.openmeetings.core.util.WebSocketHelper.alwaysTrue;
import static org.apache.openmeetings.core.util.WebSocketHelper.publish;
import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_SRC;
import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM__SRC;
import java.util.function.Predicate;
import org.apache.openmeetings.db.entity.basic.Client;
import org.apache.openmeetings.db.entity.file.BaseFileItem;
import org.apache.openmeetings.util.NullStringer;
import org.apache.openmeetings.util.ws.IClusterWsMessage;
import org.apache.openmeetings.web.room.RoomPreviewResourceReference;
import org.apache.openmeetings.web.room.RoomResourceReference;
import org.apache.openmeetings.web.user.record.Mp4RecordingResourceReference;
import org.apache.openmeetings.web.user.record.PngRecordingResourceReference;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.resource.FileSystemResourceReference;
import com.github.openjson.JSONObject;
public class WbWebSocketHelper {
public static final String PARAM_OBJ = "obj";
private static final String PARAM__POSTER = "_poster";
private WbWebSocketHelper() {
// denied
}
public static boolean send(IClusterWsMessage inMsg) {
if (inMsg instanceof WsMessageWb msg) {
if (msg.getUid() == null) {
sendWbAll(msg.getRoomId(), msg.getMeth(), msg.getObj(), false);
} else {
sendWbOthers(msg.getRoomId(), msg.getMeth(), msg.getObj(), msg.getUid(), false);
}
return true;
} else if (inMsg instanceof WsMessageWbFile fileMsg) {
sendWbFile(fileMsg.getRoomId(), fileMsg.getWbId()
, fileMsg.getRoomUid(), fileMsg.getFile(), fileMsg.getFileItem(), false);
return true;
}
return false;
}
public static void sendWbAll(Long roomId, WbAction meth, JSONObject obj) {
sendWbAll(roomId, meth, obj, true);
}
private static void sendWbAll(Long roomId, WbAction meth, JSONObject obj, boolean publish) {
if (publish) {
publish(new WsMessageWb(roomId, meth, obj, null));
}
sendWb(roomId, meth, obj, alwaysTrue());
}
public static void sendWbOthers(Long roomId, WbAction meth, JSONObject obj, final String uid) {
sendWbOthers(roomId, meth, obj, uid, true);
}
private static void sendWbOthers(Long roomId, WbAction meth, JSONObject obj, final String uid, boolean publish) {
if (publish) {
publish(new WsMessageWb(roomId, meth, obj, uid));
}
sendWb(roomId, meth, obj, c -> !uid.equals(c.getUid()));
}
public static JSONObject getWbJson(Long wbId) {
return new JSONObject().put("wbId", wbId);
}
public static JSONObject getObjWbJson(Long wbId, Object o) {
return getWbJson(wbId).put(PARAM_OBJ, o);
}
private static CharSequence urlFor(final ResourceReference ref, PageParameters params) {
RequestCycle rc = RequestCycle.get();
ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(ref, params);
return rc.getUrlRenderer().renderContextRelativeUrl(rc.mapUrlFor(handler).toString());
}
public static JSONObject addFileUrl(String ruid, JSONObject inFile, BaseFileItem fi, Client c) {
JSONObject file = new JSONObject(inFile.toString(new NullStringer()));
final FileSystemResourceReference ref;
final PageParameters pp = new PageParameters()
.add("id", fi.getId())
.add("ruid", ruid)
.add("wuid", inFile.optString("uid"));
if (c != null) {
pp.add("uid", c.getUid());
}
file.put("deleted", !fi.exists());
switch (fi.getType()) {
case VIDEO:
ref = new RoomResourceReference();
file.put(PARAM__SRC, urlFor(ref, pp));
file.put(PARAM__POSTER, urlFor(new RoomPreviewResourceReference(), pp));
break;
case RECORDING:
ref = new Mp4RecordingResourceReference();
file.put(PARAM__SRC, urlFor(ref, pp));
file.put(PARAM__POSTER, urlFor(new PngRecordingResourceReference(), pp));
break;
case PRESENTATION:
ref = new RoomResourceReference();
file.put(PARAM__SRC, urlFor(ref, pp));
break;
default:
ref = new RoomResourceReference();
file.put(PARAM_SRC, urlFor(ref, pp));
break;
}
return file;
}
public static void sendWbFile(Long roomId, long wbId, String ruid, JSONObject file, BaseFileItem fi) {
sendWbFile(roomId, wbId, ruid, file, fi, true);
}
//This is required cause WebSocketHelper will send message async
private static String patchUrl(String url, Client c) {
return url + "&uid=" + c.getUid();
}
private static JSONObject patchUrls(BaseFileItem fi, Client c, JSONObject inFile) {
JSONObject f = new JSONObject(inFile.toString()); // deep copy to ensure thread safety
switch (fi.getType()) {
case VIDEO, RECORDING:
f.put(PARAM__SRC, patchUrl(f.getString(PARAM__SRC), c));
f.put(PARAM__POSTER, patchUrl(f.getString(PARAM__POSTER), c));
break;
case PRESENTATION:
f.put(PARAM__SRC, patchUrl(f.getString(PARAM__SRC), c));
break;
default:
f.put(PARAM_SRC, patchUrl(f.getString(PARAM_SRC), c));
break;
}
return f;
}
private static void sendWbFile(Long roomId, long wbId, String ruid, JSONObject file, BaseFileItem fi, boolean publish) {
if (publish) {
publish(new WsMessageWbFile(roomId, wbId, ruid, file, fi));
}
final JSONObject f = addFileUrl(ruid, file, fi, null);
sendRoom(
roomId
, new JSONObject().put("type", "wb")
, alwaysTrue()
, (o, c) -> o.put("func", WbAction.CREATE_OBJ.jsName())
.put("param", getObjWbJson(wbId, patchUrls(fi, c, f))));
}
private static void sendWb(Long roomId, WbAction meth, JSONObject obj, Predicate<Client> check) {
sendRoom(
roomId
, new JSONObject().put("type", "wb")
, check
, (o, c) -> o.put("func", meth.jsName())
.put("param", obj)
);
}
}