diff options
Diffstat (limited to 'l10ntools/source/merge.cxx')
-rw-r--r-- | l10ntools/source/merge.cxx | 386 |
1 files changed, 386 insertions, 0 deletions
diff --git a/l10ntools/source/merge.cxx b/l10ntools/source/merge.cxx new file mode 100644 index 000000000000..21002d79141e --- /dev/null +++ b/l10ntools/source/merge.cxx @@ -0,0 +1,386 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_l10ntools.hxx" +#include <stdio.h> +#include <tools/fsys.hxx> +#include "export.hxx" +#include "utf8conv.hxx" +#include <iostream> + +using namespace std; + +namespace +{ + static ::rtl::OString lcl_NormalizeFilename(const ::rtl::OString& rFilename) + { + return rFilename.copy( + ::std::max( + rFilename.lastIndexOf( "\\" ), + rFilename.lastIndexOf( "/" ))+1); + }; +} + +extern void ConvertHalfwitdhToFullwidth( String& rString ); + +// +// class PFormEntrys +// + +ByteString PFormEntrys::Dump() +{ + ByteString sRet( "PFormEntrys\n" ); + ByteString a("sText"); + if(sText.size()) + Export::DumpMap(a , sText); + return sRet; +} + +sal_Bool PFormEntrys::GetTransex3Text( ByteString &rReturn, + sal_uInt16 nTyp, const ByteString &nLangIndex, sal_Bool bDel ) +{ + sal_Bool rc = GetText( rReturn , nTyp , nLangIndex , bDel ); + ByteString test( rReturn ); + for( sal_uInt16 idx = 0; idx < rReturn.Len(); idx++ ) + { + if( rReturn.GetChar( idx ) == '\"' && ( idx >= 1 ) && rReturn.GetChar( idx-1 ) == '\\' ) + { + rReturn.Erase( idx-1 , 1 ); + } + } + //if( !rReturn.Equals( test ) ) + // printf("*CHANGED******************\n%s\n%s\n",test.GetBuffer(),rReturn.GetBuffer()); + return rc; +} +/*****************************************************************************/ +sal_Bool PFormEntrys::GetText( ByteString &rReturn, + sal_uInt16 nTyp, const ByteString &nLangIndex, sal_Bool bDel ) +{ + + sal_Bool bReturn=sal_True; + switch ( nTyp ) { + case STRING_TYP_TEXT : + rReturn = sText[ nLangIndex ]; + if ( bDel ) + sText[ nLangIndex ] = ""; + bReturn = bTextFirst[ nLangIndex ]; + bTextFirst[ nLangIndex ] = sal_False; + break; + case STRING_TYP_HELPTEXT : + rReturn = sHelpText; + break; + case STRING_TYP_QUICKHELPTEXT : + rReturn = sQuickHelpText[ nLangIndex ]; + if ( bDel ) + sQuickHelpText[ nLangIndex ] = ""; + bReturn = bQuickHelpTextFirst[ nLangIndex ]; + bQuickHelpTextFirst[ nLangIndex ] = sal_False; + break; + case STRING_TYP_TITLE : + rReturn = sTitle[ nLangIndex ]; + if ( bDel ) + sTitle[ nLangIndex ] = ""; + bReturn = bTitleFirst[ nLangIndex ]; + bTitleFirst[ nLangIndex ] = sal_False; + break; + } + return bReturn; +} + + +// +// class MergeData +// + +MergeData::~MergeData() +{ +} + +PFormEntrys* MergeData::GetPFormEntrys(ResData*) +{ + if( aMap.find( ByteString("HACK") ) != aMap.end() ) + return aMap[ ByteString("HACK") ]; + return NULL; +} + +void MergeData::Insert(const ByteString&, PFormEntrys* pfEntrys ) +{ + aMap.insert( PFormEntrysHashMap::value_type( ByteString("HACK") , pfEntrys ) ); +} + +ByteString MergeData::Dump(){ + ByteString sRet( "MergeData\n" ); + + printf("MergeData sTyp = %s , sGid = %s , sLid =%s , sFilename = %s\n",sTyp.GetBuffer(),sGID.GetBuffer(),sLID.GetBuffer(), sFilename.GetBuffer() ); + + PFormEntrysHashMap::const_iterator idbg; + for( idbg = aMap.begin() ; idbg != aMap.end(); ++idbg ) + { + printf("aMap[ %s ] = " ,idbg->first.GetBuffer()); + ( (PFormEntrys*)(idbg->second) )->Dump(); + printf("\n"); + } + printf("\n"); + return sRet; +} + +PFormEntrys* MergeData::GetPFObject( const ByteString& rPFO ){ + if( aMap.find( ByteString("HACK") ) != aMap.end() ) + return aMap[ rPFO ]; + return NULL; +} + + +PFormEntrys *MergeData::InsertEntry( const ByteString &rPForm ) +{ + PFormEntrys* pFEntrys = new PFormEntrys( rPForm ); + aMap.insert( PFormEntrysHashMap::value_type( rPForm , pFEntrys ) ); + return pFEntrys; +} + +sal_Bool MergeData::operator==( ResData *pData ) +{ + ByteString sResTyp_upper( pData->sResTyp ); + sResTyp_upper.ToUpperAscii(); + ByteString sTyp_upper( sTyp ); + sTyp_upper.ToUpperAscii(); + + return (( pData->sId == sLID ) && + ( pData->sGId == sGID ) && + ( sResTyp_upper == sTyp_upper ) + ); +} + +// +// class MergeDataFile +// + +#define FFORMAT_UNKNOWN 0x0000 +#define FFORMAT_NEW 0x0001 +#define FFORMAT_OLD 0x0002 + + +MergeDataFile::MergeDataFile( + const ByteString &rFileName, + const ByteString& sFile, + sal_Bool bErrLog, + CharSet aCharSet, + bool bCaseSensitive) + : bErrorLog( bErrLog ) +{ + SvFileStream aInputStream( String( rFileName, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_READ ); + aInputStream.SetStreamCharSet( aCharSet ); + ByteString sLine; + const ByteString sHACK("HACK"); + const ::rtl::OString sFileNormalized(lcl_NormalizeFilename(sFile)); + const bool isFileEmpty = sFileNormalized.getLength(); + + if( !aInputStream.IsOpen() ) + { + printf("Warning : Can't open %s\n", rFileName.GetBuffer()); + return; + } + while ( !aInputStream.IsEof()) + { + xub_StrLen nToks; + aInputStream.ReadLine( sLine ); + sLine = sLine.Convert( RTL_TEXTENCODING_MS_1252, aCharSet ); + + nToks = sLine.GetTokenCount( '\t' ); + if ( nToks == 15 ) + { + // Skip all wrong filenames + const ::rtl::OString filename = lcl_NormalizeFilename(sLine.GetToken( 1 , '\t' )); + if(isFileEmpty || sFileNormalized.equals("") || (!isFileEmpty && filename.equals(sFileNormalized)) ) + { + xub_StrLen rIdx = 0; + const ByteString sTYP = sLine.GetToken( 3, '\t', rIdx ); + const ByteString sGID = sLine.GetToken( 0, '\t', rIdx ); // 4 + const ByteString sLID = sLine.GetToken( 0, '\t', rIdx ); // 5 + ByteString sPFO = sLine.GetToken( 1, '\t', rIdx ); // 7 + sPFO = sHACK; + ByteString nLANG = sLine.GetToken( 1, '\t', rIdx ); // 9 + nLANG.EraseLeadingAndTrailingChars(); + const ByteString sTEXT = sLine.GetToken( 0, '\t', rIdx ); // 10 + const ByteString sQHTEXT = sLine.GetToken( 1, '\t', rIdx ); // 12 + const ByteString sTITLE = sLine.GetToken( 0, '\t', rIdx ); // 13 + + +#ifdef MERGE_SOURCE_LANGUAGES + if( true ) +#else + if( !nLANG.EqualsIgnoreCaseAscii("en-US") ) +#endif + { + aLanguageSet.insert(nLANG); + InsertEntry( sTYP, sGID, sLID, sPFO, nLANG, sTEXT, sQHTEXT, sTITLE, filename, bCaseSensitive ); + } + } + } + else if ( nToks == 10 ) + { + printf("ERROR: File format is obsolete and no longer supported!\n"); + } + } + aInputStream.Close(); +} + +MergeDataFile::~MergeDataFile() +{ +} + +ByteString MergeDataFile::Dump(){ + ByteString sRet( "MergeDataFile\n" ); + + printf("MergeDataFile\n"); + MergeDataHashMap::const_iterator idbg; + for( idbg = aMap.begin() ; idbg != aMap.end(); ++idbg ) + { + printf("aMap[ %s ] = ",idbg->first.GetBuffer()); + ((MergeData*) (idbg->second))->Dump(); + printf("\n"); + } + printf("\n"); + return sRet; +} + +void MergeDataFile::WriteError( const ByteString &rLine ) +{ + if ( bErrorLog ) + { + if ( !aErrLog.IsOpen()) + aErrLog.Open( String( sErrorLog, RTL_TEXTENCODING_ASCII_US ), STREAM_STD_WRITE | STREAM_TRUNC ); + aErrLog.WriteLine( rLine ); + } + else + fprintf( stderr, "%s\n", rLine.GetBuffer()); +} + +std::vector<ByteString> MergeDataFile::GetLanguages(){ + return std::vector<ByteString>(aLanguageSet.begin(),aLanguageSet.end()); +} + +MergeData *MergeDataFile::GetMergeData( ResData *pResData , bool bCaseSensitive ) +{ + ByteString sOldG = pResData->sGId; + ByteString sOldL = pResData->sId; + ByteString sGID = pResData->sGId; + ByteString sLID; + if(!sGID.Len()) + sGID = pResData->sId; + else + sLID = pResData->sId; + pResData->sGId = sGID; + pResData->sId = sLID; + + ByteString sKey = CreateKey( pResData->sResTyp , pResData->sGId , pResData->sId , pResData->sFilename , bCaseSensitive ); + + if(aMap.find( sKey ) != aMap.end()) + { + pResData->sGId = sOldG; + pResData->sId = sOldL; + return aMap[ sKey ]; + } + pResData->sGId = sOldG; + pResData->sId = sOldL; + return NULL; +} + + +PFormEntrys *MergeDataFile::GetPFormEntrys( ResData *pResData ) +{ + // search for requested PFormEntrys + MergeData *pData = GetMergeData( pResData ); + if ( pData ) + return pData->GetPFormEntrys( pResData ); + return NULL; +} + +PFormEntrys *MergeDataFile::GetPFormEntrysCaseSensitive( ResData *pResData ) +{ + // search for requested PFormEntrys + MergeData *pData = GetMergeData( pResData , true ); + if ( pData ) + return pData->GetPFormEntrys( pResData ); + return NULL; +} + +void MergeDataFile::InsertEntry( + const ByteString &rTYP, const ByteString &rGID, + const ByteString &rLID, const ByteString &rPFO, + const ByteString &nLANG, const ByteString &rTEXT, + const ByteString &rQHTEXT, const ByteString &rTITLE , + const ByteString &rInFilename , bool bCaseSensitive + ) +{ + MergeData *pData; + + // search for MergeData + ByteString sKey = CreateKey( rTYP , rGID , rLID , rInFilename , bCaseSensitive ); + MergeDataHashMap::const_iterator mit; + mit = aMap.find( sKey ); + if( mit != aMap.end() ) + { + pData = mit->second; + } + else + { + pData = new MergeData( rTYP, rGID, rLID, rInFilename ); + aMap.insert( MergeDataHashMap::value_type( sKey, pData ) ); + } + + PFormEntrys *pFEntrys = 0; + + // search for PFormEntrys + pFEntrys = pData->GetPFObject( rPFO ); + if( !pFEntrys ) + { + // create new PFormEntrys, cause no one exists with current properties + pFEntrys = new PFormEntrys( rPFO ); + pData->Insert( rPFO , pFEntrys ); + } + + // finaly insert the cur string + pFEntrys->InsertEntry( nLANG , rTEXT, rQHTEXT, rTITLE ); +} + +ByteString MergeDataFile::CreateKey( const ByteString& rTYP , const ByteString& rGID , const ByteString& rLID , const ByteString& rFilename , bool bCaseSensitive ) +{ + static const ::rtl::OString sStroke('-'); + ::rtl::OString sKey( rTYP ); + sKey += sStroke; + sKey += rGID; + sKey += sStroke; + sKey += rLID; + sKey += sStroke; + sKey += lcl_NormalizeFilename(rFilename); + OSL_TRACE("created key: %s", sKey.getStr()); + if(bCaseSensitive) + return sKey; // officecfg case sensitive identifier + return sKey.toAsciiUpperCase(); +} |