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

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

Fixes for icXML 0.9

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