/*******************************************************************************
* Copyright (c) 2016 Rogue Wave Software, Inc.
* 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:
* Rogue Wave Software, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.zdb.server.utils;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.Adler32;
import org.eclipse.che.plugin.zdb.server.ZendDebugger;
import org.eclipse.che.plugin.zdb.server.connection.IDbgMessage;
/**
* Connection utilities.
*
* @author Bartlomiej Laczkowski
*/
public class ZendDbgConnectionUtils {
/**
* Writes line to data output stream.
*
* @param out
* @param line
* @throws IOException
*/
public static final void writeString(DataOutputStream out, String line) throws IOException {
byte[] byteArray = line.getBytes(Charset.forName(IDbgMessage.ENCODING));
out.writeInt(byteArray.length);
out.write(byteArray);
}
/**
* Writes string as bytes to data output stream.
*
* @param out
* @param byteArray
* @throws IOException
*/
public static final void writeStringAsBytes(DataOutputStream out, byte[] byteArray) throws IOException {
out.writeInt(byteArray.length);
out.write(byteArray);
}
/**
* Writes line to data output stream with the use of given encoding.
*
* @param out
* @param line
* @param encoding
* @throws IOException
*/
public static final void writeEncodedString(DataOutputStream out, String line, String encoding) throws IOException {
byte[] byteArray = getBytesFromText(line, encoding);
out.writeInt(byteArray.length);
out.write(byteArray);
}
/**
* Reads string from data input stream.
*
* @param in
* @return
* @throws IOException
*/
public static final String readString(DataInputStream in) throws IOException {
return new String(readStringAsBytes(in), Charset.forName(IDbgMessage.ENCODING));
}
/**
* Reads string as bytes from data output stream.
*
* @param in
* @return
* @throws IOException
*/
public static final byte[] readStringAsBytes(DataInputStream in) throws IOException {
int size = in.readInt();
byte[] byteArray = new byte[size];
in.readFully(byteArray);
return byteArray;
}
/**
* Reads string from data input stream with the use of given encoding.
*
* @param in
* @param encoding
* @return
* @throws IOException
*/
public static final String readEncodedString(DataInputStream in, String encoding) throws IOException {
byte[] byteArray = readStringAsBytes(in);
String rv = getTextFromBytes(byteArray, encoding);
return rv;
}
/**
* Computes bytes from text with the use of given encoding.
*
* @param text
* @param encoding
* @return bytes
*/
public static final byte[] getBytesFromText(String text, String encoding) {
try {
return text.getBytes(encoding);
} catch (Exception e) {
}
return text.getBytes(Charset.forName(IDbgMessage.ENCODING));
}
/**
* Computes text from bytes with the use of given encoding.
*
* @param bytes
* @param encoding
* @return
*/
public static final String getTextFromBytes(byte[] bytes, String encoding) {
try {
return new String(bytes, encoding);
} catch (Exception e) {
}
return new String(bytes, Charset.forName(IDbgMessage.ENCODING));
}
/**
* Checks if remote content is equal to corresponding local one.
*
* @param sizeToCheck
* @param checksumToCheck
* @param content
* @return <code>true</code> if is equal, <code>false</code> otherwise
*/
public static final boolean isRemoteContentEqual(int sizeToCheck, int checksumToCheck, byte[] content) {
int checksum;
if (sizeToCheck == content.length) {
checksum = getContentCheckSum(content);
return (checksumToCheck == checksum);
}
// Checks if the difference is just in the line endings
try {
int linesCount = 0;
byte r = 13;
byte n = 10;
for (byte element : content) {
if (element == n) {
linesCount++;
}
}
if (sizeToCheck == content.length + linesCount) {
byte converted[] = new byte[content.length + linesCount];
int i = 0;
// Convert line endings UNIX -> Win
for (byte element : content) {
if (element == n) {
converted[i] = r;
i++;
}
converted[i] = element;
i++;
}
checksum = getContentCheckSum(converted);
if (checksumToCheck == checksum) {
return true;
}
// Convert line endings Win -> UNIX
for (int j = 0; j < content.length; j++) {
if (content[j] == n) {
converted[j] = r;
} else if (content[j] == r) {
converted[j] = n;
}
}
checksum = getContentCheckSum(converted);
return (checksumToCheck == checksum);
}
} catch (Exception e) {
ZendDebugger.LOG.error(e.getMessage(), e);
}
return false;
}
/**
* Computes check-sum for Zend debugger content comparison.
*
* @param content
* @return check-sum
*/
public static final int getContentCheckSum(byte[] content) {
Adler32 checksumCalculator = new Adler32();
checksumCalculator.update(content);
return (int) checksumCalculator.getValue();
}
}