1bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen/*
2bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * Copyright (C) 2011, The Android Open Source Project
3bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen *
4bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License");
5bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * you may not use this file except in compliance with the License.
6bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * You may obtain a copy of the License at
7bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen *
8bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen *     http://www.apache.org/licenses/LICENSE-2.0
9bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen *
10bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * Unless required by applicable law or agreed to in writing, software
11bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS,
12bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * See the License for the specific language governing permissions and
14bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * limitations under the License.
15bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen */
16bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
17bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenenpackage android.nfc;
18bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
19bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenenimport android.os.Parcel;
20bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenenimport android.os.Parcelable;
21bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
22faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenenimport java.io.IOException;
23faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen
24bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen/**
25bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * Class used to pipe transceive result from the NFC service.
26bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen *
27bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen * @hide
28bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen */
29bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenenpublic final class TransceiveResult implements Parcelable {
30faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    public static final int RESULT_SUCCESS = 0;
31faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    public static final int RESULT_FAILURE = 1;
32faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    public static final int RESULT_TAGLOST = 2;
33faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    public static final int RESULT_EXCEEDED_LENGTH = 3;
34bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
35faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    final int mResult;
36faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    final byte[] mResponseData;
37bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
38faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    public TransceiveResult(final int result, final byte[] data) {
39faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen        mResult = result;
40faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen        mResponseData = data;
41bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    }
42bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
43faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen    public byte[] getResponseOrThrow() throws IOException {
44faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen        switch (mResult) {
45faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen            case RESULT_SUCCESS:
46faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen                return mResponseData;
47faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen            case RESULT_TAGLOST:
48faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen                throw new TagLostException("Tag was lost.");
49faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen            case RESULT_EXCEEDED_LENGTH:
50faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen                throw new IOException("Transceive length exceeds supported maximum");
51faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen            default:
52faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen                throw new IOException("Transceive failed");
53faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen        }
54bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    }
55bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
56bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    @Override
57bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    public int describeContents() {
58bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        return 0;
59bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    }
60bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
61bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    @Override
62bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    public void writeToParcel(Parcel dest, int flags) {
63faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen        dest.writeInt(mResult);
64faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen        if (mResult == RESULT_SUCCESS) {
65bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen            dest.writeInt(mResponseData.length);
66bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen            dest.writeByteArray(mResponseData);
67bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        }
68bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    }
69bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
70bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    public static final Parcelable.Creator<TransceiveResult> CREATOR =
71bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen            new Parcelable.Creator<TransceiveResult>() {
72bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        @Override
73bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        public TransceiveResult createFromParcel(Parcel in) {
74faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen            int result = in.readInt();
75bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen            byte[] responseData;
76bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
77faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen            if (result == RESULT_SUCCESS) {
78bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen                int responseLength = in.readInt();
79bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen                responseData = new byte[responseLength];
80bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen                in.readByteArray(responseData);
81bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen            } else {
82bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen                responseData = null;
83bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen            }
84faca12adc62d148505fadfd286e6a2752c197fa0Martijn Coenen            return new TransceiveResult(result, responseData);
85bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        }
86bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
87bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        @Override
88bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        public TransceiveResult[] newArray(int size) {
89bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen            return new TransceiveResult[size];
90bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen        }
91bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen    };
92bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen
93bf34061bb4af12aa9efaab653ae413f2bce4a240Martijn Coenen}
94