1
0
Fork 0
libreoffice/desktop/source/app/officeipcthread.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

158 lines
5.9 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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 <sal/config.h>
#include <utility>
#include <vector>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/frame/XTerminateListener.hpp>
#include <osl/signal.h>
#include <rtl/ref.hxx>
#include <rtl/ustring.hxx>
#include <salhelper/simplereferenceobject.hxx>
#include <cppuhelper/implbase.hxx>
#include <osl/conditn.hxx>
#include <optional>
namespace desktop
{
oslSignalAction SalMainPipeExchangeSignal_impl(void* /*pData*/, oslSignalInfo* pInfo);
// A request for the current office
// that was given by command line or by IPC pipe communication.
struct ProcessDocumentsRequest
{
explicit ProcessDocumentsRequest(std::optional< OUString > cwdUrl):
aCwdUrl(std::move(cwdUrl)), pcProcessed( nullptr ), bTextCat( false ), bScriptCat( false ) {}
std::optional< OUString > aCwdUrl;
OUString aModule;
std::vector< OUString > aOpenList; // Documents that should be opened in the default way
std::vector< OUString > aViewList; // Documents that should be opened in viewmode
std::vector< OUString > aStartList; // Documents/Presentations that should be started
std::vector< OUString > aPrintList; // Documents that should be printed on default printer
std::vector< OUString > aForceOpenList; // Documents that should be forced to open for editing (even templates)
std::vector< OUString > aForceNewList; // Documents that should be forced to create a new document
OUString aPrinterName; // The printer name that should be used for printing
std::vector< OUString > aPrintToList; // Documents that should be printed on the given printer
std::vector< OUString > aConversionList;
OUString aConversionParams;
OUString aConversionOut;
OUString aImageConversionType;
OUString aStartListParams;
std::vector< OUString > aInFilter;
::osl::Condition *pcProcessed; // pointer condition to be set when the request has been processed
bool* mpbSuccess = nullptr; // pointer to boolean receiving if the processing was successful
bool bTextCat; // boolean flag indicating whether to dump text content to console
bool bScriptCat; // boolean flag indicating whether to dump script content to console
};
class DispatchWatcher;
class IpcThread;
class PipeIpcThread;
class DbusIpcThread;
class RequestHandler: public salhelper::SimpleReferenceObject
{
friend IpcThread;
friend PipeIpcThread;
friend DbusIpcThread;
private:
static rtl::Reference< RequestHandler > pGlobal;
enum class State { Starting, RequestsEnabled, Downing };
State mState;
int mnPendingRequests;
rtl::Reference<DispatchWatcher> mpDispatchWatcher;
rtl::Reference<IpcThread> mIpcThread;
/* condition to be set when the request has been processed */
::osl::Condition cProcessed;
/* receives if the processing was successful (may be false e.g. when shutting down) */
bool mbSuccess = false;
/* condition to be set when the main event loop is ready
otherwise an error dialogs event loop could eat away
requests from a 2nd office */
::osl::Condition cReady;
static ::osl::Mutex& GetMutex();
RequestHandler();
virtual ~RequestHandler() override;
public:
enum Status
{
IPC_STATUS_OK,
IPC_STATUS_2ND_OFFICE,
IPC_STATUS_PIPE_ERROR,
IPC_STATUS_BOOTSTRAP_ERROR
};
// controlling pipe communication during shutdown
static void SetDowning();
static void EnableRequests();
static bool AreRequestsPending();
static void RequestsCompleted();
static bool ExecuteCmdLineRequests(
ProcessDocumentsRequest&, bool noTerminate);
// return sal_False if second office
static Status Enable(bool ipc);
static void Disable();
// start dispatching events...
static void SetReady(bool bIsReady);
static void WaitForReady();
bool AreRequestsEnabled() const { return mState == State::RequestsEnabled; }
};
class RequestHandlerController : public ::cppu::WeakImplHelper<
css::lang::XServiceInfo,
css::frame::XTerminateListener >
{
public:
RequestHandlerController() {}
// XServiceInfo
virtual OUString SAL_CALL getImplementationName() override;
virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
// XEventListener
virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
// XTerminateListener
virtual void SAL_CALL queryTermination( const css::lang::EventObject& aEvent ) override;
virtual void SAL_CALL notifyTermination( const css::lang::EventObject& aEvent ) override;
};
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */