1c1226709c
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
76 lines
2.1 KiB
C++
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: */
|