Grundaufbau der App
[DHBWCampusApp.git] / app / src / main / java / de / dhbwloe / campusapp / nfcreader / cardreader / NfcCardData.java
1 /*
2  * ValueData.java
3  *
4  * Copyright (C) 2014 Jakob Wenzel
5  *
6  * Authors:
7  * Jakob Wenzel <jakobwenzel92@gmail.com>
8  *
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.
13  *
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.
18  *
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/>.
21  */
22
23 package de.dhbwloe.campusapp.nfcreader.cardreader;
24
25 import android.os.Bundle;
26
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;
36 import java.util.Map;
37
38 /**
39  * Stores Data read from a card
40  */
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] = ' ';
50                 }
51                 return new String(hexChars);
52         }
53
54
55         private class NfcCardPlainData {
56                 int appid;
57                 int fileid;
58
59                 Bundle bundle;
60         };
61         private class NfcCardNamedData {
62                 String name;
63                 byte[] data;
64         }
65
66         private ArrayList<NfcCardPlainData> plainDataRecords = new ArrayList<NfcCardPlainData>();
67         private ArrayList<NfcCardNamedData> namedDataRecords = new ArrayList<NfcCardNamedData>();
68         private int iUniqueCardId;
69         private long iUpdateTime;
70
71         public NfcCardData() {
72                 iUpdateTime = (new Date()).getTime()/1000;
73         }
74
75         public NfcCardData(long updatetime) {
76                 iUpdateTime = updatetime;
77         }
78
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);
85         }
86
87         public void appendNamedData(String name, byte[] data) {
88                 NfcCardNamedData dataobj = new NfcCardNamedData();
89                 dataobj.name = name;
90                 dataobj.data = data;
91                 namedDataRecords.add(dataobj);
92         }
93
94         public byte[] intToBytes(int my_int) throws IOException {
95                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
96                 ObjectOutput out = new ObjectOutputStream(bos);
97                 out.writeInt(my_int);
98                 out.close();
99                 byte[] int_bytes = bos.toByteArray();
100                 bos.close();
101                 return int_bytes;
102         }
103
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();
108                 ois.close();
109                 return my_int;
110         }
111
112         private NfcCardPlainData getPlainData(int appId, int fileId) {
113                 for(NfcCardPlainData data : plainDataRecords) {
114                         if(data.appid == appId && data.fileid == fileId)
115                                 return data;
116                 }
117                 return null;
118         }
119
120         private NfcCardNamedData getNamedDataRecord(String name) {
121                 for(NfcCardNamedData data : namedDataRecords) {
122                         if(data.name.equalsIgnoreCase(name))
123                                 return data;
124                 }
125                 return null;
126         }
127
128         public double getBalanceData() {
129                 int balancePlain = 0;
130                 NfcCardNamedData dataobj;
131                 if((dataobj = getNamedDataRecord("balance")) != null) {
132                         try {
133                                 balancePlain = bytesToInt(dataobj.data);
134                         } catch (Exception e) {}
135                 } else {
136                         NfcCardPlainData data = getPlainData(0x5F8415, 1);
137                         if(data != null) {
138                                 balancePlain = data.bundle.getInt("data");
139                         }
140                 }
141                 return balancePlain / 1000.0;
142         }
143
144         public double getLastTransaction() {
145                 int balancePlain = 0;
146                 NfcCardNamedData dataobj;
147                 if((dataobj = getNamedDataRecord("transaction")) != null) {
148                         try {
149                                 balancePlain = bytesToInt(dataobj.data);
150                         } catch (Exception e) {}
151                 } else {
152                         NfcCardPlainData data = getPlainData(0x5F8415, 1);
153                         balancePlain = data.bundle.getInt("value");
154                 }
155                 return balancePlain / 1000.0;
156         }
157
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");
171
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");
178                 }
179                 return summary.toString();
180         }
181
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("} ");
188
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")+"] ");
195
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");
203                 }
204                 return summary.toString();
205         }
206
207         public void setUniqueId(int uid) {
208                 iUniqueCardId = uid;
209         }
210
211         public int getUniqueid() {
212                 return iUniqueCardId;
213         }
214
215 }