/*******************************************************************************
* Copyright (c) 2015 Zend Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Zend Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.php.internal.debug.core.zend.debugger.handlers;
import java.util.zip.Adler32;
import org.eclipse.php.debug.core.debugger.handlers.IDebugRequestHandler;
import org.eclipse.php.internal.debug.core.Logger;
import org.eclipse.php.internal.debug.core.zend.debugger.messages.FileContentExtendedRequest;
import org.eclipse.php.internal.debug.core.zend.debugger.messages.FileContentRequest;
import org.eclipse.php.internal.debug.core.zend.debugger.messages.FileContentResponse;
/**
* Abstract implementation of file content request handler.
*
* @author michael
*/
public abstract class AbstractFileContentRequestHandler implements IDebugRequestHandler {
protected void setResponseContent(FileContentResponse response, FileContentRequest request, byte[] content) {
if (request instanceof FileContentExtendedRequest) {
FileContentExtendedRequest extendedRequest = (FileContentExtendedRequest) request;
if (filesAreIdentical(extendedRequest.getSize(), extendedRequest.getCheckSum(), content)) {
response.setStatus(FileContentResponse.FILES_IDENTICAL);
return;
}
}
response.setContent(content);
}
private static boolean filesAreIdentical(int requestSize, int requestChecksum, byte[] content) {
int checksum;
if (requestSize == content.length) {
checksum = calcCheckSum(content);
return (requestChecksum == checksum);
}
try {
// checking if the difference is just the line ending - \n instead
// of \r\n or \n\r
int numOfNewLine = 0;
byte slashR = 13;
byte slashN = 10;
// counting lineBreaks
for (byte element : content) {
if (element == slashN) {
numOfNewLine++;
}
}
if (requestSize == content.length + numOfNewLine) {
byte newContent[] = new byte[content.length + numOfNewLine];
int newContentIndex = 0;
// changing every \n to \r\n
for (byte element : content) {
if (element == slashN) {
newContent[newContentIndex] = slashR;
newContentIndex++;
}
newContent[newContentIndex] = element;
newContentIndex++;
}
checksum = calcCheckSum(newContent);
if (requestChecksum == checksum) {
return true;
}
// changing \r\n to \n\r
for (int index = 0; index < content.length; index++) {
if (content[index] == slashN) {
newContent[index] = slashR;
} else if (content[index] == slashR) {
newContent[index] = slashN;
}
}
checksum = calcCheckSum(newContent);
return (requestChecksum == checksum);
}
} catch (Exception e) {
Logger.logException(e);
}
return false;
}
private static int calcCheckSum(byte[] content) {
Adler32 checksumCalculator = new Adler32();
checksumCalculator.update(content);
return (int) checksumCalculator.getValue();
}
}