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}