package Client;

import java.io.InputStream;
/* 
* >--Helper--<
* Author: Someone
* www.jvales.net
* 
* Purpose:
* Misc functions, that are used more than once, but dont fit into a category/class
*/
public class Helper{
  final static String $CLASSname	= "Helper";
  final static String $CLASSvers	= "0.06";
		
public Helper(){
  System.out.println($CLASSname+" v"+$CLASSvers);
}

// ######################################
// #          BYTE-CALCULATION          #
// ######################################
public static byte[] int2ba(int i){
  byte b[] = {(byte) (i >> 0), (byte) (i >> 8), (byte) (i >> 16), (byte) (i >> 24)};
  return b;
}

public static int ba2int(byte[] b){
  int i = ((b[0] & 0xff) << 0) + ((b[1] &0xff) << 8) + ((b[2] & 0xff) << 16) + ((b[3] & 0xff) << 24);
  return i;
}


public static byte[] long2ba(long i){
  byte b[] = {(byte) (i >> 0), (byte) (i >> 8), (byte) (i >> 16), (byte) (i >> 24), (byte) (i >> 32), (byte) (i >> 40), (byte) (i >> 48), (byte) (i >> 56)};
  return b;
}

public static long ba2long(byte[] b){
  long l = (((long)(b[0] & 0xff)) << 0) + (((long)(b[1] & 0xff)) << 8) + (((long)(b[2] & 0xff)) << 16) + (((long)(b[3] & 0xff)) << 24) + (((long)(b[4] & 0xff)) << 32) + (((long)(b[5] & 0xff)) << 40) + (((long)(b[6] & 0xff)) << 48) + (((long)(b[7] & 0xff)) << 56);
  return l;
}

// Used to change endian.
public static byte[] revba(byte data[]){
  byte rev[] = new byte[data.length];
  for(int i = 0; i < data.length; i++){
    rev[i] = data[(data.length -1 - i)];
  }
  return rev;
}

// ######################################
// #            NUMERIC STUFF           #
// ######################################
static public String leadingZero2(int $in){
  if($in < 10)return "0"+$in;
  return ""+$in;
}

static public int parseDuration(String $in){
  String[] $data = $in.split(":");
  int $ret = Integer.parseInt($data[0])*3600 + Integer.parseInt($data[1])*60 + Integer.parseInt($data[2]);
  return $ret;
}

// ######################################
// #             Other STUFF            #
// ######################################
static public byte[] parseIP(String $in){
  String[] $data = $in.split("\\.");
  byte[] $ret = new byte[4];
  $ret[0] = (byte)Integer.parseInt($data[0]);
  $ret[1] = (byte)Integer.parseInt($data[1]);
  $ret[2] = (byte)Integer.parseInt($data[2]);
  $ret[3] = (byte)Integer.parseInt($data[3]);
  return $ret;
}

static public String ba2ips(byte[] $data){
  return ((int)($data[0] &0xff))+"."+((int)($data[1] &0xff))+"."+((int)($data[2] &0xff))+"."+((int)($data[3] &0xff));
}

//should block until String-data are received!
static public String getLine(InputStream $in)throws Exception{
  String $ret = "";
  while(true){
    int $read = $in.read();
    if($read == -1){Thread.sleep(1000); continue;}
    if(($read == 10 || $read == 13) && $ret.length() > 0)break;
    if($read == 10 || $read == 13)continue;
    $ret=$ret+((char)($read));
  }
  return $ret;
}

//should block until String-data are received!
static public byte[] readBA(InputStream $in, int $len)throws Exception{
  byte[] $arr = new byte[$len];
  for(int $i=0; $i < $len; $i++){
    int $read = $in.read();
    if($read == -1){Thread.sleep(200); $i--; continue;}
    $arr[$i]=(byte)$read;
  }
  return $arr;
}

//should block until one byte is read!
static public int readByte(InputStream $in)throws Exception{
  int $ret = -1;
  while(true){
    $ret = $in.read();
    if($ret != -1)break;
    Thread.sleep(200);
  }
  return $ret;
}
}