sw/source/uibase/dochdl/swdtflvr.cxx |   37 ++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

New commits:
commit b81ea32945d553a712d651fe472ece921ac64d10
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Tue Apr 2 16:48:56 2019 +0100
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Apr 3 09:53:47 2019 +0200

    tdf#124500: convert short path names from drag-n-drop to long names
    
    ... otherwise link URLs with short names like 2E23~1.PNG would be
    inaccessible from the network, or after copy to a different directory
    or system, where the autogenerated short name might be different.
    
    Change-Id: Ice0b2fa205a25aba232e960cad2615a527cba05a
    Reviewed-on: https://gerrit.libreoffice.org/70145
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/sw/source/uibase/dochdl/swdtflvr.cxx 
b/sw/source/uibase/dochdl/swdtflvr.cxx
index e74e3b7af3ca..ab949d3635be 100644
--- a/sw/source/uibase/dochdl/swdtflvr.cxx
+++ b/sw/source/uibase/dochdl/swdtflvr.cxx
@@ -72,6 +72,13 @@
 #include <unotools/streamwrap.hxx>
 #include <vcl/graphicfilter.hxx>
 
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <o3tl/char16_t2wchar_t.hxx>
+#include <osl/file.hxx>
+#endif
+
 #include <svx/unomodel.hxx>
 #include <fmturl.hxx>
 #include <fmtinfmt.hxx>
@@ -2469,9 +2476,33 @@ bool SwTransferable::PasteGrf( TransferableDataHelper& 
rData, SwWrtShell& rSh,
                 OUString sDesc;
                 SwTransferable::CheckForURLOrLNKFile( rData, sText, &sDesc );
 
-                aBkmk = INetBookmark(
-                        URIHelper::SmartRel2Abs(INetURLObject(), sText, 
Link<OUString *, bool>(), false ),
-                        sDesc );
+                sText = URIHelper::SmartRel2Abs(INetURLObject(), sText, 
Link<OUString*, bool>(),
+                    false);
+
+#ifdef _WIN32
+                // Now that the path could be modified after 
SwTransferable::CheckForURLOrLNKFile,
+                // where it could have been converted to URL, and made sure 
it's actually converted
+                // to URL in URIHelper::SmartRel2Abs, we can finally convert 
file: URL back to
+                // system path to make sure we don't use short path.
+                // It looks not optimal, when we could apply GetLongPathNameW 
right to the original
+                // pasted filename. But I don't know if (1) all arriving 
strings are system paths;
+                // and (2) if SwTransferable::CheckForURLOrLNKFile could 
result in a different short
+                // path, so taking a safe route.
+                if (sText.startsWithIgnoreAsciiCase("file:"))
+                {
+                    // tdf#124500: Convert short path to long path which 
should be used in links
+                    OUString sSysPath;
+                    osl::FileBase::getSystemPathFromFileURL(sText, sSysPath);
+                    std::unique_ptr<sal_Unicode[]> aBuf(new 
sal_Unicode[32767]);
+                    DWORD nCopied = 
GetLongPathNameW(o3tl::toW(sSysPath.getStr()),
+                                                     o3tl::toW(aBuf.get()), 
32767);
+                    if (nCopied && nCopied < 32767)
+                        sText = URIHelper::SmartRel2Abs(INetURLObject(), 
aBuf.get(),
+                                                        Link<OUString*, 
bool>(), false);
+                }
+#endif
+
+                aBkmk = INetBookmark(sText, sDesc);
                 bCheckForGrf = true;
                 bCheckForImageMap = SwPasteSdr::Replace == nAction;
             }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to