xref: /AOO41X/main/l10ntools/source/localize.cxx (revision 3cd96b95fb0ad23ccdd883f9b15a685c459d45ca)
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