summaryrefslogtreecommitdiffstats
path: root/core/java/com/trustedlogic/trustednfc/android/P2pTarget.java
blob: b5e00dbe04a5dbfb41164e4295b287753e8b6477 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/*
 * Copyright (C) 2010 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.
 */

/**
 * File            : P2PTarget.java
 * Original-Author : Trusted Logic S.A. (Daniel Tomas)
 */

package com.trustedlogic.trustednfc.android;

import java.io.IOException;

import com.trustedlogic.trustednfc.android.internal.ErrorCodes;

import android.os.RemoteException;
import android.util.Log;

/**
 * P2pTarget represents the target in an NFC-IP1 peer-to-peer communication.
 * 
 * @see P2pInitiator
 * @since AA02.01
 * @hide
 */
public class P2pTarget extends P2pDevice {

    private static final String TAG = "P2pTarget";

	/**
     * The entry point for P2P tag operations.
     * @hide
     */
	private IP2pTarget mService;
	
    /**
     * Flag set when the object is closed and thus not usable any more.
     * @hide
     */
	private boolean isClosed = false;
	
    /**
     * Flag set when the tag is connected.
     * @hide
     */
	private boolean isConnected = false;
	
    /**
     * Check if tag is still opened.
     * 
     * @return data sent by the P2pInitiator.
     * @throws NfcException if accessing a closed target.
     * 
     * @hide          
     */
    public void checkState() throws NfcException {
    	if(isClosed) {
    		throw new NfcException("Tag has been closed.");
    	}
    }

    /**
     * Internal constructor for the P2pTarget class.
     * 
     * @param handle The handle returned by the NFC service and used to identify
     * 				 the tag in subsequent calls.
     * 
     * @hide
     */
    P2pTarget(IP2pTarget service, int handle) {
        this.mService = service;
        this.mHandle = handle;
    }	

    /**
     * Connects to the P2pTarget. This shall be called prior to any other
     * operation on the P2pTarget.
     * 
     * @throws NfcException
     */
    public void connect() throws NfcException {
    	// Check state
    	checkState();
    	if (isConnected) {
    		throw new NfcException("Already connected");
    	}
    	
    	// Perform connect
        try {
            int result = mService.connect(mHandle);
            if (ErrorCodes.isError(result)) {
                if (result == ErrorCodes.ERROR_IO) {
                    throw new NfcException("Failed to connect");
                }
                else {
                    throw NfcManager.convertErrorToNfcException(result);
                }
            }
            isConnected = true;
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in connect(): ", e);
        }
    }

    /**
     * Disconnects from the P2p Target. This must be called so that other
     * targets can be discovered. It restarts the NFC discovery loop.
     * 
     * @throws NFCException
     */
    public void disconnect() throws NfcException {
        checkState();
        try {
            mService.disconnect(mHandle);
            isConnected = true;
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in disconnect(): ", e);
        }
    }

    /**
     * Exchanges raw data with the P2pTarget.
     * 
     * @param data data to be sent to the P2pTarget
     * @return data sent in response by the P2pTarget
     * @throws IOException if the target has been lost or the connection has
     *             been closed.
     * @throws NfcException in case of failure within the stack
     */
    public byte[] transceive(byte[] data) throws IOException, NfcException {
    	// Check state
    	checkState();

    	// Perform transceive
        try {
            byte[] response = mService.transceive(mHandle, data);
            if (response == null) {
                throw new IOException("Transceive failed");
            }
            return response;
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in transceive(): ", e);
            return null;
        }
    }

    /**
     * Get the General bytes of the connected P2P Target
     * 
     * @return general bytes of the connected P2P Target
     * @throws IOException if the target in not in connected state
     */
    public byte[] getGeneralBytes() throws IOException {
        try {
            if(isConnected){
                return mService.getGeneralBytes(mHandle);
            }else{
                throw new IOException("Target not in connected state");
            }
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in getGeneralBytes(): ", e);
            return null;
        }
    }

    @Override
    public int getMode() {
        return P2pDevice.MODE_P2P_TARGET;
    }

}