2 * DesfireManufacturingData.java
4 * Copyright (C) 2011 Eric Butler
7 * Eric Butler <eric@codebutler.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 com.codebutler.farebot.card.desfire;
25 import android.os.Parcel;
26 import android.os.Parcelable;
27 import com.codebutler.farebot.Utils;
28 import org.w3c.dom.Element;
30 import java.io.ByteArrayInputStream;
32 public class DesfireManufacturingData implements Parcelable {
33 public final int hwVendorID;
34 public final int hwType;
35 public final int hwSubType;
36 public final int hwMajorVersion;
37 public final int hwMinorVersion;
38 public final int hwStorageSize;
39 public final int hwProtocol;
41 public final int swVendorID;
42 public final int swType;
43 public final int swSubType;
44 public final int swMajorVersion;
45 public final int swMinorVersion;
46 public final int swStorageSize;
47 public final int swProtocol;
50 public final int batchNo;
51 public final int weekProd;
52 public final int yearProd;
54 public DesfireManufacturingData (byte[] data) {
55 ByteArrayInputStream stream = new ByteArrayInputStream(data);
56 hwVendorID = stream.read();
57 hwType = stream.read();
58 hwSubType = stream.read();
59 hwMajorVersion = stream.read();
60 hwMinorVersion = stream.read();
61 hwStorageSize = stream.read();
62 hwProtocol = stream.read();
64 swVendorID = stream.read();
65 swType = stream.read();
66 swSubType = stream.read();
67 swMajorVersion = stream.read();
68 swMinorVersion = stream.read();
69 swStorageSize = stream.read();
70 swProtocol = stream.read();
72 // FIXME: This has fewer digits than what's contained in EXTRA_ID, why?
73 byte[] buf = new byte[7];
74 stream.read(buf, 0, buf.length);
75 uid = Utils.byteArrayToInt(buf);
77 // FIXME: This is returning a negative number. Probably is unsigned.
79 stream.read(buf, 0, buf.length);
80 batchNo = Utils.byteArrayToInt(buf);
82 // FIXME: These numbers aren't making sense.
83 weekProd = stream.read();
84 yearProd = stream.read();
87 public static DesfireManufacturingData fromXml (Element element) {
88 return new DesfireManufacturingData(element);
91 private DesfireManufacturingData (Element element) {
92 hwVendorID = Integer.parseInt(element.getElementsByTagName("hw-vendor-id").item(0).getTextContent());
93 hwType = Integer.parseInt(element.getElementsByTagName("hw-type").item(0).getTextContent());
94 hwSubType = Integer.parseInt(element.getElementsByTagName("hw-sub-type").item(0).getTextContent());
95 hwMajorVersion = Integer.parseInt(element.getElementsByTagName("hw-major-version").item(0).getTextContent());
96 hwMinorVersion = Integer.parseInt(element.getElementsByTagName("hw-minor-version").item(0).getTextContent());
97 hwStorageSize = Integer.parseInt(element.getElementsByTagName("hw-storage-size").item(0).getTextContent());
98 hwProtocol = Integer.parseInt(element.getElementsByTagName("hw-protocol").item(0).getTextContent());
100 swVendorID = Integer.parseInt(element.getElementsByTagName("sw-vendor-id").item(0).getTextContent());
101 swType = Integer.parseInt(element.getElementsByTagName("sw-type").item(0).getTextContent());
102 swSubType = Integer.parseInt(element.getElementsByTagName("sw-sub-type").item(0).getTextContent());
103 swMajorVersion = Integer.parseInt(element.getElementsByTagName("sw-major-version").item(0).getTextContent());
104 swMinorVersion = Integer.parseInt(element.getElementsByTagName("sw-minor-version").item(0).getTextContent());
105 swStorageSize = Integer.parseInt(element.getElementsByTagName("sw-storage-size").item(0).getTextContent());
106 swProtocol = Integer.parseInt(element.getElementsByTagName("sw-protocol").item(0).getTextContent());
108 uid = Integer.parseInt(element.getElementsByTagName("uid").item(0).getTextContent());
109 batchNo = Integer.parseInt(element.getElementsByTagName("batch-no").item(0).getTextContent());
110 weekProd = Integer.parseInt(element.getElementsByTagName("week-prod").item(0).getTextContent());
111 yearProd = Integer.parseInt(element.getElementsByTagName("year-prod").item(0).getTextContent());
114 private DesfireManufacturingData (Parcel parcel) {
115 hwVendorID = parcel.readInt();
116 hwType = parcel.readInt();
117 hwSubType = parcel.readInt();
118 hwMajorVersion = parcel.readInt();
119 hwMinorVersion = parcel.readInt();
120 hwStorageSize = parcel.readInt();
121 hwProtocol = parcel.readInt();
123 swVendorID = parcel.readInt();
124 swType = parcel.readInt();
125 swSubType = parcel.readInt();
126 swMajorVersion = parcel.readInt();
127 swMinorVersion = parcel.readInt();
128 swStorageSize = parcel.readInt();
129 swProtocol = parcel.readInt();
131 uid = parcel.readInt();
132 batchNo = parcel.readInt();
133 weekProd = parcel.readInt();
134 yearProd = parcel.readInt();
137 public void writeToParcel(Parcel parcel, int flags) {
138 parcel.writeInt(hwVendorID);
139 parcel.writeInt(hwType);
140 parcel.writeInt(hwSubType);
141 parcel.writeInt(hwMajorVersion);
142 parcel.writeInt(hwMinorVersion);
143 parcel.writeInt(hwStorageSize);
144 parcel.writeInt(hwProtocol);
146 parcel.writeInt(swVendorID);
147 parcel.writeInt(swType);
148 parcel.writeInt(swSubType);
149 parcel.writeInt(swMajorVersion);
150 parcel.writeInt(swMinorVersion);
151 parcel.writeInt(swStorageSize);
152 parcel.writeInt(swProtocol);
154 parcel.writeInt(uid);
155 parcel.writeInt(batchNo);
156 parcel.writeInt(weekProd);
157 parcel.writeInt(yearProd);
160 public int describeContents() {
164 public static final Parcelable.Creator<DesfireManufacturingData> CREATOR = new Parcelable.Creator<DesfireManufacturingData>() {
165 public DesfireManufacturingData createFromParcel(Parcel source) {
166 return new DesfireManufacturingData(source);
169 public DesfireManufacturingData[] newArray(int size) {
170 return new DesfireManufacturingData[size];