blob: 80b405a726d9c103f88b2f19c9f3cfca1c66e372 [file] [log] [blame]
/*
* Copyright (C) 2011 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;
/**
* ActiveSync command error status definitions (EAS 14.0 and later); these are in addition to the
* command-specific errors defined for earlier protocol versions
*/
public class CommandStatusException extends EasException {
private static final long serialVersionUID = 1L;
// A status response to an EAS account. Responses < 16 correspond to command-specific errors as
// reported by EAS versions < 14.0; responses > 100 correspond to generic errors as reported
// by EAS versions 14.0 and greater
public final int mStatus;
// If the error refers to a specific data item, that item's id (as provided by the server) is
// stored here
public final String mItemId;
public static class CommandStatus {
private static final long serialVersionUID = 1L;
// Fatal user/provisioning issues (put on security hold)
public static final int USER_DISABLED_FOR_SYNC = 126;
public static final int USERS_DISABLED_FOR_SYNC = 127;
public static final int USER_ON_LEGACY_SERVER_CANT_SYNC = 128;
public static final int DEVICE_QUARANTINED = 129;
public static final int ACCESS_DENIED = 130;
public static final int USER_ACCOUNT_DISABLED = 131;
public static final int NOT_PROVISIONABLE_PARTIAL = 139;
public static final int NOT_PROVISIONABLE_LEGACY_DEVICE = 141;
public static final int TOO_MANY_PARTNERSHIPS = 177;
// Sync state problems (bad key, multiple client conflict, etc.)
public static final int SYNC_STATE_LOCKED = 133;
public static final int SYNC_STATE_CORRUPT = 134;
public static final int SYNC_STATE_EXISTS = 135;
public static final int SYNC_STATE_INVALID = 136;
// Soft provisioning errors, we need to send Provision command
public static final int NEEDS_PROVISIONING_WIPE = 140;
public static final int NEEDS_PROVISIONING = 142;
public static final int NEEDS_PROVISIONING_REFRESH = 143;
public static final int NEEDS_PROVISIONING_INVALID = 144;
// WTF issues (really shouldn't happen in our implementation)
public static final int WTF_INVALID_COMMAND = 137;
public static final int WTF_INVALID_PROTOCOL = 138;
public static final int WTF_DEVICE_CLAIMS_EXTERNAL_MANAGEMENT = 145;
public static final int WTF_UNKNOWN_ITEM_TYPE = 147;
public static final int WTF_REQUIRES_PROXY_WITHOUT_SSL = 148;
// For SmartReply/SmartForward
public static final int ITEM_NOT_FOUND = 150;
// Transient or possibly transient errors
public static final int SERVER_ERROR_RETRY = 111;
public static final int SYNC_STATE_NOT_FOUND = 132;
// String version of error status codes (for logging only)
private static final int STATUS_TEXT_START = 101;
private static final int STATUS_TEXT_END = 150;
private static final String[] STATUS_TEXT = {
"InvalidContent", "InvalidWBXML", "InvalidXML", "InvalidDateTime", "InvalidIDCombo",
"InvalidIDs", "InvalidMIME", "DeviceIdError", "DeviceTypeError", "ServerError",
"ServerErrorRetry", "ADAccessDenied", "Quota", "ServerOffline", "SendQuota",
"RecipientUnresolved", "ReplyNotAllowed", "SentPreviously", "NoRecipient", "SendFailed",
"ReplyFailed", "AttsTooLarge", "NoMailbox", "CantBeAnonymous", "UserNotFound",
"UserDisabled", "NewMailbox", "LegacyMailbox", "DeviceBlocked", "AccessDenied",
"AcctDisabled", "SyncStateNF", "SyncStateLocked", "SyncStateCorrupt", "SyncStateExists",
"SyncStateInvalid", "BadCommand", "BadVersion", "NotFullyProvisionable", "RemoteWipe",
"LegacyDevice", "NotProvisioned", "PolicyRefresh", "BadPolicyKey", "ExternallyManaged",
"NoRecurrence", "UnexpectedClass", "RemoteHasNoSSL", "InvalidRequest", "ItemNotFound"
};
public static boolean isNeedsProvisioning(int status) {
return (status == CommandStatus.NEEDS_PROVISIONING ||
status == CommandStatus.NEEDS_PROVISIONING_REFRESH ||
status == CommandStatus.NEEDS_PROVISIONING_INVALID ||
status == CommandStatus.NEEDS_PROVISIONING_WIPE);
}
public static boolean isBadSyncKey(int status) {
return (status == CommandStatus.SYNC_STATE_CORRUPT ||
status == CommandStatus.SYNC_STATE_INVALID);
}
public static boolean isDeniedAccess(int status) {
return (status == CommandStatus.USER_DISABLED_FOR_SYNC ||
status == CommandStatus.USERS_DISABLED_FOR_SYNC ||
status == CommandStatus.USER_ON_LEGACY_SERVER_CANT_SYNC ||
status == CommandStatus.DEVICE_QUARANTINED ||
status == CommandStatus.ACCESS_DENIED ||
status == CommandStatus.USER_ACCOUNT_DISABLED ||
status == CommandStatus.NOT_PROVISIONABLE_LEGACY_DEVICE ||
status == CommandStatus.NOT_PROVISIONABLE_PARTIAL ||
status == CommandStatus.TOO_MANY_PARTNERSHIPS);
}
public static boolean isTransientError(int status) {
return status == CommandStatus.SYNC_STATE_NOT_FOUND ||
status == CommandStatus.SERVER_ERROR_RETRY;
}
public static String toString(int status) {
StringBuilder sb = new StringBuilder();
sb.append(status);
sb.append(" (");
if (status < STATUS_TEXT_START || status > STATUS_TEXT_END) {
sb.append("unknown");
} else {
int offset = status - STATUS_TEXT_START;
if (offset <= STATUS_TEXT.length) {
sb.append(STATUS_TEXT[offset]);
}
}
sb.append(")");
return sb.toString();
}
}
public CommandStatusException(int status) {
mStatus = status;
mItemId = null;
}
public CommandStatusException(int status, String itemId) {
mStatus = status;
mItemId = itemId;
}
}