blob: 2a0642941a5bbc88395862402b25ea386ea69de6 [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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_l10ntools.hxx"
#include <iterator> /* std::iterator*/
#include <stdio.h>
#include <sal/alloca.h>
#include "xmlparse.hxx"
#include <fstream>
#include <iostream>
#include <osl/mutex.hxx>
#include <osl/thread.hxx>
#ifdef __MINGW32__
#include <tools/prewin.h>
#include <tools/postwin.h>
#endif
using namespace std;
using namespace osl;
//
// class XMLChildNode
//
/*****************************************************************************/
XMLChildNode::XMLChildNode( XMLParentNode *pPar )
/*****************************************************************************/
: pParent( pPar )
{
if ( pParent )
pParent->AddChild( this );
}
/*****************************************************************************/
XMLChildNode::XMLChildNode( const XMLChildNode& obj)
/*****************************************************************************/
: XMLNode(obj),
pParent(obj.pParent){}
/*****************************************************************************/
XMLChildNode& XMLChildNode::operator=(const XMLChildNode& obj){
/*****************************************************************************/
if(this != &obj){
pParent=obj.pParent;
}
return *this;
}
//
// class XMLParentNode
//
/*****************************************************************************/
XMLParentNode::~XMLParentNode()
/*****************************************************************************/
{
if( pChildList ){
RemoveAndDeleteAllChilds();
delete pChildList;
pChildList = NULL;
}
pChildList = NULL;
}
/*****************************************************************************/
XMLParentNode::XMLParentNode( const XMLParentNode& obj)
/*****************************************************************************/
: XMLChildNode( obj )
{
if( obj.pChildList ){
pChildList=new XMLChildNodeList();
XMLChildNode* pNode = NULL;
for ( sal_uLong i = 0; i < obj.pChildList->Count(); i++ ){
pNode = obj.pChildList->GetObject( i );
if( pNode != NULL){
switch(pNode->GetNodeType()){
case XML_NODE_TYPE_ELEMENT:
AddChild( new XMLElement( *static_cast<XMLElement* >(pNode) ) ); break;
case XML_NODE_TYPE_DATA:
AddChild( new XMLData ( *static_cast<XMLData* > (pNode) ) ); break;
case XML_NODE_TYPE_COMMENT:
AddChild( new XMLComment( *static_cast<XMLComment* >(pNode) ) ); break;
case XML_NODE_TYPE_DEFAULT:
AddChild( new XMLDefault( *static_cast<XMLDefault* >(pNode) ) ); break;
default: fprintf(stdout,"XMLParentNode::XMLParentNode( const XMLParentNode& obj) strange obj");
}
}
}
}else pChildList = NULL;
}
/*****************************************************************************/
XMLParentNode& XMLParentNode::operator=(const XMLParentNode& obj){
/*****************************************************************************/
if(this!=&obj){
XMLChildNode::operator=(obj);
if( pChildList ){
RemoveAndDeleteAllChilds();
delete pChildList;
pChildList = NULL;
}
if( obj.pChildList ){
pChildList=new XMLChildNodeList();
for ( sal_uLong i = 0; i < obj.pChildList->Count(); i++ )
AddChild( obj.pChildList->GetObject( i ) );
}else pChildList = NULL;
}
return *this;
}
/*****************************************************************************/
void XMLParentNode::AddChild( XMLChildNode *pChild )
/*****************************************************************************/
{
if ( !pChildList )
pChildList = new XMLChildNodeList();
pChildList->Insert( pChild, LIST_APPEND );
}
/*****************************************************************************/
void XMLParentNode::AddChild( XMLChildNode *pChild , int pos )
/*****************************************************************************/
{
if ( !pChildList )
pChildList = new XMLChildNodeList();
pChildList->Insert( pChild, pos );
}
/*****************************************************************************/
int XMLParentNode::GetPosition( ByteString id ){
/*****************************************************************************/
XMLElement* a;
static const ByteString sEnusStr = ByteString(String::CreateFromAscii(ENGLISH_US_ISO).ToLowerAscii() , RTL_TEXTENCODING_ASCII_US ).ToLowerAscii();
static const ByteString sDeStr = ByteString(String::CreateFromAscii(GERMAN_ISO2).ToLowerAscii() , RTL_TEXTENCODING_ASCII_US ).ToLowerAscii();
if ( pChildList ){
for ( sal_uLong i = 0; i < pChildList->Count(); i++ ) {
XMLChildNode *pChild = pChildList->GetObject( i );
if ( pChild->GetNodeType() == XML_NODE_TYPE_ELEMENT ){
a = static_cast<XMLElement* >(pChild);
ByteString elemid( a->GetId() );
elemid.ToLowerAscii();
if ( elemid.Equals( id.ToLowerAscii() ) ){
ByteString elemLID( a->GetLanguageId() );
elemLID.ToLowerAscii();
if( elemLID.Equals( sEnusStr) ) {
return i;
}
else if( elemLID.Equals( sDeStr) ) {
return i;
}
}
}
}
}
return -1;
}
/*****************************************************************************/
int XMLParentNode::RemoveChild( XMLElement *pRefElement )
/*****************************************************************************/
{
XMLElement* a;
if ( pChildList ){
for ( sal_uLong i = 0; i < pChildList->Count(); i++ ) {
XMLChildNode *pChild = pChildList->GetObject( i );
if ( pChild->GetNodeType() == XML_NODE_TYPE_ELEMENT ){
a = static_cast<XMLElement* >(pChild);
ByteString elemid( a->GetId() );
elemid.ToLowerAscii();
ByteString elemLID( a->GetLanguageId() );
elemLID.ToLowerAscii();
ByteString pRefLID( pRefElement->GetLanguageId() );
pRefLID.ToLowerAscii();
if ( elemid.Equals(pRefElement->GetId())
&& elemLID.Equals( pRefLID ) )
{
if( pRefElement->ToOString().compareTo( a->ToOString() )==0 ){
pChildList->Remove( i );
delete a; // Test
return i;
}
}
}
}
}
return -1;
}
/*****************************************************************************/
void XMLParentNode::RemoveAndDeleteAllChilds(){
/*****************************************************************************/
if ( pChildList ) {
for ( sal_uLong i = 0; i < pChildList->Count(); i++ )
delete pChildList->GetObject( i );
pChildList->Clear();
}
}
/*****************************************************************************/
XMLElement *XMLParentNode::GetChildElement( XMLElement *pRefElement )
/*****************************************************************************/
{
for ( sal_uLong i = 0; i < pChildList->Count(); i++ ) {
XMLChildNode *pChild = pChildList->GetObject( i );
if ( pChild->GetNodeType() == XML_NODE_TYPE_ELEMENT )
if ((( XMLElement * ) pChild )->GetName() ==
pRefElement->GetName())
{
XMLAttributeList *pList = pRefElement->GetAttributeList();
if ( !pList )
return ( XMLElement * ) pChild;
sal_Bool bMatch = sal_False;
for ( sal_uLong j = 0; j < pList->Count() && bMatch; j++ ) {
XMLAttribute *pAttribute = pList->GetObject( j );
XMLAttribute *pCandidate =
(( XMLElement * ) pChild )->GetAttribute(
*pAttribute );
if ( !pCandidate || !pAttribute->IsEqual( *pCandidate ))
bMatch = sal_False;
}
if ( bMatch )
return ( XMLElement * ) pChild;
}
}
return NULL;
}
//
// class XMLFile
//
/*****************************************************************************/
sal_uInt16 XMLFile::GetNodeType()
/*****************************************************************************/
{
return XML_NODE_TYPE_FILE;
}
/*****************************************************************************/
sal_Bool XMLFile::Write( ByteString &aFilename )
/*****************************************************************************/
{
if ( aFilename.Len()) {
// retry harder if there is a NFS problem,
for( int x = 1 ; x < 3 ; x++ ){ // this looks strange...yes!
ofstream aFStream( aFilename.GetBuffer() , ios::out | ios::trunc );
if( !aFStream ) // From time to time the stream can not be opened the first time on NFS volumes,
{ // I wasn't able to track this down. I think this is an NFS issue .....
//cerr << "ERROR: - helpex - Can't write to tempfile " << aFilename.GetBuffer() << " No#" << x << "\n";
TimeValue aTime;
aTime.Seconds = 3;
aTime.Nanosec = 0;
osl::Thread::wait( aTime );
}
else
{
// write out
Write( aFStream );
aFStream.close();
// check!
DirEntry aTarget( aFilename );
FileStat aFileStat( aTarget );
if( aFileStat.GetSize() < 1 )
{
//retry
//cerr << "WARNING: - helpex - Can't create file " << aFilename.GetBuffer() << " No#" << x << "\n";
aTarget.Kill();
}
else
{
//everything ok!
return true;
}
}
}
cerr << "ERROR: - helpex - Can't create file " << aFilename.GetBuffer() << "\nPossible reason: Disk full ? Mounted NFS volume broken ? Wrong permissions ?\n";
exit( -1 );
}
cerr << "ERROR: - helpex - Empty file name\n";
exit( -1 );
}
void XMLFile::WriteString( ofstream &rStream, const String &sString )
{
ByteString sText( sString, RTL_TEXTENCODING_UTF8 );
rStream << sText.GetBuffer();
}
sal_Bool XMLFile::Write( ofstream &rStream , XMLNode *pCur )
{
XMLUtil& xmlutil = XMLUtil::Instance();
(void) xmlutil;
if ( !pCur )
Write( rStream, this );
else {
switch( pCur->GetNodeType()) {
case XML_NODE_TYPE_FILE: {
if( GetChildList())
for ( sal_uLong i = 0; i < GetChildList()->Count(); i++ )
Write( rStream, GetChildList()->GetObject( i ));
}
break;
case XML_NODE_TYPE_ELEMENT: {
XMLElement *pElement = ( XMLElement * ) pCur;
rStream << "<";
WriteString( rStream, pElement->GetName());
if ( pElement->GetAttributeList())
for ( sal_uLong j = 0; j < pElement->GetAttributeList()->Count(); j++ ) {
rStream << " ";
String sData(*pElement->GetAttributeList()->GetObject( j ));
xmlutil.QuotHTML( sData );
WriteString( rStream , sData );
rStream << "=\"";
sData=pElement->GetAttributeList()->GetObject( j )->GetValue();
xmlutil.QuotHTML( sData );
WriteString( rStream , sData );
rStream << "\"";
}
if ( !pElement->GetChildList())
rStream << "/>";
else {
rStream << ">";
for ( sal_uLong k = 0; k < pElement->GetChildList()->Count(); k++ )
Write( rStream, pElement->GetChildList()->GetObject( k ));
rStream << "</";
WriteString( rStream, pElement->GetName());
rStream << ">";
}
}
break;
case XML_NODE_TYPE_DATA: {
XMLData *pData = ( XMLData * ) pCur;
String sData( pData->GetData());
xmlutil.QuotHTML( sData );
WriteString( rStream, sData );
}
break;
case XML_NODE_TYPE_COMMENT: {
XMLComment *pComment = ( XMLComment * ) pCur;
rStream << "<!--";
WriteString( rStream, pComment->GetComment());
rStream << "-->";
}
break;
case XML_NODE_TYPE_DEFAULT: {
XMLDefault *pDefault = ( XMLDefault * ) pCur;
WriteString( rStream, pDefault->GetDefault());
}
break;
}
}
return sal_True;
}
void XMLFile::Print( XMLNode *pCur, sal_uInt16 nLevel )
{
if ( !pCur )
Print( this );
else {
switch( pCur->GetNodeType()) {
case XML_NODE_TYPE_FILE: {
if( GetChildList())
for ( sal_uLong i = 0; i < GetChildList()->Count(); i++ )
Print( GetChildList()->GetObject( i ));
}
break;
case XML_NODE_TYPE_ELEMENT: {
XMLElement *pElement = ( XMLElement * ) pCur;
fprintf( stdout, "<%s", ByteString( pElement->GetName(), RTL_TEXTENCODING_UTF8 ).GetBuffer());
if ( pElement->GetAttributeList())
for ( sal_uLong j = 0; j < pElement->GetAttributeList()->Count(); j++ ){
ByteString aAttrName( *pElement->GetAttributeList()->GetObject( j ), RTL_TEXTENCODING_UTF8 );
if( !aAttrName.EqualsIgnoreCaseAscii( XML_LANG ) ) {
fprintf( stdout, " %s=\"%s\"",
aAttrName.GetBuffer(),
ByteString( pElement->GetAttributeList()->GetObject( j )->GetValue(),
RTL_TEXTENCODING_UTF8 ).GetBuffer());
}
}
if ( !pElement->GetChildList())
fprintf( stdout, "/>" );
else {
fprintf( stdout, ">" );
for ( sal_uLong k = 0; k < pElement->GetChildList()->Count(); k++ )
Print( pElement->GetChildList()->GetObject( k ), nLevel + 1 );
fprintf( stdout, "</%s>", ByteString( pElement->GetName(), RTL_TEXTENCODING_UTF8 ).GetBuffer());
}
}
break;
case XML_NODE_TYPE_DATA: {
XMLData *pData = ( XMLData * ) pCur;
String sData = pData->GetData();
fprintf( stdout, "%s", ByteString( sData, RTL_TEXTENCODING_UTF8 ).GetBuffer());
}
break;
case XML_NODE_TYPE_COMMENT: {
XMLComment *pComment = ( XMLComment * ) pCur;
fprintf( stdout, "<!--%s-->", ByteString( pComment->GetComment(), RTL_TEXTENCODING_UTF8 ).GetBuffer());
}
break;
case XML_NODE_TYPE_DEFAULT: {
XMLDefault *pDefault = ( XMLDefault * ) pCur;
fprintf( stdout, "%s", ByteString( pDefault->GetDefault(), RTL_TEXTENCODING_UTF8 ).GetBuffer());
}
break;
}
}
}
XMLFile::~XMLFile()
{
if( XMLStrings != NULL ){
XMLHashMap::iterator pos = XMLStrings->begin();
for( ; pos != XMLStrings->end() ; ++pos ){
delete pos->second; // Check and delete content also ?
}
delete XMLStrings;
XMLStrings = NULL;
}
}
/*****************************************************************************/
XMLFile::XMLFile( const String &rFileName ) // the file name, empty if created from memory stream
/*****************************************************************************/
: XMLParentNode( NULL ),
sFileName ( rFileName ),
ID ( "id" ),
OLDREF ( "oldref" ),
XML_LANG ( "xml-lang" ),
XMLStrings ( NULL )
{
// nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("bookmark_value"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("bookmark"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("variable"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("paragraph"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("alt"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("caption"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("title"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
nodes_localize.insert( TagMap::value_type(ByteString(String::CreateFromAscii("link"),RTL_TEXTENCODING_ASCII_US) , sal_True) );
}
/*****************************************************************************/
void XMLFile::Extract( XMLFile *pCur )
/*****************************************************************************/
{
if( XMLStrings != NULL ) delete XMLStrings; // Elements ?
XMLStrings = new XMLHashMap();
if ( !pCur )
SearchL10NElements( this );
else {
if( pCur->GetNodeType()==XML_NODE_TYPE_FILE) {
SearchL10NElements(pCur);
}
}
}
/*****************************************************************************/
void XMLFile::View(){
/*****************************************************************************/
XMLElement* cur;
for(XMLHashMap::iterator pos=XMLStrings->begin(); pos!=XMLStrings->end();++pos){
fprintf(stdout,"\nid=%s\n",(pos->first).GetBuffer());
LangHashMap* elem=pos->second;
for(LangHashMap::iterator pos2=elem->begin(); pos2!=elem->end();++pos2){
fprintf( stdout,"\nlanguage=%s\n",(pos2->first).GetBuffer() );
cur=pos2->second;
fprintf(stdout,"\n%s\n",((XMLElement*)cur)->ToOString().getStr());
}
}
}
/*****************************************************************************/
void XMLFile::InsertL10NElement( XMLElement* pElement ){
/*****************************************************************************/
ByteString tmpStr,id,oldref,language("");
LangHashMap* elem;
if( pElement->GetAttributeList() != NULL ){
for ( sal_uLong j = 0; j < pElement->GetAttributeList()->Count(); j++ ){
tmpStr=ByteString( *pElement->GetAttributeList()->GetObject( j ),RTL_TEXTENCODING_UTF8 );
if( tmpStr.CompareTo(ID)==COMPARE_EQUAL ){ // Get the "id" Attribute
id = ByteString( pElement->GetAttributeList()->GetObject( j )->GetValue(),RTL_TEXTENCODING_UTF8 );
}
if( tmpStr.CompareTo( XML_LANG ) == COMPARE_EQUAL ){ // Get the "xml-lang" Attribute
language = ByteString( pElement->GetAttributeList()->GetObject( j )->GetValue(),RTL_TEXTENCODING_UTF8 );
}
}
}else{
fprintf(stdout,"XMLFile::InsertL10NElement: No AttributeList found");
fprintf(stdout,"++++++++++++++++++++++++++++++++++++++++++++++++++");
Print( pElement , 0 );
fprintf(stdout,"++++++++++++++++++++++++++++++++++++++++++++++++++");
}
XMLHashMap::iterator pos = XMLStrings->find( id );
if( pos == XMLStrings->end() ){ // No instanze , create new one
elem = new LangHashMap();
(*elem)[ language ]=pElement;
XMLStrings->insert( XMLHashMap::value_type( id , elem ) );
order.push_back( id );
}else{ // Already there
elem=pos->second;
if ( (*elem)[ language ] )
{
fprintf(stdout,"Error: Duplicated entry. ID = %s LANG = %s in File %s\n", id.GetBuffer(), language.GetBuffer(), ByteString( sFullName,RTL_TEXTENCODING_ASCII_US ).GetBuffer() );
exit( -1 );
}
(*elem)[ language ]=pElement;
}
}
/*****************************************************************************/
void XMLFile::showType(XMLParentNode* node){
/*****************************************************************************/
switch (node->GetNodeType()){
case XML_NODE_TYPE_ELEMENT: fprintf(stdout,"ELEMENT\n") ;break;
case XML_NODE_TYPE_FILE: fprintf(stdout,"FILE\n") ;break;
case XML_NODE_TYPE_COMMENT: fprintf(stdout,"COMMENT\n") ;break;
case XML_NODE_TYPE_DATA: fprintf(stdout,"DATA\n") ;break;
case XML_NODE_TYPE_DEFAULT: fprintf(stdout,"DEFAULT\n") ;break;
default: break;
}
}
XMLFile::XMLFile()
/*****************************************************************************/
: XMLParentNode( NULL ),
ID ( "id" ),
OLDREF ( "oldref" ),
XML_LANG ( "xml-lang" ),
XMLStrings ( NULL ){};
XMLFile::XMLFile( const XMLFile& obj )
/*****************************************************************************/
: XMLParentNode( obj ),
sFileName ( obj.sFileName ),
ID ( "id" ),
OLDREF ( "oldref" ),
XML_LANG ( "xml-lang" ),
XMLStrings ( NULL )
{
if( this!=&obj )
{
nodes_localize =obj.nodes_localize;
order =obj.order;
}
}
/*****************************************************************************/
XMLFile& XMLFile::operator=(const XMLFile& obj){
/*****************************************************************************/
if( this!=&obj ){
XMLParentNode::operator=(obj);
nodes_localize =obj.nodes_localize;
order =obj.order;
if( XMLStrings ) delete XMLStrings;
if( obj.XMLStrings )
{
XMLStrings = new XMLHashMap();
for( XMLHashMap::iterator pos = obj.XMLStrings->begin() ; pos != obj.XMLStrings->end() ; ++pos )
{
LangHashMap* elem=pos->second;
LangHashMap* newelem = new LangHashMap();
for(LangHashMap::iterator pos2=elem->begin(); pos2!=elem->end();++pos2){
(*newelem)[ pos2->first ] = new XMLElement( *pos2->second );
printf("*");
}
(*XMLStrings)[ pos->first ] = newelem;
}
}
}
printf("done!\n");
return *this;
}
/*****************************************************************************/
void XMLFile::SearchL10NElements( XMLParentNode *pCur , int pos)
/*****************************************************************************/
{
static const ByteString LOCALIZE("localize");
static const ByteString THEID("id");
bool bInsert = true;
if ( !pCur )
SearchL10NElements( this );
else {
switch( pCur->GetNodeType()) {
case XML_NODE_TYPE_FILE: {
XMLParentNode* pElement;
if( GetChildList()){
for ( sal_uLong i = 0; i < GetChildList()->Count(); i++ ){
pElement = (XMLParentNode*) GetChildList()->GetObject( i );
if( pElement->GetNodeType() == XML_NODE_TYPE_ELEMENT ) SearchL10NElements( pElement , i);
}
}
}
break;
case XML_NODE_TYPE_ELEMENT: {
XMLElement *pElement = ( XMLElement * ) pCur;
ByteString sName(pElement->GetName(),RTL_TEXTENCODING_ASCII_US);
ByteString language,tmpStrVal,oldref;
if ( pElement->GetAttributeList()){
for ( sal_uLong j = 0 , cnt = pElement->GetAttributeList()->Count(); j < cnt && bInsert; j++ ){
const ByteString tmpStr( *pElement->GetAttributeList()->GetObject( j ),RTL_TEXTENCODING_UTF8 );
if( tmpStr.CompareTo(THEID)==COMPARE_EQUAL ){ // Get the "id" Attribute
tmpStrVal=ByteString( pElement->GetAttributeList()->GetObject( j )->GetValue(),RTL_TEXTENCODING_UTF8 );
//printf("Checking id = %s\n",tmpStrVal.GetBuffer() );
}
if( tmpStr.CompareTo(LOCALIZE)==COMPARE_EQUAL ){ // Get the "localize" Attribute
bInsert=false;
}
if( tmpStr.CompareTo(XML_LANG)==COMPARE_EQUAL ){ // Get the "xml-lang" Attribute
language=ByteString( pElement->GetAttributeList()->GetObject( j )->GetValue(),RTL_TEXTENCODING_UTF8 );
}
if( tmpStr.CompareTo(OLDREF)==COMPARE_EQUAL ){ // Get the "oldref" Attribute
oldref=ByteString( pElement->GetAttributeList()->GetObject( j )->GetValue(),RTL_TEXTENCODING_UTF8 );
}
}
pElement->SetLanguageId ( language );
pElement->SetId ( tmpStrVal.GetBuffer() );
pElement->SetOldRef ( oldref );
pElement->SetPos( pos );
}
if ( bInsert && ( nodes_localize.find( sName.ToLowerAscii() ) != nodes_localize.end() ) )
InsertL10NElement(pElement);
else if ( bInsert && pElement->GetChildList() ){
for ( sal_uLong k = 0; k < pElement->GetChildList()->Count(); k++ )
SearchL10NElements( (XMLParentNode*) pElement->GetChildList()->GetObject( k ) , k);
}
}
break;
case XML_NODE_TYPE_DATA: {
}
break;
case XML_NODE_TYPE_COMMENT: {
}
break;
case XML_NODE_TYPE_DEFAULT: {
}
break;
}
}
}
/*****************************************************************************/
bool XMLFile::CheckExportStatus( XMLParentNode *pCur )
/*****************************************************************************/
{
static bool bStatusExport = true;
const ByteString LOCALIZE("localize");
const ByteString STATUS("status");
const ByteString PUBLISH("PUBLISH");
const ByteString DEPRECATED("DEPRECATED");
const ByteString TOPIC("topic");
bool bInsert = true;
if ( !pCur )
CheckExportStatus( this );
else {
switch( pCur->GetNodeType()) {
case XML_NODE_TYPE_FILE: {
XMLParentNode* pElement;
if( GetChildList()){
for ( sal_uLong i = 0; i < GetChildList()->Count(); i++ ){
pElement = (XMLParentNode*) GetChildList()->GetObject( i );
if( pElement->GetNodeType() == XML_NODE_TYPE_ELEMENT ) CheckExportStatus( pElement );//, i);
}
}
}
break;
case XML_NODE_TYPE_ELEMENT: {
XMLElement *pElement = ( XMLElement * ) pCur;
ByteString sName(pElement->GetName(),RTL_TEXTENCODING_ASCII_US);
if( sName.EqualsIgnoreCaseAscii( TOPIC ) ){
if ( pElement->GetAttributeList()){
for ( sal_uLong j = 0 , cnt = pElement->GetAttributeList()->Count(); j < cnt && bInsert; j++ ){
const ByteString tmpStr( *pElement->GetAttributeList()->GetObject( j ),RTL_TEXTENCODING_UTF8 );
if( tmpStr.EqualsIgnoreCaseAscii( STATUS ) ){
ByteString tmpStrVal=ByteString( pElement->GetAttributeList()->GetObject( j )->GetValue(),RTL_TEXTENCODING_UTF8 );
if( !tmpStrVal.EqualsIgnoreCaseAscii( PUBLISH ) &&
!tmpStrVal.EqualsIgnoreCaseAscii( DEPRECATED )){
bStatusExport = false;
}
}
}
}
}
else if ( pElement->GetChildList() ){
for ( sal_uLong k = 0; k < pElement->GetChildList()->Count(); k++ )
CheckExportStatus( (XMLParentNode*) pElement->GetChildList()->GetObject( k ) );//, k);
}
}
break;
}
}
return bStatusExport;
}
/*****************************************************************************/
sal_uInt16 XMLElement::GetNodeType()
/*****************************************************************************/
{
return XML_NODE_TYPE_ELEMENT;
}
/*****************************************************************************/
XMLElement::XMLElement(const XMLElement& obj)
/*****************************************************************************/
:
XMLParentNode ( obj ),
sElementName ( obj.sElementName ),
pAttributes ( NULL ),
project ( obj.project ),
filename ( obj.filename ),
id ( obj.id ),
sOldRef ( obj.sOldRef ),
resourceType ( obj.resourceType ),
languageId ( obj.languageId ),
nPos ( obj.nPos )
{
if ( obj.pAttributes ){
pAttributes = new XMLAttributeList();
for ( sal_uLong i = 0; i < obj.pAttributes->Count(); i++ )
AddAttribute( *obj.pAttributes->GetObject( i ) , obj.pAttributes->GetObject( i )->GetValue() );
}
}
/*****************************************************************************/
XMLElement& XMLElement::operator=(const XMLElement& obj){
/*****************************************************************************/
if( this!=&obj ){
XMLParentNode::operator=(obj);
sElementName =obj.sElementName;
project =obj.project;
filename =obj.filename;
id =obj.id;
sOldRef =obj.sOldRef;
resourceType =obj.resourceType;
languageId =obj.languageId;
nPos =obj.nPos;
if ( pAttributes ){
for ( sal_uLong i = 0; i < pAttributes->Count(); i++ )
delete pAttributes->GetObject( i );
delete pAttributes;
}
if ( obj.pAttributes ){
pAttributes =new XMLAttributeList();
for ( sal_uLong i = 0; i < obj.pAttributes->Count(); i++ )
AddAttribute( *obj.pAttributes->GetObject( i ) , obj.pAttributes->GetObject( i )->GetValue() );
}
}
return *this;
}
/*****************************************************************************/
void XMLElement::AddAttribute( const String &rAttribute, const String &rValue )
/*****************************************************************************/
{
if ( !pAttributes )
pAttributes = new XMLAttributeList();
pAttributes->Insert( new XMLAttribute( rAttribute, rValue ), LIST_APPEND );
}
/*****************************************************************************/
void XMLElement::ChangeLanguageTag( const String &rValue ){
/*****************************************************************************/
static const String rName = String::CreateFromAscii("xml-lang");
SetLanguageId( ByteString(rValue,RTL_TEXTENCODING_UTF8) );
if ( pAttributes ){
for ( sal_uLong i = 0; i < pAttributes->Count(); i++ ){
if ( *pAttributes->GetObject( i ) == rName ){
pAttributes->GetObject( i )->setValue(rValue);
}
}
}
XMLChildNode* pNode = NULL;
XMLElement* pElem = NULL;
XMLChildNodeList* pCList = GetChildList();
if( pCList != NULL ){
for ( sal_uLong i = 0; i < pCList->Count(); i++ ){
pNode = pCList->GetObject( i );
if( pNode != NULL && pNode->GetNodeType() == XML_NODE_TYPE_ELEMENT ){
pElem = static_cast< XMLElement* >(pNode);
pElem->ChangeLanguageTag( rValue );
pElem->SetLanguageId( ByteString(rValue,RTL_TEXTENCODING_UTF8) );
pElem = NULL;
pNode = NULL;
}
}
pCList = NULL;
}
}
/*****************************************************************************/
XMLAttribute *XMLElement::GetAttribute( const String &rName )
/*****************************************************************************/
{
if ( pAttributes )
for ( sal_uLong i = 0; i < pAttributes->Count(); i++ )
if ( *pAttributes->GetObject( i ) == rName )
return pAttributes->GetObject( i );
return NULL;
}
/*****************************************************************************/
XMLElement::~XMLElement()
/*****************************************************************************/
{
if ( pAttributes ) {
for ( sal_uLong i = 0; i < pAttributes->Count(); i++ )
delete pAttributes->GetObject( i );
delete pAttributes;
pAttributes = NULL;
}
}
/*****************************************************************************/
bool XMLElement::Equals(OUString refStr){
/*****************************************************************************/
return refStr.equals( ToOUString() );
}
/*****************************************************************************/
OString XMLElement::ToOString(){
/*****************************************************************************/
OUString ouEmpty;
OUStringBuffer* buffer = new OUStringBuffer();
Print( this, *buffer , true );
OString result( (sal_Unicode* )buffer->getStr(), buffer->getLength() , RTL_TEXTENCODING_UTF8 );
delete buffer;
return result;
}
/*****************************************************************************/
OUString XMLElement::ToOUString(){
/*****************************************************************************/
OUStringBuffer* buffer = new OUStringBuffer();
Print(this,*buffer,true);
OUString result=buffer->makeStringAndClear();
String xy(result.getStr());
result=OUString(xy);
delete buffer;
return result;
}
/*****************************************************************************/
void XMLElement::Print(XMLNode *pCur, OUStringBuffer& buffer , bool rootelement ){
/*****************************************************************************/
//YD FIXME somewhere COMMENT is defined as 4!
static const String _COMMENT = String::CreateFromAscii("comment");
static const OUString XML_LANG ( OUString::createFromAscii("xml-lang") );
if(pCur!=NULL){
if(rootelement){
XMLElement *pElement = ( XMLElement * ) pCur;
if ( pElement->GetAttributeList()){
if ( pElement->GetChildList()){
XMLChildNode* tmp=NULL;
for ( sal_uLong k = 0; k < pElement->GetChildList()->Count(); k++ ){
tmp=pElement->GetChildList()->GetObject( k );
Print( tmp, buffer , false);
}
}
}
}
else{
switch( pCur->GetNodeType()) {
case XML_NODE_TYPE_ELEMENT: {
XMLElement *pElement = ( XMLElement * ) pCur;
if( !pElement->GetName().EqualsIgnoreCaseAscii( _COMMENT ) ){
buffer.append( OUString::createFromAscii("\\<") );
buffer.append( pElement->GetName() );
if ( pElement->GetAttributeList()){
for ( sal_uLong j = 0; j < pElement->GetAttributeList()->Count(); j++ ){
OUString aAttrName( *pElement->GetAttributeList()->GetObject( j ) );
if( !aAttrName.equalsIgnoreAsciiCase( XML_LANG ) ) {
buffer.append( OUString::createFromAscii(" ") );
buffer.append( aAttrName );
buffer.append( OUString::createFromAscii("=") );
buffer.append( OUString::createFromAscii("\\\"") );
buffer.append( pElement->GetAttributeList()->GetObject( j )->GetValue() );
buffer.append( OUString::createFromAscii("\\\"") );
}
}
}
if ( !pElement->GetChildList())
buffer.append( OUString::createFromAscii("/\\>") );
else {
buffer.append( OUString::createFromAscii("\\>") );
XMLChildNode* tmp=NULL;
for ( sal_uLong k = 0; k < pElement->GetChildList()->Count(); k++ ){
tmp=pElement->GetChildList()->GetObject( k );
Print( tmp, buffer , false);
}
buffer.append( OUString::createFromAscii("\\</") );
buffer.append( pElement->GetName() );
buffer.append( OUString::createFromAscii("\\>") );
}
}
}
break;
case XML_NODE_TYPE_DATA: {
XMLData *pData = ( XMLData * ) pCur;
String sData = pData->GetData();
buffer.append( sData );
}
break;
case XML_NODE_TYPE_COMMENT: {
XMLComment *pComment = ( XMLComment * ) pCur;
buffer.append( OUString::createFromAscii("<!--") );
buffer.append( pComment->GetComment() );
buffer.append( OUString::createFromAscii("-->") );
}
break;
case XML_NODE_TYPE_DEFAULT: {
XMLDefault *pDefault = ( XMLDefault * ) pCur;
buffer.append( pDefault->GetDefault() );
}
break;
}
}
}else {
fprintf(stdout,"\n#+------Error: NULL Pointer in XMLELement::Print------+#\n");
return;
}
}
//
// class XMLData
//
/*****************************************************************************/
XMLData::XMLData(const XMLData& obj)
/*****************************************************************************/
: XMLChildNode( obj ),
sData( obj.sData ) ,
isNewCreated ( obj.isNewCreated ){}
/*****************************************************************************/
XMLData& XMLData::operator=(const XMLData& obj){
/*****************************************************************************/
if( this!=&obj ){
XMLChildNode::operator=( obj );
sData = obj.sData;
isNewCreated = obj.isNewCreated;
}
return *this;
}
/*****************************************************************************/
void XMLData::AddData( const String &rData) {
/*****************************************************************************/
sData += rData;
}
/*****************************************************************************/
sal_uInt16 XMLData::GetNodeType()
/*****************************************************************************/
{
return XML_NODE_TYPE_DATA;
}
//
// class XMLComment
//
/*****************************************************************************/
sal_uInt16 XMLComment::GetNodeType()
/*****************************************************************************/
{
return XML_NODE_TYPE_COMMENT;
}
/*****************************************************************************/
XMLComment::XMLComment(const XMLComment& obj)
/*****************************************************************************/
: XMLChildNode( obj ),
sComment( obj.sComment ){}
/*****************************************************************************/
XMLComment& XMLComment::operator=(const XMLComment& obj){
/*****************************************************************************/
if( this!=&obj ){
XMLChildNode::operator=( obj );
sComment = obj.sComment;
}
return *this;
}
//
// class XMLDefault
//
/*****************************************************************************/
sal_uInt16 XMLDefault::GetNodeType()
/*****************************************************************************/
{
return XML_NODE_TYPE_DEFAULT;
}
/*****************************************************************************/
XMLDefault::XMLDefault(const XMLDefault& obj)
/*****************************************************************************/
: XMLChildNode( obj ),
sDefault( obj.sDefault){}
/*****************************************************************************/
XMLDefault& XMLDefault::operator=(const XMLDefault& obj){
/*****************************************************************************/
if( this!=&obj ){
XMLChildNode::operator=( obj );
sDefault = obj.sDefault;
}
return *this;
}
//
// class SimpleXMLParser
//
#define XML_CHAR_TO_OUSTRING(x) OStringToOUString(OString(x), RTL_TEXTENCODING_UTF8)
#define XML_CHAR_N_TO_OUSTRING(x,n) OStringToOUString(OString(x,n), RTL_TEXTENCODING_UTF8 )
/*****************************************************************************/
SimpleXMLParser::SimpleXMLParser()
/*****************************************************************************/
: pXMLFile( NULL )
{
aParser = XML_ParserCreate( NULL );
XML_SetUserData( aParser, this );
XML_SetElementHandler( aParser, (XML_StartElementHandler) StartElementHandler, (XML_EndElementHandler) EndElementHandler );
XML_SetCharacterDataHandler( aParser, (XML_CharacterDataHandler) CharacterDataHandler );
XML_SetCommentHandler( aParser, (XML_CommentHandler) CommentHandler );
XML_SetDefaultHandler( aParser, (XML_DefaultHandler) DefaultHandler );
}
/*****************************************************************************/
SimpleXMLParser::~SimpleXMLParser()
/*****************************************************************************/
{
XML_ParserFree( aParser );
}
/*****************************************************************************/
void SimpleXMLParser::StartElementHandler(
void *userData, const XML_Char *name, const XML_Char **atts )
/*****************************************************************************/
{
(( SimpleXMLParser * ) userData )->StartElement( name, atts );
}
/*****************************************************************************/
void SimpleXMLParser::EndElementHandler(
void *userData, const XML_Char *name )
/*****************************************************************************/
{
(( SimpleXMLParser * ) userData )->EndElement( name );
}
/*****************************************************************************/
void SimpleXMLParser::CharacterDataHandler(
void *userData, const XML_Char *s, int len )
/*****************************************************************************/
{
(( SimpleXMLParser * ) userData )->CharacterData( s, len );
}
/*****************************************************************************/
void SimpleXMLParser::CommentHandler(
void *userData, const XML_Char *data )
/*****************************************************************************/
{
(( SimpleXMLParser * ) userData )->Comment( data );
}
/*****************************************************************************/
void SimpleXMLParser::DefaultHandler(
void *userData, const XML_Char *s, int len )
/*****************************************************************************/
{
(( SimpleXMLParser * ) userData )->Default( s, len );
}
/*****************************************************************************/
void SimpleXMLParser::StartElement(
const XML_Char *name, const XML_Char **atts )
/*****************************************************************************/
{
String sElementName = String( XML_CHAR_TO_OUSTRING( name ));
XMLElement *pElement = new XMLElement( sElementName, ( XMLParentNode * ) pCurNode );
pCurNode = pElement;
pCurData = NULL;
int i = 0;
while( atts[i] ) {
pElement->AddAttribute(
String( XML_CHAR_TO_OUSTRING( atts[ i ] )),
String( XML_CHAR_TO_OUSTRING( atts[ i + 1 ] )));
i += 2;
}
}
/*****************************************************************************/
void SimpleXMLParser::EndElement( const XML_Char *name )
/*****************************************************************************/
{
// This variable is not used at all, but the the sax C interface can't be changed
// To prevent warnings this dummy assignment is used
// +++
(void) name;
pCurNode = pCurNode->GetParent();
pCurData = NULL;
}
/*****************************************************************************/
void SimpleXMLParser::CharacterData(
const XML_Char *s, int len )
/*****************************************************************************/
{
if ( !pCurData ){
String x=String( XML_CHAR_N_TO_OUSTRING( s, len ));
XMLUtil::UnQuotHTML(x);
pCurData = new XMLData( x , pCurNode );
}else{
String x=String( XML_CHAR_N_TO_OUSTRING( s, len ));
XMLUtil::UnQuotHTML(x);
pCurData->AddData( x );
}
}
/*****************************************************************************/
void SimpleXMLParser::Comment(
const XML_Char *data )
/*****************************************************************************/
{
pCurData = NULL;
new XMLComment( String( XML_CHAR_TO_OUSTRING( data )), pCurNode );
}
/*****************************************************************************/
void SimpleXMLParser::Default(
const XML_Char *s, int len )
/*****************************************************************************/
{
pCurData = NULL;
new XMLDefault(
String( XML_CHAR_N_TO_OUSTRING( s, len )), pCurNode );
}
/*****************************************************************************/
XMLFile *SimpleXMLParser::Execute( const String &rFullFileName , const String &rFileName, XMLFile* pXMLFileIn )
/*****************************************************************************/
{
// printf("DBG: SimpleXMLParser::Execute( %s )", ByteString( rFileName , RTL_TEXTENCODING_ASCII_US ).GetBuffer() );
aErrorInformation.eCode = XML_ERROR_NONE;
aErrorInformation.nLine = 0;
aErrorInformation.nColumn = 0;
aErrorInformation.sMessage = String::CreateFromAscii( "ERROR: Unable to open file " );
aErrorInformation.sMessage += rFileName;
SvFileStream aStream( rFileName, STREAM_STD_READ );
if ( !aStream.IsOpen())
return NULL;
SvMemoryStream aMemStream;
aStream >> aMemStream;
aMemStream.Seek( 0 );
aStream.Close();
pXMLFile = pXMLFileIn;
pXMLFile->SetName( rFileName );
pXMLFile->SetFullName( rFullFileName );
return Execute( &aMemStream );
}
/*****************************************************************************/
XMLFile *SimpleXMLParser::Execute( SvMemoryStream *pStream )
/*****************************************************************************/
{
if ( !pXMLFile )
pXMLFile = new XMLFile( String());
pCurNode = pXMLFile;
pCurData = NULL;
sal_uLong nPos = pStream->Tell();
pStream->Seek( STREAM_SEEK_TO_END );
aErrorInformation.eCode = XML_ERROR_NONE;
aErrorInformation.nLine = 0;
aErrorInformation.nColumn = 0;
if ( pXMLFile->GetName().Len()) {
aErrorInformation.sMessage = String::CreateFromAscii( "File " );
aErrorInformation.sMessage += pXMLFile->GetName();
aErrorInformation.sMessage += String::CreateFromAscii( " parsed succesfully" );
}
else
aErrorInformation.sMessage = String::CreateFromAscii( "XML-File parsed successfully" );
if ( !XML_Parse(
aParser, ( char * ) pStream->GetData() + nPos, pStream->Tell() - nPos, sal_True ))
{
aErrorInformation.eCode = XML_GetErrorCode( aParser );
aErrorInformation.nLine = XML_GetErrorLineNumber( aParser );
aErrorInformation.nColumn = XML_GetErrorColumnNumber( aParser );
aErrorInformation.sMessage = String::CreateFromAscii( "ERROR: " );
if ( pXMLFile->GetName().Len())
aErrorInformation.sMessage += pXMLFile->GetName();
else
aErrorInformation.sMessage += String::CreateFromAscii( "XML-File" );
aErrorInformation.sMessage += String::CreateFromAscii( " (" );
aErrorInformation.sMessage += String::CreateFromInt64( aErrorInformation.nLine );
aErrorInformation.sMessage += String::CreateFromAscii( "," );
aErrorInformation.sMessage += String::CreateFromInt64( aErrorInformation.nColumn );
aErrorInformation.sMessage += String::CreateFromAscii( "): " );
switch( aErrorInformation.eCode ) {
case XML_ERROR_NO_MEMORY: aErrorInformation.sMessage += String::CreateFromAscii( "No memory" ); break;
case XML_ERROR_SYNTAX: aErrorInformation.sMessage += String::CreateFromAscii( "Syntax" ); break;
case XML_ERROR_NO_ELEMENTS: aErrorInformation.sMessage += String::CreateFromAscii( "No elements" ); break;
case XML_ERROR_INVALID_TOKEN: aErrorInformation.sMessage += String::CreateFromAscii( "Invalid token" ); break;
case XML_ERROR_UNCLOSED_TOKEN: aErrorInformation.sMessage += String::CreateFromAscii( "Unclosed token" ); break;
case XML_ERROR_PARTIAL_CHAR: aErrorInformation.sMessage += String::CreateFromAscii( "Partial char" ); break;
case XML_ERROR_TAG_MISMATCH: aErrorInformation.sMessage += String::CreateFromAscii( "Tag mismatch" ); break;
case XML_ERROR_DUPLICATE_ATTRIBUTE: aErrorInformation.sMessage += String::CreateFromAscii( "Dublicat attribute" ); break;
case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: aErrorInformation.sMessage += String::CreateFromAscii( "Junk after doc element" ); break;
case XML_ERROR_PARAM_ENTITY_REF: aErrorInformation.sMessage += String::CreateFromAscii( "Param entity ref" ); break;
case XML_ERROR_UNDEFINED_ENTITY: aErrorInformation.sMessage += String::CreateFromAscii( "Undefined entity" ); break;
case XML_ERROR_RECURSIVE_ENTITY_REF: aErrorInformation.sMessage += String::CreateFromAscii( "Recursive entity ref" ); break;
case XML_ERROR_ASYNC_ENTITY: aErrorInformation.sMessage += String::CreateFromAscii( "Async_entity" ); break;
case XML_ERROR_BAD_CHAR_REF: aErrorInformation.sMessage += String::CreateFromAscii( "Bad char ref" ); break;
case XML_ERROR_BINARY_ENTITY_REF: aErrorInformation.sMessage += String::CreateFromAscii( "Binary entity" ); break;
case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: aErrorInformation.sMessage += String::CreateFromAscii( "Attribute external entity ref" ); break;
case XML_ERROR_MISPLACED_XML_PI: aErrorInformation.sMessage += String::CreateFromAscii( "Misplaced xml pi" ); break;
case XML_ERROR_UNKNOWN_ENCODING: aErrorInformation.sMessage += String::CreateFromAscii( "Unknown encoding" ); break;
case XML_ERROR_INCORRECT_ENCODING: aErrorInformation.sMessage += String::CreateFromAscii( "Incorrect encoding" ); break;
case XML_ERROR_UNCLOSED_CDATA_SECTION: aErrorInformation.sMessage += String::CreateFromAscii( "Unclosed cdata section" ); break;
case XML_ERROR_EXTERNAL_ENTITY_HANDLING: aErrorInformation.sMessage += String::CreateFromAscii( "External entity handling" ); break;
case XML_ERROR_NOT_STANDALONE: aErrorInformation.sMessage += String::CreateFromAscii( "Not standalone" ); break;
case XML_ERROR_NONE: break;
default:
break;
}
delete pXMLFile;
pXMLFile = NULL;
}
pStream->Seek( nPos );
return pXMLFile;
}
/*****************************************************************************/
void XMLUtil::QuotHTML( String &rString )
/*****************************************************************************/
{
OUStringBuffer sReturn;
static const String LT(String::CreateFromAscii("<"));
static const String QLT(String::CreateFromAscii("&lt;"));
static const String GT(String::CreateFromAscii(">"));
static const String QGT(String::CreateFromAscii("&gt;"));
static const String QUOT(String::CreateFromAscii("\\"));
static const String QQUOT(String::CreateFromAscii("&quot;"));
static const String APOS(String::CreateFromAscii("\""));
static const String QAPOS(String::CreateFromAscii("&apos;"));
static const String AMP(String::CreateFromAscii("&"));
static const String QAMP(String::CreateFromAscii("&amp;"));
static const String SLASH(String::CreateFromAscii("\\"));
for ( sal_uInt16 i = 0; i < rString.Len(); i++) {
if ( i < rString.Len()) {
switch ( rString.GetChar( i )) {
case '\\': if( i+1 <= rString.Len() ){
switch( rString.GetChar( i+1 ) ){
case '<': sReturn.append( LT );i++;break;
case '>': sReturn.append( GT );i++;break;
case '\\': sReturn.append( QUOT );i++;break;
case '\"': sReturn.append( APOS );i++;break;
//case '\'': sReturn += "\'";i++;break;
//case '&' : sRetrun += "&";i++;break;
default: sReturn.append( SLASH );break;
}
}
break;
case '<':
sReturn.append( QLT );
break;
case '>':
sReturn.append( QGT );
break;
case '\"':
sReturn.append( QQUOT );
break;
/* case '\'':
sReturn += "&apos;";
break;
*/
case '&':
if (
( ( i + 4 ) < rString.Len()) &&
( String( rString.Copy( i, 5 ) ).Equals( QAMP ) )
)
sReturn.append( rString.GetChar( i ) );
else
sReturn.append( QAMP );
break;
default:
sReturn.append( rString.GetChar( i ) );
break;
}
}
}
rString = String( sReturn.makeStringAndClear() );
}
void XMLUtil::UnQuotHTML( String &rString ){
UnQuotData( rString );
}
void XMLUtil::UnQuotData( String &rString_in ){
ByteString sReturn;
ByteString sString( rString_in , RTL_TEXTENCODING_UTF8 );
while ( sString.Len()) {
if ( sString.Copy( 0, 1 ) == "\\" ) {
sReturn += "\\\\";
sString.Erase( 0, 1 );
}
else if ( sString.Copy( 0, 5 ) == "&amp;" ) {
sReturn += "&";
sString.Erase( 0, 5 );
}
else if ( sString.Copy( 0, 4 ) == "&lt;" ) {
sReturn += "<";
sString.Erase( 0, 4 );
}
else if ( sString.Copy( 0, 4 ) == "&gt;" ) {
sReturn += ">";
sString.Erase( 0, 4 );
}
else if ( sString.Copy( 0, 6 ) == "&quot;" ) {
sReturn += "\"";
sString.Erase( 0, 6 );
}
else if ( sString.Copy( 0, 6 ) == "&apos;" ) {
sReturn += "\'";
sString.Erase( 0, 6 );
}
else {
sReturn += sString.GetChar( 0 );
sString.Erase( 0, 1 );
}
}
rString_in = String(sReturn , RTL_TEXTENCODING_UTF8 );
}
XMLUtil::XMLUtil(){
}
/*****************************************************************************/
void XMLUtil::dump(){
/*****************************************************************************/
int cnt=1;
printf("size=%lu\n",static_cast<unsigned long>(lMap.size()));
for(HashMap::iterator pos = lMap.begin(); pos != lMap.end() ; ++pos){
fprintf(stdout,"key=%s , value=%d , no=%d\n",pos->first.GetBuffer(),pos->second,cnt++);
}
}
/*****************************************************************************/
XMLUtil& XMLUtil::Instance(){
/*****************************************************************************/
static XMLUtil instance;
return instance;
}
/*****************************************************************************/
XMLUtil::~XMLUtil(){}
/*****************************************************************************/
/*****************************************************************************/
ByteString XMLUtil::GetIsoLangByIndex( sal_uInt16 nIndex )
/*****************************************************************************/
{
if(nIndex > 0 && MAX_LANGUAGES >= nIndex )
return isoArray[nIndex];
return "";
}