1*3cd96b95SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*3cd96b95SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*3cd96b95SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*3cd96b95SAndrew Rist * distributed with this work for additional information
6*3cd96b95SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*3cd96b95SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*3cd96b95SAndrew Rist * "License"); you may not use this file except in compliance
9*3cd96b95SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*3cd96b95SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*3cd96b95SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*3cd96b95SAndrew Rist * software distributed under the License is distributed on an
15*3cd96b95SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3cd96b95SAndrew Rist * KIND, either express or implied. See the License for the
17*3cd96b95SAndrew Rist * specific language governing permissions and limitations
18*3cd96b95SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*3cd96b95SAndrew Rist *************************************************************/
21*3cd96b95SAndrew Rist
22*3cd96b95SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_l10ntools.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "srciter.hxx"
28cdf0e10cSrcweir #include "export.hxx"
29cdf0e10cSrcweir #include "treeconfig.hxx"
30cdf0e10cSrcweir #include <string>
31cdf0e10cSrcweir #include <vector>
32cdf0e10cSrcweir #include <stdio.h>
33cdf0e10cSrcweir #include <iostream>
34cdf0e10cSrcweir #include "tools/errcode.hxx"
35cdf0e10cSrcweir #include "tools/fsys.hxx"
36cdf0e10cSrcweir
37cdf0e10cSrcweir #ifndef L10NTOOLS_FILE_HXX
38cdf0e10cSrcweir #define L10NTOOLS_FILE_HXX
39cdf0e10cSrcweir #include <l10ntools/file.hxx>
40cdf0e10cSrcweir #endif
41cdf0e10cSrcweir
42cdf0e10cSrcweir namespace transex3
43cdf0e10cSrcweir {
44cdf0e10cSrcweir
45cdf0e10cSrcweir //
46cdf0e10cSrcweir // SourceTreeLocalizer
47cdf0e10cSrcweir //
48cdf0e10cSrcweir
49cdf0e10cSrcweir const char *ExeTable[][5] = {
50cdf0e10cSrcweir { "src", "transex3", " -UTF8 -e", "negative", "noiso" },
51cdf0e10cSrcweir { "hrc", "transex3", " -UTF8 -e", "positive", "noiso" },
52cdf0e10cSrcweir { "tree", "xhtex", "", "negative", "noiso" },
53cdf0e10cSrcweir { "xtx", "xtxex", "", "negative", "noiso" },
54cdf0e10cSrcweir { "ulf", "ulfex", " -e", "negative", "noiso" },
55cdf0e10cSrcweir { "xrb", "xmlex", "-UTF8 -e", "negative", "iso" },
56cdf0e10cSrcweir { "xxl", "xmlex", "-UTF8 -e", "negative", "iso" },
57cdf0e10cSrcweir { "xgf", "xmlex", "-UTF8 -e -t:xgf", "negative", "iso" },
58cdf0e10cSrcweir { "xcd", "cfgex", "-UTF8 -e", "negative", "iso" },
59cdf0e10cSrcweir { "xcu", "cfgex", "-UTF8 -e", "negative", "iso" },
60cdf0e10cSrcweir { "xcs", "cfgex", "-UTF8 -e -f", "negative", "iso" },
61cdf0e10cSrcweir { "xrm", "xrmex", "-UTF8 -e", "negative", "iso" },
62cdf0e10cSrcweir { "xhp", "helpex", " -e", "negative", "noiso" },
63cdf0e10cSrcweir { "properties", "jpropex", " -e", "negative", "noiso" },
64cdf0e10cSrcweir { "NULL", "NULL", "NULL", "NULL", "NULL" }
65cdf0e10cSrcweir };
66cdf0e10cSrcweir
67cdf0e10cSrcweir const char *NegativeList[] = {
68cdf0e10cSrcweir "officecfg/data/org.openoffice.Office.Labels.xcd",
69cdf0e10cSrcweir "officecfg/data/org/openoffice/Office/Labels.xcd",
70cdf0e10cSrcweir "officecfg/data/org/openoffice/Office/SFX.xcd",
71cdf0e10cSrcweir "officecfg/data/org/openoffice/Office/Accelerators.xcu",
72cdf0e10cSrcweir "hidother.src",
73cdf0e10cSrcweir "NULL"
74cdf0e10cSrcweir };
75cdf0e10cSrcweir
76cdf0e10cSrcweir const char *PositiveList[] = {
77cdf0e10cSrcweir "svx/inc/globlmn_tmpl.hrc",
78cdf0e10cSrcweir "sw/source/ui/inc/swmn_tmpl.hrc",
79cdf0e10cSrcweir "sw/source/ui/inc/swacc_tmpl.hrc",
80cdf0e10cSrcweir "sw/source/ui/inc/toolbox_tmpl.hrc",
81cdf0e10cSrcweir "offmgr/inc/offmenu_tmpl.hrc",
82cdf0e10cSrcweir "offmgr/source/offapp/intro/intro_tmpl.hrc",
83cdf0e10cSrcweir "dbaccess/source/ui/inc/toolbox_tmpl.hrc",
84cdf0e10cSrcweir "svx/source/intro/intro_tmpl.hrc",
85cdf0e10cSrcweir "dbaccess/source/ui/dlg/AutoControls_tmpl.hrc",
86cdf0e10cSrcweir "svx/source/unodialogs/textconversiondlgs/chinese_direction_tmpl.hrc",
87cdf0e10cSrcweir "chart2/source/controller/dialogs/res_DataLabel_tmpl.hrc",
88cdf0e10cSrcweir "chart2/source/controller/dialogs/res_LegendPosition_tmpl.hrc",
89cdf0e10cSrcweir "chart2/source/controller/dialogs/res_Statistic_tmpl.hrc",
90cdf0e10cSrcweir "chart2/source/controller/dialogs/res_Titlesx_tmpl.hrc",
91cdf0e10cSrcweir "chart2/source/controller/dialogs/res_SecondaryAxisCheckBoxes_tmpl.hrc",
92cdf0e10cSrcweir "chart2/source/controller/menu/MenuItems_tmpl.hrc",
93cdf0e10cSrcweir "chart2/source/controller/dialogs/res_ErrorBar_tmpl.hrc",
94cdf0e10cSrcweir "chart2/source/controller/dialogs/res_Trendline_tmpl.hrc",
95cdf0e10cSrcweir "svx.link/inc/globlmn_tmpl.hrc",
96cdf0e10cSrcweir "sw.link/source/ui/inc/swmn_tmpl.hrc",
97cdf0e10cSrcweir "sw.link/source/ui/inc/swacc_tmpl.hrc",
98cdf0e10cSrcweir "sw.link/source/ui/inc/toolbox_tmpl.hrc",
99cdf0e10cSrcweir "offmgr.link/inc/offmenu_tmpl.hrc",
100cdf0e10cSrcweir "offmgr.link/source/offapp/intro/intro_tmpl.hrc",
101cdf0e10cSrcweir "dbaccess.link/source/ui/inc/toolbox_tmpl.hrc",
102cdf0e10cSrcweir "svx.link/source/intro/intro_tmpl.hrc",
103cdf0e10cSrcweir "dbaccess.link/source/ui/dlg/AutoControls_tmpl.hrc",
104cdf0e10cSrcweir "svx.link/source/unodialogs/textconversiondlgs/chinese_direction_tmpl.hrc",
105cdf0e10cSrcweir "chart2.link/source/controller/dialogs/res_DataLabel_tmpl.hrc",
106cdf0e10cSrcweir "chart2.link/source/controller/dialogs/res_LegendPosition_tmpl.hrc",
107cdf0e10cSrcweir "chart2.link/source/controller/dialogs/res_Statistic_tmpl.hrc",
108cdf0e10cSrcweir "chart2.link/source/controller/dialogs/res_Titlesx_tmpl.hrc",
109cdf0e10cSrcweir "chart2.link/source/controller/dialogs/res_SecondaryAxisCheckBoxes_tmpl.hrc",
110cdf0e10cSrcweir "chart2.link/source/controller/menu/MenuItems_tmpl.hrc",
111cdf0e10cSrcweir "chart2.link/source/controller/dialogs/res_ErrorBar_tmpl.hrc",
112cdf0e10cSrcweir "chart2.link/source/controller/dialogs/res_Trendline_tmpl.hrc",
113cdf0e10cSrcweir "NULL"
114cdf0e10cSrcweir };
115cdf0e10cSrcweir
116cdf0e10cSrcweir
117cdf0e10cSrcweir const char PRJ_DIR_NAME[] = "prj";
118cdf0e10cSrcweir const char DLIST_NAME[] = "d.lst";
119cdf0e10cSrcweir
120cdf0e10cSrcweir #define LOCALIZE_NONE 0x0000
121cdf0e10cSrcweir #define LOCALIZE_EXTRACT 0x0001
122cdf0e10cSrcweir #define LOCALIZE_MERGE 0x0002
123cdf0e10cSrcweir
124cdf0e10cSrcweir class SourceTreeLocalizer : public SourceTreeIterator
125cdf0e10cSrcweir {
126cdf0e10cSrcweir private:
127cdf0e10cSrcweir SvFileStream aSDF;
128cdf0e10cSrcweir sal_uInt16 nMode;
129cdf0e10cSrcweir
130cdf0e10cSrcweir ByteString sLanguageRestriction;
131cdf0e10cSrcweir
132cdf0e10cSrcweir ByteString sOutputFile;
133cdf0e10cSrcweir
134cdf0e10cSrcweir int nFileCnt;
135cdf0e10cSrcweir
136cdf0e10cSrcweir const ByteString GetProjectName( sal_Bool bAbs = sal_False );
137cdf0e10cSrcweir const ByteString GetProjectRootRel();
138cdf0e10cSrcweir
139cdf0e10cSrcweir
140cdf0e10cSrcweir sal_Bool CheckNegativeList( const ByteString &rFileName );
141cdf0e10cSrcweir sal_Bool CheckPositiveList( const ByteString &rFileName );
142cdf0e10cSrcweir
143cdf0e10cSrcweir void WorkOnFile(
144cdf0e10cSrcweir const ByteString &rFileName,
145cdf0e10cSrcweir const ByteString &rExecutable,
146cdf0e10cSrcweir const ByteString &rParameter
147cdf0e10cSrcweir );
148cdf0e10cSrcweir
149cdf0e10cSrcweir void WorkOnFileType(
150cdf0e10cSrcweir const ByteString &rDirectory,
151cdf0e10cSrcweir const ByteString &rExtension,
152cdf0e10cSrcweir const ByteString &rExecutable,
153cdf0e10cSrcweir const ByteString &rParameter,
154cdf0e10cSrcweir const ByteString &rCollectMode
155cdf0e10cSrcweir );
156cdf0e10cSrcweir void WorkOnDirectory( const ByteString &rDirectory );
157cdf0e10cSrcweir sal_Bool ExecuteMerge();
158cdf0e10cSrcweir sal_Bool MergeSingleFile(
159cdf0e10cSrcweir const ByteString &rPrj,
160cdf0e10cSrcweir const ByteString &rFile,
161cdf0e10cSrcweir const ByteString &rSDFFile
162cdf0e10cSrcweir );
163cdf0e10cSrcweir
164cdf0e10cSrcweir public:
165cdf0e10cSrcweir SourceTreeLocalizer( const ByteString &rRoot, const ByteString &rVersion , bool bLocal , bool skip_links );
166cdf0e10cSrcweir ~SourceTreeLocalizer();
167cdf0e10cSrcweir
168cdf0e10cSrcweir ByteString getSourceLanguages( ByteString sLanguageRestriction , ByteString sCommand );
169cdf0e10cSrcweir
SetLanguageRestriction(const ByteString & rRestrictions)170cdf0e10cSrcweir void SetLanguageRestriction( const ByteString& rRestrictions )
171cdf0e10cSrcweir { sLanguageRestriction = rRestrictions; }
172cdf0e10cSrcweir int getFileCnt();
173cdf0e10cSrcweir sal_Bool Extract( const ByteString &rDestinationFile );
174cdf0e10cSrcweir sal_Bool Merge( const ByteString &rSourceFile , const ByteString &rOutput );
175cdf0e10cSrcweir int GetFileCnt();
176cdf0e10cSrcweir virtual void OnExecuteDirectory( const rtl::OUString &rDirectory );
177cdf0e10cSrcweir };
178cdf0e10cSrcweir
179cdf0e10cSrcweir /*****************************************************************************/
SourceTreeLocalizer(const ByteString & rRoot,const ByteString & rVersion,bool bLocal_in,bool skip_links)180cdf0e10cSrcweir SourceTreeLocalizer::SourceTreeLocalizer(
181cdf0e10cSrcweir const ByteString &rRoot, const ByteString &rVersion, bool bLocal_in , bool skip_links )
182cdf0e10cSrcweir /*****************************************************************************/
183cdf0e10cSrcweir : SourceTreeIterator( rRoot, rVersion , bLocal_in ),
184cdf0e10cSrcweir nMode( LOCALIZE_NONE ),
185cdf0e10cSrcweir nFileCnt( 0 )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir bSkipLinks = skip_links ;
188cdf0e10cSrcweir }
189cdf0e10cSrcweir
190cdf0e10cSrcweir /*****************************************************************************/
~SourceTreeLocalizer()191cdf0e10cSrcweir SourceTreeLocalizer::~SourceTreeLocalizer()
192cdf0e10cSrcweir /*****************************************************************************/
193cdf0e10cSrcweir {
194cdf0e10cSrcweir }
195cdf0e10cSrcweir
196cdf0e10cSrcweir /*****************************************************************************/
GetProjectName(sal_Bool bAbs)197cdf0e10cSrcweir const ByteString SourceTreeLocalizer::GetProjectName( sal_Bool bAbs )
198cdf0e10cSrcweir /*****************************************************************************/
199cdf0e10cSrcweir {
200cdf0e10cSrcweir sal_Bool bFound = sal_False;
201cdf0e10cSrcweir DirEntry aCur;
202cdf0e10cSrcweir aCur.ToAbs();
203cdf0e10cSrcweir
204cdf0e10cSrcweir for ( ; ! bFound && aCur.Level() > 1; aCur.CutName() )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir DirEntry aTest = aCur + DirEntry(PRJ_DIR_NAME) + DirEntry(DLIST_NAME);
207cdf0e10cSrcweir if ( aTest.Exists() )
208cdf0e10cSrcweir {
209cdf0e10cSrcweir if ( bAbs )
210cdf0e10cSrcweir return ByteString( aCur.GetFull(), RTL_TEXTENCODING_ASCII_US );
211cdf0e10cSrcweir else
212cdf0e10cSrcweir return ByteString( aCur.GetName(), RTL_TEXTENCODING_ASCII_US );
213cdf0e10cSrcweir }
214cdf0e10cSrcweir }
215cdf0e10cSrcweir
216cdf0e10cSrcweir return "";
217cdf0e10cSrcweir }
218cdf0e10cSrcweir /*****************************************************************************/
GetFileCnt()219cdf0e10cSrcweir int SourceTreeLocalizer::GetFileCnt(){
220cdf0e10cSrcweir /*****************************************************************************/
221cdf0e10cSrcweir return nFileCnt;
222cdf0e10cSrcweir }
223cdf0e10cSrcweir
224cdf0e10cSrcweir /*****************************************************************************/
GetProjectRootRel()225cdf0e10cSrcweir const ByteString SourceTreeLocalizer::GetProjectRootRel()
226cdf0e10cSrcweir /*****************************************************************************/
227cdf0e10cSrcweir {
228cdf0e10cSrcweir ByteString sProjectRoot( GetProjectName( sal_True ));
229cdf0e10cSrcweir DirEntry aCur;
230cdf0e10cSrcweir aCur.ToAbs();
231cdf0e10cSrcweir ByteString sCur( aCur.GetFull(), RTL_TEXTENCODING_ASCII_US );
232cdf0e10cSrcweir
233cdf0e10cSrcweir if( sCur.SearchAndReplace( sProjectRoot, "" ) == STRING_NOTFOUND )
234cdf0e10cSrcweir return "";
235cdf0e10cSrcweir
236cdf0e10cSrcweir ByteString sDelimiter(
237cdf0e10cSrcweir DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
238cdf0e10cSrcweir
239cdf0e10cSrcweir sCur.SearchAndReplaceAll( sDelimiter, "/" );
240cdf0e10cSrcweir sCur.EraseLeadingChars( '/' );
241cdf0e10cSrcweir sal_uLong nCount = sCur.GetTokenCount( '/' );
242cdf0e10cSrcweir
243cdf0e10cSrcweir ByteString sProjectRootRel;
244cdf0e10cSrcweir for ( sal_uLong i = 0; i < nCount; i++ ) {
245cdf0e10cSrcweir if ( sProjectRootRel.Len())
246cdf0e10cSrcweir sProjectRootRel += sDelimiter;
247cdf0e10cSrcweir sProjectRootRel += "..";
248cdf0e10cSrcweir }
249cdf0e10cSrcweir if ( sProjectRootRel.Len())
250cdf0e10cSrcweir return sProjectRootRel;
251cdf0e10cSrcweir
252cdf0e10cSrcweir return ".";
253cdf0e10cSrcweir }
254cdf0e10cSrcweir
skipProject(ByteString sPrj)255cdf0e10cSrcweir bool skipProject( ByteString sPrj )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir static const ByteString READLICENSE( "readlicense" );
258cdf0e10cSrcweir return sPrj.EqualsIgnoreCaseAscii( READLICENSE );
259cdf0e10cSrcweir }
260cdf0e10cSrcweir
261cdf0e10cSrcweir /*****************************************************************************/
WorkOnFile(const ByteString & rFileName,const ByteString & rExecutable,const ByteString & rParameter)262cdf0e10cSrcweir void SourceTreeLocalizer::WorkOnFile(
263cdf0e10cSrcweir const ByteString &rFileName, const ByteString &rExecutable,
264cdf0e10cSrcweir const ByteString &rParameter )
265cdf0e10cSrcweir /*****************************************************************************/
266cdf0e10cSrcweir {
267cdf0e10cSrcweir String sFull( rFileName, RTL_TEXTENCODING_ASCII_US );
268cdf0e10cSrcweir DirEntry aEntry( sFull );
269cdf0e10cSrcweir ByteString sFileName( aEntry.GetName(), RTL_TEXTENCODING_ASCII_US );
270cdf0e10cSrcweir
271cdf0e10cSrcweir // set current working directory
272cdf0e10cSrcweir DirEntry aPath( aEntry.GetPath());
273cdf0e10cSrcweir DirEntry aOldCWD;
274cdf0e10cSrcweir aPath.SetCWD();
275cdf0e10cSrcweir
276cdf0e10cSrcweir ByteString sPrj( GetProjectName());
277cdf0e10cSrcweir if ( sPrj.Len() && !skipProject( sPrj ) )
278cdf0e10cSrcweir {
279cdf0e10cSrcweir ByteString sRoot( GetProjectRootRel());
280cdf0e10cSrcweir
281cdf0e10cSrcweir DirEntry aTemp( Export::GetTempFile());
282cdf0e10cSrcweir ByteString sTempFile( aTemp.GetFull(), RTL_TEXTENCODING_ASCII_US );
283cdf0e10cSrcweir
284cdf0e10cSrcweir ByteString sDel;
285cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
286cdf0e10cSrcweir sDel=ByteString("\\");
287cdf0e10cSrcweir #else
288cdf0e10cSrcweir sDel=ByteString("/");
289cdf0e10cSrcweir #endif
290cdf0e10cSrcweir ByteString sPath1( Export::GetEnv("SOLARVER") );
291cdf0e10cSrcweir ByteString sPath2( Export::GetEnv("INPATH") );
292cdf0e10cSrcweir ByteString sPath3( "bin" );
293cdf0e10cSrcweir ByteString sPath4( Export::GetEnv("UPDMINOREXT") );
294cdf0e10cSrcweir ByteString sExecutable( sPath1 );
295cdf0e10cSrcweir sExecutable += sDel ;
296cdf0e10cSrcweir sExecutable += sPath2 ;
297cdf0e10cSrcweir sExecutable += sDel;
298cdf0e10cSrcweir sExecutable += sPath3 ;
299cdf0e10cSrcweir sExecutable += sPath4 ;
300cdf0e10cSrcweir sExecutable += sDel ;
301cdf0e10cSrcweir sExecutable += rExecutable ;
302cdf0e10cSrcweir
303cdf0e10cSrcweir
304cdf0e10cSrcweir ByteString sCommand( sExecutable );
305cdf0e10cSrcweir sCommand += " ";
306cdf0e10cSrcweir sCommand += rParameter;
307cdf0e10cSrcweir sCommand += " -p ";
308cdf0e10cSrcweir sCommand += sPrj;
309cdf0e10cSrcweir sCommand += " -r ";
310cdf0e10cSrcweir sCommand += sRoot;
311cdf0e10cSrcweir sCommand += " -i ";
312cdf0e10cSrcweir sCommand += sFileName;
313cdf0e10cSrcweir sCommand += " -o ";
314cdf0e10cSrcweir sCommand += sTempFile;
315cdf0e10cSrcweir if ( sLanguageRestriction.Len()) {
316cdf0e10cSrcweir sCommand += " -l ";
317cdf0e10cSrcweir sCommand += getSourceLanguages( sLanguageRestriction , sCommand );
318cdf0e10cSrcweir }
319cdf0e10cSrcweir
320cdf0e10cSrcweir //printf("DBG: %s\n",sCommand.GetBuffer());
321cdf0e10cSrcweir if (system(sCommand.GetBuffer()) == -1)
322cdf0e10cSrcweir fprintf(stderr, "%s failed\n", sCommand.GetBuffer());
323cdf0e10cSrcweir nFileCnt++;
324cdf0e10cSrcweir printf(".");
325cdf0e10cSrcweir fflush( stdout );
326cdf0e10cSrcweir
327cdf0e10cSrcweir SvFileStream aSDFIn( aTemp.GetFull(), STREAM_READ );
328cdf0e10cSrcweir ByteString sLine;
329cdf0e10cSrcweir while ( aSDFIn.IsOpen() && !aSDFIn.IsEof()) {
330cdf0e10cSrcweir aSDFIn.ReadLine( sLine );
331cdf0e10cSrcweir if ( sLine.Len()) {
332cdf0e10cSrcweir aSDF.WriteLine( sLine );
333cdf0e10cSrcweir }
334cdf0e10cSrcweir }
335cdf0e10cSrcweir aSDFIn.Close();
336cdf0e10cSrcweir
337cdf0e10cSrcweir aTemp.Kill();
338cdf0e10cSrcweir
339cdf0e10cSrcweir }
340cdf0e10cSrcweir // reset current working directory
341cdf0e10cSrcweir aOldCWD.SetCWD();
342cdf0e10cSrcweir }
343cdf0e10cSrcweir
getSourceLanguages(ByteString sLanguageRestriction_inout,ByteString sCommand)344cdf0e10cSrcweir ByteString SourceTreeLocalizer::getSourceLanguages( ByteString sLanguageRestriction_inout , ByteString sCommand )
345cdf0e10cSrcweir {
346cdf0e10cSrcweir // Source languages in helpcontent2 and macromigration en-US only!
347cdf0e10cSrcweir if( sCommand.Search("helpex") != STRING_NOTFOUND ) {
348cdf0e10cSrcweir sLanguageRestriction_inout.Assign( ByteString("en-US") );
349cdf0e10cSrcweir }
350cdf0e10cSrcweir else if( sCommand.Search("xmlex") != STRING_NOTFOUND ){
351cdf0e10cSrcweir sLanguageRestriction_inout.Assign( ByteString("en-US") );
352cdf0e10cSrcweir }
353cdf0e10cSrcweir return sLanguageRestriction_inout;
354cdf0e10cSrcweir }
355cdf0e10cSrcweir
356cdf0e10cSrcweir /*****************************************************************************/
CheckNegativeList(const ByteString & rFileName)357cdf0e10cSrcweir sal_Bool SourceTreeLocalizer::CheckNegativeList( const ByteString &rFileName )
358cdf0e10cSrcweir /*****************************************************************************/
359cdf0e10cSrcweir {
360cdf0e10cSrcweir sal_uLong nIndex = 0;
361cdf0e10cSrcweir sal_Bool bReturn = sal_True;
362cdf0e10cSrcweir
363cdf0e10cSrcweir ByteString sDelimiter(
364cdf0e10cSrcweir DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
365cdf0e10cSrcweir
366cdf0e10cSrcweir ByteString sFileName( rFileName );
367cdf0e10cSrcweir sFileName.ToLowerAscii();
368cdf0e10cSrcweir
369cdf0e10cSrcweir ByteString sNegative( NegativeList[ nIndex ] );
370cdf0e10cSrcweir while( !sNegative.Equals( "NULL" ) && bReturn ) {
371cdf0e10cSrcweir sNegative.SearchAndReplaceAll( "\\", sDelimiter );
372cdf0e10cSrcweir sNegative.SearchAndReplaceAll( "/", sDelimiter );
373cdf0e10cSrcweir sNegative.ToLowerAscii();
374cdf0e10cSrcweir
375cdf0e10cSrcweir if( sFileName.Search( sNegative ) == sFileName.Len() - sNegative.Len())
376cdf0e10cSrcweir bReturn = sal_False;
377cdf0e10cSrcweir
378cdf0e10cSrcweir nIndex++;
379cdf0e10cSrcweir sNegative = NegativeList[ nIndex ];
380cdf0e10cSrcweir }
381cdf0e10cSrcweir
382cdf0e10cSrcweir return bReturn;
383cdf0e10cSrcweir }
384cdf0e10cSrcweir
385cdf0e10cSrcweir /*****************************************************************************/
CheckPositiveList(const ByteString & rFileName)386cdf0e10cSrcweir sal_Bool SourceTreeLocalizer::CheckPositiveList( const ByteString &rFileName )
387cdf0e10cSrcweir /*****************************************************************************/
388cdf0e10cSrcweir {
389cdf0e10cSrcweir sal_uLong nIndex = 0;
390cdf0e10cSrcweir sal_Bool bReturn = sal_False;
391cdf0e10cSrcweir
392cdf0e10cSrcweir ByteString sDelimiter(
393cdf0e10cSrcweir DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
394cdf0e10cSrcweir
395cdf0e10cSrcweir ByteString sFileName( rFileName );
396cdf0e10cSrcweir sFileName.ToLowerAscii();
397cdf0e10cSrcweir
398cdf0e10cSrcweir ByteString sNegative( PositiveList[ nIndex ] );
399cdf0e10cSrcweir while( !sNegative.Equals( "NULL" ) && !bReturn ) {
400cdf0e10cSrcweir sNegative.SearchAndReplaceAll( "\\", sDelimiter );
401cdf0e10cSrcweir sNegative.SearchAndReplaceAll( "/", sDelimiter );
402cdf0e10cSrcweir sNegative.ToLowerAscii();
403cdf0e10cSrcweir
404cdf0e10cSrcweir if( sFileName.Search( sNegative ) == sFileName.Len() - sNegative.Len())
405cdf0e10cSrcweir bReturn = sal_True;
406cdf0e10cSrcweir
407cdf0e10cSrcweir nIndex++;
408cdf0e10cSrcweir sNegative = PositiveList[ nIndex ];
409cdf0e10cSrcweir }
410cdf0e10cSrcweir
411cdf0e10cSrcweir return bReturn;
412cdf0e10cSrcweir }
413cdf0e10cSrcweir
414cdf0e10cSrcweir /*****************************************************************************/
WorkOnFileType(const ByteString & rDirectory,const ByteString & rExtension,const ByteString & rExecutable,const ByteString & rParameter,const ByteString & rCollectMode)415cdf0e10cSrcweir void SourceTreeLocalizer::WorkOnFileType(
416cdf0e10cSrcweir const ByteString &rDirectory, const ByteString &rExtension,
417cdf0e10cSrcweir const ByteString &rExecutable, const ByteString &rParameter,
418cdf0e10cSrcweir const ByteString &rCollectMode
419cdf0e10cSrcweir )
420cdf0e10cSrcweir /*****************************************************************************/
421cdf0e10cSrcweir {
422cdf0e10cSrcweir String sWild( rDirectory, RTL_TEXTENCODING_ASCII_US );
423cdf0e10cSrcweir sWild += DirEntry::GetAccessDelimiter();
424cdf0e10cSrcweir sWild += String::CreateFromAscii( "*." );
425cdf0e10cSrcweir sWild += String( rExtension, RTL_TEXTENCODING_ASCII_US );
426cdf0e10cSrcweir
427cdf0e10cSrcweir DirEntry aEntry( sWild );
428cdf0e10cSrcweir Dir aDir( sWild, FSYS_KIND_FILE );
429cdf0e10cSrcweir
430cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < aDir.Count(); i++ ) {
431cdf0e10cSrcweir DirEntry aFile( aDir[ i ] );
432cdf0e10cSrcweir ByteString sFile( aFile.GetFull(), RTL_TEXTENCODING_ASCII_US );
433cdf0e10cSrcweir
434cdf0e10cSrcweir sal_Bool bAllowed = sal_True;
435cdf0e10cSrcweir
436cdf0e10cSrcweir if ( rCollectMode.Equals( "negative" ))
437cdf0e10cSrcweir bAllowed = CheckNegativeList( sFile );
438cdf0e10cSrcweir else if ( rCollectMode.Equals( "positive" ))
439cdf0e10cSrcweir bAllowed = CheckPositiveList( sFile );
440cdf0e10cSrcweir
441cdf0e10cSrcweir if ( bAllowed )
442cdf0e10cSrcweir WorkOnFile( sFile, rExecutable, rParameter );
443cdf0e10cSrcweir }
444cdf0e10cSrcweir }
445cdf0e10cSrcweir
446cdf0e10cSrcweir /*****************************************************************************/
WorkOnDirectory(const ByteString & rDirectory)447cdf0e10cSrcweir void SourceTreeLocalizer::WorkOnDirectory( const ByteString &rDirectory )
448cdf0e10cSrcweir /*****************************************************************************/
449cdf0e10cSrcweir {
450cdf0e10cSrcweir //printf("Working on Directory %s\n",rDirectory.GetBuffer());
451cdf0e10cSrcweir sal_uLong nIndex = 0;
452cdf0e10cSrcweir ByteString sExtension( ExeTable[ nIndex ][ 0 ] );
453cdf0e10cSrcweir ByteString sExecutable( ExeTable[ nIndex ][ 1 ] );
454cdf0e10cSrcweir ByteString sParameter( ExeTable[ nIndex ][ 2 ] );
455cdf0e10cSrcweir ByteString sCollectMode( ExeTable[ nIndex ][ 3 ] );
456cdf0e10cSrcweir
457cdf0e10cSrcweir while( !sExtension.Equals( "NULL" )) {
458cdf0e10cSrcweir WorkOnFileType(
459cdf0e10cSrcweir rDirectory,
460cdf0e10cSrcweir sExtension,
461cdf0e10cSrcweir sExecutable,
462cdf0e10cSrcweir sParameter,
463cdf0e10cSrcweir sCollectMode
464cdf0e10cSrcweir );
465cdf0e10cSrcweir
466cdf0e10cSrcweir nIndex++;
467cdf0e10cSrcweir
468cdf0e10cSrcweir sExtension = ExeTable[ nIndex ][ 0 ];
469cdf0e10cSrcweir sExecutable = ExeTable[ nIndex ][ 1 ];
470cdf0e10cSrcweir sParameter = ExeTable[ nIndex ][ 2 ];
471cdf0e10cSrcweir sCollectMode = ExeTable[ nIndex ][ 3 ];
472cdf0e10cSrcweir }
473cdf0e10cSrcweir }
474cdf0e10cSrcweir
OnExecuteDirectory(const rtl::OUString & aDirectory)475cdf0e10cSrcweir void SourceTreeLocalizer::OnExecuteDirectory( const rtl::OUString &aDirectory )
476cdf0e10cSrcweir {
477cdf0e10cSrcweir ByteString rDirectory( rtl::OUStringToOString( aDirectory , RTL_TEXTENCODING_UTF8 , aDirectory.getLength() ) ) ;
478cdf0e10cSrcweir if ( nMode == LOCALIZE_NONE ){
479cdf0e10cSrcweir }
480cdf0e10cSrcweir else
481cdf0e10cSrcweir WorkOnDirectory( rDirectory );
482cdf0e10cSrcweir }
483cdf0e10cSrcweir
484cdf0e10cSrcweir /*****************************************************************************/
Extract(const ByteString & rDestinationFile)485cdf0e10cSrcweir sal_Bool SourceTreeLocalizer::Extract( const ByteString &rDestinationFile )
486cdf0e10cSrcweir /*****************************************************************************/
487cdf0e10cSrcweir {
488cdf0e10cSrcweir nMode = LOCALIZE_EXTRACT;
489cdf0e10cSrcweir
490cdf0e10cSrcweir aSDF.Open( String( rDestinationFile , RTL_TEXTENCODING_ASCII_US ) , STREAM_STD_WRITE );
491cdf0e10cSrcweir aSDF.SetLineDelimiter( LINEEND_CRLF );
492cdf0e10cSrcweir
493cdf0e10cSrcweir sal_Bool bReturn = aSDF.IsOpen();
494cdf0e10cSrcweir if ( bReturn ) {
495cdf0e10cSrcweir aSDF.Seek( STREAM_SEEK_TO_END );
496cdf0e10cSrcweir bReturn = StartExecute();
497cdf0e10cSrcweir aSDF.Close();
498cdf0e10cSrcweir }
499cdf0e10cSrcweir else{
500cdf0e10cSrcweir printf("ERROR: Can't create file %s\n", rDestinationFile.GetBuffer() );
501cdf0e10cSrcweir }
502cdf0e10cSrcweir nMode = LOCALIZE_NONE;
503cdf0e10cSrcweir aSDF.Close();
504cdf0e10cSrcweir return bReturn;
505cdf0e10cSrcweir }
506cdf0e10cSrcweir
507cdf0e10cSrcweir /*****************************************************************************/
MergeSingleFile(const ByteString & rPrj,const ByteString & rFile,const ByteString & rSDFFile)508cdf0e10cSrcweir sal_Bool SourceTreeLocalizer::MergeSingleFile(
509cdf0e10cSrcweir const ByteString &rPrj,
510cdf0e10cSrcweir const ByteString &rFile,
511cdf0e10cSrcweir const ByteString &rSDFFile
512cdf0e10cSrcweir )
513cdf0e10cSrcweir /*****************************************************************************/
514cdf0e10cSrcweir {
515cdf0e10cSrcweir //printf("MergeSingleFile(%s,%s,%s)",rPrj.GetBuffer(),rFile.GetBuffer(),rSDFFile.GetBuffer());
516cdf0e10cSrcweir if ( !rFile.Len())
517cdf0e10cSrcweir return sal_True;
518cdf0e10cSrcweir
519cdf0e10cSrcweir ByteString sRoot( Export::GetEnv( "SRC_ROOT" ));
520cdf0e10cSrcweir DirEntry aEntry( String( sRoot, RTL_TEXTENCODING_ASCII_US ));
521cdf0e10cSrcweir aEntry += DirEntry( String( rPrj, RTL_TEXTENCODING_ASCII_US ));
522cdf0e10cSrcweir
523cdf0e10cSrcweir ByteString sDelimiter(
524cdf0e10cSrcweir DirEntry::GetAccessDelimiter(), RTL_TEXTENCODING_ASCII_US );
525cdf0e10cSrcweir
526cdf0e10cSrcweir ByteString sCur( rFile );
527cdf0e10cSrcweir sCur.SearchAndReplaceAll( "\\", sDelimiter );
528cdf0e10cSrcweir sCur.SearchAndReplaceAll( "/", sDelimiter );
529cdf0e10cSrcweir
530cdf0e10cSrcweir aEntry += DirEntry( String( sCur, RTL_TEXTENCODING_ASCII_US ));
531cdf0e10cSrcweir ByteString sFile( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
532cdf0e10cSrcweir
533cdf0e10cSrcweir ByteString sBCur( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
534cdf0e10cSrcweir
535cdf0e10cSrcweir sal_uLong nIndex = 0;
536cdf0e10cSrcweir ByteString sExtension( aEntry.GetExtension(), RTL_TEXTENCODING_ASCII_US );
537cdf0e10cSrcweir ByteString sCandidate( ExeTable[ nIndex ][ 0 ] );
538cdf0e10cSrcweir
539cdf0e10cSrcweir while( !sCandidate.Equals ("NULL") && !sCandidate.Equals(sExtension) )
540cdf0e10cSrcweir sCandidate = ExeTable[ ++nIndex ][ 0 ];
541cdf0e10cSrcweir
542cdf0e10cSrcweir if ( !sCandidate.Equals( "NULL" ) ) {
543cdf0e10cSrcweir if( !aEntry.Exists()) {
544cdf0e10cSrcweir DirEntryKind theDir=FSYS_KIND_FILE;
545cdf0e10cSrcweir Dir myDir( aEntry.GetPath(), theDir);
546cdf0e10cSrcweir DirEntry current;
547cdf0e10cSrcweir sal_Bool found=sal_False;
548cdf0e10cSrcweir for( sal_uInt16 x=0; x < myDir.Count() && !found;){
549cdf0e10cSrcweir current=myDir[x++];
550cdf0e10cSrcweir StringCompare result=current.GetName().CompareIgnoreCaseToAscii( aEntry.GetName() );
551cdf0e10cSrcweir if( result==COMPARE_EQUAL ){
552cdf0e10cSrcweir fprintf(stderr,"WARNING: %s not found\n", ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US).GetBuffer() );
553cdf0e10cSrcweir fprintf(stderr,"but use %s instead \n" , ByteString(current.GetFull(), RTL_TEXTENCODING_ASCII_US).GetBuffer() );
554cdf0e10cSrcweir aEntry=current;
555cdf0e10cSrcweir found=sal_True;
556cdf0e10cSrcweir }
557cdf0e10cSrcweir }
558cdf0e10cSrcweir if(!found) return sal_True;
559cdf0e10cSrcweir
560cdf0e10cSrcweir }
561cdf0e10cSrcweir
562cdf0e10cSrcweir DirEntry aOut( Export::GetTempFile() );
563cdf0e10cSrcweir ByteString sOutput;
564cdf0e10cSrcweir if( sOutputFile.Len() == 0 )
565cdf0e10cSrcweir sOutput = ByteString ( aOut.GetFull(), RTL_TEXTENCODING_ASCII_US );
566cdf0e10cSrcweir else
567cdf0e10cSrcweir sOutput = sOutputFile;
568cdf0e10cSrcweir ByteString sCommand( ExeTable[ nIndex ][ 1 ] );
569cdf0e10cSrcweir sCommand += " -i ";
570cdf0e10cSrcweir sCommand += ByteString( aEntry.GetName(), RTL_TEXTENCODING_ASCII_US );
571cdf0e10cSrcweir sCommand += " -m ";
572cdf0e10cSrcweir sCommand += rSDFFile;
573cdf0e10cSrcweir sCommand += " -o ";
574cdf0e10cSrcweir sCommand += sOutput;
575cdf0e10cSrcweir sCommand += " ";
576cdf0e10cSrcweir sCommand += ByteString( ExeTable[ nIndex ][ 2 ] );
577cdf0e10cSrcweir if ( sLanguageRestriction.Len()) {
578cdf0e10cSrcweir sCommand += " -l ";
579cdf0e10cSrcweir sCommand += sLanguageRestriction;
580cdf0e10cSrcweir }
581cdf0e10cSrcweir
582cdf0e10cSrcweir DirEntry aPath( aEntry.GetPath());
583cdf0e10cSrcweir DirEntry aOldCWD;
584cdf0e10cSrcweir aPath.SetCWD();
585cdf0e10cSrcweir
586cdf0e10cSrcweir if (system(sCommand.GetBuffer()) == -1)
587cdf0e10cSrcweir fprintf(stderr, "%s failed\n", sCommand.GetBuffer());
588cdf0e10cSrcweir nFileCnt++;
589cdf0e10cSrcweir printf(".");
590cdf0e10cSrcweir SvFileStream aInStream( aOut.GetFull(), STREAM_READ );
591cdf0e10cSrcweir if ( !aInStream.IsOpen()) {
592cdf0e10cSrcweir fprintf( stderr,
593cdf0e10cSrcweir "ERROR: Unable to open file %s for reading!\n",
594cdf0e10cSrcweir sOutput.GetBuffer());
595cdf0e10cSrcweir }
596cdf0e10cSrcweir else {
597cdf0e10cSrcweir FileStat::SetReadOnlyFlag( aEntry, sal_False );
598cdf0e10cSrcweir String myStr2(aEntry.GetFull());
599cdf0e10cSrcweir String aTemp22 = String::CreateFromAscii("_tmp");
600cdf0e10cSrcweir myStr2.Append(aTemp22);
601cdf0e10cSrcweir
602cdf0e10cSrcweir ByteString test(myStr2,RTL_TEXTENCODING_ASCII_US);
603cdf0e10cSrcweir SvFileStream aOutStream( myStr2, STREAM_STD_WRITE | STREAM_TRUNC );
604cdf0e10cSrcweir if ( !aOutStream.IsOpen()) {
605cdf0e10cSrcweir ByteString test2(myStr2,RTL_TEXTENCODING_ASCII_US);
606cdf0e10cSrcweir fprintf( stderr,"ERROR: Unable to open file %s for modification!\n", test2.GetBuffer());
607cdf0e10cSrcweir aInStream.Close();
608cdf0e10cSrcweir }
609cdf0e10cSrcweir
610cdf0e10cSrcweir else {
611cdf0e10cSrcweir ByteString sLine;
612cdf0e10cSrcweir aOutStream.SetLineDelimiter( LINEEND_LF );
613cdf0e10cSrcweir
614cdf0e10cSrcweir aInStream.ReadLine( sLine );
615cdf0e10cSrcweir while ( !aInStream.IsEof()) {
616cdf0e10cSrcweir aOutStream.WriteLine( sLine );
617cdf0e10cSrcweir aInStream.ReadLine( sLine );
618cdf0e10cSrcweir }
619cdf0e10cSrcweir aInStream.Close();
620cdf0e10cSrcweir aOutStream.Close();
621cdf0e10cSrcweir
622cdf0e10cSrcweir
623cdf0e10cSrcweir DirEntry myTempFile(ByteString(myStr2,RTL_TEXTENCODING_ASCII_US)); // xxx_tmp ->
624cdf0e10cSrcweir DirEntry myFile(ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US));// xxx
625cdf0e10cSrcweir
626cdf0e10cSrcweir DirEntry oldFile(ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US));
627cdf0e10cSrcweir
628cdf0e10cSrcweir if(oldFile.Kill()==ERRCODE_NONE){
629cdf0e10cSrcweir if(myTempFile.MoveTo(myFile)!=ERRCODE_NONE){
630cdf0e10cSrcweir fprintf( stderr, "ERROR: Can't rename file %s\n",ByteString(myStr2,RTL_TEXTENCODING_ASCII_US).GetBuffer());
631cdf0e10cSrcweir }
632cdf0e10cSrcweir }
633cdf0e10cSrcweir else{
634cdf0e10cSrcweir fprintf( stderr, "ERROR: Can't remove file %s\n",ByteString(aEntry.GetFull(),RTL_TEXTENCODING_ASCII_US).GetBuffer());
635cdf0e10cSrcweir }
636cdf0e10cSrcweir } // else
637cdf0e10cSrcweir
638cdf0e10cSrcweir aOldCWD.SetCWD();
639cdf0e10cSrcweir aOut.Kill();
640cdf0e10cSrcweir } // else
641cdf0e10cSrcweir }
642cdf0e10cSrcweir return sal_True;
643cdf0e10cSrcweir }
644cdf0e10cSrcweir /*****************************************************************************/
ExecuteMerge()645cdf0e10cSrcweir sal_Bool SourceTreeLocalizer::ExecuteMerge( )
646cdf0e10cSrcweir /*****************************************************************************/
647cdf0e10cSrcweir {
648cdf0e10cSrcweir DirEntry aEntry( Export::GetTempFile());
649cdf0e10cSrcweir sal_Bool bReturn = sal_True;
650cdf0e10cSrcweir bool bMerged = false;
651cdf0e10cSrcweir
652cdf0e10cSrcweir ByteString sFileName;
653cdf0e10cSrcweir ByteString sCurFile;
654cdf0e10cSrcweir ByteString sLine;
655cdf0e10cSrcweir ByteString sFileKey;
656cdf0e10cSrcweir
657cdf0e10cSrcweir SvFileStream aFile;
658cdf0e10cSrcweir
659cdf0e10cSrcweir ByteString sOutputFileName = sOutputFile;
660cdf0e10cSrcweir ByteString sInpath(".");
661cdf0e10cSrcweir sInpath += Export::GetEnv("INPATH");
662cdf0e10cSrcweir ByteString sBlank("");
663cdf0e10cSrcweir
664cdf0e10cSrcweir sOutputFileName.SearchAndReplaceAll( sInpath , sBlank );
665cdf0e10cSrcweir
666cdf0e10cSrcweir String sDel = DirEntry::GetAccessDelimiter();
667cdf0e10cSrcweir ByteString sBDel( sDel.GetBuffer() , sDel.Len() , RTL_TEXTENCODING_UTF8 );
668cdf0e10cSrcweir if( bLocal ){
669cdf0e10cSrcweir xub_StrLen nPos = sOutputFileName.SearchBackward( sBDel.GetChar(0) );
670cdf0e10cSrcweir sOutputFileName = sOutputFileName.Copy( nPos+1 , sOutputFileName.Len()-nPos-1 );
671cdf0e10cSrcweir }
672cdf0e10cSrcweir ByteStringBoolHashMap aFileHM;
673cdf0e10cSrcweir // Read all possible files
674cdf0e10cSrcweir while ( !aSDF.IsEof()) {
675cdf0e10cSrcweir aSDF.ReadLine( sLine );
676cdf0e10cSrcweir sFileName = sLine.GetToken( 0, '\t' );
677cdf0e10cSrcweir sFileName += "#";
678cdf0e10cSrcweir sFileName += sLine.GetToken( 1, '\t' );
679cdf0e10cSrcweir aFileHM[sFileName]=true;
680cdf0e10cSrcweir }
681cdf0e10cSrcweir
682cdf0e10cSrcweir for( ByteStringBoolHashMap::iterator iter = aFileHM.begin(); iter != aFileHM.end(); ++iter ){
683cdf0e10cSrcweir sFileKey = iter->first;
684cdf0e10cSrcweir aSDF.Seek( 0 );
685cdf0e10cSrcweir aFile.Open( aEntry.GetFull(), STREAM_STD_WRITE |STREAM_TRUNC );
686cdf0e10cSrcweir
687cdf0e10cSrcweir while ( !aSDF.IsEof()) {
688cdf0e10cSrcweir aSDF.ReadLine( sLine );
689cdf0e10cSrcweir sFileName = sLine.GetToken( 0, '\t' );
690cdf0e10cSrcweir sFileName += "#";
691cdf0e10cSrcweir sFileName += sLine.GetToken( 1, '\t' );
692cdf0e10cSrcweir if( sFileName.Len() && ( sFileName.CompareTo(sFileKey) == COMPARE_EQUAL ) ){
693cdf0e10cSrcweir if ( aFile.IsOpen() && sLine.Len())
694cdf0e10cSrcweir aFile.WriteLine( sLine );
695cdf0e10cSrcweir }
696cdf0e10cSrcweir }
697cdf0e10cSrcweir if ( aFile.IsOpen())
698cdf0e10cSrcweir aFile.Close();
699cdf0e10cSrcweir
700cdf0e10cSrcweir ByteString sPrj( sFileKey.GetToken( 0, '#' ));
701cdf0e10cSrcweir ByteString sFile( sFileKey.GetToken( 1, '#' ));
702cdf0e10cSrcweir ByteString sSDFFile( aFile.GetFileName(), RTL_TEXTENCODING_ASCII_US );
703cdf0e10cSrcweir
704cdf0e10cSrcweir //printf("localize test sPrj = %s , sFile = %s , sSDFFile = %s sOutputFileName = %s\n",sPrj.GetBuffer(), sFile.GetBuffer() , sSDFFile.GetBuffer() , sOutputFileName.GetBuffer() );
705cdf0e10cSrcweir
706cdf0e10cSrcweir // Test
707cdf0e10cSrcweir bLocal = true;
708cdf0e10cSrcweir // Test
709cdf0e10cSrcweir
710cdf0e10cSrcweir if( bLocal ){
711cdf0e10cSrcweir sal_uInt16 nPos = sFile.SearchBackward( '\\' );
712cdf0e10cSrcweir ByteString sTmp = sFile.Copy( nPos+1 , sFile.Len()-nPos-1 );
713cdf0e10cSrcweir //printf("'%s'='%s'\n",sTmp.GetBuffer(), sOutputFileName.GetBuffer());
714cdf0e10cSrcweir if( sTmp.CompareTo(sOutputFileName) == COMPARE_EQUAL ){
715cdf0e10cSrcweir bMerged = true;
716cdf0e10cSrcweir if ( !MergeSingleFile( sPrj, sFile, sSDFFile ))
717cdf0e10cSrcweir bReturn = sal_False;
718cdf0e10cSrcweir }else{
719cdf0e10cSrcweir bMerged = true;
720cdf0e10cSrcweir //printf("MergeSingleFile('%s','%s','%s')\n",sPrj.GetBuffer(),sFile.GetBuffer(),sSDFFile.GetBuffer());
721cdf0e10cSrcweir if ( !MergeSingleFile( sPrj, sFile, sSDFFile ))
722cdf0e10cSrcweir bReturn = sal_False;
723cdf0e10cSrcweir }
724cdf0e10cSrcweir }
725cdf0e10cSrcweir }
726cdf0e10cSrcweir aEntry.Kill();
727cdf0e10cSrcweir // If Outputfile not included in the SDF file copy it without merge
728cdf0e10cSrcweir
729cdf0e10cSrcweir if( bLocal && !bMerged ){
730cdf0e10cSrcweir DirEntry aSourceFile( sOutputFileName.GetBuffer() );
731cdf0e10cSrcweir FSysError aErr = aSourceFile.CopyTo( DirEntry ( sOutputFile.GetBuffer() ) , FSYS_ACTION_COPYFILE );
732cdf0e10cSrcweir if( aErr != FSYS_ERR_OK ){
733cdf0e10cSrcweir printf("ERROR: Can't copy file '%s' to '%s' %d\n",sOutputFileName.GetBuffer(),sOutputFile.GetBuffer(),sal::static_int_cast<int>(aErr));
734cdf0e10cSrcweir }
735cdf0e10cSrcweir }
736cdf0e10cSrcweir return bReturn;
737cdf0e10cSrcweir
738cdf0e10cSrcweir }
739cdf0e10cSrcweir
740cdf0e10cSrcweir /*****************************************************************************/
Merge(const ByteString & rSourceFile,const ByteString & rOutput)741cdf0e10cSrcweir sal_Bool SourceTreeLocalizer::Merge( const ByteString &rSourceFile , const ByteString &rOutput )
742cdf0e10cSrcweir /*****************************************************************************/
743cdf0e10cSrcweir {
744cdf0e10cSrcweir sOutputFile = rOutput;
745cdf0e10cSrcweir nMode = LOCALIZE_MERGE;
746cdf0e10cSrcweir aSDF.Open( String( rSourceFile, RTL_TEXTENCODING_ASCII_US ),
747cdf0e10cSrcweir STREAM_STD_READ );
748cdf0e10cSrcweir
749cdf0e10cSrcweir sal_Bool bReturn = aSDF.IsOpen();
750cdf0e10cSrcweir if ( bReturn ) {
751cdf0e10cSrcweir bReturn = ExecuteMerge();
752cdf0e10cSrcweir // aSDF.Close();
753cdf0e10cSrcweir }
754cdf0e10cSrcweir aSDF.Close();
755cdf0e10cSrcweir nMode = LOCALIZE_NONE;
756cdf0e10cSrcweir return bReturn;
757cdf0e10cSrcweir }
758cdf0e10cSrcweir
759cdf0e10cSrcweir }
760cdf0e10cSrcweir using namespace transex3;
761cdf0e10cSrcweir
762cdf0e10cSrcweir #define STATE_NONE 0x0000
763cdf0e10cSrcweir #define STATE_EXPORT 0x0001
764cdf0e10cSrcweir #define STATE_MERGE 0x0002
765cdf0e10cSrcweir #define STATE_ISOCODE 0x0003
766cdf0e10cSrcweir #define STATE_LANGUAGES 0x0004
767cdf0e10cSrcweir #define STATE_FILENAME 0x0005
768cdf0e10cSrcweir #define STATE_OUTPUT 0x0006
769cdf0e10cSrcweir
770cdf0e10cSrcweir /*****************************************************************************/
Help()771cdf0e10cSrcweir void Help()
772cdf0e10cSrcweir /*****************************************************************************/
773cdf0e10cSrcweir {
774cdf0e10cSrcweir fprintf( stdout,
775cdf0e10cSrcweir "localize (c)2001 by Sun Microsystems\n"
776cdf0e10cSrcweir "====================================\n" );
777cdf0e10cSrcweir fprintf( stdout,
778cdf0e10cSrcweir "As part of the L10N framework, localize extracts and merges translations\n"
779cdf0e10cSrcweir "out of and into the whole source tree.\n\n"
780cdf0e10cSrcweir "Syntax: localize -e -l en-US -f FileName \n"
781cdf0e10cSrcweir "Parameter:\n"
782cdf0e10cSrcweir "\t-e: Extract mode\n"
783cdf0e10cSrcweir "\tFileName: Output file when extract mode, input file when merge mode\n"
784cdf0e10cSrcweir "\tl1...ln: supported languages (\"all\" for all languages).\n"
785cdf0e10cSrcweir );
786cdf0e10cSrcweir
787cdf0e10cSrcweir fprintf( stdout,
788cdf0e10cSrcweir "Valid language codes for l1...ln and f1...fn are:\n" );
789cdf0e10cSrcweir fprintf( stdout,
790cdf0e10cSrcweir "\nExample 1:\n"
791cdf0e10cSrcweir "==========\n"
792cdf0e10cSrcweir "localize -e -l en-US -f MyFile\n\n"
793cdf0e10cSrcweir "All strings will be extracted for language de and language en-US.\n"
794cdf0e10cSrcweir );
795cdf0e10cSrcweir }
796cdf0e10cSrcweir
797cdf0e10cSrcweir /*****************************************************************************/
Error()798cdf0e10cSrcweir int Error()
799cdf0e10cSrcweir /*****************************************************************************/
800cdf0e10cSrcweir {
801cdf0e10cSrcweir Help();
802cdf0e10cSrcweir return 1;
803cdf0e10cSrcweir }
804cdf0e10cSrcweir
805cdf0e10cSrcweir /*****************************************************************************/
CheckLanguages(ByteString & rLanguages)806cdf0e10cSrcweir sal_Bool CheckLanguages( ByteString &rLanguages )
807cdf0e10cSrcweir /*****************************************************************************/
808cdf0e10cSrcweir {
809cdf0e10cSrcweir ByteString sTmp( rLanguages );
810cdf0e10cSrcweir return true;
811cdf0e10cSrcweir }
812cdf0e10cSrcweir
813cdf0e10cSrcweir /*****************************************************************************/
814cdf0e10cSrcweir #if defined(UNX) || defined(OS2)
main(int argc,char * argv[])815cdf0e10cSrcweir int main( int argc, char *argv[] )
816cdf0e10cSrcweir #else
817cdf0e10cSrcweir int _cdecl main( int argc, char *argv[] )
818cdf0e10cSrcweir #endif
819cdf0e10cSrcweir /*****************************************************************************/
820cdf0e10cSrcweir {
821cdf0e10cSrcweir String sTempBase( String::CreateFromAscii( "loc" ));
822cdf0e10cSrcweir DirEntry::SetTempNameBase( sTempBase );
823cdf0e10cSrcweir sal_uInt16 nState = STATE_NONE;
824cdf0e10cSrcweir
825cdf0e10cSrcweir sal_Bool bExport = sal_False;
826cdf0e10cSrcweir sal_Bool bMerge = sal_False;
827cdf0e10cSrcweir bool bSkipLinks = false;
828cdf0e10cSrcweir
829cdf0e10cSrcweir ByteString sLanguages;
830cdf0e10cSrcweir ByteString sFileName;
831cdf0e10cSrcweir ByteString sOutput;
832cdf0e10cSrcweir
833cdf0e10cSrcweir bExport = sal_True;
834cdf0e10cSrcweir
835cdf0e10cSrcweir for( int i = 1; i < argc; i++ ) {
836cdf0e10cSrcweir ByteString sSwitch( argv[ i ] );
837cdf0e10cSrcweir sSwitch.ToUpperAscii();
838cdf0e10cSrcweir
839cdf0e10cSrcweir if ( sSwitch.Equals( "-E" )) {
840cdf0e10cSrcweir nState = STATE_EXPORT;
841cdf0e10cSrcweir if ( bMerge )
842cdf0e10cSrcweir return Error();
843cdf0e10cSrcweir bExport = sal_True;
844cdf0e10cSrcweir }
845cdf0e10cSrcweir else if ( sSwitch.Equals( "-I" ) )
846cdf0e10cSrcweir nState = STATE_ISOCODE;
847cdf0e10cSrcweir else if ( sSwitch.Equals( "-L" ) )
848cdf0e10cSrcweir nState = STATE_LANGUAGES;
849cdf0e10cSrcweir else if ( sSwitch.Equals( "-F" ) )
850cdf0e10cSrcweir nState = STATE_FILENAME;
851cdf0e10cSrcweir else if ( ByteString( argv[ i ]).ToUpperAscii().Equals( "-O" ) )
852cdf0e10cSrcweir nState = STATE_OUTPUT;
853cdf0e10cSrcweir else {
854cdf0e10cSrcweir switch ( nState ) {
855cdf0e10cSrcweir case STATE_NONE:
856cdf0e10cSrcweir return Error();
857cdf0e10cSrcweir case STATE_OUTPUT:
858cdf0e10cSrcweir if ( sOutput.Len())
859cdf0e10cSrcweir return Error();
860cdf0e10cSrcweir sOutput = ByteString( argv[ i ] );
861cdf0e10cSrcweir nState = STATE_NONE;
862cdf0e10cSrcweir break;
863cdf0e10cSrcweir case STATE_LANGUAGES:
864cdf0e10cSrcweir if ( sLanguages.Len())
865cdf0e10cSrcweir return Error();
866cdf0e10cSrcweir sLanguages = ByteString( argv[ i ] );
867cdf0e10cSrcweir nState = STATE_NONE;
868cdf0e10cSrcweir break;
869cdf0e10cSrcweir case STATE_FILENAME:
870cdf0e10cSrcweir if ( sFileName.Len())
871cdf0e10cSrcweir return Error();
872cdf0e10cSrcweir sFileName = ByteString( argv[ i ] );
873cdf0e10cSrcweir nState = STATE_NONE;
874cdf0e10cSrcweir break;
875cdf0e10cSrcweir default:
876cdf0e10cSrcweir return Error();
877cdf0e10cSrcweir }
878cdf0e10cSrcweir }
879cdf0e10cSrcweir }
880cdf0e10cSrcweir if ( !bMerge && !bExport ) {
881cdf0e10cSrcweir Help();
882cdf0e10cSrcweir return 1;
883cdf0e10cSrcweir }
884cdf0e10cSrcweir
885cdf0e10cSrcweir ByteString sSolarVer( Export::GetEnv( "WORK_STAMP" ));
886cdf0e10cSrcweir ByteString sVersion( Export::GetEnv( "WORK_STAMP" ));
887cdf0e10cSrcweir
888cdf0e10cSrcweir if ( !sSolarVer.Len() || !sVersion.Len()) {
889cdf0e10cSrcweir fprintf( stderr, "ERROR: No environment set!\n" );
890cdf0e10cSrcweir return 1;
891cdf0e10cSrcweir }
892cdf0e10cSrcweir
893cdf0e10cSrcweir if ( !CheckLanguages( sLanguages ))
894cdf0e10cSrcweir return 2;
895cdf0e10cSrcweir
896cdf0e10cSrcweir if ( !sFileName.Len()) {
897cdf0e10cSrcweir fprintf( stderr, "ERROR: No filename given\n" );
898cdf0e10cSrcweir return 3;
899cdf0e10cSrcweir }
900cdf0e10cSrcweir
901cdf0e10cSrcweir DirEntry aEntry( String( sFileName , RTL_TEXTENCODING_ASCII_US ));
902cdf0e10cSrcweir aEntry.ToAbs();
903cdf0e10cSrcweir String sFullEntry = aEntry.GetFull();
904cdf0e10cSrcweir ByteString sFileABS( aEntry.GetFull(), gsl_getSystemTextEncoding());
905cdf0e10cSrcweir //printf("B %s\nA %s\n",rDestinationFile.GetBuffer(), sFile.GetBuffer());
906cdf0e10cSrcweir sFileName = sFileABS;
907cdf0e10cSrcweir
908cdf0e10cSrcweir Treeconfig treeconfig;
909cdf0e10cSrcweir vector<string> repos;
910cdf0e10cSrcweir bool hasPwd = treeconfig.getActiveRepositories( repos );
911cdf0e10cSrcweir if( hasPwd ) cout << "Found special path!\n";
912cdf0e10cSrcweir
913cdf0e10cSrcweir string minor_ext;
914cdf0e10cSrcweir bool has_minor_ext;
915cdf0e10cSrcweir
916cdf0e10cSrcweir if( Export::GetEnv("UPDMINOREXT") != NULL )
917cdf0e10cSrcweir {
918cdf0e10cSrcweir minor_ext = string( Export::GetEnv("UPDMINOREXT") );
919cdf0e10cSrcweir has_minor_ext = minor_ext.size();
920cdf0e10cSrcweir }
921cdf0e10cSrcweir else
922cdf0e10cSrcweir has_minor_ext = false;
923cdf0e10cSrcweir
924cdf0e10cSrcweir // localize through all repositories
925cdf0e10cSrcweir for( vector<string>::iterator iter = repos.begin(); iter != repos.end() ; ++iter )
926cdf0e10cSrcweir {
927cdf0e10cSrcweir string curRepository;
928cdf0e10cSrcweir if( has_minor_ext )
929cdf0e10cSrcweir curRepository = string( Export::GetEnv("SOURCE_ROOT_DIR") ) + "/" + *iter + minor_ext;
930cdf0e10cSrcweir else
931cdf0e10cSrcweir curRepository = string( Export::GetEnv("SOURCE_ROOT_DIR") ) + "/" + *iter;
932cdf0e10cSrcweir cout << "Localizing repository " << curRepository << "\n";
933cdf0e10cSrcweir SourceTreeLocalizer aIter( ByteString( curRepository.c_str() ) , sVersion , (sOutput.Len() > 0) , bSkipLinks );
934cdf0e10cSrcweir aIter.SetLanguageRestriction( sLanguages );
935cdf0e10cSrcweir if ( bExport ){
936cdf0e10cSrcweir fflush( stdout );
937cdf0e10cSrcweir if( *iter == "ooo" )
938cdf0e10cSrcweir aIter.Extract( sFileName );
939cdf0e10cSrcweir else
940cdf0e10cSrcweir {
941cdf0e10cSrcweir ByteString sFileNameWithExt( sFileName );
942cdf0e10cSrcweir sFileNameWithExt += ByteString( "." );
943cdf0e10cSrcweir sFileNameWithExt += ByteString( (*iter).c_str() );
944cdf0e10cSrcweir aIter.Extract( sFileNameWithExt );
945cdf0e10cSrcweir }
946cdf0e10cSrcweir printf("\n%d files found!\n",aIter.GetFileCnt());
947cdf0e10cSrcweir }
948cdf0e10cSrcweir }
949cdf0e10cSrcweir if( hasPwd )
950cdf0e10cSrcweir {
951cdf0e10cSrcweir string pwd;
952cdf0e10cSrcweir Export::getCurrentDir( pwd );
953cdf0e10cSrcweir cout << "Localizing repository " << pwd << "\n";
954cdf0e10cSrcweir SourceTreeLocalizer aIter( ByteString( pwd.c_str() ) , sVersion , (sOutput.Len() > 0) , bSkipLinks );
955cdf0e10cSrcweir aIter.SetLanguageRestriction( sLanguages );
956cdf0e10cSrcweir if ( bExport ){
957cdf0e10cSrcweir fflush( stdout );
958cdf0e10cSrcweir aIter.Extract( sFileName );
959cdf0e10cSrcweir printf("\n%d files found!\n",aIter.GetFileCnt());
960cdf0e10cSrcweir }
961cdf0e10cSrcweir
962cdf0e10cSrcweir }
963cdf0e10cSrcweir
964cdf0e10cSrcweir return 0;
965cdf0e10cSrcweir }
966cdf0e10cSrcweir
967