/* Copyright (C) 2008-2009 Marc Blank * Licensed to The Android Open Source Project. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.exchange.adapter; import com.android.exchange.EasSyncService; import com.android.exchange.IllegalHeartbeatException; import com.android.exchange.StaleFolderListException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; /** * Parse the result of a Ping command. * * If there are folders with changes, add the serverId of those folders to the syncList array. * If the folder list needs to be reloaded, throw a StaleFolderListException, which will be caught * by the sync server, which will sync the updated folder list. */ public class PingParser extends Parser { private ArrayList<String> syncList = new ArrayList<String>(); private EasSyncService mService; private int mSyncStatus = 0; public ArrayList<String> getSyncList() { return syncList; } public int getSyncStatus() { return mSyncStatus; } public PingParser(InputStream in, EasSyncService service) throws IOException { super(in); mService = service; } public void parsePingFolders(ArrayList<String> syncList) throws IOException { while (nextTag(Tags.PING_FOLDERS) != END) { if (tag == Tags.PING_FOLDER) { // Here we'll keep track of which mailboxes need syncing String serverId = getValue(); syncList.add(serverId); mService.userLog("Changes found in: ", serverId); } else { skipTag(); } } } @Override public boolean parse() throws IOException, StaleFolderListException, IllegalHeartbeatException { boolean res = false; if (nextTag(START_DOCUMENT) != Tags.PING_PING) { throw new IOException(); } while (nextTag(START_DOCUMENT) != END_DOCUMENT) { if (tag == Tags.PING_STATUS) { int status = getValueInt(); mSyncStatus = status; mService.userLog("Ping completed, status = ", status); if (status == 2) { res = true; } else if (status == 7 || status == 4) { // Status of 7 or 4 indicate a stale folder list throw new StaleFolderListException(); } else if (status == 5) { // Status 5 means our heartbeat is beyond allowable limits // In this case, there will be a heartbeat interval set } } else if (tag == Tags.PING_FOLDERS) { parsePingFolders(syncList); } else if (tag == Tags.PING_HEARTBEAT_INTERVAL) { // Throw an exception, saving away the legal heartbeat interval specified throw new IllegalHeartbeatException(getValueInt()); } else { skipTag(); } } return res; } }