source: icXML/icXML-devel/src/xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.cpp @ 2777

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

Set up to use xercesc/icxercesc root-relative paths for all includes

File size: 6.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: InMemMsgLoader.cpp 570552 2007-08-28 19:57:36Z amassari $
20 */
21
22
23// ---------------------------------------------------------------------------
24//  Includes
25// ---------------------------------------------------------------------------
26#include <xercesc/util/BitOps.hpp>
27#include <icxercesc/util/PlatformUtils.hpp>
28#include <xercesc/util/XMLMsgLoader.hpp>
29#include <icxercesc/util/XMLString.hpp>
30#include <xercesc/util/XMLUni.hpp>
31#include <xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.hpp>
32#include <xercesc/util/MsgLoaders/InMemory/XercesMessages_en_US.hpp>
33
34XERCES_CPP_NAMESPACE_BEGIN
35
36// ---------------------------------------------------------------------------
37//  Public Constructors and Destructor
38// ---------------------------------------------------------------------------
39InMemMsgLoader::InMemMsgLoader(const XMLCh* const msgDomain)
40:fMsgDomain(0)
41{
42    if (!XMLString::equals(msgDomain, XMLUni::fgXMLErrDomain)
43    &&  !XMLString::equals(msgDomain, XMLUni::fgExceptDomain)
44    &&  !XMLString::equals(msgDomain, XMLUni::fgXMLDOMMsgDomain)
45    &&  !XMLString::equals(msgDomain, XMLUni::fgValidityDomain))
46    {
47        XMLPlatformUtils::panic(PanicHandler::Panic_UnknownMsgDomain);
48    }
49
50    fMsgDomain = XMLString::replicate(msgDomain, XMLPlatformUtils::fgMemoryManager);
51}
52
53InMemMsgLoader::~InMemMsgLoader()
54{
55    XMLPlatformUtils::fgMemoryManager->deallocate(fMsgDomain);//delete [] fMsgDomain;
56}
57
58
59// ---------------------------------------------------------------------------
60//  Implementation of the virtual message loader API
61// ---------------------------------------------------------------------------
62bool InMemMsgLoader::loadMsg(const  XMLMsgLoader::XMLMsgId  msgToLoad
63                            ,       XMLCh* const            toFill
64                            , const XMLSize_t               maxChars)
65{
66    //
67    //  Just use the id to map into the correct array of messages. Then
68    //  copy that to the caller's buffer.
69    //
70    //  NOTE:   The source text is in little endian form. So, if we are a
71    //          big endian machine, flip them in the process.
72    //
73    XMLCh* endPtr = toFill + maxChars;
74    XMLCh* outPtr = toFill;
75    const XMLCh* srcPtr = 0;
76
77    if (XMLString::equals(fMsgDomain, XMLUni::fgXMLErrDomain))
78    {
79        if ( msgToLoad > gXMLErrArraySize)
80            return false;
81        else
82            srcPtr = gXMLErrArray[msgToLoad - 1];
83    }
84     else if (XMLString::equals(fMsgDomain, XMLUni::fgExceptDomain))
85    {
86         if ( msgToLoad > gXMLExceptArraySize)
87            return false;
88         else
89             srcPtr = gXMLExceptArray[msgToLoad - 1];
90    }
91     else if (XMLString::equals(fMsgDomain, XMLUni::fgValidityDomain))
92    {
93         if ( msgToLoad > gXMLValidityArraySize)
94            return false;
95         else
96             srcPtr = gXMLValidityArray[msgToLoad - 1];
97    }
98     else if (XMLString::equals(fMsgDomain, XMLUni::fgXMLDOMMsgDomain))
99    {
100         if ( msgToLoad > gXMLDOMMsgArraySize)
101            return false;
102         else
103             srcPtr = gXMLDOMMsgArray[msgToLoad - 1];
104    }
105
106     while (*srcPtr && (outPtr < endPtr))
107     {
108         *outPtr++ = *srcPtr++;
109     }
110     *outPtr = 0;
111
112     return true;
113}
114
115
116bool InMemMsgLoader::loadMsg(const  XMLMsgLoader::XMLMsgId  msgToLoad
117                            ,       XMLCh* const            toFill
118                            , const XMLSize_t               maxChars
119                            , const XMLCh* const            repText1
120                            , const XMLCh* const            repText2
121                            , const XMLCh* const            repText3
122                            , const XMLCh* const            repText4
123                            , MemoryManager* const          manager)
124{
125    // Call the other version to load up the message
126    if (!loadMsg(msgToLoad, toFill, maxChars))
127        return false;
128
129    // And do the token replacement
130    XMLString::replaceTokens(toFill, maxChars, repText1, repText2, repText3, repText4, manager);
131    return true;
132}
133
134
135bool InMemMsgLoader::loadMsg(const  XMLMsgLoader::XMLMsgId  msgToLoad
136                            ,       XMLCh* const            toFill
137                            , const XMLSize_t               maxChars
138                            , const char* const             repText1
139                            , const char* const             repText2
140                            , const char* const             repText3
141                            , const char* const             repText4
142                            , MemoryManager * const         manager) 
143{
144    //
145    //  Transcode the provided parameters and call the other version,
146    //  which will do the replacement work.
147    //
148    XMLCh* tmp1 = 0;
149    XMLCh* tmp2 = 0;
150    XMLCh* tmp3 = 0;
151    XMLCh* tmp4 = 0;
152   
153    bool bRet = false;
154    if (repText1)
155        tmp1 = XMLString::transcode(repText1, manager);
156    if (repText2)
157        tmp2 = XMLString::transcode(repText2, manager);
158    if (repText3)
159        tmp3 = XMLString::transcode(repText3, manager);
160    if (repText4)
161        tmp4 = XMLString::transcode(repText4, manager);
162
163    bRet = loadMsg(msgToLoad, toFill, maxChars, tmp1, tmp2, tmp3, tmp4, manager);
164
165    if (tmp1)
166        manager->deallocate(tmp1);//delete [] tmp1;
167    if (tmp2)
168        manager->deallocate(tmp2);//delete [] tmp2;
169    if (tmp3)
170        manager->deallocate(tmp3);//delete [] tmp3;
171    if (tmp4)
172        manager->deallocate(tmp4);//delete [] tmp4;
173
174    return bRet;
175}
176
177XERCES_CPP_NAMESPACE_END
Note: See TracBrowser for help on using the repository browser.