1d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/* Copyright (C) 2008-2009 Marc Blank
2d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Licensed to The Android Open Source Project.
3d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
4d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Licensed under the Apache License, Version 2.0 (the "License");
5d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * you may not use this file except in compliance with the License.
6d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * You may obtain a copy of the License at
7d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
8d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *      http://www.apache.org/licenses/LICENSE-2.0
9d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
10d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Unless required by applicable law or agreed to in writing, software
11d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * distributed under the License is distributed on an "AS IS" BASIS,
12d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * See the License for the specific language governing permissions and
14d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * limitations under the License.
15d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
16d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
17d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpackage com.android.exchange.adapter;
18d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
19d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.exchange.EasSyncService;
20d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.exchange.IllegalHeartbeatException;
21d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.exchange.StaleFolderListException;
22d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
23d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport java.io.IOException;
24d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport java.io.InputStream;
25d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport java.util.ArrayList;
26d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
27d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/**
28d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Parse the result of a Ping command.
29d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
30d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * If there are folders with changes, add the serverId of those folders to the syncList array.
31d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * If the folder list needs to be reloaded, throw a StaleFolderListException, which will be caught
32d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * by the sync server, which will sync the updated folder list.
33d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
34d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpublic class PingParser extends Parser {
35d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private ArrayList<String> syncList = new ArrayList<String>();
36d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private EasSyncService mService;
37d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private int mSyncStatus = 0;
38d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
39d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public ArrayList<String> getSyncList() {
40d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        return syncList;
41d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
42d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
43d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public int getSyncStatus() {
44d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        return mSyncStatus;
45d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
46d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
47d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public PingParser(InputStream in, EasSyncService service) throws IOException {
48d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        super(in);
49d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        mService = service;
50d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
51d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
52d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public void parsePingFolders(ArrayList<String> syncList) throws IOException {
53d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        while (nextTag(Tags.PING_FOLDERS) != END) {
54d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            if (tag == Tags.PING_FOLDER) {
55d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                // Here we'll keep track of which mailboxes need syncing
56d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                String serverId = getValue();
57d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                syncList.add(serverId);
58d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                mService.userLog("Changes found in: ", serverId);
59d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            } else {
60d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                skipTag();
61d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
62d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
63d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
64d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
65d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    @Override
66d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public boolean parse() throws IOException, StaleFolderListException, IllegalHeartbeatException {
67d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        boolean res = false;
68d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        if (nextTag(START_DOCUMENT) != Tags.PING_PING) {
69d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            throw new IOException();
70d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
71d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        while (nextTag(START_DOCUMENT) != END_DOCUMENT) {
72d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            if (tag == Tags.PING_STATUS) {
73d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                int status = getValueInt();
74d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                mSyncStatus = status;
75d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                mService.userLog("Ping completed, status = ", status);
76d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                if (status == 2) {
77d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    res = true;
78d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                } else if (status == 7 || status == 4) {
79d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    // Status of 7 or 4 indicate a stale folder list
80d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    throw new StaleFolderListException();
81d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                } else if (status == 5) {
82d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    // Status 5 means our heartbeat is beyond allowable limits
83d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                    // In this case, there will be a heartbeat interval set
84d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                }
85d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            } else if (tag == Tags.PING_FOLDERS) {
86d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                parsePingFolders(syncList);
87d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            } else if (tag == Tags.PING_HEARTBEAT_INTERVAL) {
88d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                // Throw an exception, saving away the legal heartbeat interval specified
89d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                throw new IllegalHeartbeatException(getValueInt());
90d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            } else {
91d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                skipTag();
92d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
93d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
94d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        return res;
95d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
96d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank}
97d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
98