From 14aa9b0a818ca23efdf07a618ae493c7e7397752 Mon Sep 17 00:00:00 2001 From: Jan Holesovsky Date: Wed, 10 Feb 2016 13:26:50 +0100 Subject: lok: Introduce a "TakeOwnership" filter option for saveAs(). It is consumed by the saveAs() itself, and when provided, the document identity changes to the provided pUrl - meaning that '.uno:ModifiedStatus' is triggered as with the "Save As..." in the UI. This mode must not be used when saving to PNG or PDF. Change-Id: I11b5aa814476a8dcab9eac5202bd052828ebbd96 --- desktop/source/lib/init.cxx | 30 +++++++++++++++++++++++++++++- include/LibreOfficeKit/LibreOfficeKit.hxx | 5 +++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 507e4f828b20..d5bec92870e3 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -674,6 +674,30 @@ static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* sUrl, const cha OUString aFilterOptions = getUString(pFilterOptions); + // 'TakeOwnership' == this is a 'real' SaveAs (that is, the document + // gets a new name). When this is not provided, the meaning of + // saveAs() is more like save-a-copy, which allows saving to any + // random format like PDF or PNG. + // It is not a real filter option, so we have to filter it out. + bool bTakeOwnership = false; + int nIndex = -1; + if (aFilterOptions == "TakeOwnership") + { + bTakeOwnership = true; + aFilterOptions = ""; + } + else if ((nIndex = aFilterOptions.indexOf(",TakeOwnership")) >= 0 || (nIndex = aFilterOptions.indexOf("TakeOwnership,")) >= 0) + { + OUString aFiltered; + if (nIndex > 0) + aFiltered = aFilterOptions.copy(0, nIndex); + if (nIndex + 14 < aFilterOptions.getLength()) + aFiltered = aFiltered + aFilterOptions.copy(nIndex + 14); + + bTakeOwnership = true; + aFilterOptions = aFiltered; + } + MediaDescriptor aSaveMediaDescriptor; aSaveMediaDescriptor["Overwrite"] <<= sal_True; aSaveMediaDescriptor["FilterName"] <<= aFilterName; @@ -691,7 +715,11 @@ static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* sUrl, const cha } uno::Reference xStorable(pDocument->mxComponent, uno::UNO_QUERY_THROW); - xStorable->storeToURL(aURL, aSaveMediaDescriptor.getAsConstPropertyValueList()); + + if (bTakeOwnership) + xStorable->storeAsURL(aURL, aSaveMediaDescriptor.getAsConstPropertyValueList()); + else + xStorable->storeToURL(aURL, aSaveMediaDescriptor.getAsConstPropertyValueList()); return true; } diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index 1f2311ae6604..84741e0ee20b 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -45,6 +45,11 @@ public: * @param pUrl the location where to store the document * @param pFormat the format to use while exporting, when omitted, then deducted from pURL's extension * @param pFilterOptions options for the export filter, e.g. SkipImages. + * Another useful FilterOption is "TakeOwnership". It is consumed + * by the saveAs() itself, and when provided, the document identity + * changes to the provided pUrl - meaning that '.uno:ModifiedStatus' + * is triggered as with the "Save As..." in the UI. + * "TakeOwnership" mode must not be used when saving to PNG or PDF. */ inline bool saveAs(const char* pUrl, const char* pFormat = NULL, const char* pFilterOptions = NULL) { -- cgit v1.2.3