package org.geogebra.common.export;
import java.io.IOException;
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.main.Feature;
import org.geogebra.common.main.Localization;
/**
* Export GeoGebra worksheet to GeoGebraTube.
*
* @author Florian Sonner
*/
public abstract class GeoGebraTubeExport {
/**
* Application instance.
*/
public App app;
private Localization loc;
private ArrayList<Macro> macros;
/**
* Constructs a new instance of the GeoGebraTube exporter.
*
* @param app
*/
public GeoGebraTubeExport(App app) {
this.app = app;
this.setLoc(app.getLocalization());
}
/**
* Upload the current worksheet to GeoGebraTube.
*/
// public abstract void uploadWorksheet(ArrayList<Macro> macros);
protected abstract void statusLabelSetText(String plain);
protected abstract void pack();
/**
* returns a base64 encoded .ggb file
*
* @throws IOException
*/
protected String getBase64String() throws IOException {
return app.getGgbApi().getBase64(true);
}
/**
* returns a base64 encoded .ggt file
*
* @throws IOException
*/
protected abstract String getBase64Tools(ArrayList<Macro> macros)
throws IOException;
/**
* Storage container for uploading results.
*
* @author Florian Sonner
*/
public static class UploadResults {
private String status;
private String uid;
private String errorMessage;
/**
* Parse upload result string.
*
* @param string
*/
public UploadResults(String string0) {
String string = string0;
status = uid = errorMessage = "";
if(string.indexOf("status:")>0){
string = string.substring(string.indexOf("status:"));
}
for (String line : string.split(",")) {
int delimiterPos = line.indexOf(':');
String key = line.substring(0, delimiterPos).toLowerCase();
String value = line.substring(delimiterPos + 1).toLowerCase();
if ("status".equals(key)) {
status = value;
} else if ("uid".equals(key)) {
uid = value;
} else if ("error".equals(key)) {
errorMessage = value;
}
}
}
public boolean hasError() {
return !"ok".equals(status);
}
public String getStatus() {
return status;
}
public String getUID() {
return uid;
}
public String getErrorMessage() {
return errorMessage;
}
}
protected StringBuilder getPostData() throws IOException {
Construction cons = app.getKernel().getConstruction();
boolean isConstruction = (getMacros() == null);
// build post query
StringBuilder sb = new StringBuilder();
sb.append("data=");
sb.append(encode(
isConstruction ? getBase64String() : getBase64Tools(getMacros())));
sb.append("&type=");
sb.append(isConstruction ? "ggb" : "ggt");
if (isConstruction) {
sb.append("&title=");
sb.append(encode(cons.getTitle()));
sb.append("&pretext=");
sb.append(encode(cons.getWorksheetText(0)));
sb.append("&posttext=");
sb.append(encode(cons.getWorksheetText(1)));
}
sb.append("&version=");
sb.append(encode(GeoGebraConstants.VERSION_STRING));
return sb;
}
protected abstract String encode(String str);
protected abstract void setMaximum(int i);
protected abstract void setMinimum(int i);
protected abstract void setIndeterminate(boolean b);
protected abstract void setValue(int end);
protected abstract void setEnabled(boolean b);
/**
* @param app0
* determines whether we need TUBE_BETA flag
* @return base upload URL for GeoGebraTube
*/
public String getUploadURL(App app0) {
if (app0.has(Feature.TUBE_BETA)) {
return GeoGebraConstants.uploadURLBeta;
}
return GeoGebraConstants.uploadURL;
}
public Localization getLoc() {
return loc;
}
public void setLoc(Localization loc) {
this.loc = loc;
}
protected ArrayList<Macro> getMacros() {
return macros;
}
protected void setMacros(ArrayList<Macro> macros) {
this.macros = macros;
}
}