msgloader.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 266 行

CPP
266
字号
/* * 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,v 1.8 2004/09/08 13:56:34 peiyongz Exp $ */// ---------------------------------------------------------------------------//  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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?