4 * Copyright (C) 2014 Jakob Wenzel
7 * Jakob Wenzel <jakobwenzel92@gmail.com>
9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 package de.dhbwloe.campusapp.nfcreader.cardreader;
25 import android.os.Bundle;
27 import java.io.ByteArrayInputStream;
28 import java.io.ByteArrayOutputStream;
29 import java.io.IOException;
30 import java.io.ObjectInputStream;
31 import java.io.ObjectOutput;
32 import java.io.ObjectOutputStream;
33 import java.io.Serializable;
34 import java.util.ArrayList;
35 import java.util.Date;
39 * Stores Data read from a card
41 public class NfcCardData implements Serializable {
42 final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
43 public static String bytesToHex(byte[] bytes) {
44 char[] hexChars = new char[bytes.length * 3];
45 for ( int j = 0; j < bytes.length; j++ ) {
46 int v = bytes[j] & 0xFF;
47 hexChars[j * 3] = hexArray[v >>> 4];
48 hexChars[j * 3 + 1] = hexArray[v & 0x0F];
49 hexChars[j * 3 + 2] = ' ';
51 return new String(hexChars);
55 private class NfcCardPlainData {
61 private class NfcCardNamedData {
66 private ArrayList<NfcCardPlainData> plainDataRecords = new ArrayList<NfcCardPlainData>();
67 private ArrayList<NfcCardNamedData> namedDataRecords = new ArrayList<NfcCardNamedData>();
68 private int iUniqueCardId;
69 private long iUpdateTime;
71 public NfcCardData() {
72 iUpdateTime = (new Date()).getTime()/1000;
75 public NfcCardData(long updatetime) {
76 iUpdateTime = updatetime;
79 public void appendPlainData(int appid, int fileid, Bundle bundle) {
80 NfcCardPlainData plaindata = new NfcCardPlainData();
81 plaindata.appid = appid;
82 plaindata.fileid = fileid;
83 plaindata.bundle = bundle;
84 plainDataRecords.add(plaindata);
87 public void appendNamedData(String name, byte[] data) {
88 NfcCardNamedData dataobj = new NfcCardNamedData();
91 namedDataRecords.add(dataobj);
94 public byte[] intToBytes(int my_int) throws IOException {
95 ByteArrayOutputStream bos = new ByteArrayOutputStream();
96 ObjectOutput out = new ObjectOutputStream(bos);
99 byte[] int_bytes = bos.toByteArray();
104 private int bytesToInt(byte[] int_bytes) throws IOException {
105 ByteArrayInputStream bis = new ByteArrayInputStream(int_bytes);
106 ObjectInputStream ois = new ObjectInputStream(bis);
107 int my_int = ois.readInt();
112 private NfcCardPlainData getPlainData(int appId, int fileId) {
113 for(NfcCardPlainData data : plainDataRecords) {
114 if(data.appid == appId && data.fileid == fileId)
120 private NfcCardNamedData getNamedDataRecord(String name) {
121 for(NfcCardNamedData data : namedDataRecords) {
122 if(data.name.equalsIgnoreCase(name))
128 public double getBalanceData() {
129 int balancePlain = 0;
130 NfcCardNamedData dataobj;
131 if((dataobj = getNamedDataRecord("balance")) != null) {
133 balancePlain = bytesToInt(dataobj.data);
134 } catch (Exception e) {}
136 NfcCardPlainData data = getPlainData(0x5F8415, 1);
138 balancePlain = data.bundle.getInt("data");
141 return balancePlain / 1000.0;
144 public double getLastTransaction() {
145 int balancePlain = 0;
146 NfcCardNamedData dataobj;
147 if((dataobj = getNamedDataRecord("transaction")) != null) {
149 balancePlain = bytesToInt(dataobj.data);
150 } catch (Exception e) {}
152 NfcCardPlainData data = getPlainData(0x5F8415, 1);
153 balancePlain = data.bundle.getInt("value");
155 return balancePlain / 1000.0;
158 public String getCardDataSummary() {
159 StringBuilder summary = new StringBuilder();
160 for(NfcCardPlainData data : plainDataRecords) {
161 summary.append("App: "+data.appid+" File: "+data.fileid+"\n");
162 Bundle bnd = data.bundle;
163 if(bnd.containsKey("type"))
164 summary.append("Type: "+bnd.getString("type")+"\n");
165 if(bnd.containsKey("value"))
166 summary.append("Value: "+bnd.getInt("value")+" (Min: "+bnd.getInt("min")+" Max: "+bnd.getInt("max")+" Limited: "+bnd.getByte("limited")+")\n");
167 if(bnd.containsKey("records"))
168 summary.append("Records: "+bnd.getInt("records")+" (Size: "+bnd.getInt("size")+" Max: "+bnd.getInt("max")+")\n");
169 else if(bnd.containsKey("size"))
170 summary.append("Size: "+bnd.getInt("size")+"\n");
172 if(bnd.containsKey("data"))
173 summary.append("Data: "+bnd.getInt("data")+"\n");
174 if(bnd.containsKey("file"))
175 summary.append("File: "+bytesToHex(bnd.getByteArray("file"))+"\n");
176 if(bnd.containsKey("record"))
177 summary.append("Record: "+bytesToHex(bnd.getByteArray("record"))+"\n");
179 return summary.toString();
182 public String getCompactCardDataSummary() {
183 StringBuilder summary = new StringBuilder();
184 for(NfcCardPlainData data : plainDataRecords) {
185 summary.append("{"+data.appid+", "+data.fileid);
186 Bundle bnd = data.bundle;
187 summary.append("} ");
189 if(bnd.containsKey("value"))
190 summary.append("[VAL "+bnd.getInt("value")+", >"+bnd.getInt("min")+", <"+bnd.getInt("max")+"] ");
191 if(bnd.containsKey("records"))
192 summary.append("[REC "+bnd.getInt("records")+", #"+bnd.getInt("size")+", <"+bnd.getInt("max")+"] ");
193 else if(bnd.containsKey("size"))
194 summary.append("[STD "+bnd.getInt("size")+"] ");
196 if(bnd.containsKey("data"))
197 summary.append(bnd.getInt("data") + " ");
198 if(bnd.containsKey("file"))
199 summary.append(bytesToHex(bnd.getByteArray("file")) + " ");
200 if(bnd.containsKey("record"))
201 summary.append(bytesToHex(bnd.getByteArray("record")) + " ");
202 summary.append("\n");
204 return summary.toString();
207 public void setUniqueId(int uid) {
211 public int getUniqueid() {
212 return iUniqueCardId;