Exemplo n.º 1
0
  public void serialize(LittleEndianOutput out) {
    _range.serialize(out);

    _guid.serialize(out);
    out.writeInt(0x00000002); // TODO const
    out.writeInt(_linkOpts);

    if ((_linkOpts & HLINK_LABEL) != 0) {
      out.writeInt(_label.length());
      StringUtil.putUnicodeLE(_label, out);
    }
    if ((_linkOpts & HLINK_TARGET_FRAME) != 0) {
      out.writeInt(_targetFrame.length());
      StringUtil.putUnicodeLE(_targetFrame, out);
    }

    if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) != 0) {
      out.writeInt(_address.length());
      StringUtil.putUnicodeLE(_address, out);
    }

    if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) == 0) {
      _moniker.serialize(out);
      if (URL_MONIKER.equals(_moniker)) {
        if (_uninterpretedTail == null) {
          out.writeInt(_address.length() * 2);
          StringUtil.putUnicodeLE(_address, out);
        } else {
          out.writeInt(_address.length() * 2 + TAIL_SIZE);
          StringUtil.putUnicodeLE(_address, out);
          writeTail(_uninterpretedTail, out);
        }
      } else if (FILE_MONIKER.equals(_moniker)) {
        out.writeShort(_fileOpts);
        out.writeInt(_shortFilename.length());
        StringUtil.putCompressedUnicode(_shortFilename, out);
        writeTail(_uninterpretedTail, out);
        if (_address == null) {
          out.writeInt(0);
        } else {
          int addrLen = _address.length() * 2;
          out.writeInt(addrLen + 6);
          out.writeInt(addrLen);
          out.writeShort(0x0003); // TODO const
          StringUtil.putUnicodeLE(_address, out);
        }
      }
    }
    if ((_linkOpts & HLINK_PLACE) != 0) {
      out.writeInt(_textMark.length());
      StringUtil.putUnicodeLE(_textMark, out);
    }
  }
Exemplo n.º 2
0
 @Override
 public boolean equals(Object o) {
   if (!(o instanceof Token)) {
     return false;
   }
   return id.equals(((Token) o).id);
 }
Exemplo n.º 3
0
 protected int getDataSize() {
   int size = 0;
   size += 2 + 2 + 2 + 2; // rwFirst, rwLast, colFirst, colLast
   size += GUID.ENCODED_SIZE;
   size += 4; // label_opts
   size += 4; // link_opts
   if ((_linkOpts & HLINK_LABEL) != 0) {
     size += 4; // link length
     size += _label.length() * 2;
   }
   if ((_linkOpts & HLINK_TARGET_FRAME) != 0) {
     size += 4; // int nChars
     size += _targetFrame.length() * 2;
   }
   if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) != 0) {
     size += 4; // int nChars
     size += _address.length() * 2;
   }
   if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) == 0) {
     size += GUID.ENCODED_SIZE;
     if (URL_MONIKER.equals(_moniker)) {
       size += 4; // address length
       size += _address.length() * 2;
       if (_uninterpretedTail != null) {
         size += TAIL_SIZE;
       }
     } else if (FILE_MONIKER.equals(_moniker)) {
       size += 2; // file_opts
       size += 4; // address length
       size += _shortFilename.length();
       size += TAIL_SIZE;
       size += 4;
       if (_address != null) {
         size += 6;
         size += _address.length() * 2;
       }
     }
   }
   if ((_linkOpts & HLINK_PLACE) != 0) {
     size += 4; // address length
     size += _textMark.length() * 2;
   }
   return size;
 }
