1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ==================================================================== */
- package org.apache.poi.hpsf;
-
- import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
- import org.apache.poi.util.IOUtils;
- import org.apache.poi.util.Internal;
- import org.apache.poi.util.LittleEndian;
- import org.apache.poi.util.LittleEndianByteArrayInputStream;
- import org.apache.poi.util.LittleEndianConsts;
-
- import static org.apache.logging.log4j.util.Unbox.box;
-
- @Internal
- public class ClipboardData {
- //arbitrarily selected; may need to increase
- private static final int MAX_RECORD_LENGTH = 100_000_000;
-
- private static final Logger LOG = LogManager.getLogger(ClipboardData.class);
-
- private int _format;
- private byte[] _value;
-
- public void read( LittleEndianByteArrayInputStream lei ) {
- int offset = lei.getReadIndex();
- long size = lei.readInt();
-
- if ( size < 4 ) {
- LOG.atWarn().log("ClipboardData at offset {} size less than 4 bytes (doesn't even have format " +
- "field!). Setting to format == 0 and hope for the best", box(offset));
- _format = 0;
- _value = new byte[0];
- return;
- }
-
- _format = lei.readInt();
- _value = IOUtils.safelyAllocate(size - LittleEndianConsts.INT_SIZE, MAX_RECORD_LENGTH);
- lei.readFully(_value);
- }
-
- public byte[] getValue() {
- return _value;
- }
-
- public byte[] toByteArray() {
- byte[] result = new byte[LittleEndianConsts.INT_SIZE*2+_value.length];
- LittleEndian.putInt(result, 0, LittleEndianConsts.INT_SIZE + _value.length);
- LittleEndian.putInt(result, 4, _format);
- System.arraycopy(_value, 0, result, 8, _value.length);
- return result;
- }
-
- public void setValue( byte[] value ) {
- _value = value.clone();
- }
- }
|