1d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/*
2d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Copyright (C) 2015 The Android Open Source Project
3d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
4d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * you may not use this file except in compliance with the License.
6d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * You may obtain a copy of the License at
7d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
8d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
10d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * See the License for the specific language governing permissions and
14d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * limitations under the License.
15d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */
16d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.voicemail.impl.mail;
18d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
19d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/**
20d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * This exception is used for most types of failures that occur during server interactions.
21d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * <p>Data passed through this exception should be considered non-localized. Any strings should
23d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * either be internal-only (for debugging) or server-generated.
24d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
25d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * <p>TO DO: Does it make sense to further collapse AuthenticationFailedException and
26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * CertificateValidationException and any others into this?
27d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */
28d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpublic class MessagingException extends Exception {
29d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final long serialVersionUID = -1;
30d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
31d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int NO_ERROR = -1;
32d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Any exception that does not specify a specific issue */
33d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int UNSPECIFIED_EXCEPTION = 0;
34d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Connection or IO errors */
35d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int IOERROR = 1;
36d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The configuration requested TLS but the server did not support it. */
37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int TLS_REQUIRED = 2;
38d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Authentication is required but the server did not support it. */
39d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int AUTH_REQUIRED = 3;
40d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** General security failures */
41d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int GENERAL_SECURITY = 4;
42d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Authentication failed */
43d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int AUTHENTICATION_FAILED = 5;
44d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Attempt to create duplicate account */
45d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int DUPLICATE_ACCOUNT = 6;
46d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Required security policies reported - advisory only */
47d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int SECURITY_POLICIES_REQUIRED = 7;
48d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Required security policies not supported */
49d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int SECURITY_POLICIES_UNSUPPORTED = 8;
50d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The protocol (or protocol version) isn't supported */
51d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int PROTOCOL_VERSION_UNSUPPORTED = 9;
52d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The server's SSL certificate couldn't be validated */
53d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int CERTIFICATE_VALIDATION_ERROR = 10;
54d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Authentication failed during autodiscover */
55d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int AUTODISCOVER_AUTHENTICATION_FAILED = 11;
56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Autodiscover completed with a result (non-error) */
57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int AUTODISCOVER_AUTHENTICATION_RESULT = 12;
58d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Ambiguous failure; server error or bad credentials */
59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int AUTHENTICATION_FAILED_OR_SERVER_ERROR = 13;
60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The server refused access */
61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int ACCESS_DENIED = 14;
62d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The server refused access */
63d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int ATTACHMENT_NOT_FOUND = 15;
64d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** A client SSL certificate is required for connections to the server */
65d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int CLIENT_CERTIFICATE_REQUIRED = 16;
66d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The client SSL certificate specified is invalid */
67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int CLIENT_CERTIFICATE_ERROR = 17;
68d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The server indicates it does not support OAuth authentication */
69d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int OAUTH_NOT_SUPPORTED = 18;
70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The server indicates it experienced an internal error */
71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final int SERVER_ERROR = 19;
72d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  protected int mExceptionType;
74d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  // Exception type-specific data
75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  protected Object mExceptionData;
76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
77d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public MessagingException(String message, Throwable throwable) {
78d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    this(UNSPECIFIED_EXCEPTION, message, throwable);
79d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
80d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
81d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public MessagingException(int exceptionType, String message, Throwable throwable) {
82d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    super(message, throwable);
83d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mExceptionType = exceptionType;
84d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mExceptionData = null;
85d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
86d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
87d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
88d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Constructs a MessagingException with an exceptionType and a null message.
89d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
90d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @param exceptionType The exception type to set for this exception.
91d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
92d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public MessagingException(int exceptionType) {
93d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    this(exceptionType, null, null);
94d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
95d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
96d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
97d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Constructs a MessagingException with a message.
98d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
99d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @param message the message for this exception
100d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
101d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public MessagingException(String message) {
102d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    this(UNSPECIFIED_EXCEPTION, message, null);
103d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
104d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
105d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
106d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Constructs a MessagingException with an exceptionType and a message.
107d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
108d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @param exceptionType The exception type to set for this exception.
109d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
110d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public MessagingException(int exceptionType, String message) {
111d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    this(exceptionType, message, null);
112d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
113d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
114d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
115d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Constructs a MessagingException with an exceptionType, a message, and data
116d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
117d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @param exceptionType The exception type to set for this exception.
118d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @param message the message for the exception (or null)
119d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @param data exception-type specific data for the exception (or null)
120d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
121d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public MessagingException(int exceptionType, String message, Object data) {
122d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    super(message);
123d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mExceptionType = exceptionType;
124d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mExceptionData = data;
125d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
126d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
127d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
128d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Return the exception type. Will be OTHER_EXCEPTION if not explicitly set.
129d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
130d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @return Returns the exception type.
131d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
132d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public int getExceptionType() {
133d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mExceptionType;
134d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
135d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
136d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Return the exception data. Will be null if not explicitly set.
137d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
138d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * @return Returns the exception data.
139d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
140d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public Object getExceptionData() {
141d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mExceptionData;
142d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
143d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian}
144