Exemplo n.º 4
0
  public HyperlinkRecord(RecordInputStream in) {
    _range = new CellRangeAddress(in);

    _guid = new GUID(in);

    /**
     * streamVersion (4 bytes): An unsigned integer that specifies the version number of the
     * serialization implementation used to save this structure. This value MUST equal 2.
     */
    int streamVersion = in.readInt();
    if (streamVersion != 0x00000002) {
      throw new RecordFormatException("Stream Version must be 0x2 but found " + streamVersion);
    }
    _linkOpts = in.readInt();

    if ((_linkOpts & HLINK_LABEL) != 0) {
      int label_len = in.readInt();
      _label = in.readUnicodeLEString(label_len);
    }

    if ((_linkOpts & HLINK_TARGET_FRAME) != 0) {
      int len = in.readInt();
      _targetFrame = in.readUnicodeLEString(len);
    }

    if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) != 0) {
      _moniker = null;
      int nChars = in.readInt();
      _address = in.readUnicodeLEString(nChars);
    }

    if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) == 0) {
      _moniker = new GUID(in);

      if (URL_MONIKER.equals(_moniker)) {
        int length = in.readInt();
        /**
         * The value of <code>length<code> be either the byte size of the url field
         * (including the terminating NULL character) or the byte size of the url field plus 24.
         * If the value of this field is set to the byte size of the url field,
         * then the tail bytes fields are not present.
         */
        int remaining = in.remaining();
        if (length == remaining) {
          int nChars = length / 2;
          _address = in.readUnicodeLEString(nChars);
        } else {
          int nChars = (length - TAIL_SIZE) / 2;
          _address = in.readUnicodeLEString(nChars);
          /**
           * TODO: make sense of the remaining bytes According to the spec they consist of: 1.
           * 16-byte GUID: This field MUST equal {0xF4815879, 0x1D3B, 0x487F, 0xAF, 0x2C, 0x82,
           * 0x5D, 0xC4, 0x85, 0x27, 0x63} 2. Serial version, this field MUST equal 0 if present. 3.
           * URI Flags
           */
          _uninterpretedTail = readTail(URL_TAIL, in);
        }
      } else if (FILE_MONIKER.equals(_moniker)) {
        _fileOpts = in.readShort();

        int len = in.readInt();
        _shortFilename = StringUtil.readCompressedUnicode(in, len);
        _uninterpretedTail = readTail(FILE_TAIL, in);
        int size = in.readInt();
        if (size > 0) {
          int charDataSize = in.readInt();

          // From the spec: An optional unsigned integer that MUST be 3 if present
          // but some files has 4
          int usKeyValue = in.readUShort();

          _address = StringUtil.readUnicodeLE(in, charDataSize / 2);
        } else {
          _address = null;
        }
      } else if (STD_MONIKER.equals(_moniker)) {
        _fileOpts = in.readShort();

        int len = in.readInt();

        byte[] path_bytes = new byte[len];
        in.readFully(path_bytes);

        _address = new String(path_bytes);
      }
    }

    if ((_linkOpts & HLINK_PLACE) != 0) {

      int len = in.readInt();
      _textMark = in.readUnicodeLEString(len);
    }

    if (in.remaining() > 0) {
      logger.log(
          POILogger.WARN,
          "Hyperlink data remains: " + in.remaining() + " : " + HexDump.toHex(in.readRemainder()));
    }
  }
Exemplo n.º 5
0
 /**
  * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
  *
  * @param address the address of this hyperlink
  */
 public void setAddress(String address) {
   if ((_linkOpts & HLINK_URL) != 0 && FILE_MONIKER.equals(_moniker))
     _shortFilename = appendNullTerm(address);
   else if ((_linkOpts & HLINK_PLACE) != 0) _textMark = appendNullTerm(address);
   else _address = appendNullTerm(address);
 }
Exemplo n.º 6
0
 /**
  * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
  *
  * @return the address of this hyperlink
  */
 public String getAddress() {
   if ((_linkOpts & HLINK_URL) != 0 && FILE_MONIKER.equals(_moniker))
     return cleanString(_address != null ? _address : _shortFilename);
   else if ((_linkOpts & HLINK_PLACE) != 0) return cleanString(_textMark);
   else return cleanString(_address);
 }