blob: f066fbd1697da239bee9f11f5db5e5ff86bfd5ba [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 <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();
}