From: <ha...@us...> - 2007-11-30 22:27:50
|
Revision: 8711 http://jmol.svn.sourceforge.net/jmol/?rev=8711&view=rev Author: hansonr Date: 2007-11-30 14:27:47 -0800 (Fri, 30 Nov 2007) Log Message: ----------- version=11.3.51_dev # bug fix: write FILE not handling binary file formats properly Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolStatusListener.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/util/ZipUtil.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/FileManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/ImageCreator.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/api/JmolStatusListener.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolStatusListener.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/api/JmolStatusListener.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -73,6 +73,6 @@ public void setCallbackFunction(String callbackType, String callbackFunction); - public void createImage(String file, String type, int quality); + public void createImage(String file, Object type_or_text_or_bytes, int quality); } Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -95,7 +95,7 @@ abstract public Image getScreenImage(); abstract public void releaseScreenImage(); - abstract public void createImage(String file, String type_text, int quality, + abstract public void createImage(String file, Object type_or_text_or_bytes, int quality, int width, int height); abstract public boolean handleOldJvm10Event(Event e); Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -849,7 +849,10 @@ return ""; } - public void createImage(String file, String type_or_text, int quality) { + public void createImage(String file, Object type_or_text_or_bytes, int quality) { + String type_or_text = (type_or_text_or_bytes instanceof String + ? (String) type_or_text_or_bytes + : new String((byte[])type_or_text_or_bytes)); if (quality == Integer.MAX_VALUE) consoleMessage(type_or_text); // application-only if not text Modified: trunk/Jmol/src/org/jmol/util/ZipUtil.java =================================================================== --- trunk/Jmol/src/org/jmol/util/ZipUtil.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/util/ZipUtil.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -93,6 +93,29 @@ return ""; } + static public byte[] getZipFileContentsAsBytes(InputStream is, String[] list, + int listPtr) { + byte[] ret = new byte[0]; + String fileName = list[listPtr]; + if (fileName.lastIndexOf("/") == fileName.length() - 1) + return ret; + ZipInputStream zis = new ZipInputStream(is); + ZipEntry ze; + try { + while ((ze = zis.getNextEntry()) != null) { + if (!fileName.equals(ze.getName())) + continue; + byte[] bytes = getZipEntryAsBytes(zis); + if (isZipFile(bytes) && list != null && ++listPtr < list.length) + return getZipFileContentsAsBytes(new BufferedInputStream( + new ByteArrayInputStream(bytes)), list, listPtr); + return bytes; + } + } catch (Exception e) { + } + return ret; + } + static public String getZipDirectoryAsStringAndClose(InputStream is) { StringBuffer sb = new StringBuffer(); String[] s = new String[0]; @@ -168,4 +191,19 @@ return buf; } + public static byte[] getStreamAsBytes(BufferedInputStream bis) throws IOException { + byte[] buf = new byte[1024]; + byte[] bytes = new byte[4096]; + int len = 0; + int totalLen = 0; + while ((len = bis.read(buf)) > 0) { + totalLen += len; + if (totalLen >= bytes.length) + bytes = ArrayUtil.ensureLength(bytes, totalLen * 2); + System.arraycopy(buf, 0, bytes, totalLen - len, len); + } + buf = new byte[totalLen]; + System.arraycopy(bytes, 0, buf, 0, totalLen); + return buf; + } } Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -1161,7 +1161,7 @@ dataFrame(JmolConstants.JMOL_DATA_QUATERNION); break; case Token.write: - write(1, null); + write(); break; case Token.print: print(); @@ -7962,8 +7962,8 @@ + " bonds? orientation? selection? state? structure?"); } - private String write(int pt, StringBuffer loadScript) throws ScriptException { - boolean isLoad = (loadScript != null); + private void write() throws ScriptException { + int pt = 1; boolean isApplet = viewer.isApplet(); String driverList = viewer.getExportDriverList(); int tok = (statementLength == 1 ? Token.clipboard : statement[pt].tok); @@ -8059,7 +8059,7 @@ String val = optParameterAsString(pt); if (val.equalsIgnoreCase("clipboard")) { if (isSyntaxCheck) - return ""; + return; // if (isApplet) // evalError(GT._("The {0} command is not available for the applet.", // "WRITE CLIPBOARD")); @@ -8144,8 +8144,9 @@ "JPG|JPG64|PNG|PPM|SPT|JVXL|XYZ|MOL|PDB|" + driverList.toUpperCase().replace(';', '|') })); if (isSyntaxCheck) - return ""; + return; data = type.intern(); + Object bytes = null; if (isExport) { //POV-Ray uses a BufferedWriter instead of a StringBuffer. boolean isPovRay = type.equals("Povray"); @@ -8157,7 +8158,7 @@ + ".png"); viewer.createImage(fileName + ".ini", data, Integer.MIN_VALUE, 0, 0); scriptStatus("Created " + fileName + ".ini:\n\n" + data); - return data; + return; } } else if (data == "PDB" || data == "XYZ" || data == "MOL") { data = viewer.getData("selected", data); @@ -8169,7 +8170,11 @@ } else if (data == "FUNCS") { data = getFunctionCalls(""); } else if (data == "FILE") { - data = viewer.getCurrentFileAsString(); + if (isShow) + data = viewer.getCurrentFileAsString(); + else + bytes = viewer.getCurrentFileAsBytes(); + quality = Integer.MIN_VALUE; } else if (data == "VAR") { data = "" + getParameter(parameterAsString(2), false); } else if (data == "SPT") { @@ -8198,8 +8203,11 @@ } else if (quality <= 0) quality = 75; //JPG } + if (data == null) + data = ""; if (len == 0) - len = data.length(); + len = (bytes == null ? data.length() : bytes instanceof String + ? ((String)bytes).length() : ((byte[]) bytes).length); if (isImage) { refresh(); if (width < 0) @@ -8209,15 +8217,18 @@ } if (isShow) { showString(data); - } else if (!isLoad) { - viewer.createImage(fileName, data, quality, width, height); + } else if (bytes != null && bytes instanceof String) { + scriptStatus((String) bytes); + } else { + if (bytes == null) + bytes = data; + viewer.createImage(fileName, bytes, quality, width, height); scriptStatus("type=" + type + "; file=" + (fileName == null ? "CLIPBOARD" : fileName) + (len >= 0 ? "; length=" + len : "") + (isImage ? "; width=" + width + "; height=" + height : "") + (quality >= 0 ? "; quality=" + quality : "")); } - return data; } private void print() throws ScriptException { Modified: trunk/Jmol/src/org/jmol/viewer/FileManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/FileManager.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/viewer/FileManager.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -280,6 +280,27 @@ return (countRead == 4 && abMagic[0] == (byte) 0x1F && abMagic[1] == (byte) 0x8B); } + public Object getFileAsBytes(String name) { + if (name == null) + return null; + String[] subFileList = null; + if (name.indexOf("|") >= 0) + name = (subFileList = TextFormat.split(name, "|"))[0]; + //System.out.println("FileManager.getFileAsString(" + name + ")"); + Object t = getInputStreamOrErrorMessageFromName(name, false); + if (t instanceof String) + return "Error:" + t; + try { + BufferedInputStream bis = new BufferedInputStream((InputStream) t, 8192); + InputStream is = bis; + if (ZipUtil.isZipFile(is) && subFileList != null && 1 < subFileList.length) + return ZipUtil.getZipFileContentsAsBytes(is, subFileList, 1); + return ZipUtil.getStreamAsBytes(bis); + } catch (Exception ioe) { + return ioe.getMessage(); + } + } + /** * * @param name Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2007-11-30 22:27:47 UTC (rev 8711) @@ -1,5 +1,7 @@ version=11.3.51_dev +# bug fix: write FILE not handling binary file formats properly + # bug fix: PDB CONECT records not creating bonds for ALL models # bug fix: load =xxxx broken in 11.3.50 # bug fix: amino not a subset of protein Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -396,10 +396,10 @@ return (jmolStatusListener == null ? "" : jmolStatusListener.eval(strEval)); } - void createImage(String file, String type, int quality) { + void createImage(String file, Object type_or_text_or_bytes, int quality) { if (jmolStatusListener == null) return; - jmolStatusListener.createImage(file, type, quality); + jmolStatusListener.createImage(file, type_or_text_or_bytes, quality); } } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -1635,17 +1635,29 @@ getModelSetName(), clientFile, null); } + + public Object getCurrentFileAsBytes() { + String filename = getFullPathName(); + if (filename == "string" || filename == "string[]" || filename == "JSNode") + return getCurrentFileAsString(); + String pathName = modelManager.getModelSetPathName(); + if (pathName == null) + return ""; + return fileManager.getFileAsBytes(pathName); + } + public String getCurrentFileAsString() { - if (getFullPathName() == "string") { + String filename = getFullPathName(); + if (filename == "string") { return fileManager.getInlineData(-1); } - if (getFullPathName() == "string[]") { + if (filename == "string[]") { int modelIndex = getDisplayModelIndex(); if (modelIndex < 0) return ""; return fileManager.getInlineData(modelIndex); } - if (getFullPathName() == "JSNode") { + if (filename == "JSNode") { return "<DOM NODE>"; } String pathName = modelManager.getModelSetPathName(); @@ -5981,7 +5993,7 @@ } } - public void createImage(String file, String type_text, int quality, + public void createImage(String file, Object type_or_text_or_bytes, int quality, int width, int height) { int saveWidth = dimScreen.width; int saveHeight = dimScreen.height; @@ -5990,7 +6002,7 @@ setModelVisibility(); } try { - statusManager.createImage(file, type_text, quality); + statusManager.createImage(file, type_or_text_or_bytes, quality); } catch (Exception e) { Logger.error("Error creating image: " + e.getMessage()); } Modified: trunk/Jmol/src/org/openscience/jmol/app/ImageCreator.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/ImageCreator.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/openscience/jmol/app/ImageCreator.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -59,7 +59,9 @@ ImageSelection.setClipboard(text); } - public void createImage(String fileName, String type_or_text, int quality) { + public void createImage(String fileName, Object type_or_text_bytes, int quality) { + boolean isBytes = (type_or_text_bytes instanceof byte[]); + String type_or_text = (isBytes ? null : (String) type_or_text_bytes); boolean isText = (quality == Integer.MIN_VALUE); if (fileName == null) { clipImage(type_or_text); @@ -67,7 +69,11 @@ } try { FileOutputStream os = new FileOutputStream(fileName); - if (isText) { + if (isBytes) { + os.write((byte[]) type_or_text_bytes); + os.flush(); + os.close(); + } else if (isText) { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os), 8192); bw.write(type_or_text); bw.close(); Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2007-11-30 21:01:08 UTC (rev 8710) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2007-11-30 22:27:47 UTC (rev 8711) @@ -1707,9 +1707,9 @@ return "# 'eval' is implemented only for the applet."; } - public void createImage(String file, String type, int quality) { + public void createImage(String file, Object type_or_text_or_bytes, int quality) { ImageCreator c = new ImageCreator(viewer, status); - c.createImage(file, type, quality); + c.createImage(file, type_or_text_or_bytes, quality); } public void setCallbackFunction(String callbackType, String callbackFunction) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |