1e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor/*
2e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Copyright (C) 2012 The Android Open Source Project
3e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor *
4e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Licensed under the Apache License, Version 2.0 (the "License");
5e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * you may not use this file except in compliance with the License.
6e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * You may obtain a copy of the License at
7e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor *
8e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor *      http://www.apache.org/licenses/LICENSE-2.0
9e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor *
10e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * Unless required by applicable law or agreed to in writing, software
11e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * distributed under the License is distributed on an "AS IS" BASIS,
12e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * See the License for the specific language governing permissions and
14e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * limitations under the License.
15e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */
16e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
17e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorpackage com.android.mms.exif;
18e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
19e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorimport java.util.HashMap;
20e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorimport java.util.Map;
21e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
22e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor/**
23e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * This class stores all the tags in an IFD.
24e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor *
25e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see ExifData
26e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor * @see ExifTag
27e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor */
28e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylorclass IfdData {
29e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
30e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    private final int mIfdId;
31e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    private final Map<Short, ExifTag> mExifTags = new HashMap<Short, ExifTag>();
32e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    private int mOffsetToNextIfd = 0;
33e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    private static final int[] sIfds = {
34e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor            IfdId.TYPE_IFD_0, IfdId.TYPE_IFD_1, IfdId.TYPE_IFD_EXIF,
35e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor            IfdId.TYPE_IFD_INTEROPERABILITY, IfdId.TYPE_IFD_GPS
36e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    };
37e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
38e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Creates an IfdData with given IFD ID.
39e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     *
40e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_0
41e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_1
42e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_EXIF
43e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_GPS
44e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_INTEROPERABILITY
45e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
46e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    IfdData(int ifdId) {
47e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        mIfdId = ifdId;
48e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
49e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
50e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    static protected int[] getIfds() {
51e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return sIfds;
52e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
53e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
54e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
55e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Get a array the contains all {@link ExifTag} in this IFD.
56e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
57e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected ExifTag[] getAllTags() {
58e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return mExifTags.values().toArray(new ExifTag[mExifTags.size()]);
59e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
60e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
61e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
62e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Gets the ID of this IFD.
63e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     *
64e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_0
65e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_1
66e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_EXIF
67e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_GPS
68e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * @see IfdId#TYPE_IFD_INTEROPERABILITY
69e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
70e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected int getId() {
71e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return mIfdId;
72e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
73e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
74e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
75e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Gets the {@link ExifTag} with given tag id. Return null if there is no
76e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * such tag.
77e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
78e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected ExifTag getTag(short tagId) {
79e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return mExifTags.get(tagId);
80e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
81e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
82e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
83e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Adds or replaces a {@link ExifTag}.
84e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
85e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected ExifTag setTag(ExifTag tag) {
86e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        tag.setIfd(mIfdId);
87e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return mExifTags.put(tag.getTagId(), tag);
88e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
89e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
90e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected boolean checkCollision(short tagId) {
91e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return mExifTags.get(tagId) != null;
92e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
93e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
94e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
95e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Removes the tag of the given ID
96e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
97e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected void removeTag(short tagId) {
98e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        mExifTags.remove(tagId);
99e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
100e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
101e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
102e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Gets the tags count in the IFD.
103e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
104e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected int getTagCount() {
105e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return mExifTags.size();
106e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
107e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
108e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
109e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Sets the offset of next IFD.
110e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
111e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected void setOffsetToNextIfd(int offset) {
112e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        mOffsetToNextIfd = offset;
113e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
114e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
115e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
116e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Gets the offset of next IFD.
117e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
118e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    protected int getOffsetToNextIfd() {
119e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return mOffsetToNextIfd;
120e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
121e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor
122e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    /**
123e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * Returns true if all tags in this two IFDs are equal. Note that tags of
124e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     * IFDs offset or thumbnail offset will be ignored.
125e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor     */
126e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    @Override
127e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    public boolean equals(Object obj) {
128e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        if (this == obj) {
129e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor            return true;
130e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        }
131e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        if (obj == null) {
132e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor            return false;
133e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        }
134e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        if (obj instanceof IfdData) {
135e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor            IfdData data = (IfdData) obj;
136e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor            if (data.getId() == mIfdId && data.getTagCount() == getTagCount()) {
137e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                ExifTag[] tags = data.getAllTags();
138e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                for (ExifTag tag : tags) {
139e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                    if (ExifInterface.isOffsetTag(tag.getTagId())) {
140e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                        continue;
141e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                    }
142e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                    ExifTag tag2 = mExifTags.get(tag.getTagId());
143e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                    if (!tag.equals(tag2)) {
144e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                        return false;
145e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                    }
146e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                }
147e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor                return true;
148e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor            }
149e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        }
150e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor        return false;
151e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor    }
152e8a0d786fba1960818cb3da938cdbf2b2b11b340Tom Taylor}
153