Ejemplo n.º 1
0
  /**
   * @param bytes
   * @param metadata incoming metadata
   * @param unknownFilenameCount
   * @return byte[] for contents of obj data
   * @throws IOException
   */
  protected byte[] parse(byte[] bytes, Metadata metadata, AtomicInteger unknownFilenameCount)
      throws IOException {
    ByteArrayInputStream is = new ByteArrayInputStream(bytes);
    long version = readUInt(is);
    metadata.add(RTFMetadata.EMB_APP_VERSION, Long.toString(version));

    long formatId = readUInt(is);
    // 2 is an embedded object. 1 is a link.
    if (formatId != 2L) {
      return null;
    }
    String className = readLengthPrefixedAnsiString(is).trim();
    String topicName = readLengthPrefixedAnsiString(is).trim();
    String itemName = readLengthPrefixedAnsiString(is).trim();

    if (className != null && className.length() > 0) {
      metadata.add(RTFMetadata.EMB_CLASS, className);
    }
    if (topicName != null && topicName.length() > 0) {
      metadata.add(RTFMetadata.EMB_TOPIC, topicName);
    }
    if (itemName != null && itemName.length() > 0) {
      metadata.add(RTFMetadata.EMB_ITEM, itemName);
    }

    long dataSz = readUInt(is);

    // readBytes tests for reading too many bytes
    byte[] embObjBytes = readBytes(is, dataSz);

    if (className.toLowerCase(Locale.ROOT).equals("package")) {
      return handlePackage(embObjBytes, metadata);
    } else if (className.toLowerCase(Locale.ROOT).equals("pbrush")) {
      // simple bitmap bytes
      return embObjBytes;
    } else {
      ByteArrayInputStream embIs = new ByteArrayInputStream(embObjBytes);
      if (NPOIFSFileSystem.hasPOIFSHeader(embIs)) {
        try {
          return handleEmbeddedPOIFS(embIs, metadata, unknownFilenameCount);
        } catch (IOException e) {
          // swallow
        }
      }
    }
    return embObjBytes;
  }