|
- package net.hoo2.auth.vmodem;
-
- import java.util.Arrays;
- import ithakimodem.*;
-
- class Com {
- static final int SPEED_DEFAULT = 48000;
- static final int TIMEOUT_DEFAULT = 2000;
- static final String URL_DEFAULT = "ithaki";
-
- private Modem modem_;
- private int speed_;
- private int timeout_;
-
- Com () {
- modem_ = new Modem();
- speed_ = SPEED_DEFAULT;
- timeout_ = TIMEOUT_DEFAULT;
- modem_.setSpeed(speed_);
- modem_.setTimeout(timeout_);
- }
- Com (Log log, int speed, int timeout) {
- modem_ = new Modem();
- speed_ = speed;
- timeout_ = timeout;
- modem_.setSpeed(speed_);
- modem_.setTimeout(timeout_);
- }
-
- // get/set
- int timeout () { return timeout_; }
- void timeout (int timeout) {
- if (timeout_ != timeout) {
- timeout_ = timeout;
- modem_.setTimeout(timeout_);
- }
- }
-
- int speed () { return speed_; }
- void speed (int speed) {
- if (speed_ != speed) {
- speed_ = speed;
- modem_.setSpeed(speed_);
- }
- }
-
-
- boolean open (String url) { return modem_.open(url); }
- boolean open () { return modem_.open(URL_DEFAULT); }
- boolean close() { return modem_.close(); }
-
-
- Transaction request (Transaction data, byte[] code, byte[] begin, byte[] end, boolean bin) {
- int ch =0;
- boolean have_begin = (begin != null) ? false : true;
- boolean incoming = false;
-
- _clear (data.response, 0, data.response.length);
- if (code != null) {
- data.code = code;
- modem_.write(data.code);
- modem_.write((int)'\r');
- data.departure = System.currentTimeMillis();// - (long)((8*(data.code.length+1))*(1000.0/speed_));
- }
- data.size =0;
- do {
- if (data.size >= data.response.length) {
- data.size =0;
- return data;
- }
- try {
- ch = modem_.read();
- }
- catch (Exception e) {
- System.err.println (e.getMessage());
- data.size =0;
- return data;
- }
- if (!incoming) {
- incoming = true;
- data.arrival = System.currentTimeMillis();// - (long)(8*(1000.0/speed_));
- }
- data.response [data.size++] = (byte)ch;
-
- if (!have_begin && (detect(data.response, begin, data.size) != -1)) {
- _clear(data.response, 0, data.size);
- data.size = _copy (data.response, begin);
- have_begin = true;
- }
- } while (ch != -1 &&
- (!have_begin ||
- ( (bin || (detect (data.response, "\r\n\n\n".getBytes(), data.size) == -1))
- && (bin || (detect (data.response, "NO CARRIER".getBytes(), data.size) == -1))
- && (detect (data.response, end, data.size) == -1)
- )
- )
- );
- return data;
- }
-
- static int detect (byte[] data, byte[] pattern, int max) {
- if (pattern != null) {
- for (int i =0 ; i<max && i<data.length - pattern.length; ++i) {
- boolean detected = true;
- for (int j=0 ; j<pattern.length ; ++j) {
- if (data[i+j] != pattern[j]) {
- detected = false;
- break;
- }
- }
- if (detected)
- return i;
- }
- }
- return -1;
- }
-
- private void _clear (byte[] buffer, int begin, int end) {
- for (int i=begin ; i<end && i<buffer.length ; ++i)
- buffer[i] = 0;
- }
-
- private int _copy (byte[] dest, byte[] src) {
- if (dest.length >= src.length) {
- for (int i=0 ; i<src.length ; ++i)
- dest[i] = src[i];
- return src.length;
- }
- return 0;
- }
-
- }
-
-
- class Transaction {
- byte[] code;
- byte[] response;
- long departure;
- long arrival;
- int size;
-
- Transaction (byte[] code, byte[] response) {
- this.code = code;
- this.response = response;
- departure = arrival = 0;
- size = 0;
- }
-
- byte[] getResponse() {
- return Arrays.copyOf(response, size);
- }
- }
-
|