Open Source Repository

Home /excel/jxl-2.6.12 | Repository Home



jxl/biff/EncodedURLHelper.java
/*********************************************************************
*
*      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 jxl.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((bytes.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 != -&& nextSepIndex2 != -1)
      {
        // choose the smallest (ie. nearest) separator
        nextSepIndex = Math.min(nextSepIndex1, nextSepIndex2);
      }
      else if (nextSepIndex1 == -|| 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((bytes.length());
    byteArray.add(StringHelper.getBytes(s, ws));
    return byteArray.getBytes();
  }
}