diff options
| -rw-r--r-- | core/java/android/os/Parcel.java | 12 | ||||
| -rw-r--r-- | core/java/android/os/ServiceSpecificException.java | 39 |
2 files changed, 51 insertions, 0 deletions
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 1e879f2edca1..5d6b8aa323c7 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -231,6 +231,7 @@ public final class Parcel { private static final int VAL_SIZEF = 27; // The initial int32 in a Binder call's reply Parcel header: + // Keep these in sync with libbinder's binder/Status.h. private static final int EX_SECURITY = -1; private static final int EX_BAD_PARCELABLE = -2; private static final int EX_ILLEGAL_ARGUMENT = -3; @@ -238,7 +239,11 @@ public final class Parcel { private static final int EX_ILLEGAL_STATE = -5; private static final int EX_NETWORK_MAIN_THREAD = -6; private static final int EX_UNSUPPORTED_OPERATION = -7; + private static final int EX_SERVICE_SPECIFIC = -8; private static final int EX_HAS_REPLY_HEADER = -128; // special; see below + // EX_TRANSACTION_FAILED is used exclusively in native code. + // see libbinder's binder/Status.h + private static final int EX_TRANSACTION_FAILED = -129; private static native int nativeDataSize(long nativePtr); private static native int nativeDataAvail(long nativePtr); @@ -1515,6 +1520,8 @@ public final class Parcel { code = EX_NETWORK_MAIN_THREAD; } else if (e instanceof UnsupportedOperationException) { code = EX_UNSUPPORTED_OPERATION; + } else if (e instanceof ServiceSpecificException) { + code = EX_SERVICE_SPECIFIC; } writeInt(code); StrictMode.clearGatheredViolations(); @@ -1525,6 +1532,9 @@ public final class Parcel { throw new RuntimeException(e); } writeString(e.getMessage()); + if (e instanceof ServiceSpecificException) { + writeInt(((ServiceSpecificException)e).errorCode); + } } /** @@ -1635,6 +1645,8 @@ public final class Parcel { throw new NetworkOnMainThreadException(); case EX_UNSUPPORTED_OPERATION: throw new UnsupportedOperationException(msg); + case EX_SERVICE_SPECIFIC: + throw new ServiceSpecificException(readInt(), msg); } throw new RuntimeException("Unknown exception code: " + code + " msg " + msg); diff --git a/core/java/android/os/ServiceSpecificException.java b/core/java/android/os/ServiceSpecificException.java new file mode 100644 index 000000000000..20f237a58ae1 --- /dev/null +++ b/core/java/android/os/ServiceSpecificException.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2015 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 android.os; + +/** + * An exception specific to a service. + * + * <p>This exception includes an error code specific to the throwing + * service. This is mostly used by system services to indicate + * domain specific error conditions. + * + * @hide + */ +public class ServiceSpecificException extends RuntimeException { + public final int errorCode; + + ServiceSpecificException(int errorCode, String message) { + super(message); + this.errorCode = errorCode; + } + + ServiceSpecificException(int errorCode) { + this.errorCode = errorCode; + } +} + |