package org.geogebra.web.web.main;
import java.util.ArrayList;
import org.geogebra.common.GeoGebraConstants;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Macro;
import org.geogebra.common.main.App;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.html5.main.GgbAPIW;
import org.geogebra.web.web.gui.util.PopupBlockAvoider;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
/**
* Export GeoGebra worksheet to GeoGebraTube.
*
* @author Florian Sonner
*/
public class GeoGebraTubeExportW extends
org.geogebra.common.export.GeoGebraTubeExport {
/**
* @param app
* application
*/
public GeoGebraTubeExportW(App app) {
super(app);
}
/**
* @param base64
* material base64
* @return urlencoded POST fields
*/
protected StringBuffer getPostData(String base64) {
Construction cons = app.getKernel().getConstruction();
boolean isConstruction = (getMacros() == null);
// build post query
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("data=");
stringBuffer.append(encode(getMacros() == null ? base64
: getBase64Tools(getMacros())));
stringBuffer.append("&type=");
stringBuffer.append(isConstruction ? "ggb" : "ggt");
stringBuffer.append("&title=");
stringBuffer.append(encode(cons.getTitle()));
stringBuffer.append("&pretext=");
stringBuffer.append(encode(cons.getWorksheetText(0)));
stringBuffer.append("&posttext=");
stringBuffer.append(encode(cons.getWorksheetText(1)));
stringBuffer.append("&version=");
stringBuffer.append(encode(GeoGebraConstants.VERSION_STRING));
return stringBuffer;
}
/**
* @param rb
* request builder
* @param postData0
* worksheet metadata
* @param pba
* helper to keep popup alive
*/
protected void doUploadWorksheet(RequestBuilder rb, String postData0,
final PopupBlockAvoider pba) {
// encode '+'
// for some reason encode(postData) doesn't work
String postData = postData0.replace("+", "%2B");
try {
rb.sendRequest(postData, new RequestCallback() {
@Override
public void onError(Request request, Throwable exception) {
Log.debug("onError: " + request.toString() + " "
+ exception.toString());
}
@Override
public void onResponseReceived(Request request,
Response response) {
if (response.getStatusCode() == Response.SC_OK) {
Log.debug("result from server: " + response.getText());
final UploadResults results = new UploadResults(
response.getText());
if (results.hasError()) {
statusLabelSetText(app.getLocalization().getPlain(
"UploadError", results.getStatus()));
setEnabled(false);
Log.debug("Upload failed. Response: "
+ response.getText());
} else {
Log.debug("Opening URL: " + getUploadURL(app) + "/"
+ results.getUID());
pba.openURL(
getUploadURL(app) + "/"
+ results.getUID());
}
} else { // not Response.SC_OK
Log.debug("Upload failed. Response: #"
+ response.getStatusCode() + " - "
+ response.getStatusText());
Log.debug(response.getText());
statusLabelSetText(getLoc().getPlain("UploadError",
Integer.toString(response.getStatusCode())));
setEnabled(false);
pack();
}
}
});
} catch (RequestException e) {
statusLabelSetText(getLoc().getPlain("UploadError",
Integer.toString(500)));
setEnabled(false);
pack();
Log.debug(e.getMessage());
}
}
/**
* @param base64
* base64
* @param pba
* helper to keep popup alive
*/
public void uploadWorksheetSimple(String base64, PopupBlockAvoider pba) {
this.setMacros(null);
try {
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
getUploadURL(app));
rb.setHeader("Content-Type",
"application/x-www-form-urlencoded; charset=utf-8");
// rb.setHeader("Accept-Language", "app.getLocaleStr()");
String postData = getPostData(base64).toString();
doUploadWorksheet(rb, postData, pba);
} catch (Exception e) {
statusLabelSetText(getLoc().getPlain("UploadError",
Integer.toString(400)));
setEnabled(false);
pack();
Log.debug(e.getMessage());
}
}
/**
* Upload the current worksheet to GeoGebraTube.
*
* @param macrosIn
* macros
* @param pba
* helper to keep popup alive
*/
public void uploadWorksheet(ArrayList<Macro> macrosIn, PopupBlockAvoider pba) {
this.setMacros(macrosIn);
try {
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
getUploadURL(app));
rb.setHeader("Content-Type",
"application/x-www-form-urlencoded; charset=utf-8");
// rb.setHeader("Accept-Language", "app.getLocaleStr()");
String postData = getPostData().toString();
doUploadWorksheet(rb, postData, pba);
} catch (Exception e) {
statusLabelSetText(getLoc().getPlain("UploadError",
Integer.toString(400)));
setEnabled(false);
pack();
Log.debug(e.getMessage());
}
}
@Override
protected String encode(String str) {
if (str != null) {
return URL.encode(str);
}
Log.error("passed null");
return "";
}
@Override
protected void setMaximum(int i) {
Log.debug("Unimplemented " + i);
}
@Override
protected void setMinimum(int i) {
Log.debug("Unimplemented " + i);
}
@Override
protected void setIndeterminate(boolean b) {
Log.debug("Unimplemented " + b);
}
@Override
protected void setValue(int end) {
Log.debug("Unimplemented " + end);
}
@Override
protected void setEnabled(boolean b) {
Log.debug("Unimplemented " + b);
}
@Override
protected void statusLabelSetText(String plain) {
ToolTipManagerW.sharedInstance().showBottomMessage(plain, true,
(AppW) app);
}
@Override
protected void pack() {
Log.debug("Unimplemented");
}
@Override
protected String getBase64Tools(ArrayList<Macro> macros1) {
return ((GgbAPIW) app.getGgbApi()).getMacrosBase64();
}
}