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