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