001/**
002 *
003 * Copyright 2016-2017 Fernando Ramirez, Florian Schmaus
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.jivesoftware.smackx.bob;
018
019import org.jivesoftware.smack.util.StringUtils;
020import org.jivesoftware.smack.util.stringencoder.Base64;
021
022/**
023 * Bits of Binary data class.
024 * 
025 * @author Fernando Ramirez
026 * @author Florian Schmaus
027 * @see <a href="http://xmpp.org/extensions/xep-0231.html">XEP-0231: Bits of
028 *      Binary</a>
029 */
030public class BoBData {
031
032    private final int maxAge;
033    private final String type;
034
035    private byte[] contentBinary;
036    private String contentString;
037
038    public BoBData(String type, byte[] content) {
039        this(type, content, -1);
040    }
041
042    /**
043     * BoB data constructor.
044     * 
045     * @param type
046     * @param content
047     * @param maxAge
048     */
049    public BoBData(String type, byte[] content, int maxAge) {
050        this.type = type;
051        this.contentBinary = content;
052        this.maxAge = maxAge;
053    }
054
055    public BoBData(String type, String content) {
056        this(type, content, -1);
057    }
058
059    public BoBData(String type, String content, int maxAge) {
060        this.type = type;
061        this.contentString = content;
062        this.maxAge = maxAge;
063    }
064
065    /**
066     * Get the max age.
067     * 
068     * @return the max age
069     */
070    public int getMaxAge() {
071        return maxAge;
072    }
073
074    /**
075     * Get the type.
076     * 
077     * @return the type
078     */
079    public String getType() {
080        return type;
081    }
082
083    private void setContentBinaryIfRequired() {
084        if (contentBinary == null) {
085            assert (StringUtils.isNotEmpty(contentString));
086            contentBinary = Base64.decode(contentString);
087        }
088    }
089
090    /**
091     * Get the content.
092     * 
093     * @return the content
094     */
095    public byte[] getContent() {
096        setContentBinaryIfRequired();
097        return contentBinary.clone();
098    }
099
100    /**
101     * Get the content in a Base64 encoded String.
102     * 
103     * @return the content in a Base64 encoded String
104     */
105    public String getContentBase64Encoded() {
106        if (contentString == null) {
107            contentString = Base64.encodeToString(getContent());
108        }
109        return contentString;
110    }
111
112    /**
113     * Check if the data is of reasonable size. XEP-0231 suggest that the size should not be more than 8 KiB.
114     *
115     * @return true if the data if of reasonable size.
116     */
117    public boolean isOfReasonableSize() {
118        setContentBinaryIfRequired();
119        return contentBinary.length <= 8 * 1024;
120    }
121}