Home | History | Annotate | Download | only in ctestfw
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 2002-2006, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 
      7 /* Created by weiv 05/09/2002 */
      8 
      9 #include "unicode/datamap.h"
     10 #include "unicode/resbund.h"
     11 #include "hash.h"
     12 #include <stdlib.h>
     13 
     14 DataMap::~DataMap() {}
     15 DataMap::DataMap() {}
     16 
     17 int32_t
     18 DataMap::utoi(const UnicodeString &s) const
     19 {
     20   char ch[256];
     21   const UChar *u = s.getBuffer();
     22   int32_t len = s.length();
     23   u_UCharsToChars(u, ch, len);
     24   ch[len] = 0; /* include terminating \0 */
     25   return atoi(ch);
     26 }
     27 
     28 U_CDECL_BEGIN
     29 void U_CALLCONV
     30 deleteResBund(void *obj) {
     31   delete (ResourceBundle *)obj;
     32 }
     33 U_CDECL_END
     34 
     35 
     36 RBDataMap::~RBDataMap()
     37 {
     38   delete fData;
     39 }
     40 
     41 RBDataMap::RBDataMap()
     42 {
     43   UErrorCode status = U_ZERO_ERROR;
     44   fData = new Hashtable(TRUE, status);
     45   fData->setValueDeleter(deleteResBund);
     46 }
     47 
     48 // init from table resource
     49 // will put stuff in hashtable according to
     50 // keys.
     51 RBDataMap::RBDataMap(UResourceBundle *data, UErrorCode &status)
     52 {
     53   fData = new Hashtable(TRUE, status);
     54   fData->setValueDeleter(deleteResBund);
     55   init(data, status);
     56 }
     57 
     58 // init from headers and resource
     59 // with checking the whether the size of resource matches
     60 // header size
     61 RBDataMap::RBDataMap(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status)
     62 {
     63   fData = new Hashtable(TRUE, status);
     64   fData->setValueDeleter(deleteResBund);
     65   init(headers, data, status);
     66 }
     67 
     68 
     69 void RBDataMap::init(UResourceBundle *data, UErrorCode &status) {
     70   int32_t i = 0;
     71   fData->removeAll();
     72   UResourceBundle *t = NULL;
     73   for(i = 0; i < ures_getSize(data); i++) {
     74     t = ures_getByIndex(data, i, t, &status);
     75     fData->put(UnicodeString(ures_getKey(t), -1, US_INV), new ResourceBundle(t, status), status);
     76   }
     77   ures_close(t);
     78 }
     79 
     80 void RBDataMap::init(UResourceBundle *headers, UResourceBundle *data, UErrorCode &status)
     81 {
     82   int32_t i = 0;
     83   fData->removeAll();
     84   UResourceBundle *t = NULL;
     85   const UChar *key = NULL;
     86   int32_t keyLen = 0;
     87   if(ures_getSize(headers) == ures_getSize(data)) {
     88     for(i = 0; i < ures_getSize(data); i++) {
     89       t = ures_getByIndex(data, i, t, &status);
     90       key = ures_getStringByIndex(headers, i, &keyLen, &status);
     91       fData->put(UnicodeString(key, keyLen), new ResourceBundle(t, status), status);
     92     }
     93   } else {
     94     // error
     95     status = U_INVALID_FORMAT_ERROR;
     96   }
     97   ures_close(t);
     98 }
     99 
    100 const ResourceBundle *RBDataMap::getItem(const char* key, UErrorCode &status) const
    101 {
    102   if(U_FAILURE(status)) {
    103     return NULL;
    104   }
    105 
    106   UnicodeString hashKey(key, -1, US_INV);
    107   const ResourceBundle *r = (ResourceBundle *)fData->get(hashKey);
    108   if(r != NULL) {
    109     return r;
    110   } else {
    111     status = U_MISSING_RESOURCE_ERROR;
    112     return NULL;
    113   }
    114 }
    115 
    116 const UnicodeString RBDataMap::getString(const char* key, UErrorCode &status) const
    117 {
    118   const ResourceBundle *r = getItem(key, status);
    119   if(U_SUCCESS(status)) {
    120     return r->getString(status);
    121   } else {
    122     return UnicodeString();
    123   }
    124 }
    125 
    126 int32_t
    127 RBDataMap::getInt28(const char* key, UErrorCode &status) const
    128 {
    129   const ResourceBundle *r = getItem(key, status);
    130   if(U_SUCCESS(status)) {
    131     return r->getInt(status);
    132   } else {
    133     return 0;
    134   }
    135 }
    136 
    137 uint32_t
    138 RBDataMap::getUInt28(const char* key, UErrorCode &status) const
    139 {
    140   const ResourceBundle *r = getItem(key, status);
    141   if(U_SUCCESS(status)) {
    142     return r->getUInt(status);
    143   } else {
    144     return 0;
    145   }
    146 }
    147 
    148 const int32_t *
    149 RBDataMap::getIntVector(int32_t &length, const char *key, UErrorCode &status) const {
    150   const ResourceBundle *r = getItem(key, status);
    151   if(U_SUCCESS(status)) {
    152     return r->getIntVector(length, status);
    153   } else {
    154     return NULL;
    155   }
    156 }
    157 
    158 const uint8_t *
    159 RBDataMap::getBinary(int32_t &length, const char *key, UErrorCode &status) const {
    160   const ResourceBundle *r = getItem(key, status);
    161   if(U_SUCCESS(status)) {
    162     return r->getBinary(length, status);
    163   } else {
    164     return NULL;
    165   }
    166 }
    167 
    168 int32_t RBDataMap::getInt(const char* key, UErrorCode &status) const
    169 {
    170   UnicodeString r = this->getString(key, status);
    171   if(U_SUCCESS(status)) {
    172     return utoi(r);
    173   } else {
    174     return 0;
    175   }
    176 }
    177 
    178 const UnicodeString* RBDataMap::getStringArray(int32_t& count, const char* key, UErrorCode &status) const
    179 {
    180   const ResourceBundle *r = getItem(key, status);
    181   if(U_SUCCESS(status)) {
    182     int32_t i = 0;
    183 
    184     count = r->getSize();
    185     if(count <= 0) {
    186       return NULL;
    187     }
    188 
    189     UnicodeString *result = new UnicodeString[count];
    190     for(i = 0; i<count; i++) {
    191       result[i] = r->getStringEx(i, status);
    192     }
    193     return result;
    194   } else {
    195     return NULL;
    196   }
    197 }
    198 
    199 const int32_t* RBDataMap::getIntArray(int32_t& count, const char* key, UErrorCode &status) const
    200 {
    201   const ResourceBundle *r = getItem(key, status);
    202   if(U_SUCCESS(status)) {
    203     int32_t i = 0;
    204 
    205     count = r->getSize();
    206     if(count <= 0) {
    207       return NULL;
    208     }
    209 
    210     int32_t *result = new int32_t[count];
    211     UnicodeString stringRes;
    212     for(i = 0; i<count; i++) {
    213       stringRes = r->getStringEx(i, status);
    214       result[i] = utoi(stringRes);
    215     }
    216     return result;
    217   } else {
    218     return NULL;
    219   }
    220 }
    221 
    222