// Copyright (c) 2014 Tom Zhou<iwebpp@gmail.com>
package com.iwebpp.node;
import java.util.Date;
import com.iwebpp.SimpleDebug;
import com.iwebpp.libuvpp.LibUV;
import com.iwebpp.libuvpp.cb.TimerCallback;
import com.iwebpp.libuvpp.handles.LoopHandle;
import com.iwebpp.libuvpp.handles.TimerHandle;
// Node.android libUV loop context
public final class NodeContext extends SimpleDebug {
private static final String TAG = "NodeContext";
static {
// call an idempotent LibUV method just to ensure that the native lib is loaded
LibUV.cwd();
}
private LoopHandle loop;
/**
* @return the loop
*/
public LoopHandle getLoop() {
return loop;
}
public NodeContext() {
this.loop = new LoopHandle();
}
public void execute() throws Throwable {
this.loop.run();
}
public void destroy() {
this.loop.destroy();
}
/*
* DOM-style timers
*/
// setTimeout/clearTimeout
public interface TimeoutListener{
public void onTimeout() throws Exception;
}
// after: ms
public TimerHandle setTimeout(final TimeoutListener callback, int after) {
final TimerHandle timer = new TimerHandle(loop);
timer.setCloseCallback(new TimerCallback() {
@Override
public void onTimer(final int i) throws Exception {
debug(TAG, "setTimeout timer closed");
}
});
timer.setTimerFiredCallback(new TimerCallback() {
@Override
public void onTimer(final int status) throws Exception {
debug(TAG, "setTimeout timer fired");
callback.onTimeout();
timer.close();
}
});
timer.start(after, 0);
return timer;
}
public void clearTimeout(TimerHandle timer) {
timer.close();
}
// setInterval/clearInterval
public interface IntervalListener{
public void onInterval() throws Exception;
}
// repeat: ms
public TimerHandle setInterval(final IntervalListener callback, int repeat) {
final TimerHandle timer = new TimerHandle(loop);
timer.setCloseCallback(new TimerCallback() {
@Override
public void onTimer(final int i) throws Exception {
debug(TAG, "setInterval timer closed");
}
});
timer.setTimerFiredCallback(new TimerCallback() {
@Override
public void onTimer(final int status) throws Exception {
debug(TAG, "setInterval timer fired");
callback.onInterval();
}
});
timer.start(repeat, repeat);
return timer;
}
public void clearInterval(TimerHandle timer) {
timer.close();
}
// fire on next tick
public void nextTick(final nextTickListener next) {
final TimerHandle timer = new TimerHandle(loop);
timer.setCloseCallback(new TimerCallback() {
@Override
public void onTimer(final int i) throws Exception {
debug(TAG, "nextTick timer closed");
}
});
timer.setTimerFiredCallback(new TimerCallback() {
@Override
public void onTimer(final int status) throws Exception {
debug(TAG, "nextTick timer fired");
next.onNextTick();
timer.close();
}
});
timer.start(0, 0);
}
public interface nextTickListener {
void onNextTick() throws Exception;
}
//
private volatile String dateCached = null;
public String utcDate() {
if (null == dateCached) {
Date d = new Date();
// TBD... GTC
dateCached = d.toString();
setTimeout(new TimeoutListener() {
@Override
public void onTimeout() throws Exception {
dateCached = null;
}
}, 1000);
}
return dateCached;
}
}