116 lines
3.3 KiB
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";
|
|
}
|
|
}
|
|
}
|