blob: eba101ff1adfacb5639778fb6181c4ab65f0b67e [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 "srciter.hxx"
#include "export.hxx"
#include "treeconfig.hxx"
#include <string>
#include <vector>
#include <stdio.h>
#include <iostream>
#include "tools/errcode.hxx"
#include "tools/fsys.hxx"
#ifndef L10NTOOLS_FILE_HXX
#define L10NTOOLS_FILE_HXX
#include <l10ntools/file.hxx>
#endif
namespace transex3
{
//
// SourceTreeLocalizer
//
const char *ExeTable[][5] = {
{ "src", "transex3", " -UTF8 -e", "negative", "noiso" },
{ "hrc", "transex3", " -UTF8 -e", "positive", "noiso" },
{ "tree", "xhtex", "", "negative", "noiso" },
{ "xtx", "xtxex", "", "negative", "noiso" },
{ "ulf", "ulfex", " -e", "negative", "noiso" },
{ "xrb", "xmlex", "-UTF8 -e", "negative", "iso" },
{ "xxl", "xmlex", "-UTF8 -e", "negative", "iso" },
{ "xgf", "xmlex", "-UTF8 -e -t:xgf", "negative", "iso" },
{ "xcd", "cfgex", "-UTF8 -e", "negative", "iso" },
{ "xcu", "cfgex", "-UTF8 -e", "negative", "iso" },
{ "xcs", "cfgex", "-UTF8 -e -f", "negative", "iso" },
{ "xrm", "xrmex", "-UTF8 -e", "negative", "iso" },
{ "xhp", "helpex", " -e", "negative", "noiso" },
{ "properties", "jpropex", " -e", "negative", "noiso" },
{ "NULL", "NULL", "NULL", "NULL", "NULL" }
};
const char *NegativeList[] = {
"officecfg/data/org.openoffice.Office.Labels.xcd",
"officecfg/data/org/openoffice/Office/Labels.xcd",
"officecfg/data/org/openoffice/Office/SFX.xcd",
"officecfg/data/org/openoffice/Office/Accelerators.xcu",
"hidother.src",
"NULL"
};
const char *PositiveList[] = {
"svx/inc/globlmn_tmpl.hrc",
"sw/source/ui/inc/swmn_tmpl.hrc",
"sw/source/ui/inc/swacc_tmpl.hrc",
"sw/source/ui/inc/toolbox_tmpl.hrc",
"offmgr/inc/offmenu_tmpl.hrc",
"offmgr/source/offapp/intro/intro_tmpl.hrc",
"dbaccess/source/ui/inc/toolbox_tmpl.hrc",
"svx/source/intro/intro_tmpl.hrc",
"dbaccess/source/ui/dlg/AutoControls_tmpl.hrc",
"svx/source/unodialogs/textconversiondlgs/chinese_direction_tmpl.hrc",
"chart2/source/controller/dialogs/res_DataLabel_tmpl.hrc",
"chart2/source/controller/dialogs/res_LegendPosition_tmpl.hrc",
"chart2/source/controller/dialogs/res_Statistic_tmpl.hrc",
"chart2/source/controller/dialogs/res_Titlesx_tmpl.hrc",
"chart2/source/controller/dialogs/res_SecondaryAxisCheckBoxes_tmpl.hrc",
"chart2/source/controller/menu/MenuItems_tmpl.hrc",
"chart2/source/controller/dialogs/res_ErrorBar_tmpl.hrc",
"chart2/source/controller/dialogs/res_Trendline_tmpl.hrc",
"svx.link/inc/globlmn_tmpl.hrc",
"sw.link/source/ui/inc/swmn_tmpl.hrc",
"sw.link/source/ui/inc/swacc_tmpl.hrc",
"sw.link/source/ui/inc/toolbox_tmpl.hrc",
"offmgr.link/inc/offmenu_tmpl.hrc",
"offmgr.link/source/offapp/intro/intro_tmpl.hrc",
"dbaccess.link/source/ui/inc/toolbox_tmpl.hrc",
"svx.link/source/intro/intro_tmpl.hrc",
"dbaccess.link/source/ui/dlg/AutoControls_tmpl.hrc",
"svx.link/source/unodialogs/textconversiondlgs/chinese_direction_tmpl.hrc",
"chart2.link/source/controller/dialogs/res_DataLabel_tmpl.hrc",
"chart2.link/source/controller/dialogs/res_LegendPosition_tmpl.hrc",
"chart2.link/source/controller/dialogs/res_Statistic_tmpl.hrc",
"chart2.link/source/controller/dialogs/res_Titlesx_tmpl.hrc",
"chart2.link/source/controller/dialogs/res_SecondaryAxisCheckBoxes_tmpl.hrc",
"chart2.link/source/controller/menu/MenuItems_tmpl.hrc",
"chart2.link/source/controller/dialogs/res_ErrorBar_tmpl.hrc",
"chart2.link/source/controller/dialogs/res_Trendline_tmpl.hrc",
"NULL"
};
const char PRJ_DIR_NAME[] = "prj";
const char DLIST_NAME[] = "d.lst";
#define LOCALIZE_NONE 0x0000
#define LOCALIZE_EXTRACT 0x0001
#define LOCALIZE_MERGE 0x0002
class SourceTreeLocalizer : public SourceTreeIterator
{
private:
SvFileStream aSDF;
sal_uInt16 nMode;
ByteString sLanguageRestriction;
ByteString sOutputFile;
int nFileCnt;
const ByteString GetProjectName( sal_Bool bAbs = sal_False );
const ByteString GetProjectRootRel();
sal_Bool CheckNegativeList( const ByteString &rFileName );
sal_Bool CheckPositiveList( const ByteString &rFileName );
void WorkOnFile(
const ByteString &rFileName,
const ByteString &rExecutable,
const ByteString &rParameter
);
void WorkOnFileType(
const ByteString &rDirectory,
const ByteString &rExtension,
const ByteString &rExecutable,
const ByteString &rParameter,
const ByteString &rCollectMode
);
void WorkOnDirectory( const ByteString &rDirectory );
sal_Bool ExecuteMerge();
sal_Bool MergeSingleFile(
const ByteString &rPrj,
const ByteString &rFile,
const ByteString &rSDFFile
);
public:
SourceTreeLocalizer( const ByteString &rRoot, const ByteString &rVersion , bool bLocal , bool skip_links );
~SourceTreeLocalizer();
ByteString getSourceLanguages( ByteString sLanguageRestriction , ByteString sCommand );
void SetLanguageRestriction( const ByteString& rRestrictions )
{ sLanguageRestriction = rRestrictions; }
int getFileCnt();
sal_Bool Extract( const ByteString &rDestinationFile );
sal_Bool Merge( const ByteString &rSourceFile , const ByteString &rOutput );
int GetFileCnt();
virtual void OnExecuteDirectory( const rtl::OUString &rDirectory );
};
/*****************************************************************************/
SourceTreeLocalizer::SourceTreeLocalizer(
const ByteString &rRoot, const ByteString &rVersion, bool bLocal_in , bool skip_links )
/*****************************************************************************/
: SourceTreeIterator( rRoot, rVersion , bLocal_in ),
nMode( LOCALIZE_NONE ),
nFileCnt( 0 )
{
bSkipLinks = skip_links ;
}
/*****************************************************************************/
SourceTreeLocalizer::~SourceTreeLocalizer()
/*****************************************************************************/
{
}
/*****************************************************************************/
const ByteString SourceTreeLocalizer::GetProjectName( sal_Bool bAbs )
/*****************************************************************************/
{
sal_Bool bFound = sal_False;
DirEntry aCur;
aCur.ToAbs();
for ( ; ! bFound && aCur.Level() > 1; aCur.CutName() )
{
DirEntry aTest = aCur + DirEntry(PRJ_DIR_NAME) + DirEntry(DLIST_NAME);
if ( aTest.Exists() )
{
if ( bAbs )
return ByteString( aCur.GetFull(), RTL_TEXTENCODING_ASCII_US );
else
return ByteString( aCur.GetName(), RTL_TEXTENCODING_ASCII_US );
}
}
return "";
}
/*****************************************************************************/
int SourceTreeLocalizer::GetFileCnt(){
/*****************************************************************************/
return nFileCnt;
}
/*****************************************************************************/
const ByteString SourceTreeLocalizer::GetProjectRootRel()
/*****************************************************************************/
{
ByteString sProjectRoot( GetProjectName( sal_True ));
DirEntry aCur;
aCur.ToAbs();
ByteString sCur( aCur.GetFull(), RTL_TEXTENCODING_ASCII_US );
if( sCur.SearchAndReplace( sProjectRoot, "" ) == STRING_NOTFOUND )
return "";
ByteString sDelimiter(
DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
sCur.SearchAndReplaceAll( sDelimiter, "/" );
sCur.EraseLeadingChars( '/' );
sal_uLong nCount = sCur.GetTokenCount( '/' );
ByteString sProjectRootRel;
for ( sal_uLong i = 0; i < nCount; i++ ) {
if ( sProjectRootRel.Len())
sProjectRootRel += sDelimiter;
sProjectRootRel += "..";
}
if ( sProjectRootRel.Len())
return sProjectRootRel;
return ".";
}
bool skipProject( ByteString sPrj )
{
static const ByteString READLICENSE( "readlicense" );
return sPrj.EqualsIgnoreCaseAscii( READLICENSE );
}
/*****************************************************************************/
void SourceTreeLocalizer::WorkOnFile(
const ByteString &rFileName, const ByteString &rExecutable,
const ByteString &rParameter )
/*****************************************************************************/
{
String sFull( rFileName, RTL_TEXTENCODING_ASCII_US );
DirEntry aEntry( sFull );
ByteString sFileName( aEntry.GetName(), RTL_TEXTENCODING_ASCII_US );
// set current working directory
DirEntry aPath( aEntry.GetPath());
DirEntry aOldCWD;
aPath.SetCWD();
ByteString sPrj( GetProjectName());
if ( sPrj.Len() && !skipProject( sPrj ) )
{
ByteString sRoot( GetProjectRootRel());
DirEntry aTemp( Export::GetTempFile());
ByteString sTempFile( aTemp.GetFull(), RTL_TEXTENCODING_ASCII_US );
ByteString sDel;
#if defined(WNT) || defined(OS2)
sDel=ByteString("\\");
#else
sDel=ByteString("/");
#endif
ByteString sPath1( Export::GetEnv("SOLARVER") );
ByteString sPath2( Export::GetEnv("INPATH") );
ByteString sPath3( "bin" );
ByteString sPath4( Export::GetEnv("UPDMINOREXT") );
ByteString sExecutable( sPath1 );
sExecutable += sDel ;
sExecutable += sPath2 ;
sExecutable += sDel;
sExecutable += sPath3 ;
sExecutable += sPath4 ;
sExecutable += sDel ;
sExecutable += rExecutable ;
ByteString sCommand( sExecutable );
sCommand += " ";
sCommand += rParameter;
sCommand += " -p ";
sCommand += sPrj;
sCommand += " -r ";
sCommand += sRoot;
sCommand += " -i ";
sCommand += sFileName;
sCommand += " -o ";
sCommand += sTempFile;
if ( sLanguageRestriction.Len()) {
sCommand += " -l ";
sCommand += getSourceLanguages( sLanguageRestriction , sCommand );
}
//printf("DBG: %s\n",sCommand.GetBuffer());
if (system(sCommand.GetBuffer()) == -1)
fprintf(stderr, "%s failed\n", sCommand.GetBuffer());
nFileCnt++;
printf(".");
fflush( stdout );
SvFileStream aSDFIn( aTemp.GetFull(), STREAM_READ );
ByteString sLine;
while ( aSDFIn.IsOpen() && !aSDFIn.IsEof()) {
aSDFIn.ReadLine( sLine );
if ( sLine.Len()) {
aSDF.WriteLine( sLine );
}
}
aSDFIn.Close();
aTemp.Kill();
}
// reset current working directory
aOldCWD.SetCWD();
}
ByteString SourceTreeLocalizer::getSourceLanguages( ByteString sLanguageRestriction_inout , ByteString sCommand )
{
// Source languages in helpcontent2 and macromigration en-US only!
if( sCommand.Search("helpex") != STRING_NOTFOUND ) {
sLanguageRestriction_inout.Assign( ByteString("en-US") );
}
else if( sCommand.Search("xmlex") != STRING_NOTFOUND ){
sLanguageRestriction_inout.Assign( ByteString("en-US") );
}
return sLanguageRestriction_inout;
}
/*****************************************************************************/
sal_Bool SourceTreeLocalizer::CheckNegativeList( const ByteString &rFileName )
/*****************************************************************************/
{
sal_uLong nIndex = 0;
sal_Bool bReturn = sal_True;
ByteString sDelimiter(
DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
ByteString sFileName( rFileName );
sFileName.ToLowerAscii();
ByteString sNegative( NegativeList[ nIndex ] );
while( !sNegative.Equals( "NULL" ) && bReturn ) {
sNegative.SearchAndReplaceAll( "\\", sDelimiter );
sNegative.SearchAndReplaceAll( "/", sDelimiter );
sNegative.ToLowerAscii();
if( sFileName.Search( sNegative ) == sFileName.Len() - sNegative.Len())
bReturn = sal_False;
nIndex++;
sNegative = NegativeList[ nIndex ];
}
return bReturn;
}
/*****************************************************************************/
sal_Bool SourceTreeLocalizer::CheckPositiveList( const ByteString &rFileName )
/*****************************************************************************/
{
sal_uLong nIndex = 0;
sal_Bool bReturn = sal_False;
ByteString sDelimiter(
DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
ByteString sFileName( rFileName );
sFileName.ToLowerAscii();
ByteString sNegative( PositiveList[ nIndex ] );
while( !sNegative.Equals( "NULL" ) && !bReturn ) {
sNegative.SearchAndReplaceAll( "\\", sDelimiter );
sNegative.SearchAndReplaceAll( "/", sDelimiter );
sNegative.ToLowerAscii();
if( sFileName.Search( sNegative ) == sFileName.Len() - sNegative.Len())
bReturn = sal_True;
nIndex++;
sNegative = PositiveList[ nIndex ];
}
return bReturn;
}
/*****************************************************************************/
void SourceTreeLocalizer::WorkOnFileType(
const ByteString &rDirectory, const ByteString &rExtension,
const ByteString &rExecutable, const ByteString &rParameter,
const ByteString &rCollectMode
)
/*****************************************************************************/
{
String sWild( rDirectory, RTL_TEXTENCODING_ASCII_US );
sWild += DirEntry::GetAccessDelimiter();
sWild += String::CreateFromAscii( "*." );
sWild += String( rExtension, RTL_TEXTENCODING_ASCII_US );
DirEntry aEntry( sWild );
Dir aDir( sWild, FSYS_KIND_FILE );
for ( sal_uInt16 i = 0; i < aDir.Count(); i++ ) {
DirEntry aFile( aDir[ i ] );
ByteString sFile( aFile.GetFull(), RTL_TEXTENCODING_ASCII_US );
sal_Bool bAllowed = sal_True;
if ( rCollectMode.Equals( "negative" ))
bAllowed = CheckNegativeList( sFile );
else if ( rCollectMode.Equals( "positive" ))
bAllowed = CheckPositiveList( sFile );
if ( bAllowed )
WorkOnFile( sFile, rExecutable, rParameter );
}
}
/*****************************************************************************/
void SourceTreeLocalizer::WorkOnDirectory( const ByteString &rDirectory )
/*****************************************************************************/
{
//printf("Working on Directory %s\n",rDirectory.GetBuffer());
sal_uLong nIndex = 0;
ByteString sExtension( ExeTable[ nIndex ][ 0 ] );
ByteString sExecutable( ExeTable[ nIndex ][ 1 ] );
ByteString sParameter( ExeTable[ nIndex ][ 2 ] );
ByteString sCollectMode( ExeTable[ nIndex ][ 3 ] );
while( !sExtension.Equals( "NULL" )) {
WorkOnFileType(
rDirectory,
sExtension,
sExecutable,
sParameter,
sCollectMode
);
nIndex++;
sExtension = ExeTable[ nIndex ][ 0 ];
sExecutable = ExeTable[ nIndex ][ 1 ];
sParameter = ExeTable[ nIndex ][ 2 ];
sCollectMode = ExeTable[ nIndex ][ 3 ];
}
}
void SourceTreeLocalizer::OnExecuteDirectory( const rtl::OUString &aDirectory )
{
ByteString rDirectory( rtl::OUStringToOString( aDirectory , RTL_TEXTENCODING_UTF8 , aDirectory.getLength() ) ) ;
if ( nMode == LOCALIZE_NONE ){
}
else
WorkOnDirectory( rDirectory );
}
/*****************************************************************************/
sal_Bool SourceTreeLocalizer::Extract( const ByteString &rDestinationFile )
/*****************************************************************************/
{
nMode = LOCALIZE_EXTRACT;
aSDF.Open( String( rDestinationFile , RTL_TEXTENCODING_ASCII_US ) , STREAM_STD_WRITE );
aSDF.SetLineDelimiter( LINEEND_CRLF );
sal_Bool bReturn = aSDF.IsOpen();
if ( bReturn ) {
aSDF.Seek( STREAM_SEEK_TO_END );
bReturn = StartExecute();
aSDF.Close();
}
else{
printf("ERROR: Can't create file %s\n", rDestinationFile.GetBuffer() );
}
nMode = LOCALIZE_NONE;
aSDF.Close();
return bReturn;
}
/*****************************************************************************/
sal_Bool SourceTreeLocalizer::MergeSingleFile(
const ByteString &rPrj,
const ByteString &rFile,
const ByteString &rSDFFile
)
/*****************************************************************************/
{
//printf("MergeSingleFile(%s,%s,%s)",rPrj.GetBuffer(),rFile.GetBuffer(),rSDFFile.GetBuffer());
if ( !rFile.Len())
return sal_True;
ByteString sRoot( Export::GetEnv( "SRC_ROOT" ));
DirEntry aEntry( String( sRoot, RTL_TEXTENCODING_ASCII_US ));
aEntry += DirEntry( String( rPrj, RTL_TEXTENCODING_ASCII_US ));
ByteString sDelimiter(
DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
ByteString sCur( rFile );
sCur.SearchAndReplaceAll( "\\", sDelimiter );
sCur.SearchAndReplaceAll( "/", sDelimiter );
aEntry += DirEntry( String( sCur, RTL_TEXTENCODING_ASCII_US ));
ByteString sFile( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
ByteString sBCur( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
sal_uLong nIndex = 0;
ByteString sExtension( aEntry.GetExtension(), RTL_TEXTENCODING_ASCII_US );
ByteString sCandidate( ExeTable[ nIndex ][ 0 ] );
while( !sCandidate.Equals ("NULL") && !sCandidate.Equals(sExtension) )
sCandidate = ExeTable[ ++nIndex ][ 0 ];
if ( !sCandidate.Equals( "NULL" ) ) {
if( !aEntry.Exists()) {
DirEntryKind theDir=FSYS_KIND_FILE;
Dir myDir( aEntry.GetPath(), theDir);
DirEntry current;
sal_Bool found=sal_False;
for( sal_uInt16 x=0; x < myDir.Count() && !found;){
current=myDir[x++];
StringCompare result=current.GetName().CompareIgnoreCaseToAscii( aEntry.GetName() );
if( result==COMPARE_EQUAL ){
fprintf(stderr,"WARNING: %s not found\n", ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US).GetBuffer() );
fprintf(stderr,"but use %s instead \n" , ByteString(current.GetFull(), RTL_TEXTENCODING_ASCII_US).GetBuffer() );
aEntry=current;
found=sal_True;
}
}
if(!found) return sal_True;
}
DirEntry aOut( Export::GetTempFile() );
ByteString sOutput;
if( sOutputFile.Len() == 0 )
sOutput = ByteString ( aOut.GetFull(), RTL_TEXTENCODING_ASCII_US );
else
sOutput = sOutputFile;
ByteString sCommand( ExeTable[ nIndex ][ 1 ] );
sCommand += " -i ";
sCommand += ByteString( aEntry.GetName(), RTL_TEXTENCODING_ASCII_US );
sCommand += " -m ";
sCommand += rSDFFile;
sCommand += " -o ";
sCommand += sOutput;
sCommand += " ";
sCommand += ByteString( ExeTable[ nIndex ][ 2 ] );
if ( sLanguageRestriction.Len()) {
sCommand += " -l ";
sCommand += sLanguageRestriction;
}
DirEntry aPath( aEntry.GetPath());
DirEntry aOldCWD;
aPath.SetCWD();
if (system(sCommand.GetBuffer()) == -1)
fprintf(stderr, "%s failed\n", sCommand.GetBuffer());
nFileCnt++;
printf(".");
SvFileStream aInStream( aOut.GetFull(), STREAM_READ );
if ( !aInStream.IsOpen()) {
fprintf( stderr,
"ERROR: Unable to open file %s for reading!\n",
sOutput.GetBuffer());
}
else {
FileStat::SetReadOnlyFlag( aEntry, sal_False );
String myStr2(aEntry.GetFull());
String aTemp22 = String::CreateFromAscii("_tmp");
myStr2.Append(aTemp22);
ByteString test(myStr2,RTL_TEXTENCODING_ASCII_US);
SvFileStream aOutStream( myStr2, STREAM_STD_WRITE | STREAM_TRUNC );
if ( !aOutStream.IsOpen()) {
ByteString test2(myStr2,RTL_TEXTENCODING_ASCII_US);
fprintf( stderr,"ERROR: Unable to open file %s for modification!\n", test2.GetBuffer());
aInStream.Close();
}
else {
ByteString sLine;
aOutStream.SetLineDelimiter( LINEEND_LF );
aInStream.ReadLine( sLine );
while ( !aInStream.IsEof()) {
aOutStream.WriteLine( sLine );
aInStream.ReadLine( sLine );
}
aInStream.Close();
aOutStream.Close();
DirEntry myTempFile(ByteString(myStr2,RTL_TEXTENCODING_ASCII_US)); // xxx_tmp ->
DirEntry myFile(ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US));// xxx
DirEntry oldFile(ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US));
if(oldFile.Kill()==ERRCODE_NONE){
if(myTempFile.MoveTo(myFile)!=ERRCODE_NONE){
fprintf( stderr, "ERROR: Can't rename file %s\n",ByteString(myStr2,RTL_TEXTENCODING_ASCII_US).GetBuffer());
}
}
else{
fprintf( stderr, "ERROR: Can't remove file %s\n",ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US).GetBuffer());
}
} // else
aOldCWD.SetCWD();
aOut.Kill();
} // else
}
return sal_True;
}
/*****************************************************************************/
sal_Bool SourceTreeLocalizer::ExecuteMerge( )
/*****************************************************************************/
{
DirEntry aEntry( Export::GetTempFile());
sal_Bool bReturn = sal_True;
bool bMerged = false;
ByteString sFileName;
ByteString sCurFile;
ByteString sLine;
ByteString sFileKey;
SvFileStream aFile;
ByteString sOutputFileName = sOutputFile;
ByteString sInpath(".");
sInpath += Export::GetEnv("INPATH");
ByteString sBlank("");
sOutputFileName.SearchAndReplaceAll( sInpath , sBlank );
String sDel = DirEntry::GetAccessDelimiter();
ByteString sBDel( sDel.GetBuffer() , sDel.Len() , RTL_TEXTENCODING_UTF8 );
if( bLocal ){
xub_StrLen nPos = sOutputFileName.SearchBackward( sBDel.GetChar(0) );
sOutputFileName = sOutputFileName.Copy( nPos+1 , sOutputFileName.Len()-nPos-1 );
}
ByteStringBoolHashMap aFileHM;
// Read all possible files
while ( !aSDF.IsEof()) {
aSDF.ReadLine( sLine );
sFileName = sLine.GetToken( 0, '\t' );
sFileName += "#";
sFileName += sLine.GetToken( 1, '\t' );
aFileHM[sFileName]=true;
}
for( ByteStringBoolHashMap::iterator iter = aFileHM.begin(); iter != aFileHM.end(); ++iter ){
sFileKey = iter->first;
aSDF.Seek( 0 );
aFile.Open( aEntry.GetFull(), STREAM_STD_WRITE |STREAM_TRUNC );
while ( !aSDF.IsEof()) {
aSDF.ReadLine( sLine );
sFileName = sLine.GetToken( 0, '\t' );
sFileName += "#";
sFileName += sLine.GetToken( 1, '\t' );
if( sFileName.Len() && ( sFileName.CompareTo(sFileKey) == COMPARE_EQUAL ) ){
if ( aFile.IsOpen() && sLine.Len())
aFile.WriteLine( sLine );
}
}
if ( aFile.IsOpen())
aFile.Close();
ByteString sPrj( sFileKey.GetToken( 0, '#' ));
ByteString sFile( sFileKey.GetToken( 1, '#' ));
ByteString sSDFFile( aFile.GetFileName(), RTL_TEXTENCODING_ASCII_US );
//printf("localize test sPrj = %s , sFile = %s , sSDFFile = %s sOutputFileName = %s\n",sPrj.GetBuffer(), sFile.GetBuffer() , sSDFFile.GetBuffer() , sOutputFileName.GetBuffer() );
// Test
bLocal = true;
// Test
if( bLocal ){
sal_uInt16 nPos = sFile.SearchBackward( '\\' );
ByteString sTmp = sFile.Copy( nPos+1 , sFile.Len()-nPos-1 );
//printf("'%s'='%s'\n",sTmp.GetBuffer(), sOutputFileName.GetBuffer());
if( sTmp.CompareTo(sOutputFileName) == COMPARE_EQUAL ){
bMerged = true;
if ( !MergeSingleFile( sPrj, sFile, sSDFFile ))
bReturn = sal_False;
}else{
bMerged = true;
//printf("MergeSingleFile('%s','%s','%s')\n",sPrj.GetBuffer(),sFile.GetBuffer(),sSDFFile.GetBuffer());
if ( !MergeSingleFile( sPrj, sFile, sSDFFile ))
bReturn = sal_False;
}
}
}
aEntry.Kill();
// If Outputfile not included in the SDF file copy it without merge
if( bLocal && !bMerged ){
DirEntry aSourceFile( sOutputFileName.GetBuffer() );
FSysError aErr = aSourceFile.CopyTo( DirEntry ( sOutputFile.GetBuffer() ) , FSYS_ACTION_COPYFILE );
if( aErr != FSYS_ERR_OK ){
printf("ERROR: Can't copy file '%s' to '%s' %d\n",sOutputFileName.GetBuffer(),sOutputFile.GetBuffer(),sal::static_int_cast<int>(aErr));
}
}
return bReturn;
}
/*****************************************************************************/
sal_Bool SourceTreeLocalizer::Merge( const ByteString &rSourceFile , const ByteString &rOutput )
/*****************************************************************************/
{
sOutputFile = rOutput;
nMode = LOCALIZE_MERGE;
aSDF.Open( String( rSourceFile, RTL_TEXTENCODING_ASCII_US ),
STREAM_STD_READ );
sal_Bool bReturn = aSDF.IsOpen();
if ( bReturn ) {
bReturn = ExecuteMerge();
// aSDF.Close();
}
aSDF.Close();
nMode = LOCALIZE_NONE;
return bReturn;
}
}
using namespace transex3;
#define STATE_NONE 0x0000
#define STATE_EXPORT 0x0001
#define STATE_MERGE 0x0002
#define STATE_ISOCODE 0x0003
#define STATE_LANGUAGES 0x0004
#define STATE_FILENAME 0x0005
#define STATE_OUTPUT 0x0006
/*****************************************************************************/
void Help()
/*****************************************************************************/
{
fprintf( stdout,
"localize (c)2001 by Sun Microsystems\n"
"====================================\n" );
fprintf( stdout,
"As part of the L10N framework, localize extracts and merges translations\n"
"out of and into the whole source tree.\n\n"
"Syntax: localize -e -l en-US -f FileName \n"
"Parameter:\n"
"\t-e: Extract mode\n"
"\tFileName: Output file when extract mode, input file when merge mode\n"
"\tl1...ln: supported languages (\"all\" for all languages).\n"
);
fprintf( stdout,
"Valid language codes for l1...ln and f1...fn are:\n" );
fprintf( stdout,
"\nExample 1:\n"
"==========\n"
"localize -e -l en-US -f MyFile\n\n"
"All strings will be extracted for language de and language en-US.\n"
);
}
/*****************************************************************************/
int Error()
/*****************************************************************************/
{
Help();
return 1;
}
/*****************************************************************************/
sal_Bool CheckLanguages( ByteString &rLanguages )
/*****************************************************************************/
{
ByteString sTmp( rLanguages );
return true;
}
/*****************************************************************************/
#if defined(UNX) || defined(OS2)
int main( int argc, char *argv[] )
#else
int _cdecl main( int argc, char *argv[] )
#endif
/*****************************************************************************/
{
String sTempBase( String::CreateFromAscii( "loc" ));
DirEntry::SetTempNameBase( sTempBase );
sal_uInt16 nState = STATE_NONE;
sal_Bool bExport = sal_False;
sal_Bool bMerge = sal_False;
bool bSkipLinks = false;
ByteString sLanguages;
ByteString sFileName;
ByteString sOutput;
bExport = sal_True;
for( int i = 1; i < argc; i++ ) {
ByteString sSwitch( argv[ i ] );
sSwitch.ToUpperAscii();
if ( sSwitch.Equals( "-E" )) {
nState = STATE_EXPORT;
if ( bMerge )
return Error();
bExport = sal_True;
}
else if ( sSwitch.Equals( "-I" ) )
nState = STATE_ISOCODE;
else if ( sSwitch.Equals( "-L" ) )
nState = STATE_LANGUAGES;
else if ( sSwitch.Equals( "-F" ) )
nState = STATE_FILENAME;
else if ( ByteString( argv[ i ]).ToUpperAscii().Equals( "-O" ) )
nState = STATE_OUTPUT;
else {
switch ( nState ) {
case STATE_NONE:
return Error();
case STATE_OUTPUT:
if ( sOutput.Len())
return Error();
sOutput = ByteString( argv[ i ] );
nState = STATE_NONE;
break;
case STATE_LANGUAGES:
if ( sLanguages.Len())
return Error();
sLanguages = ByteString( argv[ i ] );
nState = STATE_NONE;
break;
case STATE_FILENAME:
if ( sFileName.Len())
return Error();
sFileName = ByteString( argv[ i ] );
nState = STATE_NONE;
break;
default:
return Error();
}
}
}
if ( !bMerge && !bExport ) {
Help();
return 1;
}
ByteString sSolarVer( Export::GetEnv( "WORK_STAMP" ));
ByteString sVersion( Export::GetEnv( "WORK_STAMP" ));
if ( !sSolarVer.Len() || !sVersion.Len()) {
fprintf( stderr, "ERROR: No environment set!\n" );
return 1;
}
if ( !CheckLanguages( sLanguages ))
return 2;
if ( !sFileName.Len()) {
fprintf( stderr, "ERROR: No filename given\n" );
return 3;
}
DirEntry aEntry( String( sFileName , RTL_TEXTENCODING_ASCII_US ));
aEntry.ToAbs();
String sFullEntry = aEntry.GetFull();
ByteString sFileABS( aEntry.GetFull(), gsl_getSystemTextEncoding());
//printf("B %s\nA %s\n",rDestinationFile.GetBuffer(), sFile.GetBuffer());
sFileName = sFileABS;
Treeconfig treeconfig;
vector<string> repos;
bool hasPwd = treeconfig.getActiveRepositories( repos );
if( hasPwd ) cout << "Found special path!\n";
string minor_ext;
bool has_minor_ext;
if( Export::GetEnv("UPDMINOREXT") != NULL )
{
minor_ext = string( Export::GetEnv("UPDMINOREXT") );
has_minor_ext = minor_ext.size();
}
else
has_minor_ext = false;
// localize through all repositories
for( vector<string>::iterator iter = repos.begin(); iter != repos.end() ; ++iter )
{
string curRepository;
if( has_minor_ext )
curRepository = string( Export::GetEnv("SOURCE_ROOT_DIR") ) + "/" + *iter + minor_ext;
else
curRepository = string( Export::GetEnv("SOURCE_ROOT_DIR") ) + "/" + *iter;
cout << "Localizing repository " << curRepository << "\n";
SourceTreeLocalizer aIter( ByteString( curRepository.c_str() ) , sVersion , (sOutput.Len() > 0) , bSkipLinks );
aIter.SetLanguageRestriction( sLanguages );
if ( bExport ){
fflush( stdout );
if( *iter == "ooo" )
aIter.Extract( sFileName );
else
{
ByteString sFileNameWithExt( sFileName );
sFileNameWithExt += ByteString( "." );
sFileNameWithExt += ByteString( (*iter).c_str() );
aIter.Extract( sFileNameWithExt );
}
printf("\n%d files found!\n",aIter.GetFileCnt());
}
}
if( hasPwd )
{
string pwd;
Export::getCurrentDir( pwd );
cout << "Localizing repository " << pwd << "\n";
SourceTreeLocalizer aIter( ByteString( pwd.c_str() ) , sVersion , (sOutput.Len() > 0) , bSkipLinks );
aIter.SetLanguageRestriction( sLanguages );
if ( bExport ){
fflush( stdout );
aIter.Extract( sFileName );
printf("\n%d files found!\n",aIter.GetFileCnt());
}
}
return 0;
}