blob: 5e275828e2d46568e284890a3894664992d3ca4f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id: MsgCatalogLoader.cpp 568078 2007-08-21 11:43:25Z amassari $
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <xercesc/util/XercesDefs.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLMsgLoader.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/XMLUni.hpp>
#include "MsgCatalogLoader.hpp"
#include "XMLMsgCat_Ids.hpp"
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
XERCES_CPP_NAMESPACE_BEGIN
// ---------------------------------------------------------------------------
// Public Constructors and Destructor
// ---------------------------------------------------------------------------
MsgCatalogLoader::MsgCatalogLoader(const XMLCh* const msgDomain)
:fCatalogHandle(0)
,fMsgSet(0)
{
if (!XMLString::equals(msgDomain, XMLUni::fgXMLErrDomain)
&& !XMLString::equals(msgDomain, XMLUni::fgExceptDomain)
&& !XMLString::equals(msgDomain, XMLUni::fgXMLDOMMsgDomain)
&& !XMLString::equals(msgDomain, XMLUni::fgValidityDomain))
{
XMLPlatformUtils::panic(PanicHandler::Panic_UnknownMsgDomain);
}
// Prepare the path info
char locationBuf[1024];
memset(locationBuf, 0, sizeof locationBuf);
const char *nlsHome = XMLMsgLoader::getNLSHome();
if (nlsHome)
{
strcpy(locationBuf, nlsHome);
strcat(locationBuf, "/");
}
else
{
nlsHome = getenv("XERCESC_NLS_HOME");
if (nlsHome)
{
strcpy(locationBuf, nlsHome);
strcat(locationBuf, "/");
}
else
{
nlsHome = getenv("XERCESCROOT");
if (nlsHome)
{
strcpy(locationBuf, nlsHome);
strcat(locationBuf, "/msg/");
}
}
}
// Prepare user-specified locale specific cat file
char catuser[1024];
memset(catuser, 0, sizeof catuser);
strcpy(catuser, locationBuf);
strcat(catuser, "XercesMessages_");
strcat(catuser, XMLMsgLoader::getLocale());
strcat(catuser, ".cat");
char catdefault[1024];
memset(catdefault, 0, sizeof catdefault);
strcpy(catdefault, locationBuf);
strcat(catdefault, "XercesMessages_en_US.cat");
/**
* To open user-specified locale specific cat file
* and default cat file if necessary
*/
if ( ((int)(fCatalogHandle=catopen(catuser, 0)) == -1) &&
((int)(fCatalogHandle=catopen(catdefault, 0)) == -1) )
{
// Probably have to call panic here
printf("Could not open catalog:\n %s\n or %s\n", catuser, catdefault);
XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
}
if (XMLString::equals(msgDomain, XMLUni::fgXMLErrDomain))
fMsgSet = CatId_XMLErrs;
else if (XMLString::equals(msgDomain, XMLUni::fgExceptDomain))
fMsgSet = CatId_XMLExcepts;
else if (XMLString::equals(msgDomain, XMLUni::fgValidityDomain))
fMsgSet = CatId_XMLValid;
else if (XMLString::equals(msgDomain, XMLUni::fgXMLDOMMsgDomain))
fMsgSet = CatId_XMLDOMMsg;
}
MsgCatalogLoader::~MsgCatalogLoader()
{
catclose(fCatalogHandle);
}
// ---------------------------------------------------------------------------
// Implementation of the virtual message loader API
// ---------------------------------------------------------------------------
bool MsgCatalogLoader::loadMsg(const XMLMsgLoader::XMLMsgId msgToLoad
, XMLCh* const toFill
, const unsigned int maxChars)
{
char msgString[100];
sprintf(msgString, "Could not find message ID %d from message set %d\n", msgToLoad, fMsgSet);
char* catMessage = catgets( fCatalogHandle, fMsgSet, (int)msgToLoad, msgString);
// catgets returns a pointer to msgString if it fails to locate the message
// from the message catalog
if (XMLString::equals(catMessage, msgString))
return false;
else
{
XMLString::transcode(catMessage, toFill, maxChars);
return true;
}
}
bool MsgCatalogLoader::loadMsg(const XMLMsgLoader::XMLMsgId msgToLoad
, XMLCh* const toFill
, const unsigned int maxChars
, const XMLCh* const repText1
, const XMLCh* const repText2
, const XMLCh* const repText3
, const XMLCh* const repText4
, MemoryManager* const manager)
{
// Call the other version to load up the message
if (!loadMsg(msgToLoad, toFill, maxChars))
return false;
// And do the token replacement
XMLString::replaceTokens(toFill, maxChars, repText1, repText2, repText3, repText4, manager);
return true;
}
bool MsgCatalogLoader::loadMsg(const XMLMsgLoader::XMLMsgId msgToLoad
, XMLCh* const toFill
, const unsigned int maxChars
, const char* const repText1
, const char* const repText2
, const char* const repText3
, const char* const repText4
, MemoryManager * const manager)
{
//
// Transcode the provided parameters and call the other version,
// which will do the replacement work.
//
XMLCh* tmp1 = 0;
XMLCh* tmp2 = 0;
XMLCh* tmp3 = 0;
XMLCh* tmp4 = 0;
bool bRet = false;
if (repText1)
tmp1 = XMLString::transcode(repText1, manager);
if (repText2)
tmp2 = XMLString::transcode(repText2, manager);
if (repText3)
tmp3 = XMLString::transcode(repText3, manager);
if (repText4)
tmp4 = XMLString::transcode(repText4, manager);
bRet = loadMsg(msgToLoad, toFill, maxChars, tmp1, tmp2, tmp3, tmp4, manager);
if (tmp1)
manager->deallocate(tmp1);//delete [] tmp1;
if (tmp2)
manager->deallocate(tmp2);//delete [] tmp2;
if (tmp3)
manager->deallocate(tmp3);//delete [] tmp3;
if (tmp4)
manager->deallocate(tmp4);//delete [] tmp4;
return bRet;
}
XERCES_CPP_NAMESPACE_END