Skip to content

Commit

Permalink
[ipcamera] Fix multiple part handling for Dahua events
Browse files Browse the repository at this point in the history
Signed-off-by: Jimmy Tanagra <jcode@tanagra.id.au>
  • Loading branch information
jimtng committed Jun 19, 2022
1 parent 6f58a52 commit 28034ce
Showing 1 changed file with 7 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import static org.openhab.binding.ipcamera.internal.IpCameraBindingConstants.*;

import java.util.List;
import java.util.regex.Pattern;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
Expand Down Expand Up @@ -43,14 +44,16 @@
public class DahuaHandler extends ChannelDuplexHandler {
private IpCameraHandler ipCameraHandler;
private int nvrChannel;
private Pattern boundaryPattern;

public DahuaHandler(IpCameraHandler handler, int nvrChannel) {
ipCameraHandler = handler;
this.nvrChannel = nvrChannel;
boundaryPattern = Pattern.compile("^-- ?myboundary$", Pattern.MULTILINE);
}

private void processEvent(String content) {
int startIndex = content.indexOf("Code=", 12) + 5;// skip --myboundary and Code=
int startIndex = content.indexOf("Code=") + 5;// skip Code=
int endIndex = content.indexOf(";", startIndex + 1);
if (startIndex == -1 || endIndex == -1) {
ipCameraHandler.logger.debug("Code= not found in Dahua event. Content was:{}", content);
Expand Down Expand Up @@ -212,11 +215,12 @@ public void channelRead(@Nullable ChannelHandlerContext ctx, @Nullable Object ms
}
try {
String content = msg.toString();
ipCameraHandler.logger.trace("HTTP Result back from camera is \t:{}:", content);
if (content.startsWith("--myboundary") || content.startsWith("-- myboundary")) {
processEvent(content);
// the first part of the match before --myboundary is empty, so skip 1
boundaryPattern.splitAsStream(content).skip(1).forEach(event -> processEvent(event));
return;
}
ipCameraHandler.logger.trace("HTTP Result back from camera is \t:{}:", content);
// determine if the motion detection is turned on or off.
if (content.contains("table.MotionDetect[0].Enable=true")) {
ipCameraHandler.setChannelState(CHANNEL_ENABLE_MOTION_ALARM, OnOffType.ON);
Expand Down

0 comments on commit 28034ce

Please sign in to comment.