/*
** This file is part of Filius, a network construction and simulation software.
**
** Originally created at the University of Siegen, Institute "Didactics of
** Informatics and E-Learning" by a students' project group:
** members (2006-2007):
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
** supervisors:
** Stefan Freischlad (maintainer until 2009), Peer Stechert
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
** and Stefan Freischlad
** Filius is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 2 of the License, or
** (at your option) version 3.
**
** Filius is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
** PURPOSE. See the GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Filius. If not, see <http://www.gnu.org/licenses/>.
*/
package filius.software.dateiaustausch;
import java.util.Random;
import java.util.StringTokenizer;
import filius.Main;
/**
* @author Nadja Haßler
*
*/
public class PeerToPeerPaket {
/* Attribute ---------------------------------------------------------------------------------------------*/
protected int guid; //16 Byte lange zufaellige Zahl zur Identifizierung von Paketen, 128 Bit, also Zahlen zwischen 0 und 6.805647338418769*10^38, hier ist die aber nur 2^31-1 gross hoechstens
protected String payload; // gibt Art des Pakets an: 0x00 (Ping), 0x01 (Pong), 0x80 (Query), 0x81 (Query-Hit) oder 0x40 (Push), Groesse 1 Byte
protected int ttl; // die Lebensdauer eines Pakets, Groesse 1 Byte
protected int hops; // die Anzahl der Hops, die das Paket schon zurueckgelegt hat, Groesse 1 Byte
protected long payloadLength; //Laenge der Nutzdaten in Bits
/* Konstruktoren ---------------------------------------------------------------------------------------------*/
/**
* einziger benoetiger Konstruktor
*/
public PeerToPeerPaket(){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (PeerToPeerPaket), constr: PeerToPeerPaket()");
this.guid=guidErstellen();
this.payload="";
this.ttl=8;
this.hops=0;
}
/**
* wandelt einen String (wenn möglich) in ein PeerToPeerPaket um
*/
public PeerToPeerPaket(String string){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (PeerToPeerPaket), constr: PeerToPeerPaket("+string+")");
// String wird nach "//" getrennt
StringTokenizer tk=new StringTokenizer(string,"//");
// Absichern der Informationen
guid=Integer.parseInt(tk.nextToken());
payload=tk.nextToken();
hops=Integer.parseInt(tk.nextToken());
ttl=Integer.parseInt(tk.nextToken());
payloadLength=Integer.parseInt(tk.nextToken());
}
/* Operationen ---------------------------------------------------------------------------------------------*/
protected long anzahlBenoetigterBits(long zahl){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (PeerToPeerPaket), anzahlBenoetigterBits("+zahl+")");
int exponent=0;
while (potenzieren(2,exponent)<zahl){
exponent++;
}
return exponent;
}
private int potenzieren(int basis, int exponent){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (PeerToPeerPaket), potenzieren("+basis+","+exponent+")");
/*
int ergebnis=1;
for (int i=0;i<exponent;i++){
ergebnis=ergebnis*basis;
}
return ergebnis;
*/
return (int) (java.lang.Math.pow((double) basis, (double) exponent));
}
/**
* erstellt eine zufaellige GUID im int-Bereich
* normalerweise sind diese Zahlen um einiges groesser, so jedoch handhabbarer
* @return erstellteGuid
*/
public int guidErstellen(){
Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (PeerToPeerPaket), guidErstellen()");
Random zufallszahl = new Random();
int erstellteGuid=-1;
while(erstellteGuid<0){
erstellteGuid=zufallszahl.nextInt();
}
return erstellteGuid;
}
/**
* wandelt ein PeerToPeerPaket in einen String um
* @return der String das PeerToPeerPaket verpackt als String
*/
public String toString(){
return getGuid()+"//"+getPayload()+"//"+getHops()+"//"
+getTtl()+"//"+getPayloadLength();
}
/* Getter und Setter ---------------------------------------------------------------------------------------------*/
public int getGuid() {
return guid;
}
public void setGuid(int guid) {
this.guid = guid;
}
public int getHops() {
return hops;
}
public void setHops(int hops) {
this.hops = hops;
}
public String getPayload() {
return payload;
}
public void setPayload(String payload) {
this.payload = payload;
}
public long getPayloadLength() {
return payloadLength;
}
public void setPayloadLength(long payloadLength) {
this.payloadLength = payloadLength;
}
public int getTtl() {
return ttl;
}
public void setTtl(int ttl) {
this.ttl = ttl;
}
}