22 #include <config_dbus.h>
23 #include <config_features.h>
24 #include <config_feature_desktop.h>
30 #include <com/sun/star/frame/TerminationVetoException.hpp>
36 #include <osl/pipe.hxx>
37 #include <rtl/digest.h>
38 #include <rtl/ustrbuf.hxx>
39 #include <osl/conditn.hxx>
41 #include <rtl/strbuf.hxx>
43 #include <osl/file.hxx>
44 #include <rtl/process.h>
52 #include <dbus/dbus.h>
53 #include <sys/socket.h>
63 char const ARGUMENT_PREFIX[] =
"InternalIPC::Arguments";
64 char const SEND_ARGUMENTS[] =
"InternalIPC::SendArguments";
65 char const PROCESSING_DONE[] =
"InternalIPC::ProcessingDone";
71 OString readStringFromPipe(osl::StreamPipe
const & pipe) {
72 for (OStringBuffer str;;) {
76 SAL_INFO(
"desktop.app",
"read empty string");
80 if (buf[n - 1] ==
'\0') {
87 auto s = str.makeStringAndClear();
88 SAL_INFO(
"desktop.app",
"read <" << s <<
">");
103 explicit Parser(OString
const & input):
m_input(input) {
104 if (!
m_input.match(ARGUMENT_PREFIX) ||
105 m_input.getLength() == RTL_CONSTASCII_LENGTH(ARGUMENT_PREFIX))
109 m_index = RTL_CONSTASCII_LENGTH(ARGUMENT_PREFIX);
116 if (!next(&url,
false)) {
125 if (!next(&path,
false)) {
129 if (osl::FileBase::getFileURLFromSystemPath(path, url) ==
130 osl::FileBase::E_None)
141 virtual std::optional< OUString > getCwdUrl()
override {
return m_cwdUrl; }
143 virtual bool next(OUString * argument)
override {
return next(argument,
true); }
146 bool next(OUString * argument,
bool prefix) {
147 OSL_ASSERT(argument !=
nullptr);
179 OString b2(b.makeStringAndClear());
180 if (!rtl_convertStringToUString(
181 &argument->pData, b2.getStr(), b2.getLength(),
182 RTL_TEXTENCODING_UTF8,
183 (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
184 RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
185 RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
200 bool addArgument(OStringBuffer &rArguments,
char prefix,
201 const OUString &rArgument)
204 if (!rArgument.convertToString(
205 &utf8, RTL_TEXTENCODING_UTF8,
206 (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
207 RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
211 rArguments.append(prefix);
212 for (sal_Int32 i = 0;
i < utf8.getLength(); ++
i) {
216 rArguments.append(
"\\0");
219 rArguments.append(
"\\,");
222 rArguments.append(
"\\\\");
225 rArguments.append(c);
240 SAL_INFO(
"desktop.app",
"create md5 from '" << aMsg <<
"'");
242 rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
246 sal_uInt32 nSize = aMsg.getLength() *
sizeof(
sal_Unicode );
247 sal_uInt32 nMD5KeyLen = rtl_digest_queryLength( handle );
248 std::unique_ptr<sal_uInt8[]> pMD5KeyBuffer(
new sal_uInt8[ nMD5KeyLen ]);
250 rtl_digest_init( handle, pData, nSize );
251 rtl_digest_update( handle, pData, nSize );
252 rtl_digest_get( handle, pMD5KeyBuffer.get(), nMD5KeyLen );
253 rtl_digest_destroy( handle );
256 OUStringBuffer
aBuffer( nMD5KeyLen * 2 + 1 );
257 for ( sal_uInt32
i = 0;
i < nMD5KeyLen;
i++ )
258 aBuffer.append( static_cast<sal_Int32>(pMD5KeyBuffer[
i]), 16 );
260 return aBuffer.makeStringAndClear();
268 class ProcessEventsClass_Impl
272 DECL_STATIC_LINK( ProcessEventsClass_Impl, ProcessDocumentsEvent,
void*,
void );
304 if( pInfo->Signal == osl_Signal_Terminate )
306 return osl_Signal_ActCallNextHdl;
322 return "com.sun.star.comp.RequestHandlerController";
326 OUString
const & ServiceName)
349 throw TerminationVetoException();
364 virtual void close() = 0;
371 bool process(OString
const & arguments,
bool * waitProcessed);
398 struct DbusConnectionHolder {
399 explicit DbusConnectionHolder(DBusConnection * theConnection):
403 DbusConnectionHolder(DbusConnectionHolder && other):
connection(
nullptr)
406 ~DbusConnectionHolder() {
416 struct DbusMessageHolder {
417 explicit DbusMessageHolder(DBusMessage * theMessage): message(theMessage) {}
419 ~DbusMessageHolder() { clear(); }
422 if (message !=
nullptr) {
423 dbus_message_unref(message);
428 DBusMessage * message;
431 DbusMessageHolder(DbusMessageHolder
const &) =
delete;
432 DbusMessageHolder& operator =(DbusMessageHolder
const &) =
delete;
442 explicit DbusIpcThread(DbusConnectionHolder && connection):
446 virtual ~DbusIpcThread()
override {}
448 void execute()
override;
450 void close()
override;
452 DbusConnectionHolder connection_;
457 assert(thread !=
nullptr);
458 if (!dbus_threads_init_default()) {
459 SAL_WARN(
"desktop.app",
"dbus_threads_init_default failed");
464 DbusConnectionHolder
con(dbus_bus_get_private(DBUS_BUS_SESSION, &e));
465 assert((
con.connection ==
nullptr) ==
bool(dbus_error_is_set(&e)));
466 if (
con.connection ==
nullptr) {
469 "dbus_bus_get_private failed with: " << e.name <<
": "
475 int n = dbus_bus_request_name(
476 con.connection,
"org.libreoffice.LibreOfficeIpc0",
477 DBUS_NAME_FLAG_DO_NOT_QUEUE, &e);
478 assert((n == -1) ==
bool(dbus_error_is_set(&e)));
483 "dbus_bus_request_name failed with: " << e.name <<
": "
487 case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
488 *thread =
new DbusIpcThread(std::move(con));
490 case DBUS_REQUEST_NAME_REPLY_EXISTS:
492 OStringBuffer buf(ARGUMENT_PREFIX);
495 && addArgument(buf,
'1', arg)))
499 sal_uInt32 narg = rtl_getAppCommandArgCount();
500 for (sal_uInt32 i = 0;
i != narg; ++
i) {
501 rtl_getAppCommandArg(i, &arg.pData);
502 if (!addArgument(buf,
',', arg)) {
506 char const * argstr = buf.getStr();
507 DbusMessageHolder msg(
508 dbus_message_new_method_call(
509 "org.libreoffice.LibreOfficeIpc0",
510 "/org/libreoffice/LibreOfficeIpc0",
511 "org.libreoffice.LibreOfficeIpcIfc0",
"Execute"));
512 if (msg.message ==
nullptr) {
514 "desktop.app",
"dbus_message_new_method_call failed");
518 dbus_message_iter_init_append(msg.message, &it);
519 if (!dbus_message_iter_append_basic(
520 &it, DBUS_TYPE_STRING, &argstr))
523 "desktop.app",
"dbus_message_iter_append_basic failed");
526 DbusMessageHolder repl(
527 dbus_connection_send_with_reply_and_block(
528 con.connection, msg.message, 0x7FFFFFFF, &e));
530 (repl.message ==
nullptr) ==
bool(dbus_error_is_set(&e)));
531 if (repl.message ==
nullptr) {
534 "dbus_connection_send_with_reply_and_block failed"
535 " with: " << e.name <<
": " << e.message);
541 case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
542 case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
545 "dbus_bus_request_name failed with unexpected " << +n);
548 for (;;) std::abort();
553 void DbusIpcThread::execute()
555 assert(m_handler !=
nullptr);
556 m_handler->cReady.wait();
564 if (!dbus_connection_read_write(connection_.connection, -1)) {
568 DbusMessageHolder msg(
569 dbus_connection_pop_message(connection_.connection));
570 if (msg.message ==
nullptr) {
573 if (!dbus_message_is_method_call(
574 msg.message,
"org.libreoffice.LibreOfficeIpcIfc0",
577 SAL_INFO(
"desktop.app",
"unknown DBus message ignored");
581 if (!dbus_message_iter_init(msg.message, &it)) {
583 "desktop.app",
"DBus message without argument ignored");
586 if (dbus_message_iter_get_arg_type(&it) != DBUS_TYPE_STRING) {
589 "DBus message with non-string argument ignored");
593 dbus_message_iter_get_basic(&it, &argstr);
594 bool waitProcessed =
false;
597 if (!process(argstr, &waitProcessed)) {
602 m_handler->cProcessed.wait();
604 DbusMessageHolder repl(dbus_message_new_method_return(msg.message));
605 if (repl.message ==
nullptr) {
607 "desktop.app",
"dbus_message_new_method_return failed");
610 dbus_uint32_t serial = 0;
611 if (!dbus_connection_send(
612 connection_.connection, repl.message, &serial)) {
613 SAL_WARN(
"desktop.app",
"dbus_connection_send failed");
616 dbus_connection_flush(connection_.connection);
621 void DbusIpcThread::close() {
622 assert(connection_.connection !=
nullptr);
626 if (!dbus_connection_get_socket(connection_.connection, &fd)) {
627 SAL_WARN(
"desktop.app",
"dbus_connection_get_socket failed");
630 if (shutdown(fd, SHUT_RD) == -1) {
631 auto const e = errno;
632 SAL_WARN(
"desktop.app",
"shutdown failed with errno " << e);
640 static ::osl::Mutex theRequestHandlerMutex;
641 return theRequestHandlerMutex;
649 ::osl::MutexGuard aGuard(
GetMutex() );
658 ::osl::MutexGuard aGuard(
GetMutex() );
666 std::optional<OUString> tmp;
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 );
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;
798 tval.Nanosec = 500000000;
799 salhelper::Thread::wait( tval );
804 oslPipeError eReason = pipe.getError();
805 if ((eReason == osl_Pipe_E_ConnectionRefused) || (eReason == osl_Pipe_E_invalidError))
809 TimeValue aTimeValue;
810 aTimeValue.Seconds = 0;
811 aTimeValue.Nanosec = 10000000;
812 salhelper::Thread::wait( aTimeValue );
815 }
while ( nPipeMode == PIPEMODE_DONTKNOW );
817 if ( nPipeMode == PIPEMODE_CREATED )
826 osl::StreamPipe aStreamPipe(pipe.getHandle());
831 addArgument(aArguments,
'1', cwdUrl)))
833 aArguments.append(
'0');
835 sal_uInt32
nCount = rtl_getAppCommandArgCount();
836 for( sal_uInt32
i=0;
i < nCount;
i++ )
838 rtl_getAppCommandArg(
i, &aUserInstallPath.pData );
839 if (!addArgument(aArguments,
',', aUserInstallPath)) {
843 aArguments.append(
'\0');
845 SAL_INFO(
"desktop.app",
"writing <" << aArguments.getStr() <<
">");
846 sal_Int32 n = aStreamPipe.write(
847 aArguments.getStr(), aArguments.getLength());
848 if (n != aArguments.getLength()) {
849 SAL_INFO(
"desktop.app",
"short write: " << n);
853 if (readStringFromPipe(aStreamPipe) != PROCESSING_DONE)
874 if (handler->mIpcThread.is()) {
875 handler->mIpcThread->close();
881 handler->cReady.set();
884 if (handler->mIpcThread.is())
886 handler->mIpcThread->join();
887 handler->mIpcThread.clear();
890 handler->cReady.reset();
894 mState(
State::Starting ),
895 mnPendingRequests( 0 )
930 assert(waitProcessed !=
nullptr);
932 std::unique_ptr< CommandLineArgs > aCmdLineArgs;
940 SAL_WARN(
"desktop.app",
"Error in received command line arguments");
944 bool bDocRequestSent =
false;
946 OUString aUnknown( aCmdLineArgs->GetUnknown() );
947 if (aUnknown.isEmpty() && !aCmdLineArgs->IsHelp() && !aCmdLineArgs->IsVersion())
951 if ( aCmdLineArgs->IsQuickstart() )
960 std::vector< OUString >
const & accept = aCmdLineArgs->GetAccept();
961 for (
auto const& elem : accept)
968 std::vector< OUString >
const & unaccept = aCmdLineArgs->GetUnaccept();
969 for (
auto const& elem : unaccept)
977 aCmdLineArgs->getCwdUrl()));
985 pRequest->aPrintList = aCmdLineArgs->GetPrintList();
986 bDocRequestSent |= !pRequest->aPrintList.empty();
987 pRequest->aPrintToList = aCmdLineArgs->GetPrintToList();
988 pRequest->aPrinterName = aCmdLineArgs->GetPrinterName();
989 bDocRequestSent |= !( pRequest->aPrintToList.empty() || pRequest->aPrinterName.isEmpty() );
990 pRequest->aConversionList = aCmdLineArgs->GetConversionList();
991 pRequest->aConversionParams = aCmdLineArgs->GetConversionParams();
992 pRequest->aConversionOut = aCmdLineArgs->GetConversionOut();
993 pRequest->aImageConversionType = aCmdLineArgs->GetImageConversionType();
994 pRequest->aInFilter = aCmdLineArgs->GetInFilter();
995 pRequest->bTextCat = aCmdLineArgs->IsTextCat();
996 pRequest->bScriptCat = aCmdLineArgs->IsScriptCat();
997 bDocRequestSent |= !pRequest->aConversionList.empty();
1003 pRequest->aOpenList = aCmdLineArgs->GetOpenList();
1004 bDocRequestSent |= !pRequest->aOpenList.empty();
1005 pRequest->aViewList = aCmdLineArgs->GetViewList();
1006 bDocRequestSent |= !pRequest->aViewList.empty();
1007 pRequest->aStartList = aCmdLineArgs->GetStartList();
1008 bDocRequestSent |= !pRequest->aStartList.empty();
1009 pRequest->aForceOpenList = aCmdLineArgs->GetForceOpenList();
1010 bDocRequestSent |= !pRequest->aForceOpenList.empty();
1011 pRequest->aForceNewList = aCmdLineArgs->GetForceNewList();
1012 bDocRequestSent |= !pRequest->aForceNewList.empty();
1020 if ( aCmdLineArgs->HasModuleParam() && !bDocRequestSent )
1024 if ( aCmdLineArgs->IsWriter() )
1026 else if ( aCmdLineArgs->IsCalc() )
1028 else if ( aCmdLineArgs->IsDraw() )
1030 else if ( aCmdLineArgs->IsImpress() )
1032 else if ( aCmdLineArgs->IsBase() )
1034 else if ( aCmdLineArgs->IsMath() )
1036 else if ( aCmdLineArgs->IsGlobal() )
1038 else if ( aCmdLineArgs->IsWeb() )
1041 if ( !pRequest->aOpenList.empty() )
1045 bDocRequestSent =
true;
1049 if ( !aCmdLineArgs->IsQuickstart() ) {
1050 bool bShowHelp =
false;
1051 OUStringBuffer aHelpURLBuffer;
1052 if (aCmdLineArgs->IsHelpWriter()) {
1054 aHelpURLBuffer.append(
"vnd.sun.star.help://swriter/start");
1055 }
else if (aCmdLineArgs->IsHelpCalc()) {
1057 aHelpURLBuffer.append(
"vnd.sun.star.help://scalc/start");
1058 }
else if (aCmdLineArgs->IsHelpDraw()) {
1060 aHelpURLBuffer.append(
"vnd.sun.star.help://sdraw/start");
1061 }
else if (aCmdLineArgs->IsHelpImpress()) {
1063 aHelpURLBuffer.append(
"vnd.sun.star.help://simpress/start");
1064 }
else if (aCmdLineArgs->IsHelpBase()) {
1066 aHelpURLBuffer.append(
"vnd.sun.star.help://sdatabase/start");
1067 }
else if (aCmdLineArgs->IsHelpBasic()) {
1069 aHelpURLBuffer.append(
"vnd.sun.star.help://sbasic/start");
1070 }
else if (aCmdLineArgs->IsHelpMath()) {
1072 aHelpURLBuffer.append(
"vnd.sun.star.help://smath/start");
1075 aHelpURLBuffer.append(
"?Language=");
1078 aHelpURLBuffer.append(
"&System=UNX");
1079 #elif defined _WIN32
1080 aHelpURLBuffer.append(
"&System=WIN");
1084 aHelpURLBuffer.makeStringAndClear());
1089 if ( bDocRequestSent )
1093 if ( aCmdLineArgs->HasModuleParam() )
1115 if (aCmdLineArgs->IsEmpty())
1123 *waitProcessed = bDocRequestSent;
1132 osl::StreamPipe aStreamPipe;
1133 oslPipeError nError =
pipe_.accept( aStreamPipe );
1136 if( nError == osl_Pipe_E_None )
1145 if (!RequestHandler::pGlobal.is())
return;
1157 SAL_INFO(
"desktop.app",
"writing <" << SEND_ARGUMENTS <<
">");
1158 sal_Int32 n = aStreamPipe.write(
1162 SAL_WARN(
"desktop.app",
"short write: " << n);
1166 OString
aArguments = readStringFromPipe(aStreamPipe);
1169 if (aArguments.isEmpty())
1172 bool waitProcessed =
false;
1173 if (!
process(aArguments, &waitProcessed)) {
1179 bool bSuccess =
true;
1189 SAL_INFO(
"desktop.app",
"writing <" << PROCESSING_DONE <<
">");
1190 n = aStreamPipe.write(PROCESSING_DONE,
SAL_N_ELEMENTS(PROCESSING_DONE));
1194 SAL_WARN(
"desktop.app",
"short write: " << n);
1209 SAL_WARN(
"desktop.app",
"Error on accept: " << static_cast<int>(nError));
1213 salhelper::Thread::wait( tval );
1215 }
while( schedule() );
1219 std::vector<DispatchWatcher::DispatchRequest>& rDispatchList,
1220 std::optional< OUString >
const & cwdUrl,
1221 std::vector< OUString >
const & aRequestList,
1223 const OUString& aParam,
1224 const OUString& aFactory )
1226 for (
auto const& request : aRequestList)
1228 rDispatchList.push_back({nType, request, cwdUrl, aParam, aFactory});
1233 std::vector<DispatchWatcher::DispatchRequest>& rDispatchList,
1234 std::optional< OUString >
const & cwdUrl,
1235 std::vector< OUString >
const & rRequestList,
1236 const OUString& rParam,
1237 const OUString& rPrinterName,
1238 const OUString& rFactory,
1239 const OUString& rParamOut,
1240 std::u16string_view rImgOut,
1241 const bool isTextCat,
1242 const bool isScriptCat )
1245 OUString aParam( rParam );
1247 if( !rParam.isEmpty() )
1262 aParam = rPrinterName;
1266 OUString aOutDir( rParamOut.trim() );
1267 std::u16string_view aImgOut =
o3tl::trim(rImgOut);
1278 if( !::osl::FileBase::getAbsoluteFileURL( aPWD, rParamOut, aOutDir ) )
1279 ::osl::FileBase::getSystemPathFromFileURL( aOutDir, aOutDir );
1281 if( !rParamOut.trim().isEmpty() )
1283 aParam +=
";" + aOutDir;
1287 ::osl::FileBase::getSystemPathFromFileURL( aPWD, aPWD );
1288 aParam +=
";" + aPWD;
1291 if( !rImgOut.empty() )
1292 aParam += OUString::Concat(
"|") + aImgOut;
1294 for (
auto const& request : rRequestList)
1296 rDispatchList.push_back({nType, request, cwdUrl, aParam, rFactory});
1302 struct ConditionSetGuard
1305 ConditionSetGuard(osl::Condition* pCondition) : m_pCondition(pCondition) {}
1306 ~ConditionSetGuard() {
if (m_pCondition) m_pCondition->set(); }
1315 osl::ClearableMutexGuard aGuard(
GetMutex() );
1318 ConditionSetGuard aSetGuard(aRequest.
pcProcessed);
1320 static std::vector<DispatchWatcher::DispatchRequest> aDispatchList;
1332 bool bShutdown(
false );
1336 if( !
pGlobal->AreRequestsEnabled() )
1345 pGlobal->mnPendingRequests += aDispatchList.size();
1346 if ( !
pGlobal->mpDispatchWatcher.is() )
1354 std::vector<DispatchWatcher::DispatchRequest> aTempList;
1355 aTempList.swap( aDispatchList );
1360 bShutdown = dispatchWatcher->executeDispatchRequests( aTempList, noTerminate);
#define LINK(Instance, Class, Member)
rtl::Reference< IpcThread > mIpcThread
std::vector< OUString > aOpenList
PipeIpcThread(osl::Pipe const &pipe)
static PathStatus locateUserInstallation(OUString &_rURL)
static bool ExecuteCmdLineRequests(ProcessDocumentsRequest &, bool noTerminate)
static void ImplPostProcessDocumentsEvent(std::unique_ptr< ProcessDocumentsRequest > pEvent)
::osl::Mutex & GetMutex()
std::unique_ptr< sal_Int32[]> pData
OUString aImageConversionType
bool IsModuleInstalled(EModule eModule) const
static bool getProcessWorkingDir(OUString &rUrl)
std::vector< OUString > aForceNewList
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)
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
std::vector< OUString > aViewList
static rtl::Reference< RequestHandler > pGlobal
virtual void SAL_CALL queryTermination(const css::lang::EventObject &aEvent) override
IMPL_STATIC_LINK(Desktop, ImplInitFilterHdl,::ConvertData &, rData, bool)
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
Sequence< PropertyValue > aArguments
virtual OUString SAL_CALL getImplementationName() override
std::optional< OUString > m_cwdUrl
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
void start(RequestHandler *handler)
virtual void SAL_CALL notifyTermination(const css::lang::EventObject &aEvent) override
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
const OUString & GetFactoryName(EFactory eFactory) const
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
exports com.sun.star. connection
virtual ~IpcThread() override
#define SAL_N_ELEMENTS(arr)
std::vector< OUString > aForceOpenList
RequestHandler * m_handler
std::vector< OUString > aPrintToList
static bool AreRequestsPending()
static void SetReady(bool bIsReady)
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 void RequestsCompleted()
static CommandLineArgs & GetCommandLineArgs()
OUString GetFactoryEmptyDocumentURL(EFactory eFactory) const
virtual ~RequestHandler() override
std::vector< OUString > aConversionList
static OUString getUILocale()
enumrange< T >::Iterator end(enumrange< T >)
std::vector< OUString > aStartList
static RequestHandler::Status enable(rtl::Reference< IpcThread > *thread)
std::optional< OUString > aCwdUrl
osl::Condition * m_pCondition
static void HandleAppEvent(const ApplicationEvent &rAppEvent)
static Status Enable(bool ipc)
std::unique_ptr< char[]> aBuffer
bool process(OString const &arguments, bool *waitProcessed)
virtual ~PipeIpcThread() override
std::vector< OUString > aPrintList
#define SAL_INFO(area, stream)
::osl::Condition cProcessed
std::u16string_view trim(std::u16string_view str)
std::vector< OUString > aInFilter
static void EnableRequests()
oslSignalAction SalMainPipeExchangeSignal_impl(SAL_UNUSED_PARAMETER void *, oslSignalInfo *pInfo)
#define SAL_WARN(area, stream)
static void WaitForReady()
OUString aConversionParams
#define DECL_STATIC_LINK(Class, Member, ArgType, RetType)
exports com.sun.star. security
IpcThread(char const *name)
::osl::Condition * pcProcessed
static OUString CreateMD5FromString(const OUString &aMsg)
static void ImplPostForeignAppEvent(ApplicationEvent *pEvent)