Don't access broken service mgr during bootstrap failure

...so that displaying a (non-translated) error box upon BE_UNO_SERVICEMANAGER
works after all.  Augment the error text with an exception message where
appropriate.  This allows to revert fdfb7a3c4b
"Related fdo#51252: Report uncaught exceptions with MessageBox on Windows" as
that was to catch and display failures from instantiating the service mgr.

Change-Id: I049a38e95342634796eb0e940e2ee8e55193c9d3
This commit is contained in:
Stephan Bergmann
2012-09-18 12:40:57 +02:00
parent a0659cc41d
commit cccc6bcfa0
16 changed files with 172 additions and 142 deletions

View File

@@ -103,15 +103,16 @@ class Desktop : public Application
static ResMgr* GetDesktopResManager(); static ResMgr* GetDesktopResManager();
static CommandLineArgs& GetCommandLineArgs(); static CommandLineArgs& GetCommandLineArgs();
void HandleBootstrapErrors( BootstrapError ); void HandleBootstrapErrors(
void SetBootstrapError( BootstrapError nError ) BootstrapError nError, OUString const & aMessage );
void SetBootstrapError(
BootstrapError nError, OUString const & aMessage )
{ {
if ( m_aBootstrapError == BE_OK ) if ( m_aBootstrapError == BE_OK )
m_aBootstrapError = nError;
}
BootstrapError GetBootstrapError() const
{ {
return m_aBootstrapError; m_aBootstrapError = nError;
m_aBootstrapErrorMessage = aMessage;
}
} }
void SetBootstrapStatus( BootstrapStatus nStatus ) void SetBootstrapStatus( BootstrapStatus nStatus )
@@ -135,8 +136,6 @@ class Desktop : public Application
void SetSplashScreenText( const ::rtl::OUString& rText ); void SetSplashScreenText( const ::rtl::OUString& rText );
void SetSplashScreenProgress( sal_Int32 ); void SetSplashScreenProgress( sal_Int32 );
static void ensureProcessServiceFactory();
private: private:
// Bootstrap methods // Bootstrap methods
static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > CreateApplicationServiceManager(); static ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > CreateApplicationServiceManager();
@@ -159,9 +158,6 @@ class Desktop : public Application
void HandleBootstrapPathErrors( ::utl::Bootstrap::Status, const ::rtl::OUString& aMsg ); void HandleBootstrapPathErrors( ::utl::Bootstrap::Status, const ::rtl::OUString& aMsg );
void StartSetup( const ::rtl::OUString& aParameters ); void StartSetup( const ::rtl::OUString& aParameters );
// Get a resource message string securely e.g. if resource cannot be retrieved return aFaultBackMsg
::rtl::OUString GetMsgString( sal_uInt16 nId, const ::rtl::OUString& aFaultBackMsg );
// Create a error message depending on bootstrap failure code and an optional file url // Create a error message depending on bootstrap failure code and an optional file url
::rtl::OUString CreateErrorMsgString( utl::Bootstrap::FailureCode nFailureCode, ::rtl::OUString CreateErrorMsgString( utl::Bootstrap::FailureCode nFailureCode,
const ::rtl::OUString& aFileURL ); const ::rtl::OUString& aFileURL );
@@ -200,6 +196,7 @@ class Desktop : public Application
bool m_bCleanedExtensionCache; bool m_bCleanedExtensionCache;
bool m_bServicesRegistered; bool m_bServicesRegistered;
BootstrapError m_aBootstrapError; BootstrapError m_aBootstrapError;
OUString m_aBootstrapErrorMessage;
BootstrapStatus m_aBootstrapStatus; BootstrapStatus m_aBootstrapStatus;
std::auto_ptr< Lockfile > m_pLockfile; std::auto_ptr< Lockfile > m_pLockfile;

View File

