use of com.biglybt.pif.utils.UTTimerEvent in project BiglyBT by BiglySoftware.
the class UTTimerImpl method addEvent.
@Override
public UTTimerEvent addEvent(long when, final UTTimerEventPerformer ext_performer) {
if (destroyed) {
throw (new RuntimeException("Timer has been destroyed"));
}
final timerEvent res = new timerEvent();
TimerEventPerformer performer = new TimerEventPerformer() {
@Override
public void perform(TimerEvent ev) {
UtilitiesImpl.callWithPluginThreadContext(plugin_interface, new Runnable() {
@Override
public void run() {
res.perform(ext_performer);
}
});
}
};
if (timer == null) {
res.setEvent(SimpleTimer.addEvent("Plugin:" + ext_performer.getClass(), when, performer));
} else {
res.setEvent(timer.addEvent("Plugin:" + ext_performer.getClass(), when, performer));
}
return (res);
}
use of com.biglybt.pif.utils.UTTimerEvent in project BiglyBT by BiglySoftware.
the class SSDPCore method received.
@Override
public void received(NetworkInterface network_interface, InetAddress local_address, final InetSocketAddress originator, byte[] packet_data, int length) {
String str = new String(packet_data, 0, length);
if (first_response) {
first_response = false;
adapter.trace("UPnP:SSDP: first response:\n" + str);
}
// example notify event
/*
NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=3600
LOCATION: http://192.168.0.1:49152/gateway.xml
NT: urn:schemas-upnp-org:service:WANIPConnection:1
NTS: ssdp:byebye
SERVER: Linux/2.4.17_mvl21-malta-mips_fp_le, UPnP/1.0, Intel SDK for UPnP devices /1.2
USN: uuid:ab5d9077-0710-4373-a4ea-5192c8781666::urn:schemas-upnp-org:service:WANIPConnection:1
*/
// if ( originator.getAddress().getHostAddress().equals( "192.168.0.135" )){
// System.out.println( originator + ":" + str );
// }
List<String> lines = new ArrayList<>();
int pos = 0;
while (true) {
int p1 = str.indexOf(NL, pos);
String line;
if (p1 == -1) {
line = str.substring(pos);
} else {
line = str.substring(pos, p1);
pos = p1 + 1;
}
lines.add(line.trim());
if (p1 == -1) {
break;
}
}
if (lines.size() == 0) {
adapter.trace("SSDP::receive packet - 0 line reply");
return;
}
String header = (String) lines.get(0);
// Gudy's Root: http://192.168.0.1:5678/igd.xml, uuid:upnp-InternetGatewayDevice-1_0-12345678900001::upnp:rootdevice, upnp:rootdevice
// Parg's Root: http://192.168.0.1:49152/gateway.xml, uuid:824ff22b-8c7d-41c5-a131-44f534e12555::upnp:rootdevice, upnp:rootdevice
URL location = null;
String usn = null;
String nt = null;
String nts = null;
String st = null;
String al = null;
String mx = null;
String server = null;
for (int i = 1; i < lines.size(); i++) {
String line = (String) lines.get(i);
int c_pos = line.indexOf(":");
if (c_pos == -1) {
continue;
}
String key = line.substring(0, c_pos).trim().toUpperCase();
String val = line.substring(c_pos + 1).trim();
if (key.equals("LOCATION")) {
try {
if (!val.equals("*")) {
location = new URL(val);
}
} catch (MalformedURLException e) {
if (!val.contains("//")) {
// seen missing protocol
val = "http://" + val;
try {
location = new URL(val);
} catch (Throwable f) {
}
}
if (location == null) {
adapter.log(e);
}
}
} else if (key.equals("NT")) {
nt = val;
} else if (key.equals("USN")) {
usn = val;
} else if (key.equals("NTS")) {
nts = val;
} else if (key.equals("ST")) {
st = val;
} else if (key.equals("AL")) {
al = val;
} else if (key.equals("MX")) {
mx = val;
} else if (key.equals("SERVER")) {
server = val;
}
}
if (server != null) {
if (server.toLowerCase().startsWith("xbox")) {
String host = originator.getAddress().getHostAddress();
synchronized (ignore_mx) {
ignore_mx.add(host);
}
}
}
if (mx != null) {
String host = originator.getAddress().getHostAddress();
synchronized (ignore_mx) {
if (ignore_mx.contains(host)) {
mx = null;
}
}
}
if (header.startsWith("M-SEARCH")) {
if (st != null) {
/*
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=600
DATE: Tue, 20 Dec 2005 13:07:31 GMT
EXT:
LOCATION: http://192.168.1.1:2869/gatedesc.xml
SERVER: Linux/2.4.17_mvl21-malta-mips_fp_le UPnP/1.0
ST: upnp:rootdevice
USN: uuid:UUID-InternetGatewayDevice-1234::upnp:rootdevice
*/
String[] response = informSearch(network_interface, local_address, originator.getAddress(), st);
if (response != null) {
String UUID = response[0];
String url = response[1];
if (url.startsWith("/")) {
url = url.substring(1);
}
// Server MUST be in this alpha-case for Xbox to work (SERVER doesn't)...
String data = "HTTP/1.1 200 OK" + NL + "USN: " + UUID + "::" + st + NL + "ST: " + st + NL + "EXT:" + NL + "Location: http://" + local_address.getHostAddress() + ":" + mc_group.getControlPort() + "/" + url + NL + "Server: " + Constants.APP_NAME + "/" + Constants.AZUREUS_VERSION + " UPnP/1.0 " + Constants.APP_NAME + "/" + Constants.AZUREUS_VERSION + NL + "Cache-Control: max-age=3600" + NL + "Date: " + TimeFormatter.getHTTPDate(SystemTime.getCurrentTime()) + NL + "Content-Length: 0" + NL + NL;
final byte[] data_bytes = data.getBytes();
if (timer == null) {
timer = adapter.createTimer("SSDPCore:MX");
}
int delay = 0;
if (mx != null) {
try {
delay = Integer.parseInt(mx) * 1000;
delay = RandomUtils.nextInt(delay);
} catch (Throwable e) {
}
}
final Runnable task = new Runnable() {
@Override
public void run() {
try {
mc_group.sendToMember(originator, data_bytes);
} catch (Throwable e) {
adapter.log(e);
}
}
};
if (delay == 0) {
task.run();
} else {
long target_time = SystemTime.getCurrentTime() + delay;
boolean schedule_event;
synchronized (timer_queue) {
timer_queue.add(task);
schedule_event = time_event_next == 0 || target_time < time_event_next;
if (schedule_event) {
time_event_next = target_time;
}
}
if (schedule_event) {
timer.addEvent(target_time, new UTTimerEventPerformer() {
@Override
public void perform(UTTimerEvent event) {
while (true) {
Runnable t;
synchronized (timer_queue) {
if (timer_queue.size() > 0) {
t = (Runnable) timer_queue.remove(0);
} else {
time_event_next = 0;
return;
}
}
try {
t.run();
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
}
});
}
}
}
} else {
adapter.trace("SSDP::receive M-SEARCH - bad header:" + header);
}
} else if (header.startsWith("NOTIFY")) {
if (nt != null && nts != null) {
informNotify(network_interface, local_address, originator.getAddress(), usn, location, nt, nts);
} else {
adapter.trace("SSDP::receive NOTIFY - bad header:" + header);
}
} else if (header.startsWith("HTTP") && header.contains("200")) {
if (location != null && st != null) {
informResult(network_interface, local_address, originator.getAddress(), usn, location, st, al);
} else {
adapter.trace("SSDP::receive HTTP - bad header:" + header);
}
} else {
adapter.trace("SSDP::receive packet - bad header:" + header);
}
}
use of com.biglybt.pif.utils.UTTimerEvent in project BiglyBT by BiglySoftware.
the class DHTTrackerPlugin method initialise.
protected void initialise() {
is_running = true;
plugin_interface.getDownloadManager().addListener(new DownloadManagerListener() {
@Override
public void downloadAdded(Download download) {
addDownload(download);
}
@Override
public void downloadRemoved(Download download) {
removeDownload(download);
}
});
plugin_interface.getUtilities().createTimer("DHT Tracker", true).addPeriodicEvent(15000, new UTTimerEventPerformer() {
private int ticks;
private String prev_alt_status = "";
@Override
public void perform(UTTimerEvent event) {
ticks++;
processRegistrations(ticks % 8 == 0);
if (ticks == 2 || ticks % 4 == 0) {
processNonRegistrations();
}
if (alt_lookup_handler != null) {
if (ticks % 4 == 0) {
String alt_status = alt_lookup_handler.getString();
if (!alt_status.equals(prev_alt_status)) {
log.log("Alternative stats: " + alt_status);
prev_alt_status = alt_status;
}
}
}
}
});
}
Aggregations