001/* 002 * The MIT License 003 * Copyright (c) 2012 Microsoft Corporation 004 * 005 * Permission is hereby granted, free of charge, to any person obtaining a copy 006 * of this software and associated documentation files (the "Software"), to deal 007 * in the Software without restriction, including without limitation the rights 008 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 009 * copies of the Software, and to permit persons to whom the Software is 010 * furnished to do so, subject to the following conditions: 011 * 012 * The above copyright notice and this permission notice shall be included in 013 * all copies or substantial portions of the Software. 014 * 015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 018 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 020 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 021 * THE SOFTWARE. 022 */ 023 024package microsoft.exchange.webservices.data.property.complex; 025 026import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; 027import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter; 028import microsoft.exchange.webservices.data.core.XmlAttributeNames; 029import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlDeserializationException; 030import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException; 031import org.apache.commons.codec.binary.Base64; 032 033import javax.xml.stream.XMLStreamException; 034 035/** 036 * Represents the MIME content of an item. 037 */ 038public final class MimeContent extends ComplexProperty { 039 040 /** 041 * The character set. 042 */ 043 private String characterSet; 044 045 /** 046 * The content. 047 */ 048 private byte[] content; 049 050 /** 051 * Initializes a new instance of the class. 052 */ 053 public MimeContent() { 054 } 055 056 /** 057 * Initializes a new instance of the class. 058 * 059 * @param characterSet the character set 060 * @param content the content 061 */ 062 public MimeContent(String characterSet, byte[] content) { 063 this(); 064 this.characterSet = characterSet; 065 this.content = content; 066 } 067 068 /** 069 * Reads attribute from XML. 070 * 071 * @param reader the reader 072 * @throws Exception the exception 073 */ 074 @Override 075 public void readAttributesFromXml(EwsServiceXmlReader reader) 076 throws Exception { 077 this.characterSet = reader.readAttributeValue(String.class, 078 XmlAttributeNames.CharacterSet); 079 } 080 081 /** 082 * Reads text value from XML. 083 * 084 * @param reader the reader 085 * @throws XMLStreamException the XML stream exception 086 * @throws ServiceXmlDeserializationException the service xml deserialization exception 087 */ 088 @Override 089 public void readTextValueFromXml(EwsServiceXmlReader reader) 090 throws XMLStreamException, ServiceXmlDeserializationException { 091 this.content = Base64.decodeBase64(reader.readValue()); 092 } 093 094 /** 095 * Writes attribute to XML. 096 * 097 * @param writer the writer 098 * @throws ServiceXmlSerializationException the service xml serialization exception 099 */ 100 @Override 101 public void writeAttributesToXml(EwsServiceXmlWriter writer) 102 throws ServiceXmlSerializationException { 103 writer.writeAttributeValue(XmlAttributeNames.CharacterSet, 104 this.characterSet); 105 } 106 107 /** 108 * Writes elements to XML. 109 * 110 * @param writer the writer 111 * @throws XMLStreamException the XML stream exception 112 */ 113 public void writeElementsToXml(EwsServiceXmlWriter writer) 114 throws XMLStreamException { 115 if (this.content != null && this.content.length > 0) { 116 writer.writeBase64ElementValue(this.content); 117 } 118 } 119 120 /** 121 * Gets the character set of the content. 122 * 123 * @return the character set 124 */ 125 public String getCharacterSet() { 126 return this.characterSet; 127 } 128 129 /** 130 * Sets the character set. 131 * 132 * @param characterSet the new character set 133 */ 134 public void setCharacterSet(String characterSet) { 135 this.canSetFieldValue(this.characterSet, characterSet); 136 } 137 138 /** 139 * Gets the character set of the content. 140 * 141 * @return the content 142 */ 143 public byte[] getContent() { 144 return this.content; 145 } 146 147 /** 148 * Sets the content. 149 * 150 * @param content the new content 151 */ 152 public void setContent(byte[] content) { 153 this.canSetFieldValue(this.content, content); 154 } 155 156 /** 157 * Writes attribute to XML. 158 * 159 * @return the string 160 */ 161 @Override 162 public String toString() { 163 if (this.getContent() == null) { 164 return ""; 165 } else { 166 try { 167 168 // Try to convert to original MIME content using specified 169 // charset. If this fails, 170 // return the Base64 representation of the content. 171 // Note: Encoding.GetString can throw DecoderFallbackException 172 // which is a subclass 173 // of ArgumentException. 174 String charSet = (this.getCharacterSet() == null || 175 this.getCharacterSet().isEmpty()) ? 176 "UTF-8" : this.getCharacterSet(); 177 return new String(this.getContent(), charSet); 178 } catch (Exception e) { 179 return Base64.encodeBase64String(this.getContent()); 180 } 181 } 182 } 183 184}