Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : :
21 : : #include "dbmm_module.hxx"
22 : : #include "dbmm_global.hrc"
23 : : #include "migrationerror.hxx"
24 : : #include "migrationlog.hxx"
25 : :
26 : :
27 : : #include <comphelper/anytostring.hxx>
28 : : #include <tools/string.hxx>
29 : : #include <rtl/ustrbuf.hxx>
30 : :
31 : : #include <vector>
32 : : #include <map>
33 : : #include <list>
34 : :
35 : : //........................................................................
36 : : namespace dbmm
37 : : {
38 : : //........................................................................
39 : :
40 : : /** === begin UNO using === **/
41 : : /** === end UNO using === **/
42 : :
43 : : //====================================================================
44 : : //= LibraryEntry
45 : : //====================================================================
46 : 0 : struct LibraryEntry
47 : : {
48 : : ScriptType eType;
49 : : ::rtl::OUString sOldName;
50 : : ::rtl::OUString sNewName;
51 : :
52 : : LibraryEntry()
53 : : :eType( eBasic )
54 : : ,sOldName()
55 : : ,sNewName()
56 : : {
57 : : }
58 : :
59 : 0 : LibraryEntry( const ScriptType& _eType, const ::rtl::OUString& _rOldName, const ::rtl::OUString& _rNewName )
60 : : :eType( _eType )
61 : : ,sOldName( _rOldName )
62 : 0 : ,sNewName( _rNewName )
63 : : {
64 : 0 : }
65 : : };
66 : :
67 : : //====================================================================
68 : : //= DocumentEntry
69 : : //====================================================================
70 : 0 : struct DocumentEntry
71 : : {
72 : : SubDocumentType eType;
73 : : ::rtl::OUString sName;
74 : : ::std::vector< LibraryEntry > aMovedLibraries;
75 : :
76 : 0 : DocumentEntry()
77 : : :eType( eForm )
78 : : ,sName()
79 : 0 : ,aMovedLibraries()
80 : : {
81 : 0 : }
82 : :
83 : 0 : DocumentEntry( const SubDocumentType _eType, const ::rtl::OUString& _rName )
84 : : :eType( _eType )
85 : 0 : ,sName( _rName )
86 : : {
87 : 0 : }
88 : : };
89 : :
90 : : //====================================================================
91 : : //= DocumentLogs
92 : : //====================================================================
93 : : typedef ::std::map< DocumentID, DocumentEntry > DocumentLogs;
94 : :
95 : : //====================================================================
96 : : //= ErrorLog
97 : : //====================================================================
98 : : typedef ::std::list< MigrationError > ErrorLog;
99 : :
100 : : //====================================================================
101 : : //= MigrationLog_Data
102 : : //====================================================================
103 : 0 : struct MigrationLog_Data
104 : : {
105 : : ::rtl::OUString sBackupLocation;
106 : : DocumentLogs aDocumentLogs;
107 : : ErrorLog aFailures;
108 : : ErrorLog aWarnings;
109 : : };
110 : :
111 : : //====================================================================
112 : : //= MigrationLog
113 : : //====================================================================
114 : : //--------------------------------------------------------------------
115 : 0 : MigrationLog::MigrationLog()
116 : 0 : :m_pData( new MigrationLog_Data )
117 : : {
118 : 0 : }
119 : :
120 : : //--------------------------------------------------------------------
121 : 0 : MigrationLog::~MigrationLog()
122 : : {
123 : 0 : }
124 : :
125 : : //--------------------------------------------------------------------
126 : 0 : void MigrationLog::logFailure( const MigrationError& _rError )
127 : : {
128 : 0 : m_pData->aFailures.push_back( _rError );
129 : 0 : }
130 : :
131 : : //--------------------------------------------------------------------
132 : 0 : void MigrationLog::logRecoverable( const MigrationError& _rError )
133 : : {
134 : 0 : m_pData->aWarnings.push_back( _rError );
135 : 0 : }
136 : :
137 : : //--------------------------------------------------------------------
138 : 0 : bool MigrationLog::hadFailure() const
139 : : {
140 : 0 : return !m_pData->aFailures.empty();
141 : : }
142 : :
143 : : //--------------------------------------------------------------------
144 : 0 : void MigrationLog::backedUpDocument( const ::rtl::OUString& _rNewDocumentLocation )
145 : : {
146 : 0 : m_pData->sBackupLocation = _rNewDocumentLocation;
147 : 0 : }
148 : :
149 : : //--------------------------------------------------------------------
150 : 0 : DocumentID MigrationLog::startedDocument( const SubDocumentType _eType, const ::rtl::OUString& _rName )
151 : : {
152 : : #if OSL_DEBUG_LEVEL > 0
153 : : bool bAlreadyKnown = false;
154 : : for ( DocumentLogs::const_iterator doc = m_pData->aDocumentLogs.begin();
155 : : doc != m_pData->aDocumentLogs.end() && !bAlreadyKnown;
156 : : ++doc
157 : : )
158 : : {
159 : : bAlreadyKnown = ( doc->second.eType == _eType ) && ( doc->second.sName == _rName );
160 : : }
161 : : OSL_ENSURE( !bAlreadyKnown, "MigrationLog::startedDocument: document is already known!" );
162 : : #endif
163 : :
164 : 0 : DocumentID nID = (DocumentID)( m_pData->aDocumentLogs.size() + 1 );
165 : 0 : while ( m_pData->aDocumentLogs.find( nID ) != m_pData->aDocumentLogs.end() )
166 : 0 : ++nID;
167 : :
168 : 0 : m_pData->aDocumentLogs[ nID ] = DocumentEntry( _eType, _rName );
169 : :
170 : 0 : return nID;
171 : : }
172 : :
173 : : //--------------------------------------------------------------------
174 : 0 : void MigrationLog::movedLibrary( const DocumentID _nDocID, const ScriptType _eScriptType,
175 : : const ::rtl::OUString& _rOriginalLibName, const ::rtl::OUString& _rNewLibName )
176 : : {
177 : : OSL_ENSURE( m_pData->aDocumentLogs.find( _nDocID ) != m_pData->aDocumentLogs.end(),
178 : : "MigrationLog::movedLibrary: document is not known!" );
179 : :
180 : 0 : DocumentEntry& rDocEntry = m_pData->aDocumentLogs[ _nDocID ];
181 : 0 : rDocEntry.aMovedLibraries.push_back( LibraryEntry( _eScriptType, _rOriginalLibName, _rNewLibName ) );
182 : 0 : }
183 : :
184 : : //--------------------------------------------------------------------
185 : 0 : void MigrationLog::finishedDocument( const DocumentID _nDocID )
186 : : {
187 : : OSL_ENSURE( m_pData->aDocumentLogs.find( _nDocID ) != m_pData->aDocumentLogs.end(),
188 : : "MigrationLog::finishedDocument: document is not known!" );
189 : :
190 : 0 : DocumentEntry& rDocEntry = m_pData->aDocumentLogs[ _nDocID ];
191 : : (void)rDocEntry;
192 : : // nothing to do here
193 : 0 : }
194 : :
195 : : //--------------------------------------------------------------------
196 : 0 : const ::rtl::OUString& MigrationLog::getNewLibraryName( DocumentID _nDocID, ScriptType _eScriptType,
197 : : const ::rtl::OUString& _rOriginalLibName ) const
198 : : {
199 : 0 : static ::rtl::OUString s_sEmptyString;
200 : :
201 : 0 : DocumentLogs::const_iterator docPos = m_pData->aDocumentLogs.find( _nDocID );
202 : 0 : if ( docPos == m_pData->aDocumentLogs.end() )
203 : : {
204 : : OSL_FAIL( "MigrationLog::getNewLibraryName: document is not known!" );
205 : 0 : return s_sEmptyString;
206 : : }
207 : :
208 : 0 : const DocumentEntry& rDocEntry( docPos->second );
209 : 0 : for ( ::std::vector< LibraryEntry >::const_iterator lib = rDocEntry.aMovedLibraries.begin();
210 : 0 : lib != rDocEntry.aMovedLibraries.end();
211 : : ++lib
212 : : )
213 : : {
214 : 0 : if ( ( _eScriptType == lib->eType )
215 : 0 : && ( _rOriginalLibName == lib->sOldName )
216 : : )
217 : 0 : return lib->sNewName;
218 : : }
219 : :
220 : : OSL_FAIL( "MigrationLog::getNewLibraryName: doc is known, but library isn't!" );
221 : 0 : return s_sEmptyString;
222 : : }
223 : :
224 : : //--------------------------------------------------------------------
225 : : namespace
226 : : {
227 : : //----------------------------------------------------------------
228 : 0 : static void lcl_appendErrorDescription( ::rtl::OUStringBuffer& _inout_rBuffer, const MigrationError& _rError )
229 : : {
230 : 0 : const sal_Char* pAsciiErrorDescription( NULL );
231 : 0 : ::std::vector< rtl::OUString > aParameterNames;
232 : 0 : switch ( _rError.eType )
233 : : {
234 : : case ERR_OPENING_SUB_DOCUMENT_FAILED:
235 : 0 : pAsciiErrorDescription = "opening '#doc#' failed";
236 : : aParameterNames.push_back(
237 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
238 : 0 : break;
239 : :
240 : : case ERR_CLOSING_SUB_DOCUMENT_FAILED:
241 : 0 : pAsciiErrorDescription = "closing '#doc#' failed";
242 : : aParameterNames.push_back(
243 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
244 : 0 : break;
245 : :
246 : : case ERR_STORAGE_COMMIT_FAILED:
247 : 0 : pAsciiErrorDescription = "committing the changes for document '#doc#' failed";
248 : : aParameterNames.push_back(
249 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
250 : 0 : break;
251 : :
252 : : case ERR_STORING_DATABASEDOC_FAILED:
253 : 0 : pAsciiErrorDescription = "storing the database document failed";
254 : 0 : break;
255 : :
256 : : case ERR_COLLECTING_DOCUMENTS_FAILED:
257 : 0 : pAsciiErrorDescription = "collecting the forms/reports of the database document failed";
258 : 0 : break;
259 : :
260 : : case ERR_UNEXPECTED_LIBSTORAGE_ELEMENT:
261 : 0 : pAsciiErrorDescription = "unexpected #lib# storage element in document '#doc#', named '#element#'";
262 : : aParameterNames.push_back(
263 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
264 : : aParameterNames.push_back(
265 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#libstore#")));
266 : : aParameterNames.push_back(
267 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#element#")));
268 : 0 : break;
269 : :
270 : : case ERR_CREATING_DBDOC_SCRIPT_STORAGE_FAILED:
271 : 0 : pAsciiErrorDescription = "creating the database document's storage for #scripttype# scripts failed";
272 : : aParameterNames.push_back(
273 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#scripttype#")));
274 : 0 : break;
275 : :
276 : : case ERR_COMMITTING_SCRIPT_STORAGES_FAILED:
277 : 0 : pAsciiErrorDescription = "saving the #scripttype# scripts for document '#doc#' failed";
278 : : aParameterNames.push_back(
279 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#scripttype#")));
280 : : aParameterNames.push_back(
281 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
282 : 0 : break;
283 : :
284 : : case ERR_GENERAL_SCRIPT_MIGRATION_FAILURE:
285 : 0 : pAsciiErrorDescription = "general error while migrating #scripttype# scripts of document '#doc#'";
286 : : aParameterNames.push_back(
287 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#scripttype#")));
288 : : aParameterNames.push_back(
289 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
290 : 0 : break;
291 : :
292 : : case ERR_GENERAL_MACRO_MIGRATION_FAILURE:
293 : 0 : pAsciiErrorDescription = "general error during macro migration of document '#doc#'";
294 : : aParameterNames.push_back(
295 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
296 : 0 : break;
297 : :
298 : : case ERR_UNKNOWN_SCRIPT_TYPE:
299 : 0 : pAsciiErrorDescription = "unknown script type: #type#";
300 : : aParameterNames.push_back(
301 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#type#")));
302 : 0 : break;
303 : :
304 : : case ERR_UNKNOWN_SCRIPT_LANGUAGE:
305 : 0 : pAsciiErrorDescription = "unknown script language: #lang#";
306 : : aParameterNames.push_back(
307 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#lang#")));
308 : 0 : break;
309 : :
310 : : case ERR_UNKNOWN_SCRIPT_NAME_FORMAT:
311 : 0 : pAsciiErrorDescription = "unknown script name format: #script#";
312 : : aParameterNames.push_back(
313 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#script#")));
314 : 0 : break;
315 : :
316 : : case ERR_SCRIPT_TRANSLATION_FAILURE:
317 : 0 : pAsciiErrorDescription = "analyzing/translating the script URL failed; script type: #type#; script: #code#";
318 : : aParameterNames.push_back(
319 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#type#")));
320 : : aParameterNames.push_back(
321 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#code#")));
322 : 0 : break;
323 : :
324 : : case ERR_INVALID_SCRIPT_DESCRIPTOR_FORMAT:
325 : 0 : pAsciiErrorDescription = "invalid script descriptor format";
326 : 0 : break;
327 : :
328 : : case ERR_ADJUSTING_DOCUMENT_EVENTS_FAILED:
329 : 0 : pAsciiErrorDescription = "adjusting events for document '#doc#' failed";
330 : : aParameterNames.push_back(
331 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
332 : 0 : break;
333 : :
334 : : case ERR_ADJUSTING_DIALOG_EVENTS_FAILED:
335 : 0 : pAsciiErrorDescription = "adjusting events for dialog #lib#.#dlg# in document '#doc#' failed";
336 : : aParameterNames.push_back(
337 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
338 : : aParameterNames.push_back(
339 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#lib#")));
340 : : aParameterNames.push_back(
341 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#dlg#")));
342 : 0 : break;
343 : :
344 : : case ERR_ADJUSTING_FORMCOMP_EVENTS_FAILED:
345 : 0 : pAsciiErrorDescription = "adjusting form component events for '#doc#' failed";
346 : : aParameterNames.push_back(
347 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
348 : 0 : break;
349 : :
350 : : case ERR_BIND_SCRIPT_STORAGE_FAILED:
351 : 0 : pAsciiErrorDescription = "binding to the script storage failed for document '#doc#'";
352 : : aParameterNames.push_back(
353 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
354 : 0 : break;
355 : :
356 : : case ERR_REMOVE_SCRIPTS_STORAGE_FAILED:
357 : 0 : pAsciiErrorDescription = "removing a scripts storage failed for document '#doc#'";
358 : : aParameterNames.push_back(
359 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
360 : 0 : break;
361 : :
362 : : case ERR_DOCUMENT_BACKUP_FAILED:
363 : 0 : pAsciiErrorDescription = "backing up the document to #location# failed";
364 : : aParameterNames.push_back(
365 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#location#")));
366 : 0 : break;
367 : :
368 : : case ERR_UNKNOWN_SCRIPT_FOLDER:
369 : 0 : pAsciiErrorDescription = "unknown script folder '#name#' in document '#doc#'";
370 : : aParameterNames.push_back(
371 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
372 : : aParameterNames.push_back(
373 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#name#")));
374 : 0 : break;
375 : :
376 : : case ERR_EXAMINING_SCRIPTS_FOLDER_FAILED:
377 : 0 : pAsciiErrorDescription = "examining the 'Scripts' folder failed for document '#doc#'";
378 : : aParameterNames.push_back(
379 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
380 : 0 : break;
381 : :
382 : : case ERR_PASSWORD_VERIFICATION_FAILED:
383 : 0 : pAsciiErrorDescription = "password verification failed for document '#doc#', #libtype# library '#name#'";
384 : : aParameterNames.push_back(
385 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
386 : : aParameterNames.push_back(
387 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#libtype#")));
388 : : aParameterNames.push_back(
389 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#name#")));
390 : 0 : break;
391 : :
392 : : case ERR_NEW_STYLE_REPORT:
393 : 0 : pAsciiErrorDescription = "#doc# could not be processed, since you don't have the Oracle Report Builder (TM) extension installed.";
394 : : aParameterNames.push_back(
395 : 0 : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#doc#")));
396 : 0 : break;
397 : :
398 : : // do *not* add a default case here: Without a default, some compilers will warn you when
399 : : // you miss a newly-introduced enum value here
400 : : }
401 : : OSL_ENSURE( pAsciiErrorDescription, "lcl_appendErrorDescription: no error message!" );
402 : 0 : if ( pAsciiErrorDescription )
403 : : {
404 : 0 : ::rtl::OUString sSubstituted( ::rtl::OUString::createFromAscii( pAsciiErrorDescription ) );
405 : : OSL_ENSURE( aParameterNames.size() == _rError.aErrorDetails.size(),
406 : : "lcl_appendErrorDescription: unexpected number of error message parameters!" );
407 : :
408 : 0 : for ( size_t i=0; i < ::std::min( aParameterNames.size(), _rError.aErrorDetails.size() ); ++i )
409 : : {
410 : : sSubstituted = sSubstituted.replaceFirst(
411 : 0 : aParameterNames[i], _rError.aErrorDetails[i]);
412 : : }
413 : :
414 : 0 : _inout_rBuffer.append( sSubstituted );
415 : 0 : }
416 : 0 : }
417 : :
418 : : //----------------------------------------------------------------
419 : 0 : void lcl_describeErrors( ::rtl::OUStringBuffer& _rBuffer, const ErrorLog& _rErrors, const sal_uInt16 _nHeadingResId )
420 : : {
421 : 0 : _rBuffer.appendAscii( "=== " );
422 : 0 : _rBuffer.append ( String( MacroMigrationResId( _nHeadingResId ) ) );
423 : 0 : _rBuffer.appendAscii( " ===\n" );
424 : :
425 : 0 : String sException( MacroMigrationResId( STR_EXCEPTION ) );
426 : :
427 : 0 : for ( ErrorLog::const_iterator error = _rErrors.begin();
428 : 0 : error != _rErrors.end();
429 : : ++error
430 : : )
431 : : {
432 : 0 : _rBuffer.append( sal_Unicode( '-' ) );
433 : 0 : _rBuffer.append( sal_Unicode( ' ' ) );
434 : 0 : lcl_appendErrorDescription( _rBuffer, *error );
435 : 0 : _rBuffer.append( sal_Unicode( '\n' ) );
436 : :
437 : 0 : if ( !error->aCaughtException.hasValue() )
438 : 0 : continue;
439 : :
440 : 0 : _rBuffer.append( sException );
441 : 0 : _rBuffer.append( ::comphelper::anyToString( error->aCaughtException ) );
442 : 0 : _rBuffer.append( sal_Unicode( '\n' ) );
443 : 0 : _rBuffer.append( sal_Unicode( '\n' ) );
444 : 0 : }
445 : 0 : }
446 : : }
447 : :
448 : : //--------------------------------------------------------------------
449 : 0 : bool MigrationLog::movedAnyLibrary( const DocumentID _nDocID )
450 : : {
451 : 0 : DocumentLogs::const_iterator docPos = m_pData->aDocumentLogs.find( _nDocID );
452 : 0 : if ( docPos == m_pData->aDocumentLogs.end() )
453 : : {
454 : : OSL_FAIL( "MigrationLog::movedAnyLibrary: document is not known!" );
455 : 0 : return false;
456 : : }
457 : 0 : return !docPos->second.aMovedLibraries.empty();
458 : : }
459 : :
460 : : //--------------------------------------------------------------------
461 : 0 : ::rtl::OUString MigrationLog::getCompleteLog() const
462 : : {
463 : 0 : ::rtl::OUStringBuffer aBuffer;
464 : :
465 : 0 : if ( !m_pData->sBackupLocation.isEmpty() )
466 : : {
467 : 0 : String sBackedUp( MacroMigrationResId( STR_SAVED_COPY_TO ) );
468 : 0 : sBackedUp.SearchAndReplaceAllAscii( "$location$", m_pData->sBackupLocation );
469 : :
470 : 0 : aBuffer.appendAscii( "=== " );
471 : 0 : aBuffer.append ( String( MacroMigrationResId( STR_DATABASE_DOCUMENT ) ) );
472 : 0 : aBuffer.appendAscii( " ===\n" );
473 : 0 : aBuffer.append ( sBackedUp );
474 : 0 : aBuffer.appendAscii( "\n\n" );
475 : : }
476 : :
477 : 0 : if ( !m_pData->aFailures.empty() )
478 : : {
479 : 0 : lcl_describeErrors( aBuffer, m_pData->aFailures
480 : 0 : , STR_ERRORS );
481 : : }
482 : : else
483 : : {
484 : 0 : String sMovedLibTemplate( MacroMigrationResId( STR_MOVED_LIBRARY ) );
485 : :
486 : 0 : for ( DocumentLogs::const_iterator doc = m_pData->aDocumentLogs.begin();
487 : 0 : doc != m_pData->aDocumentLogs.end();
488 : : ++doc
489 : : )
490 : : {
491 : 0 : const DocumentEntry& rDoc( doc->second );
492 : :
493 : 0 : if ( rDoc.aMovedLibraries.empty() )
494 : 0 : continue;
495 : :
496 : 0 : String sDocTitle( MacroMigrationResId( rDoc.eType == eForm ? STR_FORM : STR_REPORT ) );
497 : 0 : sDocTitle.SearchAndReplaceAllAscii( "$name$", rDoc.sName );
498 : :
499 : 0 : aBuffer.appendAscii( "=== " );
500 : 0 : aBuffer.append ( sDocTitle );
501 : 0 : aBuffer.appendAscii( " ===\n" );
502 : :
503 : 0 : for ( ::std::vector< LibraryEntry >::const_iterator lib = rDoc.aMovedLibraries.begin();
504 : 0 : lib != rDoc.aMovedLibraries.end();
505 : : ++lib
506 : : )
507 : : {
508 : 0 : String sMovedLib( sMovedLibTemplate );
509 : 0 : sMovedLib.SearchAndReplaceAllAscii( "$type$", getScriptTypeDisplayName( lib->eType ) );
510 : 0 : sMovedLib.SearchAndReplaceAllAscii( "$old$", lib->sOldName );
511 : 0 : sMovedLib.SearchAndReplaceAllAscii( "$new$", lib->sNewName );
512 : :
513 : 0 : aBuffer.append( sMovedLib );
514 : 0 : aBuffer.append( sal_Unicode( '\n' ) );
515 : 0 : }
516 : :
517 : 0 : aBuffer.append( sal_Unicode( '\n' ) );
518 : 0 : }
519 : : }
520 : :
521 : 0 : if ( !m_pData->aWarnings.empty() )
522 : : {
523 : 0 : lcl_describeErrors( aBuffer, m_pData->aWarnings, STR_WARNINGS );
524 : : }
525 : :
526 : 0 : return aBuffer.makeStringAndClear();
527 : : }
528 : :
529 : : //........................................................................
530 : : } // namespace dbmm
531 : : //........................................................................
532 : :
533 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|