001    package ezvcard.property;
002    
003    import java.io.File;
004    import java.io.FileInputStream;
005    import java.io.IOException;
006    import java.io.InputStream;
007    import java.util.List;
008    
009    import ezvcard.VCard;
010    import ezvcard.VCardVersion;
011    import ezvcard.Warning;
012    import ezvcard.parameter.MediaTypeParameter;
013    import ezvcard.util.IOUtils;
014    
015    /*
016     Copyright (c) 2013, Michael Angstadt
017     All rights reserved.
018    
019     Redistribution and use in source and binary forms, with or without
020     modification, are permitted provided that the following conditions are met: 
021    
022     1. Redistributions of source code must retain the above copyright notice, this
023     list of conditions and the following disclaimer. 
024     2. Redistributions in binary form must reproduce the above copyright notice,
025     this list of conditions and the following disclaimer in the documentation
026     and/or other materials provided with the distribution. 
027    
028     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
029     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
030     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
031     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
032     ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
033     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
034     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
035     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
036     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
037     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
038    
039     The views and conclusions contained in the software and documentation are those
040     of the authors and should not be interpreted as representing official policies, 
041     either expressed or implied, of the FreeBSD Project.
042     */
043    
044    /**
045     * Represents a property whose value contains binary data (for example,
046     * {@link Photo}).
047     * @author Michael Angstadt
048     * 
049     * @param <T> the class used for representing the content type of the resource
050     */
051    public abstract class BinaryProperty<T extends MediaTypeParameter> extends VCardProperty implements HasAltId {
052            /**
053             * The decoded data.
054             */
055            protected byte[] data;
056    
057            /**
058             * The URL to the resource.
059             */
060            protected String url;
061    
062            /**
063             * The content type of the resource (for example, a JPEG image).
064             */
065            protected T contentType;
066    
067            public BinaryProperty() {
068                    //empty
069            }
070    
071            /**
072             * Creates a binary property.
073             * @param url the URL to the resource
074             * @param type the content type
075             */
076            public BinaryProperty(String url, T type) {
077                    setUrl(url, type);
078            }
079    
080            /**
081             * Creates a binary property.
082             * @param data the binary data
083             * @param type the content type
084             */
085            public BinaryProperty(byte[] data, T type) {
086                    setData(data, type);
087            }
088    
089            /**
090             * Creates a binary property.
091             * @param in an input stream to the binary data (will be closed)
092             * @param type the content type
093             * @throws IOException if there is a problem reading from the input stream
094             */
095            public BinaryProperty(InputStream in, T type) throws IOException {
096                    this(IOUtils.toByteArray(in, true), type);
097            }
098    
099            /**
100             * Creates a binary property.
101             * @param file the file containing the binary data
102             * @param type the content type
103             * @throws IOException if there is a problem reading from the file
104             */
105            public BinaryProperty(File file, T type) throws IOException {
106                    this(new FileInputStream(file), type);
107            }
108    
109            /**
110             * Gets the binary data of the resource.
111             * @return the binary data or null if there is none
112             */
113            public byte[] getData() {
114                    return data;
115            }
116    
117            /**
118             * Sets the binary data of the resource.
119             * @param data the binary data
120             * @param type the content type (e.g. "JPEG image")
121             */
122            public void setData(byte[] data, T type) {
123                    this.url = null;
124                    this.data = data;
125                    setContentType(type);
126            }
127    
128            /**
129             * Gets the URL to the resource
130             * @return the URL or null if there is none
131             */
132            public String getUrl() {
133                    return url;
134            }
135    
136            /**
137             * Sets the URL to the resource.
138             * @param url the URL
139             * @param type the content type (e.g. "JPEG image")
140             */
141            public void setUrl(String url, T type) {
142                    this.url = url;
143                    this.data = null;
144                    setContentType(type);
145            }
146    
147            /**
148             * Gets the content type of the resource.
149             * @return the content type (e.g. "JPEG image")
150             */
151            public T getContentType() {
152                    return contentType;
153            }
154    
155            /**
156             * Sets the content type of the resource.
157             * @param contentType the content type (e.g. "JPEG image")
158             */
159            public void setContentType(T contentType) {
160                    this.contentType = contentType;
161            }
162    
163            /**
164             * Gets the vCard 4.0 TYPE parameter. This should NOT be used to get the
165             * TYPE parameter for 2.1/3.0 vCards. Use {@link #getContentType} instead.
166             * <p>
167             * <b>Supported versions:</b> {@code 4.0}
168             * </p>
169             * @return the TYPE value (typically, this will be either "work" or "home")
170             * or null if it doesn't exist
171             */
172            public String getType() {
173                    return parameters.getType();
174            }
175    
176            /**
177             * Sets the vCard 4.0 TYPE parameter. This should NOT be used to set the
178             * TYPE parameter for 2.1/3.0 vCards. Use {@link #setContentType} instead.
179             * <p>
180             * <b>Supported versions:</b> {@code 4.0}
181             * </p>
182             * @param type the TYPE value (should be either "work" or "home") or null to
183             * remove
184             */
185            public void setType(String type) {
186                    parameters.setType(type);
187            }
188    
189            @Override
190            public List<Integer[]> getPids() {
191                    return super.getPids();
192            }
193    
194            @Override
195            public void addPid(int localId, int clientPidMapRef) {
196                    super.addPid(localId, clientPidMapRef);
197            }
198    
199            @Override
200            public void removePids() {
201                    super.removePids();
202            }
203    
204            @Override
205            public Integer getPref() {
206                    return super.getPref();
207            }
208    
209            @Override
210            public void setPref(Integer pref) {
211                    super.setPref(pref);
212            }
213    
214            //@Override
215            public String getAltId() {
216                    return parameters.getAltId();
217            }
218    
219            //@Override
220            public void setAltId(String altId) {
221                    parameters.setAltId(altId);
222            }
223    
224            @Override
225            protected void _validate(List<Warning> warnings, VCardVersion version, VCard vcard) {
226                    if (url == null && data == null) {
227                            warnings.add(new Warning(8));
228                    }
229            }
230    }