15c523858385176c33a7456bb84035de78552d22dMarc Blank/* 25c523858385176c33a7456bb84035de78552d22dMarc Blank * Copyright (C) 2010 The Android Open Source Project 35c523858385176c33a7456bb84035de78552d22dMarc Blank * 45c523858385176c33a7456bb84035de78552d22dMarc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 55c523858385176c33a7456bb84035de78552d22dMarc Blank * you may not use this file except in compliance with the License. 65c523858385176c33a7456bb84035de78552d22dMarc Blank * You may obtain a copy of the License at 75c523858385176c33a7456bb84035de78552d22dMarc Blank * 85c523858385176c33a7456bb84035de78552d22dMarc Blank * http://www.apache.org/licenses/LICENSE-2.0 95c523858385176c33a7456bb84035de78552d22dMarc Blank * 105c523858385176c33a7456bb84035de78552d22dMarc Blank * Unless required by applicable law or agreed to in writing, software 115c523858385176c33a7456bb84035de78552d22dMarc Blank * distributed under the License is distributed on an "AS IS" BASIS, 125c523858385176c33a7456bb84035de78552d22dMarc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c523858385176c33a7456bb84035de78552d22dMarc Blank * See the License for the specific language governing permissions and 145c523858385176c33a7456bb84035de78552d22dMarc Blank * limitations under the License. 155c523858385176c33a7456bb84035de78552d22dMarc Blank */ 165c523858385176c33a7456bb84035de78552d22dMarc Blank 175c523858385176c33a7456bb84035de78552d22dMarc Blankpackage com.android.email.mail.store.imap; 185c523858385176c33a7456bb84035de78552d22dMarc Blank 195c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.email.FixedLengthInputStream; 205c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.Logging; 215c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.utility.Utility; 22560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedyimport com.android.mail.utils.LogUtils; 235c523858385176c33a7456bb84035de78552d22dMarc Blank 245c523858385176c33a7456bb84035de78552d22dMarc Blankimport java.io.ByteArrayInputStream; 255c523858385176c33a7456bb84035de78552d22dMarc Blankimport java.io.IOException; 265c523858385176c33a7456bb84035de78552d22dMarc Blankimport java.io.InputStream; 275c523858385176c33a7456bb84035de78552d22dMarc Blank 285c523858385176c33a7456bb84035de78552d22dMarc Blank/** 295c523858385176c33a7456bb84035de78552d22dMarc Blank * Subclass of {@link ImapString} used for literals backed by an in-memory byte array. 305c523858385176c33a7456bb84035de78552d22dMarc Blank */ 315c523858385176c33a7456bb84035de78552d22dMarc Blankpublic class ImapMemoryLiteral extends ImapString { 325c523858385176c33a7456bb84035de78552d22dMarc Blank private byte[] mData; 335c523858385176c33a7456bb84035de78552d22dMarc Blank 345c523858385176c33a7456bb84035de78552d22dMarc Blank /* package */ ImapMemoryLiteral(FixedLengthInputStream in) throws IOException { 355c523858385176c33a7456bb84035de78552d22dMarc Blank // We could use ByteArrayOutputStream and IOUtils.copy, but it'd perform an unnecessary 365c523858385176c33a7456bb84035de78552d22dMarc Blank // copy.... 375c523858385176c33a7456bb84035de78552d22dMarc Blank mData = new byte[in.getLength()]; 385c523858385176c33a7456bb84035de78552d22dMarc Blank int pos = 0; 395c523858385176c33a7456bb84035de78552d22dMarc Blank while (pos < mData.length) { 405c523858385176c33a7456bb84035de78552d22dMarc Blank int read = in.read(mData, pos, mData.length - pos); 415c523858385176c33a7456bb84035de78552d22dMarc Blank if (read < 0) { 425c523858385176c33a7456bb84035de78552d22dMarc Blank break; 435c523858385176c33a7456bb84035de78552d22dMarc Blank } 445c523858385176c33a7456bb84035de78552d22dMarc Blank pos += read; 455c523858385176c33a7456bb84035de78552d22dMarc Blank } 465c523858385176c33a7456bb84035de78552d22dMarc Blank if (pos != mData.length) { 47560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(Logging.LOG_TAG, ""); 485c523858385176c33a7456bb84035de78552d22dMarc Blank } 495c523858385176c33a7456bb84035de78552d22dMarc Blank } 505c523858385176c33a7456bb84035de78552d22dMarc Blank 515c523858385176c33a7456bb84035de78552d22dMarc Blank @Override 525c523858385176c33a7456bb84035de78552d22dMarc Blank public void destroy() { 535c523858385176c33a7456bb84035de78552d22dMarc Blank mData = null; 545c523858385176c33a7456bb84035de78552d22dMarc Blank super.destroy(); 555c523858385176c33a7456bb84035de78552d22dMarc Blank } 565c523858385176c33a7456bb84035de78552d22dMarc Blank 575c523858385176c33a7456bb84035de78552d22dMarc Blank @Override 585c523858385176c33a7456bb84035de78552d22dMarc Blank public String getString() { 595c523858385176c33a7456bb84035de78552d22dMarc Blank return Utility.fromAscii(mData); 605c523858385176c33a7456bb84035de78552d22dMarc Blank } 615c523858385176c33a7456bb84035de78552d22dMarc Blank 625c523858385176c33a7456bb84035de78552d22dMarc Blank @Override 635c523858385176c33a7456bb84035de78552d22dMarc Blank public InputStream getAsStream() { 645c523858385176c33a7456bb84035de78552d22dMarc Blank return new ByteArrayInputStream(mData); 655c523858385176c33a7456bb84035de78552d22dMarc Blank } 665c523858385176c33a7456bb84035de78552d22dMarc Blank 675c523858385176c33a7456bb84035de78552d22dMarc Blank @Override 685c523858385176c33a7456bb84035de78552d22dMarc Blank public String toString() { 695c523858385176c33a7456bb84035de78552d22dMarc Blank return String.format("{%d byte literal(memory)}", mData.length); 705c523858385176c33a7456bb84035de78552d22dMarc Blank } 715c523858385176c33a7456bb84035de78552d22dMarc Blank} 72