Kaydet (Commit) bbf246e4 authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski

tdf#102010 Never overwrite MM files via UNO

Fixes the regression introduced by
  commit e637b674

This commit removed the crazy bSubjectIsFilename handling,
where I didn't understood the case of bSubjectIsFilename
and a user supplied prefix.

Mail merge to files never overwrites an existing document,
but there is the special case, when a user selects a target
filename in the MM dialog for single file MM.

Should be fixed by a successive commmit, reverting this and
removing an existing file before starting the MM job.

Change-Id: Idda487023e6984de9c1e701fc088a6b7f92e9847
üst 660159a6
...@@ -21,6 +21,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_mailmerge, \ ...@@ -21,6 +21,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_mailmerge, \
sfx \ sfx \
sw \ sw \
test \ test \
tl \
unotest \ unotest \
utl \ utl \
)) ))
......
...@@ -162,7 +162,23 @@ struct SwMergeDescriptor ...@@ -162,7 +162,23 @@ struct SwMergeDescriptor
* @defgroup file Mail merge as File settings * @defgroup file Mail merge as File settings
* @addtogroup file * @addtogroup file
* @{ */ * @{ */
OUString sPath;
/**
* Basename incl. the path for the generated files.
*
* The final filename will be created by concating a number to prevent
* overwriting an existing file and the extension based on the filter
* settings.
*/
OUString sPrefix;
/**
* Use the sPrefix as the target filename also overwriting an existing
* target file.
*
* Just used for the internal mail merge dialogs as mail merge never
* overwrites existing files (see SwDBManager::ExecuteFormLetter).
*/
bool bPrefixIsFilename;
/** @} */ /** @} */
/** /**
...@@ -205,6 +221,7 @@ struct SwMergeDescriptor ...@@ -205,6 +221,7 @@ struct SwMergeDescriptor
rSh(rShell), rSh(rShell),
rDescriptor(rDesc), rDescriptor(rDesc),
bCreateSingleFile( false ), bCreateSingleFile( false ),
bPrefixIsFilename( false ),
bSendAsHTML( true ), bSendAsHTML( true ),
bSendAsAttachment( false ), bSendAsAttachment( false ),
pMailMergeConfigItem( nullptr ) pMailMergeConfigItem( nullptr )
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <com/sun/star/sdbc/XRowSet.hpp> #include <com/sun/star/sdbc/XRowSet.hpp>
#include <com/sun/star/sdbcx/XRowLocate.hpp> #include <com/sun/star/sdbcx/XRowLocate.hpp>
#include <tools/urlobj.hxx>
#include <wrtsh.hxx> #include <wrtsh.hxx>
#include <ndtxt.hxx> #include <ndtxt.hxx>
#include <swdtflvr.hxx> #include <swdtflvr.hxx>
...@@ -145,6 +147,7 @@ public: ...@@ -145,6 +147,7 @@ public:
( OUString( m_directories.getURLFromSrc(mpTestDocumentPath) + OUString::createFromAscii(filename)) ) ) ) ); ( OUString( m_directories.getURLFromSrc(mpTestDocumentPath) + OUString::createFromAscii(filename)) ) ) ) );
mMMargs.push_back( beans::NamedValue( OUString( UNO_NAME_DATA_SOURCE_NAME ), uno::Any( aDBName ) ) ); mMMargs.push_back( beans::NamedValue( OUString( UNO_NAME_DATA_SOURCE_NAME ), uno::Any( aDBName ) ) );
mMMargs.push_back( beans::NamedValue( OUString( UNO_NAME_OUTPUT_URL ), uno::Any( aWorkDir ) ) ); mMMargs.push_back( beans::NamedValue( OUString( UNO_NAME_OUTPUT_URL ), uno::Any( aWorkDir ) ) );
if (file)
mMMargs.push_back( beans::NamedValue( OUString( UNO_NAME_FILE_NAME_PREFIX ), uno::Any( aPrefix )) ); mMMargs.push_back( beans::NamedValue( OUString( UNO_NAME_FILE_NAME_PREFIX ), uno::Any( aPrefix )) );
if (bPrefixIsColumn) if (bPrefixIsColumn)
...@@ -173,7 +176,7 @@ public: ...@@ -173,7 +176,7 @@ public:
} }
void executeMailMerge() void executeMailMerge( bool bDontLoadResult = false )
{ {
uno::Sequence< beans::NamedValue > aSeqMailMergeArgs = comphelper::containerToSequence( mMMargs ); uno::Sequence< beans::NamedValue > aSeqMailMergeArgs = comphelper::containerToSequence( mMMargs );
uno::Any res = mxJob->execute( aSeqMailMergeArgs ); uno::Any res = mxJob->execute( aSeqMailMergeArgs );
...@@ -196,6 +199,8 @@ public: ...@@ -196,6 +199,8 @@ public:
bOk &= rValue >>= mnCurOutputType; bOk &= rValue >>= mnCurOutputType;
else if (rName == UNO_NAME_FILE_NAME_FROM_COLUMN) else if (rName == UNO_NAME_FILE_NAME_FROM_COLUMN)
bOk &= rValue >>= bMMFilenameFromColumn; bOk &= rValue >>= bMMFilenameFromColumn;
else if (rName == UNO_NAME_DOCUMENT_URL)
bOk &= rValue >>= msMailMergeDocumentURL;
} }
CPPUNIT_ASSERT(bOk); CPPUNIT_ASSERT(bOk);
...@@ -214,7 +219,7 @@ public: ...@@ -214,7 +219,7 @@ public:
else else
{ {
CPPUNIT_ASSERT(res == true); CPPUNIT_ASSERT(res == true);
if( !bMMFilenameFromColumn ) if( !bMMFilenameFromColumn && !bDontLoadResult )
loadMailMergeDocument( 0 ); loadMailMergeDocument( 0 );
} }
} }
...@@ -252,7 +257,17 @@ public: ...@@ -252,7 +257,17 @@ public:
*/ */
void loadMailMergeDocument( int number ) void loadMailMergeDocument( int number )
{ {
OUString name = msMailMergeOutputPrefix + OUString::number( number ) + ".odt"; OUString name;
if (!msMailMergeOutputPrefix.isEmpty())
name = msMailMergeOutputPrefix;
else
{
INetURLObject aURLObj;
aURLObj.SetSmartProtocol( INetProtocol::File );
aURLObj.SetSmartURL( msMailMergeDocumentURL );
name = aURLObj.GetBase();
}
name += OUString::number( number ) + ".odt";
loadMailMergeDocument( name ); loadMailMergeDocument( name );
} }
...@@ -262,6 +277,7 @@ protected: ...@@ -262,6 +277,7 @@ protected:
uno::Reference< css::task::XJob > mxJob; uno::Reference< css::task::XJob > mxJob;
std::vector< beans::NamedValue > mMMargs; std::vector< beans::NamedValue > mMMargs;
OUString msMailMergeDocumentURL;
OUString msMailMergeOutputURL; OUString msMailMergeOutputURL;
OUString msMailMergeOutputPrefix; OUString msMailMergeOutputPrefix;
sal_Int16 mnCurOutputType; sal_Int16 mnCurOutputType;
...@@ -603,5 +619,27 @@ DECLARE_FILE_MAILMERGE_TEST_COLUMN(testDirMailMerge, "simple-mail-merge.odt", "1 ...@@ -603,5 +619,27 @@ DECLARE_FILE_MAILMERGE_TEST_COLUMN(testDirMailMerge, "simple-mail-merge.odt", "1
} }
} }
DECLARE_FILE_MAILMERGE_TEST(testTdf102010, "empty.odt", "10-testing-addresses.ods", "testing-addresses")
{
// Create "correct" automatic filename for non-user-supplied-prefix
for (auto aNamedValueIter = mMMargs.begin(); aNamedValueIter != mMMargs.end();)
{
if ( aNamedValueIter->Name == UNO_NAME_FILE_NAME_PREFIX )
aNamedValueIter = mMMargs.erase( aNamedValueIter );
else
{
std::cout << aNamedValueIter->Name << ": " << aNamedValueIter->Value << std::endl;
++aNamedValueIter;
}
}
mMMargs.push_back( beans::NamedValue( OUString( UNO_NAME_SAVE_AS_SINGLE_FILE ), uno::Any( true ) ) );
// Generate correct mail merge result filename
executeMailMerge();
// Don't overwrite previous result
executeMailMerge( true );
loadMailMergeDocument( 1 );
}
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -1098,11 +1098,13 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, ...@@ -1098,11 +1098,13 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
bool bCheckSingleFile_ = rMergeDescriptor.bCreateSingleFile; bool bCheckSingleFile_ = rMergeDescriptor.bCreateSingleFile;
if( bMT_EMAIL ) if( bMT_EMAIL )
{ {
assert( !rMergeDescriptor.bPrefixIsFilename );
assert( bMT_EMAIL && !bCheckSingleFile_ ); assert( bMT_EMAIL && !bCheckSingleFile_ );
bCheckSingleFile_ = false; bCheckSingleFile_ = false;
} }
else if( bMT_SHELL || bMT_PRINTER ) else if( bMT_SHELL || bMT_PRINTER )
{ {
assert( !rMergeDescriptor.bPrefixIsFilename );
assert( (bMT_SHELL || bMT_PRINTER) && bCheckSingleFile_ ); assert( (bMT_SHELL || bMT_PRINTER) && bCheckSingleFile_ );
bCheckSingleFile_ = true; bCheckSingleFile_ = true;
} }
...@@ -1318,7 +1320,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, ...@@ -1318,7 +1320,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
// create a new temporary file name - only done once in case of bCreateSingleFile // create a new temporary file name - only done once in case of bCreateSingleFile
if( bNeedsTempFiles && ( !bWorkDocInitialized || !bCreateSingleFile )) if( bNeedsTempFiles && ( !bWorkDocInitialized || !bCreateSingleFile ))
{ {
OUString sPath = rMergeDescriptor.sPath; OUString sPrefix = rMergeDescriptor.sPrefix;
OUString sLeading; OUString sLeading;
//#i97667# if the name is from a database field then it will be used _as is_ //#i97667# if the name is from a database field then it will be used _as is_
...@@ -1331,14 +1333,14 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, ...@@ -1331,14 +1333,14 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
} }
else else
{ {
INetURLObject aEntry( sPath ); INetURLObject aEntry( sPrefix );
sLeading = aEntry.GetBase(); sLeading = aEntry.GetBase();
aEntry.removeSegment(); aEntry.removeSegment();
sPath = aEntry.GetMainURL( INetURLObject::NO_DECODE ); sPrefix = aEntry.GetMainURL( INetURLObject::NO_DECODE );
} }
OUString sExt(comphelper::string::stripStart(pStoreToFilter->GetDefaultExtension(), '*')); OUString sExt(comphelper::string::stripStart(pStoreToFilter->GetDefaultExtension(), '*'));
aTempFile.reset( new utl::TempFile(sLeading, sColumnData.isEmpty(), &sExt, &sPath, true) ); aTempFile.reset( new utl::TempFile(sLeading, sColumnData.isEmpty(), &sExt, &sPrefix, true) );
if( !aTempFile->IsValid() ) if( !aTempFile->IsValid() )
{ {
ErrorHandler::HandleError( ERRCODE_IO_NOTSUPPORTED ); ErrorHandler::HandleError( ERRCODE_IO_NOTSUPPORTED );
...@@ -1559,11 +1561,11 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, ...@@ -1559,11 +1561,11 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
// save merged document // save merged document
assert( aTempFile.get() ); assert( aTempFile.get() );
INetURLObject aTempFileURL; INetURLObject aTempFileURL;
if( rMergeDescriptor.sPath.isEmpty() ) if( rMergeDescriptor.sPrefix.isEmpty() || !rMergeDescriptor.bPrefixIsFilename )
aTempFileURL.SetURL( aTempFile->GetURL() ); aTempFileURL.SetURL( aTempFile->GetURL() );
else else
{ {
aTempFileURL.SetURL( rMergeDescriptor.sPath ); aTempFileURL.SetURL( rMergeDescriptor.sPrefix );
// remove the unneeded temporary file // remove the unneeded temporary file
aTempFile->EnableKillingFile(); aTempFile->EnableKillingFile();
} }
...@@ -2863,7 +2865,8 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh, ...@@ -2863,7 +2865,8 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh,
SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), rSh, aDescriptor ); SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), rSh, aDescriptor );
aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter(); aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter();
aMergeDesc.bCreateSingleFile = pImpl->pMergeDialog->IsSaveSingleDoc(); aMergeDesc.bCreateSingleFile = pImpl->pMergeDialog->IsSaveSingleDoc();
aMergeDesc.sPath = pImpl->pMergeDialog->GetTargetURL(); aMergeDesc.bPrefixIsFilename = aMergeDesc.bCreateSingleFile;
aMergeDesc.sPrefix = pImpl->pMergeDialog->GetTargetURL();
if( !aMergeDesc.bCreateSingleFile && pImpl->pMergeDialog->IsGenerateFromDataBase() ) if( !aMergeDesc.bCreateSingleFile && pImpl->pMergeDialog->IsGenerateFromDataBase() )
{ {
aMergeDesc.sDBcolumn = pImpl->pMergeDialog->GetColumnName(); aMergeDesc.sDBcolumn = pImpl->pMergeDialog->GetColumnName();
......
...@@ -738,7 +738,7 @@ uno::Any SAL_CALL SwXMailMerge::execute( ...@@ -738,7 +738,7 @@ uno::Any SAL_CALL SwXMailMerge::execute(
aPath += aCurFileNamePrefix; aPath += aCurFileNamePrefix;
} }
aMergeDesc.sPath = aPath; aMergeDesc.sPrefix = aPath;
aMergeDesc.sSaveToFilter = m_sSaveFilter; aMergeDesc.sSaveToFilter = m_sSaveFilter;
aMergeDesc.sSaveToFilterOptions = m_sSaveFilterOptions; aMergeDesc.sSaveToFilterOptions = m_sSaveFilterOptions;
aMergeDesc.aSaveToFilterData = m_aSaveFilterData; aMergeDesc.aSaveToFilterData = m_aSaveFilterData;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment