office-gobmx/fpicker/source/win32/requests.hxx
Matt K 1c1226709c tdf#106282 Change Windows File Dialog to run on the main thread
Windows crashes when an IFileDialog object is used on a non-main
thread when cancelling a long search operation, when COM is
initialized as single-threaded apartment for that thread.
Trying to use a non-main thread with COM initialized to
multi-threaded apartment hangs the dialog UI.  The only solution
that works is to run all File Dialogs on the main thread.  This
has a performance penalty on the application while a File Dialog
is open or if multiple dialogs are searching and then cancelled,
but it's better than crashing.  Other applications like Firefox
use only the main thread for File Dialogs, but have additional
processes to avoid the performance penalty.

Change-Id: Icf8a8179dbea19bd3d749a1c2fe8e67dbfc726c6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114482
Reviewed-by: Matt K <mattkse@gmail.com>
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Tested-by: Jenkins
2021-04-22 22:20:55 +02:00

76 lines
2.1 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
#include <comphelper/sequenceashashmap.hxx>
namespace fpicker
{
namespace win32
{
namespace vista
{
/** @todo document me
*/
class Request
{
// interface
public:
explicit Request()
: m_nRequest(-1)
, m_lArguments()
{
}
virtual ~Request(){};
void setRequest(::sal_Int32 nRequest) { m_nRequest = nRequest; }
::sal_Int32 getRequest() { return m_nRequest; }
void clearArguments() { m_lArguments.clear(); }
template <class TArgumentType>
void setArgument(const OUString& sName, const TArgumentType& aValue)
{
m_lArguments[sName] = css::uno::toAny(aValue);
}
template <class TArgumentType>
TArgumentType getArgumentOrDefault(const OUString& sName, const TArgumentType& aDefault)
{
return m_lArguments.getUnpackedValueOrDefault(sName, aDefault);
}
css::uno::Any getValue(OUString const& key) const { return m_lArguments.getValue(key); }
// member
private:
::sal_Int32 m_nRequest;
::comphelper::SequenceAsHashMap m_lArguments;
};
} // namespace vista
} // namespace win32
} // namespace fpicker
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */