Bug Summary

File:l10ntools/source/helpmerge.cxx
Location:line 394, column 21
Description:Called C++ object pointer is null

Annotated Source Code

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*************************************************************************
3 *
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 *
8 * OpenOffice.org - a multi-platform office productivity suite
9 *
10 * This file is part of OpenOffice.org.
11 *
12 * OpenOffice.org is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 3
14 * only, as published by the Free Software Foundation.
15 *
16 * OpenOffice.org is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License version 3 for more details
20 * (a copy is included in the LICENSE file that accompanied this code).
21 *
22 * You should have received a copy of the GNU Lesser General Public License
23 * version 3 along with OpenOffice.org. If not, see
24 * <http://www.openoffice.org/license.html>
25 * for a copy of the LGPLv3 License.
26 *
27 ************************************************************************/
28
29#include "sal/config.h"
30
31#include <fstream>
32#include <functional>
33
34#include <osl/file.hxx>
35#include <sal/log.hxx>
36
37#include <stdio.h>
38#include <stdlib.h>
39#include "helpmerge.hxx"
40#include <algorithm>
41#include <sys/types.h>
42#include <sys/stat.h>
43#include <iostream>
44#include <fstream>
45#include <vector>
46#include <rtl/strbuf.hxx>
47#ifdef WNT
48#include <windows.h>
49#undef CopyFile
50#include <direct.h>
51#endif
52
53#include "common.hxx"
54#include "helper.hxx"
55
56#if OSL_DEBUG_LEVEL1 > 2
57void HelpParser::Dump(XMLHashMap* rElem_in)
58{
59 for(XMLHashMap::iterator pos = rElem_in->begin();pos != rElem_in->end(); ++pos)
60 {
61 Dump(pos->second,pos->first);
62 }
63}
64
65void HelpParser::Dump(LangHashMap* rElem_in,const rtl::OString & sKey_in)
66{
67 rtl::OString x;
68 OString y;
69 fprintf(stdoutstdout,"+------------%s-----------+\n",sKey_in.getStr() );
70 for(LangHashMap::iterator posn=rElem_in->begin();posn!=rElem_in->end();++posn)
71 {
72 x=posn->first;
73 y=posn->second->ToOString();
74 fprintf(stdoutstdout,"key=%s value=%s\n",x.getStr(),y.getStr());
75 }
76 fprintf(stdoutstdout,"+--------------------------+\n");
77}
78#endif
79
80HelpParser::HelpParser( const rtl::OString &rHelpFile )
81 : sHelpFile( rHelpFile )
82 {};
83
84/*****************************************************************************/
85bool HelpParser::CreateSDF(
86/*****************************************************************************/
87 const rtl::OString &rSDFFile_in, const rtl::OString &rPrj_in,const rtl::OString &rRoot_in,
88 const rtl::OString &sHelpFile, XMLFile *pXmlFile, const rtl::OString &rGsi1){
89 SimpleXMLParser aParser;
90 rtl::OUString sXmlFile(
91 rtl::OStringToOUString(sHelpFile, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11))));
92 //TODO: explicit BOM handling?
93
94 std::auto_ptr <XMLFile> file ( aParser.Execute( sXmlFile, pXmlFile ) );
95
96 if(file.get() == NULL__null)
97 {
98 printf(
99 "%s: %s\n",
100 sHelpFile.getStr(),
101 (rtl::OUStringToOString(
102 aParser.GetError().sMessage, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11))).
103 getStr()));
104 exit(-1);
105 }
106 file->Extract();
107 if( !file->CheckExportStatus() ){
108 return true;
109 }
110 std::ofstream aSDFStream(
111 rSDFFile_in.getStr(), std::ios_base::out | std::ios_base::trunc);
112
113 if (!aSDFStream.is_open()) {
114 fprintf(stdoutstdout,"Can't open file %s\n",rSDFFile_in.getStr());
115 return false;
116 }
117
118 rtl::OString sActFileName(
119 common::pathnameToken(sHelpFile.getStr(), rRoot_in.getStr()));
120
121 XMLHashMap* aXMLStrHM = file->GetStrings();
122 LangHashMap* pElem;
123 XMLElement* pXMLElement = NULL__null;
124
125 OUStringBuffer sBuffer;
126 const OUString sOUPrj( rPrj_in.getStr() , rPrj_in.getLength() , RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) );
127 const OUString sOUActFileName(sActFileName.getStr() , sActFileName.getLength() , RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) );
128 const OUString sOUGsi1( rGsi1.getStr() , rGsi1.getLength() , RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) );
129
130 Export::InitLanguages( false );
131 std::vector<rtl::OString> aLanguages = Export::GetLanguages();
132
133 std::vector<rtl::OString> order = file->getOrder();
134 std::vector<rtl::OString>::iterator pos;
135 XMLHashMap::iterator posm;
136
137 for( pos = order.begin(); pos != order.end() ; ++pos )
138 {
139 posm = aXMLStrHM->find( *pos );
140 pElem = posm->second;
141 rtl::OString sCur;
142
143 for( unsigned int n = 0; n < aLanguages.size(); n++ )
144 {
145 sCur = aLanguages[ n ];
146 pXMLElement = (*pElem)[ sCur ];
147
148 if( pXMLElement != NULL__null )
149 {
150 OUString data(
151 pXMLElement->ToOUString().
152 replaceAll(
153 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\n")(&("\n")[0]), ((sal_Int32)((sizeof ("\n") / sizeof (("\n"
)[0]))-1)), (((rtl_TextEncoding) 11))
),
154 rtl::OUString()).
155 replaceAll(
156 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t")(&("\t")[0]), ((sal_Int32)((sizeof ("\t") / sizeof (("\t"
)[0]))-1)), (((rtl_TextEncoding) 11))
),
157 rtl::OUString()));
158 sBuffer.append( sOUPrj );
159 sBuffer.append('\t');
160 if ( !rRoot_in.isEmpty())
161 sBuffer.append( sOUActFileName );
162 sBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("\t0\t")(&("\t0\t")[0]), ((sal_Int32)(sizeof ("\t0\t") / sizeof (
("\t0\t")[0]))-1)
);
163 sBuffer.append( sOUGsi1 ); //"help";
164 sBuffer.append('\t');
165 rtl::OString sID = posm->first; // ID
166 sBuffer.append( rtl::OStringToOUString( sID, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)) ) );
167 sBuffer.append('\t');
168 rtl::OString sOldRef = pXMLElement->GetOldref(); // oldref
169 sBuffer.append( rtl::OStringToOUString(sOldRef, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)) ) );
170 sBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("\t\t\t0\t")(&("\t\t\t0\t")[0]), ((sal_Int32)(sizeof ("\t\t\t0\t") / sizeof
(("\t\t\t0\t")[0]))-1)
);
171 sBuffer.append( rtl::OStringToOUString( sCur, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)) ) );
172 sBuffer.append('\t');
173 sBuffer.append( data );
174 sBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("\t\t\t\t")(&("\t\t\t\t")[0]), ((sal_Int32)(sizeof ("\t\t\t\t") / sizeof
(("\t\t\t\t")[0]))-1)
);
175 rtl::OString sOut(rtl::OUStringToOString(sBuffer.makeStringAndClear().getStr() , RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
176 if( !data.isEmpty() )
177 aSDFStream << sOut.getStr() << '\n';
178 pXMLElement=NULL__null;
179 }
180 else
181 {
182 fprintf(stdoutstdout,"\nDBG: NullPointer in HelpParser::CreateSDF, Language %s, File %s\n", sCur.getStr(), sHelpFile.getStr());
183 }
184 }
185 }
186 aSDFStream.close();
187
188 return sal_True((sal_Bool)1);
189}
190
191bool HelpParser::Merge( const rtl::OString &rSDFFile, const rtl::OString &rDestinationFile ,
192 const rtl::OString& rLanguage , MergeDataFile& aMergeDataFile )
193{
194
195 (void) rSDFFile;
196 bool hasNoError = true;
197
198 SimpleXMLParser aParser;
199
200 rtl::OUString sXmlFile(
201 rtl::OStringToOUString(sHelpFile, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11))));
202 //TODO: explicit BOM handling?
203
204 XMLFile* xmlfile = ( aParser.Execute( sXmlFile, new XMLFile( rtl::OUString('0') ) ) );
205 hasNoError = MergeSingleFile( xmlfile , aMergeDataFile , rLanguage , rDestinationFile );
206 delete xmlfile;
207 return hasNoError;
208}
209
210void HelpParser::parse_languages( std::vector<rtl::OString>& aLanguages , MergeDataFile& aMergeDataFile ){
211 std::vector<rtl::OString> aTmp;
212
213 Export::InitLanguages( false );
214
215 if (Export::sLanguages.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("ALL")(&("ALL")[0]), ((sal_Int32)(sizeof ("ALL") / sizeof (("ALL"
)[0]))-1)
))
216 {
217 aLanguages = aMergeDataFile.GetLanguages();
218 aLanguages.push_back(rtl::OString(RTL_CONSTASCII_STRINGPARAM("en-US")(&("en-US")[0]), ((sal_Int32)(sizeof ("en-US") / sizeof (
("en-US")[0]))-1)
));
219
220 if( !Export::sForcedLanguages.isEmpty() )
221 {
222 std::vector<rtl::OString> aFL = Export::GetForcedLanguages();
223 std::copy( aFL.begin() ,
224 aFL.end() ,
225 back_inserter( aLanguages )
226 );
227 std::sort( aLanguages.begin() , aLanguages.end() , std::less< rtl::OString >() );
228 std::vector<rtl::OString>::iterator unique_iter = std::unique( aLanguages.begin() , aLanguages.end() , std::equal_to< rtl::OString >() );
229 std::copy( aLanguages.begin() , unique_iter , back_inserter( aTmp ) );
230 aLanguages = aTmp;
231 }
232 }
233 else{
234 aLanguages = Export::GetLanguages();
235 }
236
237}
238
239bool HelpParser::Merge(
240 const rtl::OString &rSDFFile, const rtl::OString &rPathX , const rtl::OString &rPathY , bool bISO ,
241 const std::vector<rtl::OString>& aLanguages , MergeDataFile& aMergeDataFile , bool bCreateDir )
242{
243
244
245 (void) rSDFFile ;
246 bool hasNoError = true;
247 SimpleXMLParser aParser;
248 rtl::OUString sXmlFile(
249 rtl::OStringToOUString(sHelpFile, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11))));
250 //TODO: explicit BOM handling?
251
252 XMLFile* xmlfile = aParser.Execute( sXmlFile, new XMLFile( rtl::OUString('0') ) );
253
254 if( xmlfile == NULL__null)
255 {
256 printf("%s\n", rtl::OUStringToOString(aParser.GetError().sMessage, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))).getStr());
257 exit(-1);
258 }
259
260 xmlfile->Extract();
261
262 rtl::OString sCur;
263 for( unsigned int n = 0; n < aLanguages.size(); n++ ){
264 sCur = aLanguages[ n ];
265
266 rtl::OString sFilepath;
267 if( bISO ) sFilepath = GetOutpath( rPathX , sCur , rPathY );
268 else sFilepath = rPathX;
269 if( bCreateDir )
270 MakeDir(sFilepath);
271
272 XMLFile* file = new XMLFile( *xmlfile );
273 sFilepath += sHelpFile;
274 hasNoError = MergeSingleFile( file , aMergeDataFile , sCur , sFilepath );
275 delete file;
276
277 if( !hasNoError ) return false; // Stop on error
278 }
279
280 delete xmlfile;
281 return hasNoError;
282}
283
284bool HelpParser::MergeSingleFile( XMLFile* file , MergeDataFile& aMergeDataFile , const rtl::OString& sLanguage ,
285 rtl::OString const & sPath )
286{
287 file->Extract();
288
289 XMLHashMap* aXMLStrHM = file->GetStrings();
290 LangHashMap* aLangHM;
291 static ResData pResData( "","","");
292 pResData.sResTyp = "help";
293
294 for(XMLHashMap::iterator pos=aXMLStrHM->begin();pos!=aXMLStrHM->end();++pos) // Merge every l10n related string
295 {
296
297 aLangHM = pos->second;
298#if OSL_DEBUG_LEVEL1 > 2
299 printf("*********************DUMPING HASHMAP***************************************");
300 Dump(aXMLStrHM);
301 printf("DBG: sHelpFile = %s\n",sHelpFile.getStr() );
302#endif
303
304 pResData.sGId = pos->first;
305 pResData.sFilename = sHelpFile;
306
307 ProcessHelp( aLangHM , sLanguage, &pResData , aMergeDataFile );
308 }
309
310 file->Write(sPath);
311 return true;
312}
313
314rtl::OString HelpParser::GetOutpath( const rtl::OString& rPathX , const rtl::OString& sCur , const rtl::OString& rPathY )
315{
316 rtl::OString testpath = rPathX;
317 if (!testpath.endsWithL(RTL_CONSTASCII_STRINGPARAM("/")(&("/")[0]), ((sal_Int32)(sizeof ("/") / sizeof (("/")[0]
))-1)
)) {
318 testpath += "/";
319 }
320 testpath += sCur;
321 testpath += "/";
322 rtl::OString sRelativePath( rPathY );
323 if (sRelativePath.matchL(RTL_CONSTASCII_STRINGPARAM("/")(&("/")[0]), ((sal_Int32)(sizeof ("/") / sizeof (("/")[0]
))-1)
)) {
324 sRelativePath = sRelativePath.copy(1);
325 }
326 testpath += sRelativePath;
327 testpath += "/";
328 return testpath;
329}
330
331void HelpParser::MakeDir(const rtl::OString& rPath)
332{
333 rtl::OString sTPath(rPath.replaceAll("\\", "/"));
334 sal_Int32 cnt = helper::countOccurrences(sTPath, '/');
335 rtl::OStringBuffer sCreateDir;
336 for (sal_uInt16 i = 0; i <= cnt; ++i)
337 {
338 sCreateDir.append(sTPath.getToken(i , '/'));
339 sCreateDir.append('/');
340#ifdef WNT
341 _mkdir( sCreateDir.getStr() );
342#else
343 mkdir( sCreateDir.getStr() , S_IRWXU(0400|0200|0100) | S_IRWXG((0400|0200|0100) >> 3) | S_IROTH((0400 >> 3) >> 3) | S_IXOTH((0100 >> 3) >> 3) );
344#endif
345 }
346}
347
348
349/* ProcessHelp Methode: search for en-US entry and replace it with the current language*/
350void HelpParser::ProcessHelp( LangHashMap* aLangHM , const rtl::OString& sCur , ResData *pResData , MergeDataFile& aMergeDataFile ){
351
352 XMLElement* pXMLElement = NULL__null;
353 PFormEntrys *pEntrys = NULL__null;
354 XMLData *data = NULL__null;
355
356 rtl::OString sLId;
357 rtl::OString sGId;
358
359 pEntrys = NULL__null;
360
361 if( !sCur.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("en-US")(&("en-US")[0]), ((sal_Int32)(sizeof ("en-US") / sizeof (
("en-US")[0]))-1)
) ){
1
Taking true branch
362 pXMLElement = (*aLangHM)[ "en-US" ];
363 if( pXMLElement == NULL__null )
2
Taking false branch
364 {
365 printf("Error: Can't find en-US entry\n");
366 }
367 if( pXMLElement != NULL__null )
3
Taking true branch
368 {
369 sLId = pXMLElement->GetOldref();
370 pResData->sId = sLId;
371
372 pEntrys = aMergeDataFile.GetPFormEntrys( pResData );
373 if( pEntrys != NULL__null)
4
Taking false branch
374 {
375 rtl::OString sNewText;
376 pEntrys->GetText( sNewText, STRING_TYP_TEXT0x0010, sCur , true );
377 rtl::OUString sNewdata(
378 rtl::OStringToOUString(sNewText, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
379 if (!sNewdata.isEmpty())
380 {
381 if( pXMLElement != NULL__null )
382 {
383 data = new XMLData( sNewdata , NULL__null , true ); // Add new one
384 pXMLElement->RemoveAndDeleteAllChildren();
385 pXMLElement->AddChild( data );
386 aLangHM->erase( sCur );
387 }
388 }
389 }
390 else if( pResData == NULL__null )
5
Taking true branch
391 {
392 fprintf(stdoutstdout,"Can't find GID=%s LID=%s TYP=%s\n",
393 pResData->sGId.getStr(), pResData->sId.getStr(),
394 pResData->sResTyp.getStr());
6
Called C++ object pointer is null
395 }
396 pXMLElement->ChangeLanguageTag(
397 rtl::OStringToOUString(sCur, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11))));
398 }
399
400 }
401}
402
403/* vim:set shiftwidth=4 softtabstop=4 expandtab: */