⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messageloader.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include <Pegasus/Common/MessageLoader.h>#include <Pegasus/Common/Thread.h>#include <Pegasus/Common/Tracer.h>#include <Pegasus/Common/Constants.h>#include <Pegasus/Common/CommonUTF.h>#include <Pegasus/Common/FileSystem.h>#include <Pegasus/Common/LanguageParser.h>#include <iostream>#ifdef PEGASUS_OS_OS400#include "EBCDIC_OS400.h"#endifPEGASUS_NAMESPACE_BEGINPEGASUS_USING_STD;static const int ID_INVALID = -1;static const String server_resbundl_name = "pegasus/pegasusServer";String MessageLoader::pegasus_MSG_HOME;Boolean MessageLoader::_useProcessLocale = false;Boolean MessageLoader::_useDefaultMsg = false;AcceptLanguageList MessageLoader::_acceptlanguages;String MessageLoader::getMessage(MessageLoaderParms& parms){    PEG_METHOD_ENTER(TRC_L10N, "MessageLoader::getMessage");    String msg;    try    {        openMessageFile(parms);        msg = getMessage2(parms);        closeMessageFile(parms);    }    catch (Exception&)    {        msg = String("AN INTERNAL ERROR OCCURED IN MESSAGELOADER: ").append(            parms.default_msg);    }    PEG_METHOD_EXIT();    return msg;}String MessageLoader::getMessage2(MessageLoaderParms& parms){    PEG_METHOD_ENTER(TRC_L10N, "MessageLoader::getMessage2");    String msg;    try    {#if defined (PEGASUS_HAS_MESSAGES) && defined (PEGASUS_HAS_ICU)        if (!_useDefaultMsg && (parms._resbundl != NO_ICU_MAGIC))        {            msg = extractICUMessage(parms._resbundl,parms);            if (msg.size() > 0)            {                PEG_METHOD_EXIT();                return msg;            }        }#endif        // NOTE: the default message is returned if:        // 1) The previous call to openMessageFile() set _useDefaultMsg        // 2) parms._resbundl is set to NO_ICU_MAGIC from a previous        //    call to openMessageFile() indicating an error        //    (including InitializeICU::initICUSuccessful() failed)        // 3) Message loading is DISABLED        // 4) Did not get a message from ICU        msg = formatDefaultMessage(parms);    }    catch (Exception&)    {        msg = String("AN INTERNAL ERROR OCCURED IN MESSAGELOADER: ").append(            parms.default_msg);    }    PEG_METHOD_EXIT();    return msg;}void MessageLoader::openMessageFile(MessageLoaderParms& parms){    PEG_METHOD_ENTER(TRC_L10N, "MessageLoader::openMessageFile");    try    {        parms.contentlanguages.clear();#if defined (PEGASUS_HAS_MESSAGES) && defined (PEGASUS_HAS_ICU)        if (InitializeICU::initICUSuccessful())        {            openICUMessageFile(parms);        }        // If initICUSuccessful() has returned false, then        // _resbundl is still set to NO_ICU_MAGIC and        // subsequent calls to getMessage2 will call        // formatDefaultMessage() instead of using ICU.#else        // Set _resbundl to the "magic number" indicating there is no ICU        // resource bundle to use        parms._resbundl = NO_ICU_MAGIC;#endif    }    catch (Exception&)    {        // Set _resbundl to the "magic number" indicating there was trouble        // during openICUMessageFile(), so there is no ICU resource bundle        // to use.        parms._resbundl = NO_ICU_MAGIC;    }    PEG_METHOD_EXIT();    return;}void MessageLoader::closeMessageFile(MessageLoaderParms& parms){    PEG_METHOD_ENTER(TRC_L10N, "MessageLoader::closeMessageFile");#if defined (PEGASUS_HAS_MESSAGES) && defined (PEGASUS_HAS_ICU)    if (parms._resbundl != NO_ICU_MAGIC)    {        ures_close(parms._resbundl);    }#endif    PEG_METHOD_EXIT();    return;}#ifdef PEGASUS_HAS_ICUvoid MessageLoader::openICUMessageFile(MessageLoaderParms &parms){    PEG_METHOD_ENTER(TRC_L10N, "MessageLoader::openICUMessageFile");    UErrorCode status = U_ZERO_ERROR;    CString resbundl_path_ICU;    const int size_locale_ICU = 50;    // the static AcceptLangauges takes precedence over what    // parms.acceptlangauges has    AcceptLanguageList acceptlanguages;    acceptlanguages = (_acceptlanguages.size() > 0) ?        _acceptlanguages : parms.acceptlanguages;    // get the correct path to the resource bundles    resbundl_path_ICU = getQualifiedMsgPath(parms.msg_src_path).getCString();    //cout << "USING PACKAGE PATH: " << endl;    //cout << resbundl_path_ICU << endl;    PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4, "Using resource bundle path:");    PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4, resbundl_path_ICU);#ifdef PEGASUS_OS_OS400    const char *atoe = resbundl_path_ICU;    AtoE((char*)atoe);#endif    if (_useProcessLocale ||        (acceptlanguages.size() == 0 && parms.useProcessLocale))    {        // use the system default resource bundle        parms._resbundl = ures_open(            (const char*)resbundl_path_ICU, uloc_getDefault(), &status);        if (U_SUCCESS(status))        {            UErrorCode _status = U_ZERO_ERROR;            PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4, "Using process locale:");            PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                ures_getLocale(parms._resbundl, &_status));            if (status == U_USING_FALLBACK_WARNING ||                status == U_USING_DEFAULT_WARNING)            {                PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                    "Using process locale fallback or default");            }            const char * _locale = ures_getLocale(parms._resbundl,&status);#ifdef PEGASUS_OS_OS400            char tmplcl[size_locale_ICU];            strcpy(tmplcl, _locale);            EtoA(tmplcl);            String localeStr(tmplcl);#else            String localeStr(_locale);#endif			// The "root" locale indicates that an ICU message bundle is not present			// for the current locale setting.            if (localeStr != "root")            {                parms.contentlanguages.append(LanguageTag(                    LanguageParser::convertLocaleIdToLanguageTag(localeStr)));            }        }        else        {            PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                "Using process locale.  Could not open resource, "                    "formatting default message.");            // magic number to indicate no ICU resource bundle to use            parms._resbundl = NO_ICU_MAGIC;        }        PEG_METHOD_EXIT();        return;    }    else if (acceptlanguages.size() == 0 && parms.useThreadLocale)    {        // get AcceptLanguageList from the current Thread        AcceptLanguageList *al = Thread::getLanguages();        if (al != NULL)        {            acceptlanguages = *al;            PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                "Using thread locale: got AcceptLanguageList from thread.");        }        else        {            PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                "Using thread locale: thread returned NULL for "                    "AcceptLanguageList.");        }    }    char locale_ICU[size_locale_ICU];    LanguageTag languageTag;    // iterate through AcceptLanguageList, use the first resource bundle match    PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,        "Looping through AcceptLanguageList...");    for (Uint32 index = 0; index < acceptlanguages.size(); index++)    {        languageTag = acceptlanguages.getLanguageTag(index);#ifdef PEGASUS_OS_OS400        CString cstr = languageTag.toString().getCString();        const char *atoe = cstr;        AtoE((char*)atoe);        uloc_getName(atoe, locale_ICU, size_locale_ICU, &status);#else        uloc_getName(            (const char*)(languageTag.toString()).getCString(),            locale_ICU, size_locale_ICU, &status);#endif        // TODO: check to see if we have previously cached the resource bundle        parms._resbundl =            ures_open((const char*)resbundl_path_ICU, locale_ICU, &status);        if (U_SUCCESS(status))        {            PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                "ACCEPTLANGUAGES LOOP: opened resource bundle with:");            PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4, languageTag.toString());            if (status == U_USING_FALLBACK_WARNING ||                status == U_USING_DEFAULT_WARNING)            {                // we want to use the ICU fallback behaviour in the following                // cases ONLY                PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                    "ACCEPTLANGUAGES LOOP: ICU warns using FALLBACK or "                        "DEFAULT");                if ((acceptlanguages.size() == 1) && (!parms.useICUfallback) &&                    (status == U_USING_DEFAULT_WARNING))                {                    // in this case we want to return messages from the root                    // bundle                    status = U_ZERO_ERROR;                    PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                        "acceptlang.size =1 && !parms.useICUfallback && "                            "U_USING_DEFAULT_WARNING, using root bundle.");                    // Reopen the bundle in the root locale                    ures_close(parms._resbundl);                    parms._resbundl = ures_open(                        (const char*)resbundl_path_ICU, "", &status);                    if (U_SUCCESS(status))                    {                        PEG_METHOD_EXIT();                        return;                    }                }                else if (acceptlanguages.size() == 1 || parms.useICUfallback)                {                    PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                        "ACCEPTLANGUAGES LOOP: acceptlanguages.size == 1 or "                            "useICUfallback true, using ICU fallback "                            "behaviour...");                    const char* _locale =                        ures_getLocale(parms._resbundl, &status);#ifdef PEGASUS_OS_OS400                    char tmplcl[size_locale_ICU];                    strcpy(tmplcl, _locale);                    EtoA(tmplcl);                    String localeStr(tmplcl);#else                    String localeStr(_locale);#endif					// The "root" locale indicates that an ICU message bundle is not present					// for the current locale setting.                    if (localeStr != "root")                    {                        parms.contentlanguages.append(LanguageTag(                            LanguageParser::convertLocaleIdToLanguageTag(                                localeStr)));                    }                    PEG_METHOD_EXIT();                    return;                }            }            else            {                // we found an exact resource bundle match, extract, and set                // ContentLanguage                PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                    "ACCEPTLANGUAGES LOOP: found an EXACT resource bundle "                        "MATCH:");                PEG_TRACE_STRING(TRC_L10N, Tracer::LEVEL4,                    languageTag.toString());                parms.contentlanguages.append(                    LanguageTag(languageTag.toString()));                PEG_METHOD_EXIT();                return;            }        }        else        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -