package freenet.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ClosingEvent;
import com.google.gwt.user.client.Window.ClosingHandler;
import com.google.gwt.user.client.ui.RootPanel;
import freenet.client.connection.IConnectionManager;
import freenet.client.connection.KeepaliveManager;
import freenet.client.connection.SharedConnectionManager;
import freenet.client.dynamics.TimeIncrementer;
import freenet.client.messages.MessageManager;
import freenet.client.tools.FreenetRequest;
import freenet.client.tools.QueryParameter;
import freenet.client.update.DefaultUpdateManager;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class FreenetJs implements EntryPoint {
/** Debug mode. If true, the client will log. Should be false at production */
public static boolean isDebug = true;
/** The requestId. It is used to identify this instance to the server */
public static String requestId;
/** The manager */
private static IConnectionManager cm;
/** The keepalive manager */
private static IConnectionManager keepaliveManager;
/** If true, then pushing cancel is expected, so it won't show a message for it. */
public static boolean isPushingCancelledExpected = false;
public void onModuleLoad() {
// If the user closes the window, it sends a leaving message
Window.addWindowClosingHandler(new ClosingHandler() {
@Override
public void onWindowClosing(ClosingEvent event) {
isPushingCancelledExpected = true;
FreenetRequest.sendRequest(UpdaterConstants.leavingPath, new QueryParameter("requestId", requestId));
cm.closeConnection();
}
});
// Exports some method for external use
// It is not needed, but may come handy in the future
exportStaticMethod();
requestId = RootPanel.get("requestId").getElement().getAttribute("value");
cm = new SharedConnectionManager(new DefaultUpdateManager());
keepaliveManager = new KeepaliveManager();
cm.openConnection();
keepaliveManager.openConnection();
new TimeIncrementer().start();
// Create the MessageManager object to let it register it's listener
MessageManager.get();
}
static long logCounter;
/** Log a message */
public static final void log(String msg) {
try {
// Only log id debug is enabled
if (isDebug) {
// Write the log back to the server
try{ FreenetRequest.sendRequest(UpdaterConstants.logWritebackPath, new QueryParameter("msg",requestId+":"+(logCounter++)+":"+urlEncode(msg))); }catch(Exception e){
}
// Write the log to the console
nativeLog(msg);
// Write the log to the page
/*
* Panel logPanel = RootPanel.get("log"); if (logPanel == null) { logPanel = new SimplePanel(); logPanel.getElement().setId("log");
* logPanel.getElement().setAttribute("style", "display:none;"); Document.get().getElementsByTagName("body").getItem(0).appendChild(logPanel.getElement()); }
* logPanel.add(new Label("{" + System.currentTimeMillis() + "}" + msg));
*/
}
} catch (Exception e) {
// If an error occurs, we suppress it. Logging should not throw exceptions
}
}
/** Base 64 causes some bizarre data corruption, probably because / and + are not allowed in URLs.
* Java's URLEncoder isn't available, and Freenet's URLEncoder doesn't compile: getBytes() doesn't work.
* So hack together a pathetic feature incomplete encoder that doesn't use getBytes().
* REDFLAG: THIS IS NOT REMOTELY SAFE!!!! */
private static String urlEncode(String s) {
StringBuffer sb = new StringBuffer(s.length());
for(int i=0;i<s.length();i++) {
char c = s.charAt(i);
if(c == '%') {
sb.append("%25");
} else if(c == '?') {
sb.append("%3f");
} else if(c == '&') {
sb.append("%26");
} else if(c == '#') {
sb.append("%23");
} else if(c == '/') {
sb.append("%2f");
} else if(c == '=') {
sb.append("%3d");
} else if(c == ':') {
sb.append("%3a");
} else if(c == ';') {
sb.append("%3b");
} else sb.append(c);
}
return sb.toString();
}
/** Exported method to let external sources turn on logging */
public static final void enableDebug() {
isDebug = true;
}
/** Logs a message to the console */
public static final native void nativeLog(String msg) /*-{
console.log(msg);
}-*/;
/** Exports some methods */
public static native void exportStaticMethod() /*-{
$wnd.log =
@freenet.client.FreenetJs::log(Ljava/lang/String;);
$wnd.enableDebug =
@freenet.client.FreenetJs::enableDebug();
}-*/;
/** Stops the pushing, closing connections */
public static void stop() {
cm.closeConnection();
keepaliveManager.closeConnection();
}
}