/*
* This file is part of CBCJVM.
* CBCJVM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CBCJVM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CBCJVM. If not, see <http://www.gnu.org/licenses/>.
*/
package cbc.helpers;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
*
* @author Braden McDorman
*
*/
public class Helper {
private IWorkbenchWindow window = null;
private String name = "";
public final String m_SrcDir = File.separatorChar + "src";
public final String m_BinDir = File.separatorChar + "bin";
public Helper(IWorkbenchWindow window, String name) {
this.window = window;
this.name = name;
}
public void error(String error) {
MessageDialog.openError(window.getShell(), name, "Error: " + error);
}
public void message(String message) {
MessageDialog.openInformation(window.getShell(), name, message);
}
public String getCFile(String projectName, boolean beep) {
String cFile = "int main()" + "{";
if (beep)
cFile += "beep();";
cFile += "chdir(\"/mnt/user/code/" + projectName + "/bin" + "\");"
+ "system(\"/mnt/user/jvm/java Main\");" + "}";
return cFile;
}
public File getTmpCFile(String projectName) throws IOException {
File tmp = File.createTempFile("CBCJava", ".c");
FileWriter c = new FileWriter(tmp);
c.append(getCFile(projectName, false));
c.close();
return tmp;
}
public String getInstallerFile(String projectName) {
String cFile = "int main()\n{\n";
cFile += "system(\"mkdir /mnt/user/tmpusb\"); // Make the mount point for the flash drive\n";
cFile += "system(\"mount /dev/sdb1 /mnt/user/tmpusb -t vfat\"); //mount the flash drive\n";
cFile += "msleep(1000); //make sure it completely mounts\n";
cFile += "system(\"cp -R \\\"/mnt/user/tmpusb/" + projectName + "/\\\" /mnt/user/code/\"); //Copy the project\n";
cFile += "system(\"umount /mnt/user/tmpusb\"); //Unmount flash drive\n";
cFile += "system(\"rm -Rf /mnt/user/tmpusb\"); //Remove mount point\n";
cFile += "printf(\"Done Installing " + projectName + "!\"); //Inform user we are done\n";
cFile += "}\n";
return cFile;
}
public File getTmpInstallerFile(String projectName) throws IOException {
File tmp = File.createTempFile("CBCJavaInstaller", ".c");
FileWriter c = new FileWriter(tmp);
c.append(getInstallerFile(projectName));
c.close();
return tmp;
}
public String getWorkspace() {
IEditorPart activeEditor = getActiveEditor();
String currentFile = activeEditor.getTitle();
String fileLocation = ((IPathEditorInput) activeEditor.getEditorInput()).getPath().toString();
return fileLocation.substring(0, fileLocation.length() - (m_SrcDir.length() + 1 + currentFile.length()));
}
public String getProjectName(String workspace) {
int ch = workspace.lastIndexOf('/');
if(ch == -1) {
ch = workspace.lastIndexOf(File.separatorChar);
if(ch == -1) {
error("Unable to determine project name from \"" + workspace + "\"");
return null;
}
}
return workspace.substring(ch + 1);
}
public String getInputFromUser(String text, String predef) {
InputDialog input = new InputDialog(window.getShell(), name, text, predef, null);
input.open();
input.close();
return input.getValue();
}
public IEditorPart getActiveEditor() {
IWorkbench iworkbench = PlatformUI.getWorkbench();
if (iworkbench == null) {
error("Unable to fetch workbench.");
return null;
}
IWorkbenchWindow iworkbenchwindow = iworkbench
.getActiveWorkbenchWindow();
if (iworkbenchwindow == null) {
error("Unable to fetch workbench window.");
return null;
}
IWorkbenchPage iworkbenchpage = iworkbenchwindow.getActivePage();
if (iworkbenchpage == null) {
error("Unable to fetch workbench page.");
return null;
}
IEditorPart ieditorpart = iworkbenchpage.getActiveEditor();
if (ieditorpart == null) {
error("Unable to fetch active editor. You probably have no editors open.");
return null;
}
return ieditorpart;
}
public void copyFile(File source, File destination) {
try {
destination.createNewFile();
InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(destination);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
} catch (FileNotFoundException ex) {
error(ex.getMessage() + " in the specified directory.");
} catch (IOException e) {
error(e.getMessage());
}
}
public void copyDirectory(File src, File dst) throws IOException {
File[] files = src.listFiles();
dst.mkdirs();
for (int it = 0; it < files.length; ++it) {
copyFile(files[it], new File(dst.getAbsolutePath() + File.separatorChar + files[it].getName()));
}
}
// Recursive sending of a directory
public void sendDirectory(Ssh cbc, String projectName, boolean recursive, String prefix, File dir) throws IOException {
File[] files = dir.listFiles();
for(int it = 0; it < files.length; ++it) {
if(files[it].isDirectory() && recursive) {
sendDirectory(cbc, projectName, recursive, prefix + files[it].getName() + "/", files[it]);
} else {
cbc.sendFile("/mnt/user/code/" + projectName + "/bin" + prefix + files[it].getName(), files[it]);
}
}
}
public File[] getDirectoryFiles(File dir) {
return dir.listFiles();
}
}