package cc.blynk.server.application.handlers.main.logic;
import cc.blynk.server.application.handlers.main.auth.AppStateHolder;
import cc.blynk.server.core.model.DashBoard;
import cc.blynk.server.core.model.Pin;
import cc.blynk.server.core.model.PinStorageKey;
import cc.blynk.server.core.model.widgets.AppSyncWidget;
import cc.blynk.server.core.model.widgets.Widget;
import cc.blynk.server.core.protocol.model.messages.StringMessage;
import cc.blynk.utils.ParseUtil;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import java.util.Map;
import static cc.blynk.server.core.model.widgets.AppSyncWidget.ANY_TARGET;
import static cc.blynk.server.core.model.widgets.AppSyncWidget.SYNC_DEFAULT_MESSAGE_ID;
import static cc.blynk.server.core.protocol.enums.Command.APP_SYNC;
import static cc.blynk.utils.BlynkByteBufUtil.makeUTF8StringMessage;
import static cc.blynk.utils.BlynkByteBufUtil.ok;
import static cc.blynk.utils.StringUtils.prependDashIdAndDeviceId;
import static cc.blynk.utils.StringUtils.split2Device;
/**
* Request state sync info for widgets.
* Supports sync for all widgets and sync for specific target
*
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 2/1/2015.
*
*/
public class AppSyncLogic {
public static void messageReceived(ChannelHandlerContext ctx, AppStateHolder state, StringMessage message) {
String[] dashIdAndTargetIdString = split2Device(message.body);
int dashId = ParseUtil.parseInt(dashIdAndTargetIdString[0]);
int targetId = AppSyncWidget.ANY_TARGET;
if (dashIdAndTargetIdString.length == 2) {
targetId = ParseUtil.parseInt(dashIdAndTargetIdString[1]);
}
DashBoard dash = state.user.profile.getDashByIdOrThrow(dashId);
sendSyncAndOk(ctx, dash, targetId, message.id);
}
public static void sendSyncAndOk(ChannelHandlerContext ctx, DashBoard dash, int targetId, int msgId) {
ctx.write(ok(msgId), ctx.voidPromise());
final Channel appChannel = ctx.channel();
for (Widget widget : dash.widgets) {
if (widget instanceof AppSyncWidget) {
((AppSyncWidget) widget).sendAppSync(appChannel, dash.id, targetId);
}
}
for (Map.Entry<PinStorageKey, String> entry : dash.pinsStorage.entrySet()) {
PinStorageKey key = entry.getKey();
if (targetId == ANY_TARGET || targetId == key.deviceId) {
String body = prependDashIdAndDeviceId(dash.id, key.deviceId, Pin.makeHardwareBody(key.pinType, key.pin, entry.getValue()));
ctx.write(makeUTF8StringMessage(APP_SYNC, SYNC_DEFAULT_MESSAGE_ID, body), ctx.voidPromise());
}
}
ctx.flush();
}
}