/********************************************************************* * * Copyright (C) 2005 Andrew Khan * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ***************************************************************************/ package jxl.biff; import common.Logger; import jxl.WorkbookSettings; /** * Helper to get the Microsoft encoded URL from the given string */ public class EncodedURLHelper { /** * The logger */ private static Logger logger = Logger.getLogger(EncodedURLHelper.class); // The control codes private static byte msDosDriveLetter = 0x01; private static byte sameDrive = 0x02; private static byte endOfSubdirectory = 0x03; private static byte parentDirectory = 0x04; private static byte unencodedUrl = 0x05; public static byte[] getEncodedURL(String s, WorkbookSettings ws) { if (s.startsWith("http:")) { return getURL(s, ws); } else { return getFile(s, ws); } } private static byte[] getFile(String s, WorkbookSettings ws) { ByteArray byteArray = new ByteArray(); int pos = 0; if (s.charAt(1) == ':') { // we have a drive letter byteArray.add(msDosDriveLetter); byteArray.add((byte) s.charAt(0)); pos = 2; } else if (s.charAt(pos) == '\\' || s.charAt(pos) == '/') { byteArray.add(sameDrive); } while (s.charAt(pos) == '\\' || s.charAt(pos) == '/') { pos++; } while (pos < s.length()) { int nextSepIndex1 = s.indexOf('/', pos); int nextSepIndex2 = s.indexOf('\\', pos); int nextSepIndex = 0; String nextFileNameComponent = null; if (nextSepIndex1 != -1 && nextSepIndex2 != -1) { // choose the smallest (ie. nearest) separator nextSepIndex = Math.min(nextSepIndex1, nextSepIndex2); } else if (nextSepIndex1 == -1 || nextSepIndex2 == -1) { // chose the maximum separator nextSepIndex = Math.max(nextSepIndex1, nextSepIndex2); } if (nextSepIndex == -1) { // no more separators nextFileNameComponent = s.substring(pos); pos = s.length(); } else { nextFileNameComponent = s.substring(pos, nextSepIndex); pos = nextSepIndex + 1; } if (nextFileNameComponent.equals(".")) { // current directory - do nothing } else if (nextFileNameComponent.equals("..")) { // parent directory byteArray.add(parentDirectory); } else { // add the filename component byteArray.add(StringHelper.getBytes(nextFileNameComponent, ws)); } if (pos < s.length()) { byteArray.add(endOfSubdirectory); } } return byteArray.getBytes(); } private static byte[] getURL(String s, WorkbookSettings ws) { ByteArray byteArray = new ByteArray(); byteArray.add(unencodedUrl); byteArray.add((byte) s.length()); byteArray.add(StringHelper.getBytes(s, ws)); return byteArray.getBytes(); } }