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