/*
*******************************************************************************
*
*   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() >= 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
