source: icXML/icXML-devel/src/xercesc/util/MsgLoaders/MsgCatalog/MsgCatalogLoader.cpp @ 2722

Last change on this file since 2722 was 2722, checked in by cameron, 6 years ago

Original Xerces files with import mods for icxercesc

File size: 7.2 KB
Line 
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*
19 * $Id: MsgCatalogLoader.cpp 614259 2008-01-22 16:59:21Z amassari $
20 */
21
22
23// ---------------------------------------------------------------------------
24//  Includes
25// ---------------------------------------------------------------------------
26#include <xercesc/util/XercesDefs.hpp>
27#include <icxercesc/util/PlatformUtils.hpp>
28#include <xercesc/util/XMLMsgLoader.hpp>
29#include <icxercesc/util/XMLString.hpp>
30#include <xercesc/util/XMLUniDefs.hpp>
31#include <xercesc/util/XMLUni.hpp>
32#include "MsgCatalogLoader.hpp"
33#include "XMLMsgCat_Ids.hpp"
34
35#include <locale.h>
36#include <stdlib.h>
37#include <stdio.h>
38#include <string.h>
39
40XERCES_CPP_NAMESPACE_BEGIN
41
42// ---------------------------------------------------------------------------
43//  Public Constructors and Destructor
44// ---------------------------------------------------------------------------
45MsgCatalogLoader::MsgCatalogLoader(const XMLCh* const msgDomain)
46:fCatalogHandle(0)
47,fMsgSet(0)
48{
49    if (!XMLString::equals(msgDomain, XMLUni::fgXMLErrDomain)
50    &&  !XMLString::equals(msgDomain, XMLUni::fgExceptDomain)
51    &&  !XMLString::equals(msgDomain, XMLUni::fgXMLDOMMsgDomain)
52    &&  !XMLString::equals(msgDomain, XMLUni::fgValidityDomain))
53    {
54        XMLPlatformUtils::panic(PanicHandler::Panic_UnknownMsgDomain);
55    }
56
57    // Prepare the path info
58    char locationBuf[1024];
59    memset(locationBuf, 0, sizeof locationBuf);
60    const char *nlsHome = XMLMsgLoader::getNLSHome();
61   
62    if (nlsHome)
63    {
64        strcpy(locationBuf, nlsHome);
65        strcat(locationBuf, "/");
66    }
67    else
68    {
69        nlsHome = getenv("XERCESC_NLS_HOME");
70        if (nlsHome)
71        {
72            strcpy(locationBuf, nlsHome);
73            strcat(locationBuf, "/");
74        }
75        else
76        {
77            nlsHome = getenv("XERCESCROOT");
78            if (nlsHome)
79            {                           
80                strcpy(locationBuf, nlsHome);
81                strcat(locationBuf, "/msg/");
82            }
83        }   
84    }
85   
86    // Prepare user-specified locale specific cat file
87    char catuser[1024];
88    memset(catuser, 0, sizeof catuser);
89    strcpy(catuser, locationBuf);
90    strcat(catuser, "XercesMessages_");
91    strcat(catuser, XMLMsgLoader::getLocale());
92    strcat(catuser, ".cat");
93       
94    char catdefault[1024];
95    memset(catdefault, 0, sizeof catdefault);
96    strcpy(catdefault, locationBuf);
97    strcat(catdefault, "XercesMessages_en_US.cat");
98
99   /**
100    * To open user-specified locale specific cat file
101    * and default cat file if necessary
102    */
103    if ( ((fCatalogHandle=catopen(catuser, 0)) == (nl_catd)-1) &&
104         ((fCatalogHandle=catopen(catdefault, 0)) == (nl_catd)-1)   )
105    {
106        // Probably have to call panic here
107        printf("Could not open catalog:\n %s\n or %s\n", catuser, catdefault);
108        XMLPlatformUtils::panic(PanicHandler::Panic_CantLoadMsgDomain);
109    }
110
111    if (XMLString::equals(msgDomain, XMLUni::fgXMLErrDomain))
112        fMsgSet = CatId_XMLErrs;
113    else if (XMLString::equals(msgDomain, XMLUni::fgExceptDomain))
114        fMsgSet = CatId_XMLExcepts;
115    else if (XMLString::equals(msgDomain, XMLUni::fgValidityDomain))
116        fMsgSet = CatId_XMLValid;
117    else if (XMLString::equals(msgDomain, XMLUni::fgXMLDOMMsgDomain))
118        fMsgSet = CatId_XMLDOMMsg;
119}
120
121MsgCatalogLoader::~MsgCatalogLoader()
122{
123    catclose(fCatalogHandle);   
124}
125
126
127// ---------------------------------------------------------------------------
128//  Implementation of the virtual message loader API
129// ---------------------------------------------------------------------------
130bool MsgCatalogLoader::loadMsg(const  XMLMsgLoader::XMLMsgId  msgToLoad
131                              ,       XMLCh*   const          toFill
132                              , const XMLSize_t               maxChars)
133{
134    char msgString[100];
135    sprintf(msgString, "Could not find message ID %d from message set %d\n", msgToLoad, fMsgSet);
136    char* catMessage = catgets( fCatalogHandle, fMsgSet, (int)msgToLoad, msgString);
137
138    // catgets returns a pointer to msgString if it fails to locate the message
139    // from the message catalog
140    if (XMLString::equals(catMessage, msgString))
141        return false;
142    else
143    {
144        XMLString::transcode(catMessage, toFill, maxChars);
145        return true;
146    }
147       
148}
149
150bool MsgCatalogLoader::loadMsg(const  XMLMsgLoader::XMLMsgId  msgToLoad
151                            ,       XMLCh* const            toFill
152                            , const XMLSize_t               maxChars
153                            , const XMLCh* const            repText1
154                            , const XMLCh* const            repText2
155                            , const XMLCh* const            repText3
156                            , const XMLCh* const            repText4
157                            , MemoryManager* const          manager)
158{
159    // Call the other version to load up the message
160    if (!loadMsg(msgToLoad, toFill, maxChars))
161        return false;
162
163    // And do the token replacement
164    XMLString::replaceTokens(toFill, maxChars, repText1, repText2, repText3, repText4, manager);
165    return true;
166}
167
168
169bool MsgCatalogLoader::loadMsg(const  XMLMsgLoader::XMLMsgId  msgToLoad
170                            ,       XMLCh* const            toFill
171                            , const XMLSize_t               maxChars
172                            , const char* const             repText1
173                            , const char* const             repText2
174                            , const char* const             repText3
175                            , const char* const             repText4
176                            , MemoryManager * const         manager) 
177{
178    //
179    //  Transcode the provided parameters and call the other version,
180    //  which will do the replacement work.
181    //
182    XMLCh* tmp1 = 0;
183    XMLCh* tmp2 = 0;
184    XMLCh* tmp3 = 0;
185    XMLCh* tmp4 = 0;   
186
187    bool bRet = false;
188    if (repText1)
189        tmp1 = XMLString::transcode(repText1, manager);
190    if (repText2)
191        tmp2 = XMLString::transcode(repText2, manager);
192    if (repText3)
193        tmp3 = XMLString::transcode(repText3, manager);
194    if (repText4)
195        tmp4 = XMLString::transcode(repText4, manager);
196
197    bRet = loadMsg(msgToLoad, toFill, maxChars, tmp1, tmp2, tmp3, tmp4, manager);
198
199    if (tmp1)
200        manager->deallocate(tmp1);//delete [] tmp1;
201    if (tmp2)
202        manager->deallocate(tmp2);//delete [] tmp2;
203    if (tmp3)
204        manager->deallocate(tmp3);//delete [] tmp3;
205    if (tmp4)
206        manager->deallocate(tmp4);//delete [] tmp4;
207
208    return bRet;
209}
210
211XERCES_CPP_NAMESPACE_END
Note: See TracBrowser for help on using the repository browser.