Kaydet (Commit) b218cbf5 authored tarafından Jürgen Schmidt's avatar Jürgen Schmidt Kaydeden (comit) Fridrich Štrba

Fixing i#119950 warn about other running terminal sessions

introduce new warning message box to inform about further running terminal sessions

Patch By: Juan Li
Review By: Jina Fang Zheng, jsc

(cherry picked from commit 208b788d)

Conflicts:
	desktop/source/app/app.cxx
	desktop/source/app/officeipcthread.cxx
	desktop/source/app/officeipcthread.hxx

Change-Id: Icd858adaa0d2400eecba3c61c91e0c6fdb6d6af7
üst ab29ad8c
......@@ -64,6 +64,7 @@ class Desktop : public Application
BE_LANGUAGE_MISSING,
BE_USERINSTALL_NOTENOUGHDISKSPACE,
BE_USERINSTALL_NOWRITEACCESS,
BE_MULTISESSION_NOT_SUPPORTED,
BE_OFFICECONFIG_BROKEN
};
enum BootstrapStatus
......
......@@ -415,7 +415,10 @@ OUString MakeStartupConfigAccessErrorMessage( OUString const & aInternalErrMsg )
// are allowed. Otherwise we will force a "crash inside a crash".
// Thats why we have to use a special native message box here which does not use yield :-)
//=============================================================================
void FatalError(const OUString& sMessage)
// #i119950# Add a option that not to display the "Fatal Error" on dialog title
void FatalError(const OUString& sMessage, const bool isDisplayErrorString = true);
void FatalError(const OUString& sMessage, const bool isDisplayErrorString)
{
OUString sProductKey = ::utl::Bootstrap::getProductKey();
if ( sProductKey.isEmpty())
......@@ -429,8 +432,9 @@ void FatalError(const OUString& sMessage)
OUStringBuffer sTitle (128);
sTitle.append (sProductKey );
sTitle.appendAscii (" - Fatal Error");
if (isDisplayErrorString) {
sTitle.appendAscii (" - Fatal Error");
}
Application::ShowNativeErrorBox (sTitle.makeStringAndClear (), sMessage);
_exit(EXITHELPER_FATAL_ERROR);
}
......@@ -622,6 +626,10 @@ void Desktop::Init()
{
SetBootstrapError( BE_PATHINFO_MISSING, OUString() );
}
else if ( aStatus == OfficeIPCThread::IPC_STATUS_MULTI_TS_ERROR )
{
SetBootstrapError( BE_MULTISESSION_NOT_SUPPORTED, OUString() );
}
else if ( aStatus == OfficeIPCThread::IPC_STATUS_2ND_OFFICE )
{
// 2nd office startup should terminate after sending cmdlineargs through pipe
......@@ -848,7 +856,13 @@ OUString Desktop::CreateErrorMsgString(
void Desktop::HandleBootstrapErrors(
BootstrapError aBootstrapError, OUString const & aErrorMessage )
{
if ( aBootstrapError == BE_PATHINFO_MISSING )
if ( aBootstrapError == BE_MULTISESSION_NOT_SUPPORTED ) {
OUString aMessage;
aMessage = GetMsgString( STR_BOOTSTRAP_ERR_MULTISESSION,
OUString( RTL_CONSTASCII_USTRINGPARAM( "You have another instance running in a different terminal session. Close that instance and then try again." )) );
FatalError(aMessage,sal_False);
} else if ( aBootstrapError == BE_PATHINFO_MISSING )
{
OUString aErrorMsg;
OUString aBuffer;
......
......@@ -522,28 +522,41 @@ OfficeIPCThread::Status OfficeIPCThread::EnableOfficeIPCThread()
do
{
osl::Security &rSecurity = Security::get();
// Try to create pipe
if ( pThread->maPipe.create( aPipeIdent.getStr(), osl_Pipe_CREATE, rSecurity ))
// #119950# Try to connect pipe first. If connected, means another instance already launched.
if ( pThread->maPipe.create( aPipeIdent.getStr(), osl_Pipe_OPEN, rSecurity ))
{
// Pipe created
nPipeMode = PIPEMODE_CREATED;
// #119950# Test if launched in a new terminal session for same user. On Windows platform, normally a user is resticted
// to have only one terminal session. But if mutiple terminal session for one user is allowed, crash will happen if launched
// LibreOffice from more than one terminal session. So need to detect and prevent this happen.
// Will try to create a same name pipe. If creation is successfully, means current instance is launched in a new session.
osl::Pipe aSessionPipe;
if ( aSessionPipe.create( aPipeIdent.getStr(), osl_Pipe_OPEN, rSecurity )) {
// Can create a pipe with same name. This can only happen in multiple terminal session environment on Windows platform.
// Will display a warning dialog and exit.
return IPC_STATUS_MULTI_TS_ERROR;
} else {
osl::StreamPipe aStreamPipe(pThread->maPipe.getHandle());
if (readStringFromPipe(aStreamPipe) == SEND_ARGUMENTS)
{
// Pipe connected to first office
nPipeMode = PIPEMODE_CONNECTED;
}
else
{
// Pipe connection failed (other office exited or crashed)
TimeValue tval;
tval.Seconds = 0;
tval.Nanosec = 500000000;
salhelper::Thread::wait( tval );
}
}
}
else if( pThread->maPipe.create( aPipeIdent.getStr(), osl_Pipe_OPEN, rSecurity )) // Creation not successful, now we try to connect
else if ( pThread->maPipe.create( aPipeIdent.getStr(), osl_Pipe_OPEN, rSecurity )) // Connection not successfull, now we try to create
{
osl::StreamPipe aStreamPipe(pThread->maPipe.getHandle());
if (readStringFromPipe(aStreamPipe) == SEND_ARGUMENTS)
{
// Pipe connected to first office
nPipeMode = PIPEMODE_CONNECTED;
}
else
{
// Pipe connection failed (other office exited or crashed)
TimeValue tval;
tval.Seconds = 0;
tval.Nanosec = 500000000;
salhelper::Thread::wait( tval );
}
// Pipe created
nPipeMode = PIPEMODE_CREATED;
}
else
{
......
......@@ -108,7 +108,8 @@ class OfficeIPCThread : public salhelper::Thread
IPC_STATUS_OK,
IPC_STATUS_2ND_OFFICE,
IPC_STATUS_PIPE_ERROR,
IPC_STATUS_BOOTSTRAP_ERROR
IPC_STATUS_BOOTSTRAP_ERROR,
IPC_STATUS_MULTI_TS_ERROR
};
// controlling pipe communication during shutdown
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment