1d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/* 2d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Copyright (C) 2010 The Android Open Source Project 3d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 4d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * you may not use this file except in compliance with the License. 6d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * You may obtain a copy of the License at 7d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 8d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 10d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * See the License for the specific language governing permissions and 14d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * limitations under the License. 15d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 16d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.voicemail.impl.mail.store.imap; 18d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 19d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.voicemail.impl.VvmLog; 20d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.voicemail.impl.mail.FixedLengthInputStream; 21d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport java.io.ByteArrayInputStream; 22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport java.io.IOException; 23d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport java.io.InputStream; 24d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport java.io.UnsupportedEncodingException; 25d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/** Subclass of {@link ImapString} used for literals backed by an in-memory byte array. */ 27d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpublic class ImapMemoryLiteral extends ImapString { 28d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private final String TAG = "ImapMemoryLiteral"; 29d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private byte[] mData; 30d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 31d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /* package */ ImapMemoryLiteral(FixedLengthInputStream in) throws IOException { 32d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian // We could use ByteArrayOutputStream and IOUtils.copy, but it'd perform an unnecessary 33d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian // copy.... 34d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian mData = new byte[in.getLength()]; 35d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian int pos = 0; 36d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian while (pos < mData.length) { 37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian int read = in.read(mData, pos, mData.length - pos); 38d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (read < 0) { 39d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian break; 40d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 41d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian pos += read; 42d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 43d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (pos != mData.length) { 44d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.w(TAG, "length mismatch"); 45d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 46d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 47d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 48d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 49d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public void destroy() { 50d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian mData = null; 51d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian super.destroy(); 52d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 53d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 54d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 55d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public String getString() { 56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian try { 57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new String(mData, "US-ASCII"); 58d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } catch (UnsupportedEncodingException e) { 59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.e(TAG, "Unsupported encoding: ", e); 60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return null; 62d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 63d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 64d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 65d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public InputStream getAsStream() { 66d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new ByteArrayInputStream(mData); 67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 68d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 69d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public String toString() { 71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return String.format("{%d byte literal(memory)}", mData.length); 72d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian} 74