/* * Copyright 1999-2000,2004 The Apache Software Foundation. * * Licensed 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 176026 2004-09-08 13:57:07Z peiyongz $ */ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- #include #include #include #include #include #include #include "MsgLoader.hpp" #include "XMLMessages.h" #include #include #include #include #include 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