1/* Copyright (C) 2011 The Android Open Source Project.
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *      http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16package com.android.exchange.adapter;
17
18import java.io.IOException;
19import java.io.InputStream;
20import java.io.OutputStream;
21
22/**
23 * Parse the result of an ItemOperations command; we use this to load attachments in EAS 14.0
24 */
25public class ItemOperationsParser extends Parser {
26    private final AttachmentLoader mAttachmentLoader;
27    private int mStatusCode = 0;
28    private final OutputStream mAttachmentOutputStream;
29    private final int mAttachmentSize;
30
31    public ItemOperationsParser(AttachmentLoader loader, InputStream in, OutputStream out, int size)
32            throws IOException {
33        super(in);
34        mAttachmentLoader = loader;
35        mAttachmentOutputStream = out;
36        mAttachmentSize = size;
37    }
38
39    public int getStatusCode() {
40        return mStatusCode;
41    }
42
43    private void parseProperties() throws IOException {
44        while (nextTag(Tags.ITEMS_PROPERTIES) != END) {
45            if (tag == Tags.ITEMS_DATA) {
46                // Wrap the input stream in our custom base64 input stream
47                Base64InputStream bis = new Base64InputStream(getInput());
48                // Read the attachment
49                mAttachmentLoader.readChunked(bis, mAttachmentOutputStream, mAttachmentSize);
50            } else {
51                skipTag();
52            }
53        }
54    }
55
56    private void parseFetch() throws IOException {
57        while (nextTag(Tags.ITEMS_FETCH) != END) {
58            if (tag == Tags.ITEMS_PROPERTIES) {
59                parseProperties();
60            } else {
61                skipTag();
62            }
63        }
64    }
65
66    private void parseResponse() throws IOException {
67        while (nextTag(Tags.ITEMS_RESPONSE) != END) {
68            if (tag == Tags.ITEMS_FETCH) {
69                parseFetch();
70            } else {
71                skipTag();
72            }
73        }
74    }
75
76    @Override
77    public boolean parse() throws IOException {
78        boolean res = false;
79        if (nextTag(START_DOCUMENT) != Tags.ITEMS_ITEMS) {
80            throw new IOException();
81        }
82        while (nextTag(START_DOCUMENT) != END_DOCUMENT) {
83            if (tag == Tags.ITEMS_STATUS) {
84                // Save the status code
85                mStatusCode = getValueInt();
86            } else if (tag == Tags.ITEMS_RESPONSE) {
87                parseResponse();
88            } else {
89                skipTag();
90            }
91        }
92        return res;
93    }
94}
95