1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.gallery3d.exif; 18 19 import java.nio.charset.Charset; 20 import java.text.SimpleDateFormat; 21 import java.util.Arrays; 22 import java.util.Date; 23 24 /** 25 * This class stores information of an EXIF tag. For more information about 26 * defined EXIF tags, please read the Jeita EXIF 2.2 standard. Tags should be 27 * instantiated using {@link ExifInterface#buildTag}. 28 * 29 * @see ExifInterface 30 */ 31 public class ExifTag { 32 /** 33 * The BYTE type in the EXIF standard. An 8-bit unsigned integer. 34 */ 35 public static final short TYPE_UNSIGNED_BYTE = 1; 36 /** 37 * The ASCII type in the EXIF standard. An 8-bit byte containing one 7-bit 38 * ASCII code. The final byte is terminated with NULL. 39 */ 40 public static final short TYPE_ASCII = 2; 41 /** 42 * The SHORT type in the EXIF standard. A 16-bit (2-byte) unsigned integer 43 */ 44 public static final short TYPE_UNSIGNED_SHORT = 3; 45 /** 46 * The LONG type in the EXIF standard. A 32-bit (4-byte) unsigned integer 47 */ 48 public static final short TYPE_UNSIGNED_LONG = 4; 49 /** 50 * The RATIONAL type of EXIF standard. It consists of two LONGs. The first 51 * one is the numerator and the second one expresses the denominator. 52 */ 53 public static final short TYPE_UNSIGNED_RATIONAL = 5; 54 /** 55 * The UNDEFINED type in the EXIF standard. An 8-bit byte that can take any 56 * value depending on the field definition. 57 */ 58 public static final short TYPE_UNDEFINED = 7; 59 /** 60 * The SLONG type in the EXIF standard. A 32-bit (4-byte) signed integer 61 * (2's complement notation). 62 */ 63 public static final short TYPE_LONG = 9; 64 /** 65 * The SRATIONAL type of EXIF standard. It consists of two SLONGs. The first 66 * one is the numerator and the second one is the denominator. 67 */ 68 public static final short TYPE_RATIONAL = 10; 69 70 private static Charset US_ASCII = Charset.forName("US-ASCII"); 71 private static final int TYPE_TO_SIZE_MAP[] = new int[11]; 72 private static final int UNSIGNED_SHORT_MAX = 65535; 73 private static final long UNSIGNED_LONG_MAX = 4294967295L; 74 private static final long LONG_MAX = Integer.MAX_VALUE; 75 private static final long LONG_MIN = Integer.MIN_VALUE; 76 77 static { 78 TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_BYTE] = 1; 79 TYPE_TO_SIZE_MAP[TYPE_ASCII] = 1; 80 TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_SHORT] = 2; 81 TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_LONG] = 4; 82 TYPE_TO_SIZE_MAP[TYPE_UNSIGNED_RATIONAL] = 8; 83 TYPE_TO_SIZE_MAP[TYPE_UNDEFINED] = 1; 84 TYPE_TO_SIZE_MAP[TYPE_LONG] = 4; 85 TYPE_TO_SIZE_MAP[TYPE_RATIONAL] = 8; 86 } 87 88 static final int SIZE_UNDEFINED = 0; 89 90 // Exif TagId 91 private final short mTagId; 92 // Exif Tag Type 93 private final short mDataType; 94 // If tag has defined count 95 private boolean mHasDefinedDefaultComponentCount; 96 // Actual data count in tag (should be number of elements in value array) 97 private int mComponentCountActual; 98 // The ifd that this tag should be put in 99 private int mIfd; 100 // The value (array of elements of type Tag Type) 101 private Object mValue; 102 // Value offset in exif header. 103 private int mOffset; 104 105 private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("yyyy:MM:dd kk:mm:ss"); 106 107 /** 108 * Returns true if the given IFD is a valid IFD. 109 */ isValidIfd(int ifdId)110 public static boolean isValidIfd(int ifdId) { 111 return ifdId == IfdId.TYPE_IFD_0 || ifdId == IfdId.TYPE_IFD_1 112 || ifdId == IfdId.TYPE_IFD_EXIF || ifdId == IfdId.TYPE_IFD_INTEROPERABILITY 113 || ifdId == IfdId.TYPE_IFD_GPS; 114 } 115 116 /** 117 * Returns true if a given type is a valid tag type. 118 */ isValidType(short type)119 public static boolean isValidType(short type) { 120 return type == TYPE_UNSIGNED_BYTE || type == TYPE_ASCII || 121 type == TYPE_UNSIGNED_SHORT || type == TYPE_UNSIGNED_LONG || 122 type == TYPE_UNSIGNED_RATIONAL || type == TYPE_UNDEFINED || 123 type == TYPE_LONG || type == TYPE_RATIONAL; 124 } 125 126 // Use builtTag in ExifInterface instead of constructor. ExifTag(short tagId, short type, int componentCount, int ifd, boolean hasDefinedComponentCount)127 ExifTag(short tagId, short type, int componentCount, int ifd, 128 boolean hasDefinedComponentCount) { 129 mTagId = tagId; 130 mDataType = type; 131 mComponentCountActual = componentCount; 132 mHasDefinedDefaultComponentCount = hasDefinedComponentCount; 133 mIfd = ifd; 134 mValue = null; 135 } 136 137 /** 138 * Gets the element size of the given data type in bytes. 139 * 140 * @see #TYPE_ASCII 141 * @see #TYPE_LONG 142 * @see #TYPE_RATIONAL 143 * @see #TYPE_UNDEFINED 144 * @see #TYPE_UNSIGNED_BYTE 145 * @see #TYPE_UNSIGNED_LONG 146 * @see #TYPE_UNSIGNED_RATIONAL 147 * @see #TYPE_UNSIGNED_SHORT 148 */ getElementSize(short type)149 public static int getElementSize(short type) { 150 return TYPE_TO_SIZE_MAP[type]; 151 } 152 153 /** 154 * Returns the ID of the IFD this tag belongs to. 155 * 156 * @see IfdId#TYPE_IFD_0 157 * @see IfdId#TYPE_IFD_1 158 * @see IfdId#TYPE_IFD_EXIF 159 * @see IfdId#TYPE_IFD_GPS 160 * @see IfdId#TYPE_IFD_INTEROPERABILITY 161 */ getIfd()162 public int getIfd() { 163 return mIfd; 164 } 165 setIfd(int ifdId)166 protected void setIfd(int ifdId) { 167 mIfd = ifdId; 168 } 169 170 /** 171 * Gets the TID of this tag. 172 */ getTagId()173 public short getTagId() { 174 return mTagId; 175 } 176 177 /** 178 * Gets the data type of this tag 179 * 180 * @see #TYPE_ASCII 181 * @see #TYPE_LONG 182 * @see #TYPE_RATIONAL 183 * @see #TYPE_UNDEFINED 184 * @see #TYPE_UNSIGNED_BYTE 185 * @see #TYPE_UNSIGNED_LONG 186 * @see #TYPE_UNSIGNED_RATIONAL 187 * @see #TYPE_UNSIGNED_SHORT 188 */ getDataType()189 public short getDataType() { 190 return mDataType; 191 } 192 193 /** 194 * Gets the total data size in bytes of the value of this tag. 195 */ getDataSize()196 public int getDataSize() { 197 return getComponentCount() * getElementSize(getDataType()); 198 } 199 200 /** 201 * Gets the component count of this tag. 202 */ 203 204 // TODO: fix integer overflows with this getComponentCount()205 public int getComponentCount() { 206 return mComponentCountActual; 207 } 208 209 /** 210 * Sets the component count of this tag. Call this function before 211 * setValue() if the length of value does not match the component count. 212 */ forceSetComponentCount(int count)213 protected void forceSetComponentCount(int count) { 214 mComponentCountActual = count; 215 } 216 217 /** 218 * Returns true if this ExifTag contains value; otherwise, this tag will 219 * contain an offset value that is determined when the tag is written. 220 */ hasValue()221 public boolean hasValue() { 222 return mValue != null; 223 } 224 225 /** 226 * Sets integer values into this tag. This method should be used for tags of 227 * type {@link #TYPE_UNSIGNED_SHORT}. This method will fail if: 228 * <ul> 229 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_SHORT}, 230 * {@link #TYPE_UNSIGNED_LONG}, or {@link #TYPE_LONG}.</li> 231 * <li>The value overflows.</li> 232 * <li>The value.length does NOT match the component count in the definition 233 * for this tag.</li> 234 * </ul> 235 */ setValue(int[] value)236 public boolean setValue(int[] value) { 237 if (checkBadComponentCount(value.length)) { 238 return false; 239 } 240 if (mDataType != TYPE_UNSIGNED_SHORT && mDataType != TYPE_LONG && 241 mDataType != TYPE_UNSIGNED_LONG) { 242 return false; 243 } 244 if (mDataType == TYPE_UNSIGNED_SHORT && checkOverflowForUnsignedShort(value)) { 245 return false; 246 } else if (mDataType == TYPE_UNSIGNED_LONG && checkOverflowForUnsignedLong(value)) { 247 return false; 248 } 249 250 long[] data = new long[value.length]; 251 for (int i = 0; i < value.length; i++) { 252 data[i] = value[i]; 253 } 254 mValue = data; 255 mComponentCountActual = value.length; 256 return true; 257 } 258 259 /** 260 * Sets integer value into this tag. This method should be used for tags of 261 * type {@link #TYPE_UNSIGNED_SHORT}, or {@link #TYPE_LONG}. This method 262 * will fail if: 263 * <ul> 264 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_SHORT}, 265 * {@link #TYPE_UNSIGNED_LONG}, or {@link #TYPE_LONG}.</li> 266 * <li>The value overflows.</li> 267 * <li>The component count in the definition of this tag is not 1.</li> 268 * </ul> 269 */ setValue(int value)270 public boolean setValue(int value) { 271 return setValue(new int[] { 272 value 273 }); 274 } 275 276 /** 277 * Sets long values into this tag. This method should be used for tags of 278 * type {@link #TYPE_UNSIGNED_LONG}. This method will fail if: 279 * <ul> 280 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_LONG}.</li> 281 * <li>The value overflows.</li> 282 * <li>The value.length does NOT match the component count in the definition 283 * for this tag.</li> 284 * </ul> 285 */ setValue(long[] value)286 public boolean setValue(long[] value) { 287 if (checkBadComponentCount(value.length) || mDataType != TYPE_UNSIGNED_LONG) { 288 return false; 289 } 290 if (checkOverflowForUnsignedLong(value)) { 291 return false; 292 } 293 mValue = value; 294 mComponentCountActual = value.length; 295 return true; 296 } 297 298 /** 299 * Sets long values into this tag. This method should be used for tags of 300 * type {@link #TYPE_UNSIGNED_LONG}. This method will fail if: 301 * <ul> 302 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_LONG}.</li> 303 * <li>The value overflows.</li> 304 * <li>The component count in the definition for this tag is not 1.</li> 305 * </ul> 306 */ setValue(long value)307 public boolean setValue(long value) { 308 return setValue(new long[] { 309 value 310 }); 311 } 312 313 /** 314 * Sets a string value into this tag. This method should be used for tags of 315 * type {@link #TYPE_ASCII}. The string is converted to an ASCII string. 316 * Characters that cannot be converted are replaced with '?'. The length of 317 * the string must be equal to either (component count -1) or (component 318 * count). The final byte will be set to the string null terminator '\0', 319 * overwriting the last character in the string if the value.length is equal 320 * to the component count. This method will fail if: 321 * <ul> 322 * <li>The data type is not {@link #TYPE_ASCII} or {@link #TYPE_UNDEFINED}.</li> 323 * <li>The length of the string is not equal to (component count -1) or 324 * (component count) in the definition for this tag.</li> 325 * </ul> 326 */ setValue(String value)327 public boolean setValue(String value) { 328 if (mDataType != TYPE_ASCII && mDataType != TYPE_UNDEFINED) { 329 return false; 330 } 331 332 byte[] buf = value.getBytes(US_ASCII); 333 byte[] finalBuf = buf; 334 if (buf.length > 0) { 335 finalBuf = (buf[buf.length - 1] == 0 || mDataType == TYPE_UNDEFINED) ? buf : Arrays 336 .copyOf(buf, buf.length + 1); 337 } else if (mDataType == TYPE_ASCII && mComponentCountActual == 1) { 338 finalBuf = new byte[] { 0 }; 339 } 340 int count = finalBuf.length; 341 if (checkBadComponentCount(count)) { 342 return false; 343 } 344 mComponentCountActual = count; 345 mValue = finalBuf; 346 return true; 347 } 348 349 /** 350 * Sets Rational values into this tag. This method should be used for tags 351 * of type {@link #TYPE_UNSIGNED_RATIONAL}, or {@link #TYPE_RATIONAL}. This 352 * method will fail if: 353 * <ul> 354 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_RATIONAL} 355 * or {@link #TYPE_RATIONAL}.</li> 356 * <li>The value overflows.</li> 357 * <li>The value.length does NOT match the component count in the definition 358 * for this tag.</li> 359 * </ul> 360 * 361 * @see Rational 362 */ setValue(Rational[] value)363 public boolean setValue(Rational[] value) { 364 if (checkBadComponentCount(value.length)) { 365 return false; 366 } 367 if (mDataType != TYPE_UNSIGNED_RATIONAL && mDataType != TYPE_RATIONAL) { 368 return false; 369 } 370 if (mDataType == TYPE_UNSIGNED_RATIONAL && checkOverflowForUnsignedRational(value)) { 371 return false; 372 } else if (mDataType == TYPE_RATIONAL && checkOverflowForRational(value)) { 373 return false; 374 } 375 376 mValue = value; 377 mComponentCountActual = value.length; 378 return true; 379 } 380 381 /** 382 * Sets a Rational value into this tag. This method should be used for tags 383 * of type {@link #TYPE_UNSIGNED_RATIONAL}, or {@link #TYPE_RATIONAL}. This 384 * method will fail if: 385 * <ul> 386 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_RATIONAL} 387 * or {@link #TYPE_RATIONAL}.</li> 388 * <li>The value overflows.</li> 389 * <li>The component count in the definition for this tag is not 1.</li> 390 * </ul> 391 * 392 * @see Rational 393 */ setValue(Rational value)394 public boolean setValue(Rational value) { 395 return setValue(new Rational[] { 396 value 397 }); 398 } 399 400 /** 401 * Sets byte values into this tag. This method should be used for tags of 402 * type {@link #TYPE_UNSIGNED_BYTE} or {@link #TYPE_UNDEFINED}. This method 403 * will fail if: 404 * <ul> 405 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_BYTE} or 406 * {@link #TYPE_UNDEFINED} .</li> 407 * <li>The length does NOT match the component count in the definition for 408 * this tag.</li> 409 * </ul> 410 */ setValue(byte[] value, int offset, int length)411 public boolean setValue(byte[] value, int offset, int length) { 412 if (checkBadComponentCount(length)) { 413 return false; 414 } 415 if (mDataType != TYPE_UNSIGNED_BYTE && mDataType != TYPE_UNDEFINED) { 416 return false; 417 } 418 mValue = new byte[length]; 419 System.arraycopy(value, offset, mValue, 0, length); 420 mComponentCountActual = length; 421 return true; 422 } 423 424 /** 425 * Equivalent to setValue(value, 0, value.length). 426 */ setValue(byte[] value)427 public boolean setValue(byte[] value) { 428 return setValue(value, 0, value.length); 429 } 430 431 /** 432 * Sets byte value into this tag. This method should be used for tags of 433 * type {@link #TYPE_UNSIGNED_BYTE} or {@link #TYPE_UNDEFINED}. This method 434 * will fail if: 435 * <ul> 436 * <li>The component type of this tag is not {@link #TYPE_UNSIGNED_BYTE} or 437 * {@link #TYPE_UNDEFINED} .</li> 438 * <li>The component count in the definition for this tag is not 1.</li> 439 * </ul> 440 */ setValue(byte value)441 public boolean setValue(byte value) { 442 return setValue(new byte[] { 443 value 444 }); 445 } 446 447 /** 448 * Sets the value for this tag using an appropriate setValue method for the 449 * given object. This method will fail if: 450 * <ul> 451 * <li>The corresponding setValue method for the class of the object passed 452 * in would fail.</li> 453 * <li>There is no obvious way to cast the object passed in into an EXIF tag 454 * type.</li> 455 * </ul> 456 */ setValue(Object obj)457 public boolean setValue(Object obj) { 458 if (obj == null) { 459 return false; 460 } else if (obj instanceof Short) { 461 return setValue(((Short) obj).shortValue() & 0x0ffff); 462 } else if (obj instanceof String) { 463 return setValue((String) obj); 464 } else if (obj instanceof int[]) { 465 return setValue((int[]) obj); 466 } else if (obj instanceof long[]) { 467 return setValue((long[]) obj); 468 } else if (obj instanceof Rational) { 469 return setValue((Rational) obj); 470 } else if (obj instanceof Rational[]) { 471 return setValue((Rational[]) obj); 472 } else if (obj instanceof byte[]) { 473 return setValue((byte[]) obj); 474 } else if (obj instanceof Integer) { 475 return setValue(((Integer) obj).intValue()); 476 } else if (obj instanceof Long) { 477 return setValue(((Long) obj).longValue()); 478 } else if (obj instanceof Byte) { 479 return setValue(((Byte) obj).byteValue()); 480 } else if (obj instanceof Short[]) { 481 // Nulls in this array are treated as zeroes. 482 Short[] arr = (Short[]) obj; 483 int[] fin = new int[arr.length]; 484 for (int i = 0; i < arr.length; i++) { 485 fin[i] = (arr[i] == null) ? 0 : arr[i].shortValue() & 0x0ffff; 486 } 487 return setValue(fin); 488 } else if (obj instanceof Integer[]) { 489 // Nulls in this array are treated as zeroes. 490 Integer[] arr = (Integer[]) obj; 491 int[] fin = new int[arr.length]; 492 for (int i = 0; i < arr.length; i++) { 493 fin[i] = (arr[i] == null) ? 0 : arr[i].intValue(); 494 } 495 return setValue(fin); 496 } else if (obj instanceof Long[]) { 497 // Nulls in this array are treated as zeroes. 498 Long[] arr = (Long[]) obj; 499 long[] fin = new long[arr.length]; 500 for (int i = 0; i < arr.length; i++) { 501 fin[i] = (arr[i] == null) ? 0 : arr[i].longValue(); 502 } 503 return setValue(fin); 504 } else if (obj instanceof Byte[]) { 505 // Nulls in this array are treated as zeroes. 506 Byte[] arr = (Byte[]) obj; 507 byte[] fin = new byte[arr.length]; 508 for (int i = 0; i < arr.length; i++) { 509 fin[i] = (arr[i] == null) ? 0 : arr[i].byteValue(); 510 } 511 return setValue(fin); 512 } else { 513 return false; 514 } 515 } 516 517 /** 518 * Sets a timestamp to this tag. The method converts the timestamp with the 519 * format of "yyyy:MM:dd kk:mm:ss" and calls {@link #setValue(String)}. This 520 * method will fail if the data type is not {@link #TYPE_ASCII} or the 521 * component count of this tag is not 20 or undefined. 522 * 523 * @param time the number of milliseconds since Jan. 1, 1970 GMT 524 * @return true on success 525 */ setTimeValue(long time)526 public boolean setTimeValue(long time) { 527 // synchronized on TIME_FORMAT as SimpleDateFormat is not thread safe 528 synchronized (TIME_FORMAT) { 529 return setValue(TIME_FORMAT.format(new Date(time))); 530 } 531 } 532 533 /** 534 * Gets the value as a String. This method should be used for tags of type 535 * {@link #TYPE_ASCII}. 536 * 537 * @return the value as a String, or null if the tag's value does not exist 538 * or cannot be converted to a String. 539 */ getValueAsString()540 public String getValueAsString() { 541 if (mValue == null) { 542 return null; 543 } else if (mValue instanceof String) { 544 return (String) mValue; 545 } else if (mValue instanceof byte[]) { 546 return new String((byte[]) mValue, US_ASCII); 547 } 548 return null; 549 } 550 551 /** 552 * Gets the value as a String. This method should be used for tags of type 553 * {@link #TYPE_ASCII}. 554 * 555 * @param defaultValue the String to return if the tag's value does not 556 * exist or cannot be converted to a String. 557 * @return the tag's value as a String, or the defaultValue. 558 */ getValueAsString(String defaultValue)559 public String getValueAsString(String defaultValue) { 560 String s = getValueAsString(); 561 if (s == null) { 562 return defaultValue; 563 } 564 return s; 565 } 566 567 /** 568 * Gets the value as a byte array. This method should be used for tags of 569 * type {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE}. 570 * 571 * @return the value as a byte array, or null if the tag's value does not 572 * exist or cannot be converted to a byte array. 573 */ getValueAsBytes()574 public byte[] getValueAsBytes() { 575 if (mValue instanceof byte[]) { 576 return (byte[]) mValue; 577 } 578 return null; 579 } 580 581 /** 582 * Gets the value as a byte. If there are more than 1 bytes in this value, 583 * gets the first byte. This method should be used for tags of type 584 * {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE}. 585 * 586 * @param defaultValue the byte to return if tag's value does not exist or 587 * cannot be converted to a byte. 588 * @return the tag's value as a byte, or the defaultValue. 589 */ getValueAsByte(byte defaultValue)590 public byte getValueAsByte(byte defaultValue) { 591 byte[] b = getValueAsBytes(); 592 if (b == null || b.length < 1) { 593 return defaultValue; 594 } 595 return b[0]; 596 } 597 598 /** 599 * Gets the value as an array of Rationals. This method should be used for 600 * tags of type {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. 601 * 602 * @return the value as as an array of Rationals, or null if the tag's value 603 * does not exist or cannot be converted to an array of Rationals. 604 */ getValueAsRationals()605 public Rational[] getValueAsRationals() { 606 if (mValue instanceof Rational[]) { 607 return (Rational[]) mValue; 608 } 609 return null; 610 } 611 612 /** 613 * Gets the value as a Rational. If there are more than 1 Rationals in this 614 * value, gets the first one. This method should be used for tags of type 615 * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. 616 * 617 * @param defaultValue the Rational to return if tag's value does not exist 618 * or cannot be converted to a Rational. 619 * @return the tag's value as a Rational, or the defaultValue. 620 */ getValueAsRational(Rational defaultValue)621 public Rational getValueAsRational(Rational defaultValue) { 622 Rational[] r = getValueAsRationals(); 623 if (r == null || r.length < 1) { 624 return defaultValue; 625 } 626 return r[0]; 627 } 628 629 /** 630 * Gets the value as a Rational. If there are more than 1 Rationals in this 631 * value, gets the first one. This method should be used for tags of type 632 * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. 633 * 634 * @param defaultValue the numerator of the Rational to return if tag's 635 * value does not exist or cannot be converted to a Rational (the 636 * denominator will be 1). 637 * @return the tag's value as a Rational, or the defaultValue. 638 */ getValueAsRational(long defaultValue)639 public Rational getValueAsRational(long defaultValue) { 640 Rational defaultVal = new Rational(defaultValue, 1); 641 return getValueAsRational(defaultVal); 642 } 643 644 /** 645 * Gets the value as an array of ints. This method should be used for tags 646 * of type {@link #TYPE_UNSIGNED_SHORT}, {@link #TYPE_UNSIGNED_LONG}. 647 * 648 * @return the value as as an array of ints, or null if the tag's value does 649 * not exist or cannot be converted to an array of ints. 650 */ getValueAsInts()651 public int[] getValueAsInts() { 652 if (mValue == null) { 653 return null; 654 } else if (mValue instanceof long[]) { 655 long[] val = (long[]) mValue; 656 int[] arr = new int[val.length]; 657 for (int i = 0; i < val.length; i++) { 658 arr[i] = (int) val[i]; // Truncates 659 } 660 return arr; 661 } 662 return null; 663 } 664 665 /** 666 * Gets the value as an int. If there are more than 1 ints in this value, 667 * gets the first one. This method should be used for tags of type 668 * {@link #TYPE_UNSIGNED_SHORT}, {@link #TYPE_UNSIGNED_LONG}. 669 * 670 * @param defaultValue the int to return if tag's value does not exist or 671 * cannot be converted to an int. 672 * @return the tag's value as a int, or the defaultValue. 673 */ getValueAsInt(int defaultValue)674 public int getValueAsInt(int defaultValue) { 675 int[] i = getValueAsInts(); 676 if (i == null || i.length < 1) { 677 return defaultValue; 678 } 679 return i[0]; 680 } 681 682 /** 683 * Gets the value as an array of longs. This method should be used for tags 684 * of type {@link #TYPE_UNSIGNED_LONG}. 685 * 686 * @return the value as as an array of longs, or null if the tag's value 687 * does not exist or cannot be converted to an array of longs. 688 */ getValueAsLongs()689 public long[] getValueAsLongs() { 690 if (mValue instanceof long[]) { 691 return (long[]) mValue; 692 } 693 return null; 694 } 695 696 /** 697 * Gets the value or null if none exists. If there are more than 1 longs in 698 * this value, gets the first one. This method should be used for tags of 699 * type {@link #TYPE_UNSIGNED_LONG}. 700 * 701 * @param defaultValue the long to return if tag's value does not exist or 702 * cannot be converted to a long. 703 * @return the tag's value as a long, or the defaultValue. 704 */ getValueAsLong(long defaultValue)705 public long getValueAsLong(long defaultValue) { 706 long[] l = getValueAsLongs(); 707 if (l == null || l.length < 1) { 708 return defaultValue; 709 } 710 return l[0]; 711 } 712 713 /** 714 * Gets the tag's value or null if none exists. 715 */ getValue()716 public Object getValue() { 717 return mValue; 718 } 719 720 /** 721 * Gets a long representation of the value. 722 * 723 * @param defaultValue value to return if there is no value or value is a 724 * rational with a denominator of 0. 725 * @return the tag's value as a long, or defaultValue if no representation 726 * exists. 727 */ forceGetValueAsLong(long defaultValue)728 public long forceGetValueAsLong(long defaultValue) { 729 long[] l = getValueAsLongs(); 730 if (l != null && l.length >= 1) { 731 return l[0]; 732 } 733 byte[] b = getValueAsBytes(); 734 if (b != null && b.length >= 1) { 735 return b[0]; 736 } 737 Rational[] r = getValueAsRationals(); 738 if (r != null && r.length >= 1 && r[0].getDenominator() != 0) { 739 return (long) r[0].toDouble(); 740 } 741 return defaultValue; 742 } 743 744 /** 745 * Gets a string representation of the value. 746 */ forceGetValueAsString()747 public String forceGetValueAsString() { 748 if (mValue == null) { 749 return ""; 750 } else if (mValue instanceof byte[]) { 751 if (mDataType == TYPE_ASCII) { 752 return new String((byte[]) mValue, US_ASCII); 753 } else { 754 return Arrays.toString((byte[]) mValue); 755 } 756 } else if (mValue instanceof long[]) { 757 if (((long[]) mValue).length == 1) { 758 return String.valueOf(((long[]) mValue)[0]); 759 } else { 760 return Arrays.toString((long[]) mValue); 761 } 762 } else if (mValue instanceof Object[]) { 763 if (((Object[]) mValue).length == 1) { 764 Object val = ((Object[]) mValue)[0]; 765 if (val == null) { 766 return ""; 767 } else { 768 return val.toString(); 769 } 770 } else { 771 return Arrays.toString((Object[]) mValue); 772 } 773 } else { 774 return mValue.toString(); 775 } 776 } 777 778 /** 779 * Gets the value for type {@link #TYPE_ASCII}, {@link #TYPE_LONG}, 780 * {@link #TYPE_UNDEFINED}, {@link #TYPE_UNSIGNED_BYTE}, 781 * {@link #TYPE_UNSIGNED_LONG}, or {@link #TYPE_UNSIGNED_SHORT}. For 782 * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}, call 783 * {@link #getRational(int)} instead. 784 * 785 * @exception IllegalArgumentException if the data type is 786 * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. 787 */ getValueAt(int index)788 protected long getValueAt(int index) { 789 if (mValue instanceof long[]) { 790 return ((long[]) mValue)[index]; 791 } else if (mValue instanceof byte[]) { 792 return ((byte[]) mValue)[index]; 793 } 794 throw new IllegalArgumentException("Cannot get integer value from " 795 + convertTypeToString(mDataType)); 796 } 797 798 /** 799 * Gets the {@link #TYPE_ASCII} data. 800 * 801 * @exception IllegalArgumentException If the type is NOT 802 * {@link #TYPE_ASCII}. 803 */ getString()804 protected String getString() { 805 if (mDataType != TYPE_ASCII) { 806 throw new IllegalArgumentException("Cannot get ASCII value from " 807 + convertTypeToString(mDataType)); 808 } 809 return new String((byte[]) mValue, US_ASCII); 810 } 811 812 /* 813 * Get the converted ascii byte. Used by ExifOutputStream. 814 */ getStringByte()815 protected byte[] getStringByte() { 816 return (byte[]) mValue; 817 } 818 819 /** 820 * Gets the {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL} data. 821 * 822 * @exception IllegalArgumentException If the type is NOT 823 * {@link #TYPE_RATIONAL} or {@link #TYPE_UNSIGNED_RATIONAL}. 824 */ getRational(int index)825 protected Rational getRational(int index) { 826 if ((mDataType != TYPE_RATIONAL) && (mDataType != TYPE_UNSIGNED_RATIONAL)) { 827 throw new IllegalArgumentException("Cannot get RATIONAL value from " 828 + convertTypeToString(mDataType)); 829 } 830 return ((Rational[]) mValue)[index]; 831 } 832 833 /** 834 * Equivalent to getBytes(buffer, 0, buffer.length). 835 */ getBytes(byte[] buf)836 protected void getBytes(byte[] buf) { 837 getBytes(buf, 0, buf.length); 838 } 839 840 /** 841 * Gets the {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE} data. 842 * 843 * @param buf the byte array in which to store the bytes read. 844 * @param offset the initial position in buffer to store the bytes. 845 * @param length the maximum number of bytes to store in buffer. If length > 846 * component count, only the valid bytes will be stored. 847 * @exception IllegalArgumentException If the type is NOT 848 * {@link #TYPE_UNDEFINED} or {@link #TYPE_UNSIGNED_BYTE}. 849 */ getBytes(byte[] buf, int offset, int length)850 protected void getBytes(byte[] buf, int offset, int length) { 851 if ((mDataType != TYPE_UNDEFINED) && (mDataType != TYPE_UNSIGNED_BYTE)) { 852 throw new IllegalArgumentException("Cannot get BYTE value from " 853 + convertTypeToString(mDataType)); 854 } 855 System.arraycopy(mValue, 0, buf, offset, 856 (length > mComponentCountActual) ? mComponentCountActual : length); 857 } 858 859 /** 860 * Gets the offset of this tag. This is only valid if this data size > 4 and 861 * contains an offset to the location of the actual value. 862 */ getOffset()863 protected int getOffset() { 864 return mOffset; 865 } 866 867 /** 868 * Sets the offset of this tag. 869 */ setOffset(int offset)870 protected void setOffset(int offset) { 871 mOffset = offset; 872 } 873 setHasDefinedCount(boolean d)874 protected void setHasDefinedCount(boolean d) { 875 mHasDefinedDefaultComponentCount = d; 876 } 877 hasDefinedCount()878 protected boolean hasDefinedCount() { 879 return mHasDefinedDefaultComponentCount; 880 } 881 checkBadComponentCount(int count)882 private boolean checkBadComponentCount(int count) { 883 if (mHasDefinedDefaultComponentCount && (mComponentCountActual != count)) { 884 return true; 885 } 886 return false; 887 } 888 convertTypeToString(short type)889 private static String convertTypeToString(short type) { 890 switch (type) { 891 case TYPE_UNSIGNED_BYTE: 892 return "UNSIGNED_BYTE"; 893 case TYPE_ASCII: 894 return "ASCII"; 895 case TYPE_UNSIGNED_SHORT: 896 return "UNSIGNED_SHORT"; 897 case TYPE_UNSIGNED_LONG: 898 return "UNSIGNED_LONG"; 899 case TYPE_UNSIGNED_RATIONAL: 900 return "UNSIGNED_RATIONAL"; 901 case TYPE_UNDEFINED: 902 return "UNDEFINED"; 903 case TYPE_LONG: 904 return "LONG"; 905 case TYPE_RATIONAL: 906 return "RATIONAL"; 907 default: 908 return ""; 909 } 910 } 911 checkOverflowForUnsignedShort(int[] value)912 private boolean checkOverflowForUnsignedShort(int[] value) { 913 for (int v : value) { 914 if (v > UNSIGNED_SHORT_MAX || v < 0) { 915 return true; 916 } 917 } 918 return false; 919 } 920 checkOverflowForUnsignedLong(long[] value)921 private boolean checkOverflowForUnsignedLong(long[] value) { 922 for (long v : value) { 923 if (v < 0 || v > UNSIGNED_LONG_MAX) { 924 return true; 925 } 926 } 927 return false; 928 } 929 checkOverflowForUnsignedLong(int[] value)930 private boolean checkOverflowForUnsignedLong(int[] value) { 931 for (int v : value) { 932 if (v < 0) { 933 return true; 934 } 935 } 936 return false; 937 } 938 checkOverflowForUnsignedRational(Rational[] value)939 private boolean checkOverflowForUnsignedRational(Rational[] value) { 940 for (Rational v : value) { 941 if (v.getNumerator() < 0 || v.getDenominator() < 0 942 || v.getNumerator() > UNSIGNED_LONG_MAX 943 || v.getDenominator() > UNSIGNED_LONG_MAX) { 944 return true; 945 } 946 } 947 return false; 948 } 949 checkOverflowForRational(Rational[] value)950 private boolean checkOverflowForRational(Rational[] value) { 951 for (Rational v : value) { 952 if (v.getNumerator() < LONG_MIN || v.getDenominator() < LONG_MIN 953 || v.getNumerator() > LONG_MAX 954 || v.getDenominator() > LONG_MAX) { 955 return true; 956 } 957 } 958 return false; 959 } 960 961 @Override equals(Object obj)962 public boolean equals(Object obj) { 963 if (obj == null) { 964 return false; 965 } 966 if (obj instanceof ExifTag) { 967 ExifTag tag = (ExifTag) obj; 968 if (tag.mTagId != this.mTagId 969 || tag.mComponentCountActual != this.mComponentCountActual 970 || tag.mDataType != this.mDataType) { 971 return false; 972 } 973 if (mValue != null) { 974 if (tag.mValue == null) { 975 return false; 976 } else if (mValue instanceof long[]) { 977 if (!(tag.mValue instanceof long[])) { 978 return false; 979 } 980 return Arrays.equals((long[]) mValue, (long[]) tag.mValue); 981 } else if (mValue instanceof Rational[]) { 982 if (!(tag.mValue instanceof Rational[])) { 983 return false; 984 } 985 return Arrays.equals((Rational[]) mValue, (Rational[]) tag.mValue); 986 } else if (mValue instanceof byte[]) { 987 if (!(tag.mValue instanceof byte[])) { 988 return false; 989 } 990 return Arrays.equals((byte[]) mValue, (byte[]) tag.mValue); 991 } else { 992 return mValue.equals(tag.mValue); 993 } 994 } else { 995 return tag.mValue == null; 996 } 997 } 998 return false; 999 } 1000 1001 @Override toString()1002 public String toString() { 1003 return String.format("tag id: %04X\n", mTagId) + "ifd id: " + mIfd + "\ntype: " 1004 + convertTypeToString(mDataType) + "\ncount: " + mComponentCountActual 1005 + "\noffset: " + mOffset + "\nvalue: " + forceGetValueAsString() + "\n"; 1006 } 1007 1008 } 1009