resbund_cnv.cpp   [plain text]


/*
*******************************************************************************
*
*   Copyright (C) 1997-2004, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*   file name:  resbund_cnv.cpp
*   encoding:   US-ASCII
*   tab size:   8 (not used)
*   indentation:4
*
*   created on: 2004aug25
*   created by: Markus W. Scherer
*
*   Character conversion functions moved here from resbund.cpp
*/

#include "unicode/utypes.h"
#include "unicode/resbund.h"
#include "uinvchar.h"

U_NAMESPACE_BEGIN

ResourceBundle::ResourceBundle( const UnicodeString&    path,
                                const Locale&           locale,
                                UErrorCode&              error)
                                :UObject(), fLocale(NULL)
{
    constructForLocale(path, locale, error);
}

ResourceBundle::ResourceBundle( const UnicodeString&    path,
                                UErrorCode&              error)
                                :UObject(), fLocale(NULL)
{
    constructForLocale(path, Locale::getDefault(), error);
}

void 
ResourceBundle::constructForLocale(const UnicodeString& path,
                                   const Locale& locale,
                                   UErrorCode& error)
{
    char name[300];

    if(path.length() >= (int32_t)sizeof(name)) {
        fResource = NULL;
        error = U_ILLEGAL_ARGUMENT_ERROR;
    } else if(!path.isEmpty()) {
        if(uprv_isInvariantUString(path.getBuffer(), path.length())) {
            // the invariant converter is sufficient for package and tree names
            // and is more efficient
            path.extract(0, INT32_MAX, name, (int32_t)sizeof(name), US_INV);
        } else {
#if !UCONFIG_NO_CONVERSION
            // use the default converter to support variant-character paths
            path.extract(name, sizeof(name), 0, error);
#else
            // the default converter is not available
            fResource = NULL;
            error = U_UNSUPPORTED_ERROR;
            return;
#endif
        }
        fResource = ures_open(name, locale.getName(), &error);
    } else {
        fResource = ures_open(0, locale.getName(), &error);
    }
}

U_NAMESPACE_END