mikrotik-utils/MikroTikAPI/src/com/mikroTik/wiki/WriteCommand.java

116 lines
3.3 KiB
Java

package com.mikroTik.wiki;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author janisk
*/
public class WriteCommand {
private byte[] len = {0};
private DataOutputStream out = null;
private String command = "";
WriteCommand(DataOutputStream out, String command) {
this.out = out;
this.command = command.replaceAll("\n", "").trim();
}
public WriteCommand(DataOutputStream out) {
this.out = out;
}
public WriteCommand setCommand(String command) {
this.command = command.trim();
return this;
}
String getCommand() {
return command;
}
private byte[] writeLen(String command) {
Integer i = null;
String s = "";
String ret = "";
if (command.length() < 0x80) {
i = command.length();
} else if (command.length() < 0x4000) {
i = Integer.reverseBytes(command.length() | 0x8000);
} else if (command.length() < 0x20000) {
i = Integer.reverseBytes(command.length() | 0xC00000);
} else if (command.length() < 10000000) {
i = Integer.reverseBytes(command.length() | 0xE0000000);
} else {
i = Integer.reverseBytes(command.length());
}
s = Integer.toHexString(i);
if (s.length() < 2) {
return new byte[]{i.byteValue()};
} else {
for (int j = 0; j < s.length(); j += 2) {
ret += (char) Integer.parseInt(s.substring(j, j + 2), 16) != 0 ? (char) Integer.parseInt(s.substring(j, j + 2), 16) : "";
}
}
char[] ch = ret.toCharArray();
return ret.getBytes();
}
public String runCommand() {
try {
byte[] ret = new byte[0];
if (!command.contains("\n")) {
int i = 0;
byte[] b = writeLen(command);
int retLen = b.length + command.length() + 1;
ret = new byte[retLen];
for (i = 0; i < b.length; i++) {
ret[i] = b[i];
}
for (byte c : command.getBytes("US-ASCII")) {
ret[i++] = c;
}
} else {
String[] str = command.split("\n");
int i = 1;
int[] iTmp = new int[str.length];
for (int a = 0; a < str.length; a++) {
iTmp[a] = writeLen(str[a]).length + str[a].length();
}
for (int b : iTmp) {
i += b;
}
ret = new byte[i];
int counter = 0;
for (int a = 0; a < str.length; a++) {
int j = 0;
byte[] b = writeLen(str[a]);
for (j = 0; j < b.length; j++) {
ret[counter++] = b[j];
}
for (byte c : str[a].getBytes("US-ASCII")) {
ret[counter++] = c;
}
}
}
out.write(ret);
return "Sent successfully";
} catch (IOException ex) {
Logger.getLogger(WriteCommand.class.getName()).log(Level.SEVERE, null, ex);
return "failed";
}
}
}