22#include <config_dbus.h>
23#include <config_features.h>
24#include <config_feature_desktop.h>
30#include <com/sun/star/frame/TerminationVetoException.hpp>
37#include <osl/pipe.hxx>
38#include <rtl/digest.h>
39#include <rtl/ustrbuf.hxx>
40#include <osl/conditn.hxx>
42#include <rtl/strbuf.hxx>
44#include <osl/file.hxx>
45#include <rtl/process.h>
55#include <sys/socket.h>
65char const ARGUMENT_PREFIX[] =
"InternalIPC::Arguments";
66char const SEND_ARGUMENTS[] =
"InternalIPC::SendArguments";
67char const PROCESSING_DONE[] =
"InternalIPC::ProcessingDone";
73OString readStringFromPipe(osl::StreamPipe
const & pipe) {
74 for (OStringBuffer str;;) {
76 sal_Int32
n = pipe.recv(buf, std::size(buf));
78 SAL_INFO(
"desktop.app",
"read empty string");
82 if (buf[n - 1] ==
'\0') {
89 auto s = str.makeStringAndClear();
90 SAL_INFO(
"desktop.app",
"read <" << s <<
">");
105 explicit Parser(OString input):
m_input(
std::move(input)) {
106 if (!
m_input.match(ARGUMENT_PREFIX) ||
107 m_input.getLength() == RTL_CONSTASCII_LENGTH(ARGUMENT_PREFIX))
111 m_index = RTL_CONSTASCII_LENGTH(ARGUMENT_PREFIX);
118 if (!next(&url,
false)) {
127 if (!next(&path,
false)) {
131 if (osl::FileBase::getFileURLFromSystemPath(path, url) ==
132 osl::FileBase::E_None)
143 virtual std::optional< OUString > getCwdUrl()
override {
return m_cwdUrl; }
145 virtual bool next(OUString * argument)
override {
return next(argument,
true); }
148 bool next(OUString * argument,
bool prefix) {
149 OSL_ASSERT(argument !=
nullptr);
181 OString b2(b.makeStringAndClear());
182 if (!rtl_convertStringToUString(
183 &
argument->pData, b2.getStr(), b2.getLength(),
184 RTL_TEXTENCODING_UTF8,
185 (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
186 RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
187 RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
202bool addArgument(OStringBuffer &rArguments,
char prefix,
203 const OUString &rArgument)
206 if (!rArgument.convertToString(
207 &utf8, RTL_TEXTENCODING_UTF8,
208 (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
209 RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
213 rArguments.append(prefix);
214 for (sal_Int32 i = 0;
i < utf8.getLength(); ++
i) {
218 rArguments.append(
"\\0");
221 rArguments.append(
"\\,");
224 rArguments.append(
"\\\\");
227 rArguments.append(c);
242 SAL_INFO(
"desktop.app",
"create md5 from '" << aMsg <<
"'");
244 rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
248 sal_uInt32 nSize = aMsg.getLength() *
sizeof(
sal_Unicode );
249 sal_uInt32 nMD5KeyLen = rtl_digest_queryLength( handle );
250 std::unique_ptr<sal_uInt8[]> pMD5KeyBuffer(
new sal_uInt8[ nMD5KeyLen ]);
252 rtl_digest_init( handle,
pData, nSize );
253 rtl_digest_update( handle,
pData, nSize );
254 rtl_digest_get( handle, pMD5KeyBuffer.get(), nMD5KeyLen );
255 rtl_digest_destroy( handle );
258 OUStringBuffer
aBuffer( nMD5KeyLen * 2 + 1 );
259 for ( sal_uInt32
i = 0;
i < nMD5KeyLen;
i++ )
260 aBuffer.append(
static_cast<sal_Int32
>(pMD5KeyBuffer[
i]), 16 );
262 return aBuffer.makeStringAndClear();
270class ProcessEventsClass_Impl
274 DECL_STATIC_LINK( ProcessEventsClass_Impl, ProcessDocumentsEvent,
void*,
void );
306 if( pInfo->Signal == osl_Signal_Terminate )
308 return osl_Signal_ActCallNextHdl;
324 return "com.sun.star.comp.RequestHandlerController";
328 OUString
const & ServiceName)
351 throw TerminationVetoException();
373 bool process(OString
const & arguments,
bool * waitProcessed);
400struct DbusConnectionHolder {
401 explicit DbusConnectionHolder(DBusConnection * theConnection):
402 connection(theConnection)
405 DbusConnectionHolder(DbusConnectionHolder && other): connection(
nullptr)
406 { std::swap(connection, other.connection); }
408 ~DbusConnectionHolder() {
409 if (connection !=
nullptr) {
410 dbus_connection_close(connection);
411 dbus_connection_unref(connection);
415 DBusConnection * connection;
418struct DbusMessageHolder {
419 explicit DbusMessageHolder(DBusMessage * theMessage): message(theMessage) {}
421 ~DbusMessageHolder() { clear(); }
424 if (message !=
nullptr) {
425 dbus_message_unref(message);
430 DBusMessage * message;
433 DbusMessageHolder(DbusMessageHolder
const &) =
delete;
434 DbusMessageHolder& operator =(DbusMessageHolder
const &) =
delete;
444 explicit DbusIpcThread(DbusConnectionHolder && connection):
445 IpcThread(
"DbusIPC"), connection_(
std::move(connection))
448 virtual ~DbusIpcThread()
override {}
450 void execute()
override;
452 void close()
override;
454 DbusConnectionHolder connection_;
459 assert(thread !=
nullptr);
460 if (!dbus_threads_init_default()) {
461 SAL_WARN(
"desktop.app",
"dbus_threads_init_default failed");
466 DbusConnectionHolder
con(dbus_bus_get_private(DBUS_BUS_SESSION, &e));
467 assert((
con.connection ==
nullptr) ==
bool(dbus_error_is_set(&e)));
468 if (
con.connection ==
nullptr) {
471 "dbus_bus_get_private failed with: " << e.name <<
": "
477 int n = dbus_bus_request_name(
478 con.connection,
"org.libreoffice.LibreOfficeIpc0",
479 DBUS_NAME_FLAG_DO_NOT_QUEUE, &e);
480 assert((n == -1) ==
bool(dbus_error_is_set(&e)));
485 "dbus_bus_request_name failed with: " << e.name <<
": "
489 case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
490 *thread =
new DbusIpcThread(std::move(con));
492 case DBUS_REQUEST_NAME_REPLY_EXISTS:
494 OStringBuffer buf(ARGUMENT_PREFIX);
497 && addArgument(buf,
'1', arg)))
501 sal_uInt32 narg = rtl_getAppCommandArgCount();
502 for (sal_uInt32 i = 0;
i != narg; ++
i) {
503 rtl_getAppCommandArg(i, &arg.pData);
504 if (!addArgument(buf,
',', arg)) {
508 char const * argstr = buf.getStr();
509 DbusMessageHolder msg(
510 dbus_message_new_method_call(
511 "org.libreoffice.LibreOfficeIpc0",
512 "/org/libreoffice/LibreOfficeIpc0",
513 "org.libreoffice.LibreOfficeIpcIfc0",
"Execute"));
514 if (msg.message ==
nullptr) {
516 "desktop.app",
"dbus_message_new_method_call failed");
520 dbus_message_iter_init_append(msg.message, &it);
521 if (!dbus_message_iter_append_basic(
522 &it, DBUS_TYPE_STRING, &argstr))
525 "desktop.app",
"dbus_message_iter_append_basic failed");
528 DbusMessageHolder repl(
529 dbus_connection_send_with_reply_and_block(
530 con.connection, msg.message, 0x7FFFFFFF, &e));
532 (repl.message ==
nullptr) ==
bool(dbus_error_is_set(&e)));
533 if (repl.message ==
nullptr) {
536 "dbus_connection_send_with_reply_and_block failed"
537 " with: " << e.name <<
": " << e.message);
543 case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
544 case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
547 "dbus_bus_request_name failed with unexpected " << +n);
550 for (;;) std::abort();
555void DbusIpcThread::execute()
557 assert(m_handler !=
nullptr);
558 m_handler->cReady.wait();
566 if (!dbus_connection_read_write(connection_.connection, -1)) {
570 DbusMessageHolder msg(
571 dbus_connection_pop_message(connection_.connection));
572 if (msg.message ==
nullptr) {
575 if (!dbus_message_is_method_call(
576 msg.message,
"org.libreoffice.LibreOfficeIpcIfc0",
579 SAL_INFO(
"desktop.app",
"unknown DBus message ignored");
583 if (!dbus_message_iter_init(msg.message, &it)) {
585 "desktop.app",
"DBus message without argument ignored");
588 if (dbus_message_iter_get_arg_type(&it) != DBUS_TYPE_STRING) {
591 "DBus message with non-string argument ignored");
595 dbus_message_iter_get_basic(&it, &argstr);
596 bool waitProcessed =
false;
599 if (!process(argstr, &waitProcessed)) {
604 m_handler->cProcessed.wait();
606 DbusMessageHolder repl(dbus_message_new_method_return(msg.message));
607 if (repl.message ==
nullptr) {
609 "desktop.app",
"dbus_message_new_method_return failed");
612 dbus_uint32_t serial = 0;
613 if (!dbus_connection_send(
614 connection_.connection, repl.message, &serial)) {
615 SAL_WARN(
"desktop.app",
"dbus_connection_send failed");
618 dbus_connection_flush(connection_.connection);
623void DbusIpcThread::close() {
624 assert(connection_.connection !=
nullptr);
628 if (!dbus_connection_get_socket(connection_.connection, &fd)) {
629 SAL_WARN(
"desktop.app",
"dbus_connection_get_socket failed");
632 if (shutdown(fd, SHUT_RD) == -1) {
633 auto const e = errno;
634 SAL_WARN(
"desktop.app",
"shutdown failed with errno " << e);
642 static ::osl::Mutex theRequestHandlerMutex;
643 return theRequestHandlerMutex;
651 ::osl::MutexGuard aGuard(
GetMutex() );
660 ::osl::MutexGuard aGuard(
GetMutex() );
676 ::osl::MutexGuard aGuard(
GetMutex() );
678 return (
pGlobal->mnPendingRequests > 0 );
686 ::osl::MutexGuard aGuard(
GetMutex() );
689 if (
pGlobal->mnPendingRequests > 0 )
696 ::osl::MutexGuard aGuard(
GetMutex() );
701#if !HAVE_FEATURE_DESKTOP || HAVE_FEATURE_MACOSX_SANDBOX || defined(EMSCRIPTEN)
710 enum class Kind { Pipe, Dbus };
713 kind = std::getenv(
"LIBO_FLATPAK") !=
nullptr ? Kind::Dbus : Kind::Pipe;
725 stat = DbusIpcThread::enable(&thread);
742 assert(thread !=
nullptr);
746 OUString aUserInstallPath;
762 if ( aUserInstallPathHashCode.isEmpty() )
772 PipeMode nPipeMode = PIPEMODE_DONTKNOW;
774 OUString aPipeIdent(
"SingleOfficeIPC_" + aUserInstallPathHashCode );
777 osl::Security security;
780 if ( pipe.create( aPipeIdent, osl_Pipe_CREATE, security ))
783 nPipeMode = PIPEMODE_CREATED;
785 else if( pipe.create( aPipeIdent, osl_Pipe_OPEN, security ))
787 osl::StreamPipe aStreamPipe(pipe.getHandle());
788 if (readStringFromPipe(aStreamPipe) == SEND_ARGUMENTS)
791 nPipeMode = PIPEMODE_CONNECTED;
796 std::this_thread::sleep_for( std::chrono::milliseconds(500) );
801 oslPipeError eReason = pipe.getError();
802 if ((eReason == osl_Pipe_E_ConnectionRefused) || (eReason == osl_Pipe_E_invalidError))
806 std::this_thread::sleep_for( std::chrono::milliseconds(10) );
809 }
while ( nPipeMode == PIPEMODE_DONTKNOW );
811 if ( nPipeMode == PIPEMODE_CREATED )
820 osl::StreamPipe aStreamPipe(pipe.getHandle());
829 sal_uInt32
nCount = rtl_getAppCommandArgCount();
832 rtl_getAppCommandArg(
i, &aUserInstallPath.pData );
833 if (!addArgument(
aArguments,
',', aUserInstallPath)) {
840 sal_Int32
n = aStreamPipe.write(
843 SAL_INFO(
"desktop.app",
"short write: " <<
n);
847 if (readStringFromPipe(aStreamPipe) != PROCESSING_DONE)
868 if (handler->mIpcThread.is()) {
869 handler->mIpcThread->close();
875 handler->cReady.set();
878 if (handler->mIpcThread.is())
880 handler->mIpcThread->join();
881 handler->mIpcThread.clear();
884 handler->cReady.reset();
888 mState(
State::Starting ),
889 mnPendingRequests( 0 )
924 assert(waitProcessed !=
nullptr);
926 std::unique_ptr< CommandLineArgs > aCmdLineArgs;
934 SAL_WARN(
"desktop.app",
"Error in received command line arguments");
938 bool bDocRequestSent =
false;
940 OUString aUnknown( aCmdLineArgs->GetUnknown() );
941 if (aUnknown.isEmpty() && !aCmdLineArgs->IsHelp() && !aCmdLineArgs->IsVersion())
945 if ( aCmdLineArgs->IsQuickstart() )
954 std::vector< OUString >
const & accept = aCmdLineArgs->GetAccept();
955 for (
auto const& elem : accept)
962 std::vector< OUString >
const & unaccept = aCmdLineArgs->GetUnaccept();
963 for (
auto const& elem : unaccept)
971 aCmdLineArgs->getCwdUrl()));
979 pRequest->aPrintList = aCmdLineArgs->GetPrintList();
980 bDocRequestSent |= !pRequest->aPrintList.empty();
981 pRequest->aPrintToList = aCmdLineArgs->GetPrintToList();
982 pRequest->aPrinterName = aCmdLineArgs->GetPrinterName();
983 bDocRequestSent |= !( pRequest->aPrintToList.empty() || pRequest->aPrinterName.isEmpty() );
984 pRequest->aConversionList = aCmdLineArgs->GetConversionList();
985 pRequest->aConversionParams = aCmdLineArgs->GetConversionParams();
986 pRequest->aConversionOut = aCmdLineArgs->GetConversionOut();
987 pRequest->aImageConversionType = aCmdLineArgs->GetImageConversionType();
988 pRequest->aInFilter = aCmdLineArgs->GetInFilter();
989 pRequest->bTextCat = aCmdLineArgs->IsTextCat();
990 pRequest->bScriptCat = aCmdLineArgs->IsScriptCat();
991 bDocRequestSent |= !pRequest->aConversionList.empty();
997 pRequest->aOpenList = aCmdLineArgs->GetOpenList();
998 bDocRequestSent |= !pRequest->aOpenList.empty();
999 pRequest->aViewList = aCmdLineArgs->GetViewList();
1000 bDocRequestSent |= !pRequest->aViewList.empty();
1001 pRequest->aStartList = aCmdLineArgs->GetStartList();
1002 bDocRequestSent |= !pRequest->aStartList.empty();
1003 pRequest->aForceOpenList = aCmdLineArgs->GetForceOpenList();
1004 bDocRequestSent |= !pRequest->aForceOpenList.empty();
1005 pRequest->aForceNewList = aCmdLineArgs->GetForceNewList();
1006 bDocRequestSent |= !pRequest->aForceNewList.empty();
1014 if ( aCmdLineArgs->HasModuleParam() && !bDocRequestSent )
1018 if ( aCmdLineArgs->IsWriter() )
1020 else if ( aCmdLineArgs->IsCalc() )
1022 else if ( aCmdLineArgs->IsDraw() )
1024 else if ( aCmdLineArgs->IsImpress() )
1026 else if ( aCmdLineArgs->IsBase() )
1028 else if ( aCmdLineArgs->IsMath() )
1030 else if ( aCmdLineArgs->IsGlobal() )
1032 else if ( aCmdLineArgs->IsWeb() )
1035 if ( !pRequest->aOpenList.empty() )
1039 bDocRequestSent =
true;
1043 if ( !aCmdLineArgs->IsQuickstart() ) {
1044 bool bShowHelp =
false;
1045 OUStringBuffer aHelpURLBuffer;
1046 if (aCmdLineArgs->IsHelpWriter()) {
1048 aHelpURLBuffer.append(
"vnd.sun.star.help://swriter/start");
1049 }
else if (aCmdLineArgs->IsHelpCalc()) {
1051 aHelpURLBuffer.append(
"vnd.sun.star.help://scalc/start");
1052 }
else if (aCmdLineArgs->IsHelpDraw()) {
1054 aHelpURLBuffer.append(
"vnd.sun.star.help://sdraw/start");
1055 }
else if (aCmdLineArgs->IsHelpImpress()) {
1057 aHelpURLBuffer.append(
"vnd.sun.star.help://simpress/start");
1058 }
else if (aCmdLineArgs->IsHelpBase()) {
1060 aHelpURLBuffer.append(
"vnd.sun.star.help://sdatabase/start");
1061 }
else if (aCmdLineArgs->IsHelpBasic()) {
1063 aHelpURLBuffer.append(
"vnd.sun.star.help://sbasic/start");
1064 }
else if (aCmdLineArgs->IsHelpMath()) {
1066 aHelpURLBuffer.append(
"vnd.sun.star.help://smath/start");
1069 aHelpURLBuffer.append(
"?Language="
1078 aHelpURLBuffer.makeStringAndClear());
1083 if ( bDocRequestSent )
1087 if ( aCmdLineArgs->HasModuleParam() )
1109 if (aCmdLineArgs->IsEmpty())
1117 *waitProcessed = bDocRequestSent;
1126 osl::StreamPipe aStreamPipe;
1127 oslPipeError nError =
pipe_.accept( aStreamPipe );
1130 if( nError == osl_Pipe_E_None )
1151 SAL_INFO(
"desktop.app",
"writing <" << SEND_ARGUMENTS <<
">");
1152 std::size_t
n = aStreamPipe.write(
1153 SEND_ARGUMENTS, std::size(SEND_ARGUMENTS));
1155 if (
n != std::size(SEND_ARGUMENTS)) {
1156 SAL_WARN(
"desktop.app",
"short write: " <<
n);
1160 OString
aArguments = readStringFromPipe(aStreamPipe);
1166 bool waitProcessed =
false;
1173 bool bSuccess =
true;
1183 SAL_INFO(
"desktop.app",
"writing <" << PROCESSING_DONE <<
">");
1184 n = aStreamPipe.write(PROCESSING_DONE, std::size(PROCESSING_DONE));
1186 if (
n != std::size(PROCESSING_DONE))
1188 SAL_WARN(
"desktop.app",
"short write: " <<
n);
1203 SAL_WARN(
"desktop.app",
"Error on accept: " <<
static_cast<int>(nError));
1204 std::this_thread::sleep_for( std::chrono::seconds(1) );
1206 }
while( schedule() );
1210 std::vector<DispatchWatcher::DispatchRequest>& rDispatchList,
1211 std::optional< OUString >
const & cwdUrl,
1212 std::vector< OUString >
const & aRequestList,
1214 const OUString& aParam,
1215 const OUString& aFactory )
1217 for (
auto const& request : aRequestList)
1219 rDispatchList.push_back({
nType, request, cwdUrl, aParam, aFactory});
1224 std::vector<DispatchWatcher::DispatchRequest>& rDispatchList,
1225 std::optional< OUString >
const & cwdUrl,
1226 std::vector< OUString >
const & rRequestList,
1227 const OUString& rParam,
1228 const OUString& rPrinterName,
1229 const OUString& rFactory,
1230 const OUString& rParamOut,
1231 std::u16string_view rImgOut,
1232 const bool isTextCat,
1233 const bool isScriptCat )
1236 OUString aParam( rParam );
1238 if( !rParam.isEmpty() )
1252 aParam = rPrinterName;
1266 if (OUString aOutDir(rParamOut.trim()); !aOutDir.isEmpty())
1268 if (osl::FileBase::getAbsoluteFileURL(aPWD, rParamOut, aOutDir) == osl::FileBase::E_None)
1269 osl::FileBase::getSystemPathFromFileURL(aOutDir, aOutDir);
1270 aParam +=
";" + aOutDir;
1274 ::osl::FileBase::getSystemPathFromFileURL( aPWD, aPWD );
1275 aParam +=
";" + aPWD;
1278 if( !rImgOut.empty() )
1279 aParam += OUString::Concat(
"|") +
o3tl::trim(rImgOut);
1281 for (
auto const& request : rRequestList)
1283 rDispatchList.push_back({
nType, request, cwdUrl, aParam, rFactory});
1289struct ConditionSetGuard
1292 ConditionSetGuard(osl::Condition* pCondition) :
m_pCondition(pCondition) {}
1302 osl::ClearableMutexGuard aGuard(
GetMutex() );
1305 ConditionSetGuard aSetGuard(aRequest.
pcProcessed);
1307 static std::vector<DispatchWatcher::DispatchRequest> aDispatchList;
1319 bool bShutdown(
false );
1323 if( !
pGlobal->AreRequestsEnabled() )
1332 pGlobal->mnPendingRequests += aDispatchList.size();
1333 if ( !
pGlobal->mpDispatchWatcher.is() )
1341 std::vector<DispatchWatcher::DispatchRequest> aTempList;
1342 aTempList.swap( aDispatchList );
1347 bShutdown = dispatchWatcher->executeDispatchRequests( aTempList, noTerminate);
::boost::spirit::classic::rule< ScannerT > argument
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
bool IsModuleInstalled(EModule eModule) const
OUString GetFactoryEmptyDocumentURL(EFactory eFactory) const
const OUString & GetFactoryName(EFactory eFactory) const
static void HandleAppEvent(const ApplicationEvent &rAppEvent)
static CommandLineArgs & GetCommandLineArgs()
IpcThread(char const *name)
virtual ~IpcThread() override
void start(RequestHandler *handler)
RequestHandler * m_handler
bool process(OString const &arguments, bool *waitProcessed)
static RequestHandler::Status enable(rtl::Reference< IpcThread > *thread)
PipeIpcThread(osl::Pipe pipe)
virtual ~PipeIpcThread() override
virtual OUString SAL_CALL getImplementationName() override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual void SAL_CALL queryTermination(const css::lang::EventObject &aEvent) override
virtual void SAL_CALL notifyTermination(const css::lang::EventObject &aEvent) override
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
static rtl::Reference< RequestHandler > pGlobal
static void EnableRequests()
static void WaitForReady()
static Status Enable(bool ipc)
rtl::Reference< IpcThread > mIpcThread
static bool AreRequestsPending()
static void SetReady(bool bIsReady)
static bool ExecuteCmdLineRequests(ProcessDocumentsRequest &, bool noTerminate)
@ IPC_STATUS_BOOTSTRAP_ERROR
::osl::Mutex & GetMutex()
static void RequestsCompleted()
::osl::Condition cProcessed
virtual ~RequestHandler() override
static PathStatus locateUserInstallation(OUString &_rURL)
static bool getProcessWorkingDir(OUString &rUrl)
static OUString getUILocale()
Sequence< PropertyValue > aArguments
#define LINK(Instance, Class, Member)
#define DECL_STATIC_LINK(Class, Member, ArgType, RetType)
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
std::unique_ptr< sal_Int32[]> pData
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
static void ImplPostProcessDocumentsEvent(std::unique_ptr< ProcessDocumentsRequest > pEvent)
static void ImplPostForeignAppEvent(ApplicationEvent *pEvent)
static void AddConversionsToDispatchList(std::vector< DispatchWatcher::DispatchRequest > &rDispatchList, std::optional< OUString > const &cwdUrl, std::vector< OUString > const &rRequestList, const OUString &rParam, const OUString &rPrinterName, const OUString &rFactory, const OUString &rParamOut, std::u16string_view rImgOut, const bool isTextCat, const bool isScriptCat)
static OUString CreateMD5FromString(const OUString &aMsg)
static void AddToDispatchList(std::vector< DispatchWatcher::DispatchRequest > &rDispatchList, std::optional< OUString > const &cwdUrl, std::vector< OUString > const &aRequestList, DispatchWatcher::RequestType nType, const OUString &aParam, const OUString &aFactory)
IMPL_STATIC_LINK(Desktop, ImplInitFilterHdl, ::ConvertData &, rData, bool)
oslSignalAction SalMainPipeExchangeSignal_impl(SAL_UNUSED_PARAMETER void *, oslSignalInfo *pInfo)
std::basic_string_view< charT, traits > trim(std::basic_string_view< charT, traits > str)
std::optional< OUString > m_cwdUrl
osl::Condition * m_pCondition
std::vector< OUString > aPrintToList
OUString aConversionParams
::osl::Condition * pcProcessed
std::vector< OUString > aPrintList
std::vector< OUString > aConversionList
std::vector< OUString > aViewList
std::vector< OUString > aOpenList
OUString aImageConversionType
std::vector< OUString > aStartList
std::optional< OUString > aCwdUrl
std::vector< OUString > aInFilter
std::vector< OUString > aForceNewList
std::vector< OUString > aForceOpenList
std::unique_ptr< char[]> aBuffer