1 /* 2 ****************************************************************************** 3 * 4 * Copyright (C) 2009, International Business Machines 5 * Corporation and others. All Rights Reserved. 6 * 7 ****************************************************************************** 8 */ 9 10 #include "unicode/utypes.h" 11 #include "unicode/icudataver.h" 12 #include "unicode/uversion.h" 13 #include "unicode/ures.h" 14 #include "uresimp.h" /* for ures_getVersionByKey */ 15 #include "cmemory.h" 16 17 /* 18 * Determines if icustd is in the data. 19 */ 20 static UBool hasICUSTDBundle(); 21 22 static UBool hasICUSTDBundle() { 23 UErrorCode status = U_ZERO_ERROR; 24 UBool result = TRUE; 25 26 UResourceBundle *icustdbundle = ures_openDirect(NULL, U_ICU_STD_BUNDLE, &status); 27 if (U_SUCCESS(status)) { 28 result = TRUE; 29 } else { 30 result = FALSE; 31 } 32 33 ures_close(icustdbundle); 34 35 return result; 36 } 37 38 U_CAPI void U_EXPORT2 u_getDataVersion(UVersionInfo dataVersionFillin, UErrorCode *status) { 39 UResourceBundle *icudatares = NULL; 40 41 if (U_FAILURE(*status)) { 42 return; 43 } 44 45 if (dataVersionFillin != NULL) { 46 icudatares = ures_openDirect(NULL, U_ICU_VERSION_BUNDLE , status); 47 if (U_SUCCESS(*status)) { 48 ures_getVersionByKey(icudatares, U_ICU_DATA_KEY, dataVersionFillin, status); 49 } 50 ures_close(icudatares); 51 } 52 } 53 54 U_CAPI UBool U_EXPORT2 u_isDataOlder(UVersionInfo dataVersionFillin, UBool *isModifiedFillin, UErrorCode *status) { 55 UBool result = TRUE; 56 UVersionInfo dataVersion; 57 UVersionInfo wiredVersion; 58 59 if (U_FAILURE(*status)) { 60 return result; 61 } 62 63 u_getDataVersion(dataVersion, status); 64 if (U_SUCCESS(*status)) { 65 u_versionFromString(wiredVersion, U_ICU_DATA_VERSION); 66 67 if (uprv_memcmp(dataVersion, wiredVersion, sizeof(UVersionInfo)) >= 0) { 68 result = FALSE; 69 } 70 71 if (dataVersionFillin != NULL) { 72 uprv_memcpy(dataVersionFillin, dataVersion, sizeof(UVersionInfo)); 73 } 74 75 if (hasICUSTDBundle()) { 76 *isModifiedFillin = FALSE; 77 } else { 78 *isModifiedFillin = TRUE; 79 } 80 } 81 82 return result; 83 } 84