@@ -378,28 +378,34 @@ ResMgr* Desktop::GetDesktopResManager()
return Desktop::pResMgr; return Desktop::pResMgr;
} }
namespace {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Get a message string securely. There is a fallback string if the resource // Get a message string securely. There is a fallback string if the resource
// is not available. // is not available.
OUString Desktop::GetMsgString( sal_uInt16 nId, const OUString& aFaultBackMsg ) OUString GetMsgString(
sal_uInt16 nId, const OUString& aFaultBackMsg,
bool bAlwaysUseFaultBackMsg = false )
{ {
ResMgr* resMgr = GetDesktopResManager(); if ( !bAlwaysUseFaultBackMsg )
if ( !resMgr ) {
return aFaultBackMsg; ResMgr* resMgr = Desktop::GetDesktopResManager();
else if ( resMgr )
return OUString( String( ResId( nId, *resMgr ))); return OUString( String( ResId( nId, *resMgr )));
} }
return aFaultBackMsg;
}
OUString MakeStartupErrorMessage(OUString const & aErrorMessage) OUString MakeStartupErrorMessage(
OUString const & aErrorMessage, bool bAlwaysUseFaultBackMsg = false )
{ {
OUStringBuffer aDiagnosticMessage( 100 ); OUStringBuffer aDiagnosticMessage( 100 );
ResMgr* pResMgr = Desktop::GetDesktopResManager(); aDiagnosticMessage.append(
if ( pResMgr ) GetMsgString(
aDiagnosticMessage.append( OUString(String(ResId(STR_BOOTSTRAP_ERR_CANNOT_START, *pResMgr))) ); STR_BOOTSTRAP_ERR_CANNOT_START, "The program cannot be started.",
else bAlwaysUseFaultBackMsg ) );
aDiagnosticMessage.appendAscii( "The program cannot be started." );
aDiagnosticMessage.appendAscii( "\n" ); aDiagnosticMessage.appendAscii( "\n" );
@@ -468,9 +474,8 @@ static bool ShouldSuppressUI(const CommandLineArgs& rCmdLine)
rCmdLine.IsQuickstart(); rCmdLine.IsQuickstart();
} }
namespace
{
struct theCommandLineArgs : public rtl::Static< CommandLineArgs, theCommandLineArgs > {}; struct theCommandLineArgs : public rtl::Static< CommandLineArgs, theCommandLineArgs > {};
} }
CommandLineArgs& Desktop::GetCommandLineArgs() CommandLineArgs& Desktop::GetCommandLineArgs()
@@ -591,29 +596,30 @@ void Desktop::Init()
// We need to have service factory before going further, but see fdo#37195. // We need to have service factory before going further, but see fdo#37195.
// Doing this will mmap common.rdb, making it not overwritable on windows, // Doing this will mmap common.rdb, making it not overwritable on windows,
// so this can't happen before the synchronization above. Lets rework this // so this can't happen before the synchronization above. Lets rework this
// so that the above is called *from* ensureProcessServiceFactory or // so that the above is called *from* CreateApplicationServiceManager or
// something to enforce this gotcha // something to enforce this gotcha
ensureProcessServiceFactory(); try
if( !::comphelper::getProcessServiceFactory().is())
{ {
OSL_FAIL("Service factory should have been crated in soffice_main()."); comphelper::setProcessServiceFactory(CreateApplicationServiceManager());
SetBootstrapError( BE_UNO_SERVICEMANAGER ); }
catch (css::uno::Exception & e)
{
SetBootstrapError( BE_UNO_SERVICEMANAGER, e.Message );
} }
if ( GetBootstrapError() == BE_OK ) if ( m_aBootstrapError == BE_OK )
{ {
// prepare language // prepare language
if ( !LanguageSelection::prepareLanguage() ) if ( !LanguageSelection::prepareLanguage() )
{ {
if ( LanguageSelection::getStatus() == LanguageSelection::LS_STATUS_CANNOT_DETERMINE_LANGUAGE ) if ( LanguageSelection::getStatus() == LanguageSelection::LS_STATUS_CANNOT_DETERMINE_LANGUAGE )
SetBootstrapError( BE_LANGUAGE_MISSING ); SetBootstrapError( BE_LANGUAGE_MISSING, OUString() );
else else
SetBootstrapError( BE_OFFICECONFIG_BROKEN ); SetBootstrapError( BE_OFFICECONFIG_BROKEN, OUString() );
} }
} }
if ( GetBootstrapError() == BE_OK ) if ( m_aBootstrapError == BE_OK )
{ {
const CommandLineArgs& rCmdLineArgs = GetCommandLineArgs(); const CommandLineArgs& rCmdLineArgs = GetCommandLineArgs();
// start ipc thread only for non-remote offices // start ipc thread only for non-remote offices
@@ -621,7 +627,7 @@ void Desktop::Init()
OfficeIPCThread::Status aStatus = OfficeIPCThread::EnableOfficeIPCThread(); OfficeIPCThread::Status aStatus = OfficeIPCThread::EnableOfficeIPCThread();
if ( aStatus == OfficeIPCThread::IPC_STATUS_BOOTSTRAP_ERROR ) if ( aStatus == OfficeIPCThread::IPC_STATUS_BOOTSTRAP_ERROR )
{ {
SetBootstrapError( BE_PATHINFO_MISSING ); SetBootstrapError( BE_PATHINFO_MISSING, OUString() );
} }
else if ( aStatus == OfficeIPCThread::IPC_STATUS_2ND_OFFICE ) else if ( aStatus == OfficeIPCThread::IPC_STATUS_2ND_OFFICE )
{ {
@@ -644,29 +650,6 @@ void Desktop::InitFinished()
CloseSplashScreen(); CloseSplashScreen();
} }
// GetCommandLineArgs() requires this code to work, otherwise it will abort, and
// on Unix command line args needs to be checked before Desktop::Init()
void Desktop::ensureProcessServiceFactory()
{
if (!comphelper::getProcessServiceFactory().is())
{
try
{
comphelper::setProcessServiceFactory(
CreateApplicationServiceManager());
}
catch (const css::uno::Exception& e)
{
// Application::ShowNativeErrorBox would only work after InitVCL, so
// all we can realistically do here is hope the user can see stderr:
std::cerr << "UNO Exception: " << e.Message << std::endl;
// Let exceptions escape and tear down the process, it is completely
// broken anyway:
throw;
}
}
}
void Desktop::DeInit() void Desktop::DeInit()
{ {
RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::DeInit" ); RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::DeInit" );
@@ -881,7 +864,8 @@ void Desktop::HandleBootstrapPathErrors( ::utl::Bootstrap::Status aBootstrapStat
return MakeStartupErrorMessage( aMsg ); return MakeStartupErrorMessage( aMsg );
} }
void Desktop::HandleBootstrapErrors( BootstrapError aBootstrapError ) void Desktop::HandleBootstrapErrors(
BootstrapError aBootstrapError, OUString const & aErrorMessage )
{ {
if ( aBootstrapError == BE_PATHINFO_MISSING ) if ( aBootstrapError == BE_PATHINFO_MISSING )
{ {
@@ -962,16 +946,18 @@ void Desktop::HandleBootstrapErrors( BootstrapError aBootstrapError )
// PropertyValue is available). To give the user a hint even if // PropertyValue is available). To give the user a hint even if
// generating and displaying a message box below crashes, print a // generating and displaying a message box below crashes, print a
// hard-coded message on stderr first: // hard-coded message on stderr first:
fputs( std::cerr
aBootstrapError == BE_UNO_SERVICEMANAGER << "The application cannot be started.\n"
? ("The application cannot be started. " "\n" // STR_BOOTSTRAP_ERR_CANNOT_START
"The component manager is not available." "\n") << (aBootstrapError == BE_UNO_SERVICEMANAGER
// STR_BOOTSTRAP_ERR_CANNOT_START, STR_BOOTSTRAP_ERR_NO_SERVICE ? "The component manager is not available.\n"
: ("The application cannot be started. " "\n" // STR_BOOTSTRAP_ERR_NO_SERVICE
"The configuration service is not available." "\n"), : "The configuration service is not available.\n");
// STR_BOOTSTRAP_ERR_CANNOT_START,
// STR_BOOTSTRAP_ERR_NO_CFG_SERVICE // STR_BOOTSTRAP_ERR_NO_CFG_SERVICE
stderr); if ( !aErrorMessage.isEmpty() )
{
std::cerr << "(\"" << aErrorMessage << "\")\n";
}
// First sentence. We cannot bootstrap office further! // First sentence. We cannot bootstrap office further!
OUString aMessage; OUString aMessage;
@@ -980,24 +966,32 @@ void Desktop::HandleBootstrapErrors( BootstrapError aBootstrapError )
OUString aErrorMsg; OUString aErrorMsg;
if ( aBootstrapError == BE_UNO_SERVICEMANAGER ) if ( aBootstrapError == BE_UNO_SERVICEMANAGER )
aErrorMsg = GetMsgString( STR_BOOTSTRAP_ERR_NO_SERVICE, aErrorMsg = "The service manager is not available.";
OUString( "The service manager is not available." ) );
else else
aErrorMsg = GetMsgString( STR_BOOTSTRAP_ERR_NO_CFG_SERVICE, aErrorMsg = GetMsgString( STR_BOOTSTRAP_ERR_NO_CFG_SERVICE,
OUString( "The configuration service is not available." ) ); OUString( "The configuration service is not available." ) );
aDiagnosticMessage.append( aErrorMsg ); aDiagnosticMessage.append( aErrorMsg );
aDiagnosticMessage.appendAscii( "\n" ); aDiagnosticMessage.appendAscii( "\n" );
if ( !aErrorMessage.isEmpty() )
{
aDiagnosticMessage.appendAscii( "(\"" );
aDiagnosticMessage.append( aErrorMessage );
aDiagnosticMessage.appendAscii( "\")\n" );
}
// Due to the fact the we haven't a backup applicat.rdb file anymore it is not possible to // Due to the fact the we haven't a backup applicat.rdb file anymore it is not possible to
// repair the installation with the setup executable besides the office executable. Now // repair the installation with the setup executable besides the office executable. Now
// we have to ask the user to start the setup on CD/installation directory manually!! // we have to ask the user to start the setup on CD/installation directory manually!!
OUString aStartSetupManually( GetMsgString( OUString aStartSetupManually( GetMsgString(
STR_ASK_START_SETUP_MANUALLY, STR_ASK_START_SETUP_MANUALLY,
OUString( "Start setup application to repair the installation from CD, or the folder containing the installation packages." ) )); OUString( "Start setup application to repair the installation from CD, or the folder containing the installation packages." ),
aBootstrapError == BE_UNO_SERVICEMANAGER ) );
aDiagnosticMessage.append( aStartSetupManually ); aDiagnosticMessage.append( aStartSetupManually );
aMessage = MakeStartupErrorMessage( aDiagnosticMessage.makeStringAndClear() ); aMessage = MakeStartupErrorMessage(
aDiagnosticMessage.makeStringAndClear(),
aBootstrapError == BE_UNO_SERVICEMANAGER );
FatalError( aMessage); FatalError( aMessage);
} }
@@ -1378,10 +1372,9 @@ int Desktop::Main()
com::sun::star::uno::ContextLayer layer( com::sun::star::uno::ContextLayer layer(
com::sun::star::uno::getCurrentContext() ); com::sun::star::uno::getCurrentContext() );
BootstrapError eError = GetBootstrapError(); if ( m_aBootstrapError != BE_OK )
if ( eError != BE_OK )
{ {
HandleBootstrapErrors( eError ); HandleBootstrapErrors( m_aBootstrapError, m_aBootstrapErrorMessage );
return EXIT_FAILURE; return EXIT_FAILURE;
} }
@@ -1415,11 +1408,12 @@ int Desktop::Main()
{ {
OSL_FAIL("userinstall failed"); OSL_FAIL("userinstall failed");
if ( inst_fin == UserInstall::E_NoDiskSpace ) if ( inst_fin == UserInstall::E_NoDiskSpace )
HandleBootstrapErrors( BE_USERINSTALL_NOTENOUGHDISKSPACE ); HandleBootstrapErrors(
BE_USERINSTALL_NOTENOUGHDISKSPACE, OUString() );
else if ( inst_fin == UserInstall::E_NoWriteAccess ) else if ( inst_fin == UserInstall::E_NoWriteAccess )
HandleBootstrapErrors( BE_USERINSTALL_NOWRITEACCESS ); HandleBootstrapErrors( BE_USERINSTALL_NOWRITEACCESS, OUString() );
else else
HandleBootstrapErrors( BE_USERINSTALL_FAILED ); HandleBootstrapErrors( BE_USERINSTALL_FAILED, OUString() );
return EXIT_FAILURE; return EXIT_FAILURE;
} }
// refresh path information // refresh path information
@@ -1797,9 +1791,10 @@ bool Desktop::InitializeConfiguration()
comphelper::getProcessComponentContext() ); comphelper::getProcessComponentContext() );
return true; return true;
} }
catch( const ::com::sun::star::lang::ServiceNotRegisteredException& ) catch( ::com::sun::star::lang::ServiceNotRegisteredException & e )
{ {
this->HandleBootstrapErrors( Desktop::BE_UNO_SERVICE_CONFIG_MISSING ); this->HandleBootstrapErrors(
Desktop::BE_UNO_SERVICE_CONFIG_MISSING, e.Message );
} }
catch( const ::com::sun::star::configuration::MissingBootstrapFileException& e ) catch( const ::com::sun::star::configuration::MissingBootstrapFileException& e )
{ {

View File

@@ -51,7 +51,6 @@
#define STR_BOOTSTRAP_ERR_NO_SUPPORT (RID_DESKTOP_STRING_START+107) #define STR_BOOTSTRAP_ERR_NO_SUPPORT (RID_DESKTOP_STRING_START+107)
#define STR_BOOTSTRAP_ERR_LANGUAGE_MISSING (RID_DESKTOP_STRING_START+108) #define STR_BOOTSTRAP_ERR_LANGUAGE_MISSING (RID_DESKTOP_STRING_START+108)
#define STR_BOOTSTRAP_ERR_NO_SERVICE (RID_DESKTOP_STRING_START+120)
#define STR_BOOTSTRAP_ERR_NO_CFG_SERVICE (RID_DESKTOP_STRING_START+121) #define STR_BOOTSTRAP_ERR_NO_CFG_SERVICE (RID_DESKTOP_STRING_START+121)
#define STR_BOOTSTRAP_ERR_CFG_DATAACCESS (RID_DESKTOP_STRING_START+122) #define STR_BOOTSTRAP_ERR_CFG_DATAACCESS (RID_DESKTOP_STRING_START+122)
#define STR_BOOTSTRAP_ERR_NO_PATHSET_SERVICE (RID_DESKTOP_STRING_START+123) #define STR_BOOTSTRAP_ERR_NO_PATHSET_SERVICE (RID_DESKTOP_STRING_START+123)

View File

@@ -88,11 +88,6 @@ String STR_BOOTSTRAP_ERR_LANGUAGE_MISSING
Text [ en-US ] = "The user interface language cannot be determined."; Text [ en-US ] = "The user interface language cannot be determined.";
}; };
String STR_BOOTSTRAP_ERR_NO_SERVICE
{
Text [ en-US ] = "The component manager is not available.";
};
String STR_BOOTSTRAP_ERR_NO_CFG_SERVICE String STR_BOOTSTRAP_ERR_NO_CFG_SERVICE
{ {
Text [ en-US ] = "The configuration service is not available."; Text [ en-US ] = "The configuration service is not available.";

View File

@@ -38,21 +38,14 @@
#include <rtl/bootstrap.hxx> #include <rtl/bootstrap.hxx>
#include <tools/extendapplicationenvironment.hxx> #include <tools/extendapplicationenvironment.hxx>
#if defined WNT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
int SVMain(); int SVMain();
// -=-= main() -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // -=-= main() -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
extern "C" int DESKTOP_DLLPUBLIC soffice_main() extern "C" int DESKTOP_DLLPUBLIC soffice_main()
{ {
#if defined ANDROID || defined WNT #if defined ANDROID
try { try {
#endif
#if defined(ANDROID)
rtl::Bootstrap::setIniFilename( rtl::Bootstrap::setIniFilename(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:///assets/program/lofficerc"))); rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:///assets/program/lofficerc")));
#endif #endif
@@ -83,20 +76,10 @@ extern "C" int DESKTOP_DLLPUBLIC soffice_main()
} }
#endif #endif
return SVMain(); return SVMain();
#if defined ANDROID || defined WNT
} catch (const ::com::sun::star::uno::Exception &e) {
#if defined ANDROID #if defined ANDROID
} catch (const ::com::sun::star::uno::Exception &e) {
fprintf (stderr, "Not handled UNO exception at main: '%s'\n", fprintf (stderr, "Not handled UNO exception at main: '%s'\n",
rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr()); rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
#elif defined WNT
MessageBoxW(
0,
reinterpret_cast< LPCWSTR >(
rtl::OUString("Unhandled exception:\n" + e.Message).getStr()),
reinterpret_cast< LPCWSTR >(rtl::OUString("Fatal Error").getStr()),
(MB_OK | MB_ICONERROR | MB_DEFBUTTON1 | MB_TASKMODAL
| MB_SETFOREGROUND | MB_TOPMOST));
#endif
throw; // to get exception type printed throw; // to get exception type printed
} }
#endif #endif

View File

@@ -106,9 +106,13 @@ rtl::OUString AquaSalSystem::GetDisplayScreenName( unsigned int nScreen )
return aRet; return aRet;
} }
static NSString* getStandardString( int nButtonId ) static NSString* getStandardString( int nButtonId, bool bUseResources )
{ {
rtl::OUString aText( Button::GetStandardText( nButtonId ) ); rtl::OUString aText;
if( bUseResources )
{
aText = Button::GetStandardText( nButtonId );
}
if( aText.isEmpty() ) // this is for bad cases, we might be missing the vcl resource if( aText.isEmpty() ) // this is for bad cases, we might be missing the vcl resource
{ {
switch( nButtonId ) switch( nButtonId )
@@ -127,7 +131,7 @@ static NSString* getStandardString( int nButtonId )
int AquaSalSystem::ShowNativeMessageBox( const rtl::OUString& rTitle, int AquaSalSystem::ShowNativeMessageBox( const rtl::OUString& rTitle,
const rtl::OUString& rMessage, const rtl::OUString& rMessage,
int nButtonCombination, int nButtonCombination,
int nDefaultButton) int nDefaultButton, bool bUseResources)
{ {
NSString* pTitle = CreateNSString( rTitle ); NSString* pTitle = CreateNSString( rTitle );
NSString* pMessage = CreateNSString( rMessage ); NSString* pMessage = CreateNSString( rMessage );
@@ -166,11 +170,14 @@ int AquaSalSystem::ShowNativeMessageBox( const rtl::OUString& rTitle,
if( aButtonIds[nC].nDefaultButton == nDefaultButton ) if( aButtonIds[nC].nDefaultButton == nDefaultButton )
{ {
if( aButtonIds[nC].nTextIds[0] != -1 ) if( aButtonIds[nC].nTextIds[0] != -1 )
pDefText = getStandardString( aButtonIds[nC].nTextIds[0] ); pDefText = getStandardString(
aButtonIds[nC].nTextIds[0], bUseResources );
if( aButtonIds[nC].nTextIds[1] != -1 ) if( aButtonIds[nC].nTextIds[1] != -1 )
pAltText = getStandardString( aButtonIds[nC].nTextIds[1] ); pAltText = getStandardString(
aButtonIds[nC].nTextIds[1], bUseResources );
if( aButtonIds[nC].nTextIds[2] != -1 ) if( aButtonIds[nC].nTextIds[2] != -1 )
pOthText = getStandardString( aButtonIds[nC].nTextIds[2] ); pOthText = getStandardString(
aButtonIds[nC].nTextIds[2], bUseResources );
break; break;
} }
} }

View File

@@ -47,6 +47,47 @@
using namespace com::sun::star; using namespace com::sun::star;
namespace {
OUString GetNativeMessageBoxButtonText( int nButtonId, bool bUseResources )
{
OUString aText;
if( bUseResources )
{
aText = Button::GetStandardText( nButtonId );
}
if( aText.isEmpty() )
{
switch( nButtonId )
{
case BUTTON_OK:
aText = "OK";
break;
case BUTTON_CANCEL:
aText = "Cancel";
break;
case BUTTON_ABORT:
aText = "Abort";
break;
case BUTTON_RETRY:
aText = "Retry";
break;
case BUTTON_IGNORE:
aText = "Ignore";
break;
case BUTTON_YES:
aText = "Yes";
break;
case BUTTON_NO:
aText = "No";
break;
}
}
return aText;
}
}
SalGenericSystem::SalGenericSystem() SalGenericSystem::SalGenericSystem()
{ {
} }
@@ -56,7 +97,8 @@ SalGenericSystem::~SalGenericSystem()
} }
int SalGenericSystem::ShowNativeMessageBox( const rtl::OUString& rTitle, const rtl::OUString& rMessage, int SalGenericSystem::ShowNativeMessageBox( const rtl::OUString& rTitle, const rtl::OUString& rMessage,
int nButtonCombination, int nDefaultButton ) int nButtonCombination, int nDefaultButton,
bool bUseResources )
{ {
int nDefButton = 0; int nDefButton = 0;
std::list< rtl::OUString > aButtons; std::list< rtl::OUString > aButtons;
@@ -67,15 +109,15 @@ int SalGenericSystem::ShowNativeMessageBox( const rtl::OUString& rTitle, const r
if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK || if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK ||
nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL ) nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL )
{ {
aButtons.push_back( Button::GetStandardText( BUTTON_OK ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_OK, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK;
} }
if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO_CANCEL || if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO_CANCEL ||
nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO ) nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_YES_NO )
{ {
aButtons.push_back( Button::GetStandardText( BUTTON_YES ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_YES, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_YES; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_YES;
aButtons.push_back( Button::GetStandardText( BUTTON_NO ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_NO, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO;
if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO ) if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_NO )
nDefButton = 1; nDefButton = 1;
@@ -86,21 +128,21 @@ int SalGenericSystem::ShowNativeMessageBox( const rtl::OUString& rTitle, const r
{ {
if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL ) if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL )
{ {
aButtons.push_back( Button::GetStandardText( BUTTON_RETRY ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_RETRY, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY;
} }
aButtons.push_back( Button::GetStandardText( BUTTON_CANCEL ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_CANCEL, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL;
if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL ) if( nDefaultButton == SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL )
nDefButton = aButtons.size()-1; nDefButton = aButtons.size()-1;
} }
if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_ABORT_RETRY_IGNORE ) if( nButtonCombination == SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_ABORT_RETRY_IGNORE )
{ {
aButtons.push_back( Button::GetStandardText( BUTTON_ABORT ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_ABORT, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_ABORT; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_ABORT;
aButtons.push_back( Button::GetStandardText( BUTTON_RETRY ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_RETRY, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_RETRY;
aButtons.push_back( Button::GetStandardText( BUTTON_IGNORE ) ); aButtons.push_back( GetNativeMessageBoxButtonText( BUTTON_IGNORE, bUseResources ) );
nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_IGNORE; nButtonIds[nBut++] = SALSYSTEM_SHOWNATIVEMSGBOX_BTN_IGNORE;
switch( nDefaultButton ) switch( nDefaultButton )
{ {

View File

@@ -52,7 +52,7 @@ public:
virtual int ShowNativeMessageBox( const rtl::OUString& rTitle, virtual int ShowNativeMessageBox( const rtl::OUString& rTitle,
const rtl::OUString& rMessage, const rtl::OUString& rMessage,
int nButtonCombination, int nButtonCombination,
int nDefaultButton); int nDefaultButton, bool bUseResources);
}; };

View File

@@ -50,7 +50,7 @@ class VCL_DLLPUBLIC SalGenericSystem : public SalSystem
virtual int ShowNativeMessageBox( const rtl::OUString& rTitle, virtual int ShowNativeMessageBox( const rtl::OUString& rTitle,
const rtl::OUString& rMessage, const rtl::OUString& rMessage,
int nButtonCombination, int nButtonCombination,
int nDefaultButton); int nDefaultButton, bool bUseResources);
// simple helpers primarily for X Windowing W_CLASS hints // simple helpers primarily for X Windowing W_CLASS hints
static const char *getFrameResName(); static const char *getFrameResName();

View File

@@ -46,7 +46,7 @@ public:
virtual int ShowNativeMessageBox( const rtl::OUString& rTitle, virtual int ShowNativeMessageBox( const rtl::OUString& rTitle,
const rtl::OUString& rMessage, const rtl::OUString& rMessage,
int nButtonCombination, int nButtonCombination,
int nDefaultButton); int nDefaultButton, bool bUseResources);
}; };
#endif // _SV_SALSYS_H #endif // _SV_SALSYS_H

View File

@@ -133,6 +133,10 @@ public:
The effect of specifying a button that doesn't belong The effect of specifying a button that doesn't belong
to the specified button combination is undefined. to the specified button combination is undefined.
@param bUseResources
If false, assume initialization of the application failed early and do
not try to access any resources.
@returns the identifier of the button that was pressed by the user. @returns the identifier of the button that was pressed by the user.
See button identifier above. If the function fails the See button identifier above. If the function fails the
return value is 0. return value is 0.
@@ -140,7 +144,8 @@ public:
virtual int ShowNativeMessageBox( const rtl::OUString& rTitle, virtual int ShowNativeMessageBox( const rtl::OUString& rTitle,
const rtl::OUString& rMessage, const rtl::OUString& rMessage,
int nButtonCombination, int nButtonCombination,
int nDefaultButton) = 0; int nDefaultButton,
bool bUseResources ) = 0;
}; };
SalSystem* ImplGetSalSystem(); SalSystem* ImplGetSalSystem();

View File

@@ -76,7 +76,7 @@ public:
virtual int ShowNativeMessageBox( const rtl::OUString& rTitle, virtual int ShowNativeMessageBox( const rtl::OUString& rTitle,
const rtl::OUString& rMessage, const rtl::OUString& rMessage,
int nButtonCombination, int nButtonCombination,
int nDefaultButton); int nDefaultButton, bool bUseResources);
bool initMonitors(); bool initMonitors();
// discards monitorinfo; used by WM_DISPLAYCHANGED handler // discards monitorinfo; used by WM_DISPLAYCHANGED handler
void clearMonitors(); void clearMonitors();

View File

@@ -106,9 +106,13 @@ rtl::OUString IosSalSystem::GetDisplayScreenName( unsigned int nScreen )
return aRet; return aRet;
} }
static NSString* getStandardString( int nButtonId ) static NSString* getStandardString( int nButtonId, bool bUseResources )
{ {
rtl::OUString aText( Button::GetStandardText( nButtonId ) ); rtl::OUString aText;
if( bUseResources )
{
aText = Button::GetStandardText( nButtonId );
}
if( ! aText.getLength() ) // this is for bad cases, we might be missing the vcl resource if( ! aText.getLength() ) // this is for bad cases, we might be missing the vcl resource
{ {
switch( nButtonId ) switch( nButtonId )
@@ -150,7 +154,7 @@ static NSString* getStandardString( int nButtonId )
int IosSalSystem::ShowNativeMessageBox( const rtl::OUString& rTitle, int IosSalSystem::ShowNativeMessageBox( const rtl::OUString& rTitle,
const rtl::OUString& rMessage, const rtl::OUString& rMessage,
int nButtonCombination, int nButtonCombination,
int nDefaultButton) int nDefaultButton, bool bUseResources)
{ {
NSString* pTitle = CreateNSString( rTitle ); NSString* pTitle = CreateNSString( rTitle );
NSString* pMessage = CreateNSString( rMessage ); NSString* pMessage = CreateNSString( rMessage );
@@ -189,11 +193,14 @@ int IosSalSystem::ShowNativeMessageBox( const rtl::OUString& rTitle,
if( aButtonIds[nC].nDefaultButton == nDefaultButton ) if( aButtonIds[nC].nDefaultButton == nDefaultButton )
{ {
if( aButtonIds[nC].nTextIds[0] != -1 ) if( aButtonIds[nC].nTextIds[0] != -1 )
pDefText = getStandardString( aButtonIds[nC].nTextIds[0] ); pDefText = getStandardString(
aButtonIds[nC].nTextIds[0], bUseResources );
if( aButtonIds[nC].nTextIds[1] != -1 ) if( aButtonIds[nC].nTextIds[1] != -1 )
pAltText = getStandardString( aButtonIds[nC].nTextIds[1] ); pAltText = getStandardString(
aButtonIds[nC].nTextIds[1], bUseResources );
if( aButtonIds[nC].nTextIds[2] != -1 ) if( aButtonIds[nC].nTextIds[2] != -1 )
pOthText = getStandardString( aButtonIds[nC].nTextIds[2] ); pOthText = getStandardString(
aButtonIds[nC].nTextIds[2], bUseResources );
break; break;
} }
} }

View File

@@ -1716,7 +1716,7 @@ void Application::ShowNativeErrorBox(const String& sTitle ,
sTitle, sTitle,
sMessage, sMessage,
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK, SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK); SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK, false);
if (btn != SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK) { if (btn != SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK) {
OSL_TRACE("ShowNativeMessageBox returned %d", btn); OSL_TRACE("ShowNativeMessageBox returned %d", btn);
} }

View File

@@ -407,7 +407,7 @@ bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled)
aTitle, aTitle,
ReplaceJavaErrorMessages(aMessage.makeStringAndClear()), ReplaceJavaErrorMessages(aMessage.makeStringAndClear()),
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL, true);
// Do not change the setting in case the user chooses to cancel // Do not change the setting in case the user chooses to cancel
if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret )
@@ -430,7 +430,7 @@ bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled)
aTitle, aTitle,
ReplaceJavaErrorMessages(aMessage.makeStringAndClear()), ReplaceJavaErrorMessages(aMessage.makeStringAndClear()),
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL, true);
// Do not change the setting in case the user chooses to cancel // Do not change the setting in case the user chooses to cancel
if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret )
@@ -453,7 +453,7 @@ bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled)
aTitle, aTitle,
ReplaceJavaErrorMessages(aMessage.makeStringAndClear()), ReplaceJavaErrorMessages(aMessage.makeStringAndClear()),
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL, true);
// Do not change the setting in case the user chooses to cancel // Do not change the setting in case the user chooses to cancel
if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret )
@@ -476,7 +476,7 @@ bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled)
aTitle, aTitle,
ReplaceJavaErrorMessages(aMessage.makeStringAndClear()), ReplaceJavaErrorMessages(aMessage.makeStringAndClear()),
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL, true);
// Do not change the setting in case the user chooses to cancel // Do not change the setting in case the user chooses to cancel
if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret )
@@ -515,7 +515,7 @@ bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled)
aTitle, aTitle,
ReplaceJavaErrorMessages(aMessage.makeStringAndClear()), ReplaceJavaErrorMessages(aMessage.makeStringAndClear()),
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL, SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK_CANCEL,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL); SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL, true);
// Do not change the setting in case the user chooses to cancel // Do not change the setting in case the user chooses to cancel
if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret ) if( SALSYSTEM_SHOWNATIVEMSGBOX_BTN_CANCEL == ret )
@@ -529,7 +529,7 @@ bool ImplInitAccessBridge(sal_Bool bAllowCancel, sal_Bool &rCancelled)
aTitle, aTitle,
ReplaceJavaErrorMessages(aMessage.makeStringAndClear()), ReplaceJavaErrorMessages(aMessage.makeStringAndClear()),
SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK, SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK,
SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK); SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK, true);
} }
} }
} }

View File

@@ -220,7 +220,7 @@ static int DEFAULT_BTN_MAPPING_TABLE[][8] =
{ MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON1 } //RETRY_CANCEL { MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON1, MB_DEFBUTTON1 } //RETRY_CANCEL
}; };
int WinSalSystem::ShowNativeMessageBox(const rtl::OUString& rTitle, const rtl::OUString& rMessage, int nButtonCombination, int nDefaultButton) int WinSalSystem::ShowNativeMessageBox(const rtl::OUString& rTitle, const rtl::OUString& rMessage, int nButtonCombination, int nDefaultButton, SAL_UNUSED_PARAMETER bool)
{ {
DBG_ASSERT( nButtonCombination >= SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK && DBG_ASSERT( nButtonCombination >= SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK &&
nButtonCombination <= SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL && nButtonCombination <= SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_RETRY_CANCEL &&