private int getSectorData( SB data, byte[] byteBuf, int nSectorBytes, int nBytes, boolean asBinaryString, ZipData gzipData) throws Exception { readByteArray(byteBuf, 0, byteBuf.length); int n = gzipData.addBytes(byteBuf, nSectorBytes, nBytes); if (n >= 0) return n; if (asBinaryString) { for (int i = 0; i < nSectorBytes; i++) { data.append(Integer.toHexString(byteBuf[i] & 0xFF)).appendC(' '); if (--nBytes < 1) break; } } else { for (int i = 0; i < nSectorBytes; i++) { if (byteBuf[i] == 0) return -9999; // don't allow binary data data.appendC((char) byteBuf[i]); if (--nBytes < 1) break; } } return nBytes; }
/** * delivers file contents and directory listing for a ZIP/JAR file into sb * * @param name * @param header * @param fileData * @return name of entry */ private String getObjectAsSections(String name, String header, Map<String, String> fileData) { if (name == null) return null; String[] subFileList = null; boolean asBinaryString = false; String name0 = name.replace('\\', '/'); if (name.indexOf(":asBinaryString") >= 0) { asBinaryString = true; name = name.substring(0, name.indexOf(":asBinaryString")); } SB sb = null; if (fileData.containsKey(name0)) return name0; if (name.indexOf("#JMOL_MODEL ") >= 0) { fileData.put(name0, name0 + "\n"); return name0; } String fullName = name; if (name.indexOf("|") >= 0) { subFileList = PT.split(name, "|"); name = subFileList[0]; } BufferedInputStream bis = null; try { Object t = getBufferedInputStreamOrErrorMessageFromName(name, fullName, false, false, null, false); if (t instanceof String) { fileData.put(name0, (String) t + "\n"); return name0; } bis = (BufferedInputStream) t; if (JmolBinary.isCompoundDocumentS(bis)) { JmolDocument doc = (JmolDocument) Interface.getOptionInterface("io2.CompoundDocument"); doc.setStream(bis, true); doc.getAllDataMapped(name.replace('\\', '/'), "Molecule", fileData); } else if (JmolBinary.isZipS(bis)) { JmolBinary.getAllZipData(bis, subFileList, name.replace('\\', '/'), "Molecule", fileData); } else if (asBinaryString) { // used for Spartan binary file reading JmolDocument bd = (JmolDocument) Interface.getOptionInterface("io2.BinaryDocument"); bd.setStream(bis, false); sb = new SB(); // note -- these headers must match those in ZipUtil.getAllData and // CompoundDocument.getAllData if (header != null) sb.append("BEGIN Directory Entry " + name0 + "\n"); try { while (true) sb.append(Integer.toHexString(bd.readByte() & 0xFF)).appendC(' '); } catch (Exception e1) { sb.appendC('\n'); } if (header != null) sb.append("\nEND Directory Entry " + name0 + "\n"); fileData.put(name0, sb.toString()); } else { BufferedReader br = JmolBinary.getBufferedReader( JmolBinary.isGzipS(bis) ? new BufferedInputStream(JmolBinary.newGZIPInputStream(bis)) : bis, null); String line; sb = new SB(); if (header != null) sb.append("BEGIN Directory Entry " + name0 + "\n"); while ((line = br.readLine()) != null) { sb.append(line); sb.appendC('\n'); } br.close(); if (header != null) sb.append("\nEND Directory Entry " + name0 + "\n"); fileData.put(name0, sb.toString()); } } catch (Exception ioe) { fileData.put(name0, ioe.toString()); } if (bis != null) try { bis.close(); } catch (Exception e) { // } if (!fileData.containsKey(name0)) fileData.put(name0, "FILE NOT FOUND: " + name0 + "\n"); return name0; }