blob: 64b6c93efb85b0786b10c2598b6bbe65500eea7a [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: MsgLoader.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 "MsgLoader.hpp"
#include "XMLMessages.h"
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
#include <qmhrtvm.h>
#include <qusec.h>
XERCES_CPP_NAMESPACE_BEGIN
// ---------------------------------------------------------------------------
// Public Constructors and Destructor
// ---------------------------------------------------------------------------
MsgCatalogLoader::MsgCatalogLoader(const XMLCh* const msgDomain) :
fCatalogHandle(0)
, fMsgDomain(0)
{
fMsgDomain = XMLString::replicate(msgDomain, XMLPlatformUtils::fgMemoryManager);
}
MsgCatalogLoader::~MsgCatalogLoader()
{
XMLPlatformUtils::fgMemoryManager->deallocate(fMsgDomain);//delete[] fMsgDomain;
}
char* PackingRepText(const char * const repText1,
const char * const repText2,
const char * const repText3,
const char * const repText4,
int& totalsize)
{
short sizes[4];
char* reps[4];
char *buffer; // Allocate just what we need
char* anchor;
char temp[2];
reps[0] = (char*)repText1;
reps[1] = (char*)repText2;
reps[2] = (char*)repText3;
reps[3] = (char*)repText4;
int count = 0;
for(int i = 0; i < 4; i++)
if(reps[i] != NULL)
{ // Collect all the sizes and count how many we've got
sizes[i] = strlen(reps[i]);
totalsize += sizes[i]+2;
count++;
}
buffer = (char*)malloc(totalsize); // Allocate just what we need
anchor = buffer;
for(i = 0; i < count; i++) // Stuff everything into the buffer
{
memcpy(buffer, (void *)&sizes[i], sizeof(short));
buffer += sizeof(short);
memcpy(buffer, reps[i], sizes[i]);
buffer += sizes[i];
}
return anchor; // This guy is still holding the beginning of the buffer
}
// ---------------------------------------------------------------------------
// Implementation of the local retrieve message
// ---------------------------------------------------------------------------
bool localMsg(char * msgId
, XMLCh* const toFill
, const unsigned int maxChars
, char* repTexts
, int size)
{
typedef _Packed struct {
Qmh_Rtvm_RTVM0100_t mdata; /* Basic Message Data */
char mtext[1024]; /* Kind of arbitrary, enough? */
} MyMessage_t;
/* Information about the message that we're going to retrieve */
char msgformat[9] = "RTVM0100";
char msgfile[21] = "QXMLMSG *LIBL ";
char *msgsubstdta = repTexts; // ??
int msgsubstlen = 0;
if(repTexts)
msgsubstlen = size; //strlen(repTexts); // ??
char msgsubst[11] = "*YES ";
char msgfmtctl[11] = "*NO ";
Qus_EC_t errorcode;
MyMessage_t message; /* message we'll retrieve */
memset(&errorcode, 0, sizeof(errorcode)); /* Clear the error area */
errorcode.Bytes_Provided = sizeof(errorcode);/* Init the error code */
memset(&message, 0, sizeof(message.mdata)); /* Clear the message area */
message.mtext[0]='\0'; /* Null Text String */
int len = sizeof(message);
for(int i = 0; i < 1024; i++)
message.mtext[i] = '\0';
QMHRTVM( &message, len, msgformat, msgId,
msgfile, msgsubstdta, msgsubstlen, msgsubst, msgfmtctl, &errorcode); /*,
"*MSGID ", 1200, 1200); */
/* The error message should now be stored in message.mtext */
/* with the CCSID 1200 */
// char msgString[100];
// char* catMessage = catgets( fCatalogHandle, msgSet, (int)msgToLoad, msgString);
XMLString::transcode(message.mtext, toFill, maxChars);
return true;
}
// ---------------------------------------------------------------------------
// Implementation of the virtual message loader API
// ---------------------------------------------------------------------------
bool MsgCatalogLoader::loadMsg(const XMLMsgLoader::XMLMsgId msgToLoad
, XMLCh* const toFill
, const unsigned int maxChars)
{
char * msgId;
char * repTexts = NULL;
int size = 0;
if (XMLString::equals(fMsgDomain, XMLUni::fgXMLErrDomain))
{
if(msgToLoad < 7) // Warning messages
msgId = Warnings[msgToLoad - 2];
else // Fatal Errors
msgId = Errors[msgToLoad - 9];
}
else if (XMLString::equals(fMsgDomain, XMLUni::fgExceptDomain))
msgId = Exceptions[msgToLoad - 2];
else if (XMLString::equals(fMsgDomain, XMLUni::fgValidityDomain))
msgId = Invalid[msgToLoad - 2];
else if (XMLString::equals(fMsgDomain, XMLUni::fgXMLDOMMsgDomain))
msgId = DOMMsg[msgToLoad - 2];
if (!localMsg(msgId, toFill, maxChars, repTexts, size))
return false;
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)
{
char * msgId;
int size=0;
char* repTexts = PackingRepText(repText1, repText2, repText3, repText4, size);
if (XMLString::equals(fMsgDomain, XMLUni::fgXMLErrDomain))
{
if(msgToLoad < 7)
msgId = Warnings[msgToLoad - 2];
else
msgId = Errors[msgToLoad - 9];
}
else if (XMLString::equals(fMsgDomain, XMLUni::fgExceptDomain))
msgId = Exceptions[msgToLoad - 2];
else if (XMLString::equals(fMsgDomain, XMLUni::fgValidityDomain))
msgId = Invalid[msgToLoad - 2];
else if (XMLString::equals(fMsgDomain, XMLUni::fgXMLDOMMsgDomain))
msgId = DOMMsg[msgToLoad - 2];
// Call the other version to load up the message
// note that no one is deleting repTexts...
if (!localMsg(msgId, toFill, maxChars, repTexts, size))
return false;
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)
{
//
// Transcode the provided parameters and call the other version,
// which will do the replacement work.
//
char* tmp1 = 0;
char* tmp2 = 0;
char* tmp3 = 0;
char* 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