sb130: merged in OOO330_m5

This commit is contained in:
sb 2010-08-25 14:21:49 +02:00
commit fd6cf3d74c
36 changed files with 767 additions and 306 deletions

View File

@ -96,11 +96,12 @@ void RootAccess::initBroadcaster(
for (ChangesListeners::iterator i(changesListeners_.begin());
i != changesListeners_.end(); ++i)
{
cppu::OWeakObject* pSource = static_cast< cppu::OWeakObject * >(this);
css::uno::Reference< css::uno::XInterface > xBase( pSource, css::uno::UNO_QUERY );
broadcaster->addChangesNotification(
*i,
css::util::ChangesEvent(
static_cast< cppu::OWeakObject * >(this),
css::uno::makeAny(pathRepresentation_), set));
pSource, makeAny( xBase ), set));
}
}
}

View File

@ -28,6 +28,9 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_desktop.hxx"
#include <cstdlib>
#include <vector>
#include <memory>
#include <unistd.h>
#include "app.hxx"
@ -119,6 +122,7 @@
#include <osl/file.hxx>
#include <osl/signal.h>
#include <rtl/uuid.h>
#include <rtl/uri.hxx>
#include <unotools/pathoptions.hxx>
#include <svl/languageoptions.hxx>
#include <unotools/internaloptions.hxx>
@ -155,6 +159,11 @@
#include "langselect.hxx"
#if defined MACOSX
#include <errno.h>
#include <sys/wait.h>
#endif
#define DEFINE_CONST_UNICODE(CONSTASCII) UniString(RTL_CONSTASCII_USTRINGPARAM(CONSTASCII))
#define U2S(STRING) ::rtl::OUStringToOString(STRING, RTL_TEXTENCODING_UTF8)
@ -460,6 +469,194 @@ void ReplaceStringHookProc( UniString& rStr )
}
}
static const char pLastSyncFileName[] = "lastsynchronized";
static const sal_Int32 nStrLenLastSync = 16;
static bool needsSynchronization(
::rtl::OUString const & baseSynchronizedURL, ::rtl::OUString const & userSynchronizedURL )
{
bool bNeedsSync( false );
::osl::DirectoryItem itemUserFile;
::osl::File::RC err1 =
::osl::DirectoryItem::get(userSynchronizedURL, itemUserFile);
//If it does not exist, then there is nothing to be done
if (err1 == ::osl::File::E_NOENT)
{
return true;
}
else if (err1 != ::osl::File::E_None)
{
OSL_ENSURE(0, "Cannot access lastsynchronized in user layer");
return true; //sync just in case
}
//If last synchronized does not exist in base layer, then do nothing
::osl::DirectoryItem itemBaseFile;
::osl::File::RC err2 = ::osl::DirectoryItem::get(baseSynchronizedURL, itemBaseFile);
if (err2 == ::osl::File::E_NOENT)
{
return true;
}
else if (err2 != ::osl::File::E_None)
{
OSL_ENSURE(0, "Cannot access file lastsynchronized in base layer");
return true; //sync just in case
}
//compare the modification time of the extension folder and the last
//modified file
::osl::FileStatus statUser(FileStatusMask_ModifyTime);
::osl::FileStatus statBase(FileStatusMask_ModifyTime);
if (itemUserFile.getFileStatus(statUser) == ::osl::File::E_None)
{
if (itemBaseFile.getFileStatus(statBase) == ::osl::File::E_None)
{
TimeValue timeUser = statUser.getModifyTime();
TimeValue timeBase = statBase.getModifyTime();
if (timeUser.Seconds < timeBase.Seconds)
bNeedsSync = true;
}
else
{
OSL_ASSERT(0);
bNeedsSync = true;
}
}
else
{
OSL_ASSERT(0);
bNeedsSync = true;
}
return bNeedsSync;
}
static ::rtl::OUString getBrandSharePreregBundledPathURL()
{
::rtl::OUString url(
RTL_CONSTASCII_USTRINGPARAM("$BRAND_BASE_DIR/share/prereg/bundled"));
::rtl::Bootstrap::expandMacros(url);
return url;
}
static ::rtl::OUString getUserBundledExtPathURL()
{
::rtl::OUString folder( RTL_CONSTASCII_USTRINGPARAM( "$BUNDLED_EXTENSIONS_USER" ));
::rtl::Bootstrap::expandMacros(folder);
return folder;
}
static ::rtl::OUString getLastSyncFileURLFromBrandInstallation()
{
::rtl::OUString aURL = getBrandSharePreregBundledPathURL();
::sal_Int32 nLastIndex = aURL.lastIndexOf('/');
::rtl::OUStringBuffer aTmp( aURL );
if ( nLastIndex != aURL.getLength()-1 )
aTmp.appendAscii( "/" );
aTmp.appendAscii( pLastSyncFileName );
return aTmp.makeStringAndClear();
}
static ::rtl::OUString getLastSyncFileURLFromUserInstallation()
{
::rtl::OUString aUserBundledPathURL = getUserBundledExtPathURL();
::sal_Int32 nLastIndex = aUserBundledPathURL.lastIndexOf('/');
::rtl::OUStringBuffer aTmp( aUserBundledPathURL );
if ( nLastIndex != aUserBundledPathURL.getLength()-1 )
aTmp.appendAscii( "/" );
aTmp.appendAscii( pLastSyncFileName );
return aTmp.makeStringAndClear();
}
static osl::FileBase::RC copy_bundled_recursive(
const rtl::OUString& srcUnqPath,
const rtl::OUString& dstUnqPath,
sal_Int32 TypeToCopy )
throw()
{
osl::FileBase::RC err = osl::FileBase::E_None;
if( TypeToCopy == -1 ) // Document
{
err = osl::File::copy( srcUnqPath,dstUnqPath );
}
else if( TypeToCopy == +1 ) // Folder
{
osl::Directory aDir( srcUnqPath );
aDir.open();
err = osl::Directory::create( dstUnqPath );
osl::FileBase::RC next = err;
if( err == osl::FileBase::E_None ||
err == osl::FileBase::E_EXIST )
{
err = osl::FileBase::E_None;
sal_Int32 n_Mask = FileStatusMask_FileURL | FileStatusMask_FileName | FileStatusMask_Type;
osl::DirectoryItem aDirItem;
while( err == osl::FileBase::E_None && ( next = aDir.getNextItem( aDirItem ) ) == osl::FileBase::E_None )
{
sal_Bool IsDoc = false;
sal_Bool bFilter = false;
osl::FileStatus aFileStatus( n_Mask );
aDirItem.getFileStatus( aFileStatus );
if( aFileStatus.isValid( FileStatusMask_Type ) )
IsDoc = aFileStatus.getFileType() == osl::FileStatus::Regular;
// Getting the information for the next recursive copy
sal_Int32 newTypeToCopy = IsDoc ? -1 : +1;
rtl::OUString newSrcUnqPath;
if( aFileStatus.isValid( FileStatusMask_FileURL ) )
newSrcUnqPath = aFileStatus.getFileURL();
rtl::OUString newDstUnqPath = dstUnqPath;
rtl::OUString tit;
if( aFileStatus.isValid( FileStatusMask_FileName ) )
{
::rtl::OUString aFileName = aFileStatus.getFileName();
tit = rtl::Uri::encode( aFileName,
rtl_UriCharClassPchar,
rtl_UriEncodeIgnoreEscapes,
RTL_TEXTENCODING_UTF8 );
// Special treatment for "lastsychronized" file. Must not be
// copied from the bundled folder!
if ( IsDoc && aFileName.equalsAscii( pLastSyncFileName ))
bFilter = true;
}
if( newDstUnqPath.lastIndexOf( sal_Unicode('/') ) != newDstUnqPath.getLength()-1 )
newDstUnqPath += rtl::OUString::createFromAscii( "/" );
newDstUnqPath += tit;
if (( newSrcUnqPath != dstUnqPath ) && !bFilter )
err = copy_bundled_recursive( newSrcUnqPath,newDstUnqPath, newTypeToCopy );
}
if( err == osl::FileBase::E_None && next != osl::FileBase::E_NOENT )
err = next;
}
aDir.close();
}
return err;
}
Desktop::Desktop()
: m_bServicesRegistered( false )
, m_aBootstrapError( BE_OK )
@ -477,6 +674,24 @@ void Desktop::Init()
RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::Init" );
SetBootstrapStatus(BS_OK);
// Check for lastsynchronized file for bundled extensions in the user directory
// and test if synchronzation is necessary!
{
::rtl::OUString aUserLastSyncFilePathURL = getLastSyncFileURLFromUserInstallation();
::rtl::OUString aPreregSyncFilePathURL = getLastSyncFileURLFromBrandInstallation();
if ( needsSynchronization( aPreregSyncFilePathURL, aUserLastSyncFilePathURL ))
{
rtl::OUString aUserPath = getUserBundledExtPathURL();
rtl::OUString aPreregBundledPath = getBrandSharePreregBundledPathURL();
// copy bundled folder to the user directory
osl::FileBase::RC rc = osl::Directory::createPath(aUserPath);
(void) rc;
copy_bundled_recursive( aPreregBundledPath, aUserPath, +1 );
}
}
// create service factory...
Reference < XMultiServiceFactory > rSMgr = CreateApplicationServiceManager();
if( rSMgr.is() )
@ -1117,28 +1332,79 @@ sal_Bool Desktop::SaveTasks()
sal_False);
}
#ifdef MACOSX
static void DoRestart()
{
oslProcess process;
oslProcessError error;
OUString sExecutableFile;
namespace {
osl_getExecutableFile( &sExecutableFile.pData );
error = osl_executeProcess(
sExecutableFile.pData,
NULL,
0,
0,
NULL,
NULL,
NULL,
0,
&process
);
}
void restartOnMac(bool passArguments) {
#if defined MACOSX
OfficeIPCThread::DisableOfficeIPCThread();
rtl::OUString execUrl;
OSL_VERIFY(osl_getExecutableFile(&execUrl.pData) == osl_Process_E_None);
rtl::OUString execPath;
rtl::OString execPath8;
if ((osl::FileBase::getSystemPathFromFileURL(execUrl, execPath)
!= osl::FileBase::E_None) ||
!execPath.convertToString(
&execPath8, osl_getThreadTextEncoding(),
(RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
{
std::abort();
}
std::vector< rtl::OString > args;
args.push_back(execPath8);
bool wait = false;
if (passArguments) {
sal_uInt32 n = osl_getCommandArgCount();
for (sal_uInt32 i = 0; i < n; ++i) {
rtl::OUString arg;
OSL_VERIFY(osl_getCommandArg(i, &arg.pData) == osl_Process_E_None);
if (arg.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("-accept="))) {
wait = true;
}
rtl::OString arg8;
if (!arg.convertToString(
&arg8, osl_getThreadTextEncoding(),
(RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
{
std::abort();
}
args.push_back(arg8);
}
}
std::vector< char const * > argPtrs;
for (std::vector< rtl::OString >::iterator i(args.begin()); i != args.end();
++i)
{
argPtrs.push_back(i->getStr());
}
argPtrs.push_back(0);
execv(execPath8.getStr(), const_cast< char ** >(&argPtrs[0]));
if (errno == ENOTSUP) { // happens when multithreaded on OS X < 10.6
pid_t pid = fork();
if (pid == 0) {
execv(execPath8.getStr(), const_cast< char ** >(&argPtrs[0]));
} else if (pid > 0) {
// Two simultaneously running soffice processes lead to two dock
// icons, so avoid waiting here unless it must be assumed that the
// process invoking soffice itself wants to wait for soffice to
// finish:
if (!wait) {
return;
}
int stat;
if (waitpid(pid, &stat, 0) == pid && WIFEXITED(stat)) {
_exit(WEXITSTATUS(stat));
}
}
}
std::abort();
#else
(void) passArguments; // avoid warnings
#endif
}
}
USHORT Desktop::Exception(USHORT nError)
{
@ -1209,9 +1475,7 @@ USHORT Desktop::Exception(USHORT nError)
OfficeIPCThread::DisableOfficeIPCThread();
if( pSignalHandler )
DELETEZ( pSignalHandler );
#ifdef MACOSX
DoRestart();
#endif
restartOnMac(false);
_exit( ExitHelper::E_CRASH_WITH_RESTART );
}
else
@ -1294,6 +1558,9 @@ void Desktop::Main()
std::auto_ptr<SvtLanguageOptions> pLanguageOptions;
std::auto_ptr<SvtPathOptions> pPathOptions;
sal_Bool bRestartRequested( sal_False );
sal_Bool bUseSystemFileDialog(sal_True);
int nAcquireCount( 0 );
Reference < css::document::XEventListener > xGlobalBroadcaster;
try
{
@ -1423,6 +1690,13 @@ void Desktop::Main()
( xSMgr->createInstance(
DEFINE_CONST_UNICODE( "com.sun.star.frame.GlobalEventBroadcaster" ) ), UNO_QUERY );
/* ensure existance of a default window that messages can be dispatched to
This is for the benefit of testtool which uses PostUserEvent extensively
and else can deadlock while creating this window from another tread while
the main thread is not yet in the event loop.
*/
Application::GetDefaultDevice();
// initialize test-tool library (if available)
RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ tools::InitTestToolLib" );
tools::InitTestToolLib();
@ -1487,58 +1761,80 @@ void Desktop::Main()
impl_checkRecoveryState(bCrashed, bExistsRecoveryData, bExistsSessionData);
RTL_LOGFILE_CONTEXT_TRACE( aLog, "} impl_checkRecoveryState" );
if (
(pCmdLineArgs->IsEmptyOrAcceptOnly() ) &&
(SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SSTARTMODULE)) &&
(!bExistsRecoveryData ) &&
(!bExistsSessionData ) &&
(!Application::AnyInput( INPUT_APPEVENT ) )
)
Reference< ::com::sun::star::task::XRestartManager > xRestartManager;
{
RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ create BackingComponent" );
Reference< XFrame > xDesktopFrame( xSMgr->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ))), UNO_QUERY );
if (xDesktopFrame.is())
::comphelper::ComponentContext aContext( xSMgr );
xRestartManager.set( aContext.getSingleton( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.OfficeRestartManager" ) ) ), UNO_QUERY );
}
// check whether the shutdown is caused by restart
bRestartRequested = ( xRestartManager.is() && xRestartManager->isRestartRequested( sal_True ) );
if ( pCmdLineArgs->IsHeadless() )
{
// Ensure that we use not the system file dialogs as
// headless mode relies on Application::EnableHeadlessMode()
// which does only work for VCL dialogs!!
SvtMiscOptions aMiscOptions;
bUseSystemFileDialog = aMiscOptions.UseSystemFileDialog();
aMiscOptions.SetUseSystemFileDialog( sal_False );
}
if ( !bRestartRequested )
{
if (
(pCmdLineArgs->IsEmptyOrAcceptOnly() ) &&
(SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SSTARTMODULE)) &&
(!bExistsRecoveryData ) &&
(!bExistsSessionData ) &&
(!Application::AnyInput( INPUT_APPEVENT ) )
)
{
// SetSplashScreenProgress(60);
Reference< XFrame > xBackingFrame;
Reference< ::com::sun::star::awt::XWindow > xContainerWindow;
xBackingFrame = xDesktopFrame->findFrame(OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" )), 0);
if (xBackingFrame.is())
xContainerWindow = xBackingFrame->getContainerWindow();
if (xContainerWindow.is())
RTL_LOGFILE_CONTEXT_TRACE( aLog, "{ create BackingComponent" );
Reference< XFrame > xDesktopFrame( xSMgr->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ))), UNO_QUERY );
if (xDesktopFrame.is())
{
// set the WB_EXT_DOCUMENT style. Normally, this is done by the TaskCreator service when a "_blank"
// frame/window is created. Since we do not use the TaskCreator here, we need to mimic its behavior,
// otherwise documents loaded into this frame will later on miss functionality depending on the style.
Window* pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow );
OSL_ENSURE( pContainerWindow, "Desktop::Main: no implementation access to the frame's container window!" );
pContainerWindow->SetExtendedStyle( pContainerWindow->GetExtendedStyle() | WB_EXT_DOCUMENT );
// SetSplashScreenProgress(60);
Reference< XFrame > xBackingFrame;
Reference< ::com::sun::star::awt::XWindow > xContainerWindow;
SetSplashScreenProgress(75);
Sequence< Any > lArgs(1);
lArgs[0] <<= xContainerWindow;
Reference< XController > xBackingComp(
xSMgr->createInstanceWithArguments(OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.StartModule") ), lArgs),
UNO_QUERY);
// SetSplashScreenProgress(80);
if (xBackingComp.is())
xBackingFrame = xDesktopFrame->findFrame(OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" )), 0);
if (xBackingFrame.is())
xContainerWindow = xBackingFrame->getContainerWindow();
if (xContainerWindow.is())
{
Reference< ::com::sun::star::awt::XWindow > xBackingWin(xBackingComp, UNO_QUERY);
// Attention: You MUST(!) call setComponent() before you call attachFrame().
// Because the backing component set the property "IsBackingMode" of the frame
// to true inside attachFrame(). But setComponent() reset this state everytimes ...
xBackingFrame->setComponent(xBackingWin, xBackingComp);
SetSplashScreenProgress(100);
xBackingComp->attachFrame(xBackingFrame);
CloseSplashScreen();
xContainerWindow->setVisible(sal_True);
// set the WB_EXT_DOCUMENT style. Normally, this is done by the TaskCreator service when a "_blank"
// frame/window is created. Since we do not use the TaskCreator here, we need to mimic its behavior,
// otherwise documents loaded into this frame will later on miss functionality depending on the style.
Window* pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow );
OSL_ENSURE( pContainerWindow, "Desktop::Main: no implementation access to the frame's container window!" );
pContainerWindow->SetExtendedStyle( pContainerWindow->GetExtendedStyle() | WB_EXT_DOCUMENT );
SetSplashScreenProgress(75);
Sequence< Any > lArgs(1);
lArgs[0] <<= xContainerWindow;
Reference< XController > xBackingComp(
xSMgr->createInstanceWithArguments(OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.StartModule") ), lArgs),
UNO_QUERY);
// SetSplashScreenProgress(80);
if (xBackingComp.is())
{
Reference< ::com::sun::star::awt::XWindow > xBackingWin(xBackingComp, UNO_QUERY);
// Attention: You MUST(!) call setComponent() before you call attachFrame().
// Because the backing component set the property "IsBackingMode" of the frame
// to true inside attachFrame(). But setComponent() reset this state everytimes ...
xBackingFrame->setComponent(xBackingWin, xBackingComp);
SetSplashScreenProgress(100);
xBackingComp->attachFrame(xBackingFrame);
CloseSplashScreen();
xContainerWindow->setVisible(sal_True);
}
}
}
RTL_LOGFILE_CONTEXT_TRACE( aLog, "} create BackingComponent" );
}
RTL_LOGFILE_CONTEXT_TRACE( aLog, "} create BackingComponent" );
}
}
catch ( com::sun::star::lang::WrappedTargetException& wte )
@ -1573,107 +1869,82 @@ void Desktop::Main()
aOptions.SetVCLSettings();
// SetSplashScreenProgress(60);
Application::SetFilterHdl( LINK( this, Desktop, ImplInitFilterHdl ) );
sal_Bool bTerminateRequested = sal_False;
// Preload function depends on an initialized sfx application!
SetSplashScreenProgress(75);
sal_Bool bUseSystemFileDialog(sal_True);
if ( pCmdLineArgs->IsHeadless() )
if ( !bRestartRequested )
{
// Ensure that we use not the system file dialogs as
// headless mode relies on Application::EnableHeadlessMode()
// which does only work for VCL dialogs!!
SvtMiscOptions aMiscOptions;
bUseSystemFileDialog = aMiscOptions.UseSystemFileDialog();
aMiscOptions.SetUseSystemFileDialog( sal_False );
}
Application::SetFilterHdl( LINK( this, Desktop, ImplInitFilterHdl ) );
// use system window dialogs
Application::SetSystemWindowMode( SYSTEMWINDOW_MODE_DIALOG );
sal_Bool bTerminateRequested = sal_False;
// SetSplashScreenProgress(80);
// Preload function depends on an initialized sfx application!
SetSplashScreenProgress(75);
if ( !bTerminateRequested && !pCmdLineArgs->IsInvisible() &&
!pCmdLineArgs->IsNoQuickstart() )
InitializeQuickstartMode( xSMgr );
// use system window dialogs
Application::SetSystemWindowMode( SYSTEMWINDOW_MODE_DIALOG );
RTL_LOGFILE_CONTEXT( aLog2, "desktop (cd100003) createInstance com.sun.star.frame.Desktop" );
try
{
Reference< XDesktop > xDesktop( xSMgr->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ))), UNO_QUERY );
if ( xDesktop.is() )
xDesktop->addTerminateListener( new OfficeIPCThreadController );
SetSplashScreenProgress(100);
}
catch ( com::sun::star::uno::Exception& e )
{
FatalError( MakeStartupErrorMessage(e.Message) );
return;
}
/*
catch ( ... )
{
FatalError( MakeStartupErrorMessage(
OUString::createFromAscii(
"Unknown error during startup (TD/Desktop service).\nInstallation could be damaged.")));
return;
}
*/
// SetSplashScreenProgress(80);
// Release solar mutex just before we wait for our client to connect
int nAcquireCount = 0;
::vos::IMutex& rMutex = Application::GetSolarMutex();
if ( rMutex.tryToAcquire() )
nAcquireCount = Application::ReleaseSolarMutex() - 1;
if ( !bTerminateRequested && !pCmdLineArgs->IsInvisible() &&
!pCmdLineArgs->IsNoQuickstart() )
InitializeQuickstartMode( xSMgr );
// Post user event to startup first application component window
// We have to send this OpenClients message short before execute() to
// minimize the risk that this message overtakes type detection contruction!!
Application::PostUserEvent( LINK( this, Desktop, OpenClients_Impl ) );
RTL_LOGFILE_CONTEXT( aLog2, "desktop (cd100003) createInstance com.sun.star.frame.Desktop" );
try
{
Reference< XDesktop > xDesktop( xSMgr->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ))), UNO_QUERY );
if ( xDesktop.is() )
xDesktop->addTerminateListener( new OfficeIPCThreadController );
SetSplashScreenProgress(100);
}
catch ( com::sun::star::uno::Exception& e )
{
FatalError( MakeStartupErrorMessage(e.Message) );
return;
}
/*
catch ( ... )
{
FatalError( MakeStartupErrorMessage(
OUString::createFromAscii(
"Unknown error during startup (TD/Desktop service).\nInstallation could be damaged.")));
return;
}
*/
// Post event to enable acceptors
Application::PostUserEvent( LINK( this, Desktop, EnableAcceptors_Impl) );
// Post user event to startup first application component window
// We have to send this OpenClients message short before execute() to
// minimize the risk that this message overtakes type detection contruction!!
Application::PostUserEvent( LINK( this, Desktop, OpenClients_Impl ) );
// The configuration error handler currently is only for startup
aConfigErrHandler.deactivate();
// Post event to enable acceptors
Application::PostUserEvent( LINK( this, Desktop, EnableAcceptors_Impl) );
// Acquire solar mutex just before we enter our message loop
if ( nAcquireCount )
Application::AcquireSolarMutex( nAcquireCount );
// The configuration error handler currently is only for startup
aConfigErrHandler.deactivate();
// call Application::Execute to process messages in vcl message loop
RTL_LOGFILE_PRODUCT_TRACE( "PERFORMANCE - enter Application::Execute()" );
// call Application::Execute to process messages in vcl message loop
RTL_LOGFILE_PRODUCT_TRACE( "PERFORMANCE - enter Application::Execute()" );
Reference< ::com::sun::star::task::XRestartManager > xRestartManager;
try
{
// The JavaContext contains an interaction handler which is used when
// the creation of a Java Virtual Machine fails
com::sun::star::uno::ContextLayer layer2(
new svt::JavaContext( com::sun::star::uno::getCurrentContext() ) );
try
{
// The JavaContext contains an interaction handler which is used when
// the creation of a Java Virtual Machine fails
com::sun::star::uno::ContextLayer layer2(
new svt::JavaContext( com::sun::star::uno::getCurrentContext() ) );
::comphelper::ComponentContext aContext( xSMgr );
xRestartManager.set( aContext.getSingleton( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.OfficeRestartManager" ) ) ), UNO_QUERY );
if ( !xRestartManager.is() || !xRestartManager->isRestartRequested( sal_True ) )
Execute();
}
catch(const com::sun::star::document::CorruptedFilterConfigurationException& exFilterCfg)
{
OfficeIPCThread::SetDowning();
FatalError( MakeStartupErrorMessage(exFilterCfg.Message) );
}
catch(const com::sun::star::configuration::CorruptedConfigurationException& exAnyCfg)
{
OfficeIPCThread::SetDowning();
FatalError( MakeStartupErrorMessage(exAnyCfg.Message) );
}
}
catch(const com::sun::star::document::CorruptedFilterConfigurationException& exFilterCfg)
{
OfficeIPCThread::SetDowning();
FatalError( MakeStartupErrorMessage(exFilterCfg.Message) );
}
catch(const com::sun::star::configuration::CorruptedConfigurationException& exAnyCfg)
{
OfficeIPCThread::SetDowning();
FatalError( MakeStartupErrorMessage(exAnyCfg.Message) );
}
// check whether the shutdown is caused by restart
sal_Bool bRestartRequested = ( xRestartManager.is() && xRestartManager->isRestartRequested( sal_True ) );
if (xGlobalBroadcaster.is())
{
@ -1709,9 +1980,7 @@ void Desktop::Main()
RTL_LOGFILE_CONTEXT_TRACE( aLog, "FINISHED WITH Destop::Main" );
if ( bRestartRequested )
{
#ifdef MACOSX
DoRestart();
#endif
restartOnMac(true);
// wouldn't the solution be more clean if SalMain returns the exit code to the system?
_exit( ExitHelper::E_NORMAL_RESTART );
}

12
desktop/source/deployment/gui/dp_gui_dialog2.cxx Executable file → Normal file
View File

@ -372,11 +372,13 @@ MENU_COMMAND ExtBoxWithBtns_Impl::ShowPopupMenu( const Point & rPos, const long
if ( ! GetEntryData( nPos )->m_bLocked )
{
if ( GetEntryData( nPos )->m_eState == REGISTERED )
aPopup.InsertItem( CMD_DISABLE, DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
else if ( GetEntryData( nPos )->m_eState != NOT_AVAILABLE )
aPopup.InsertItem( CMD_ENABLE, DialogHelper::getResourceString( RID_CTX_ITEM_ENABLE ) );
if ( GetEntryData( nPos )->m_bUser )
{
if ( GetEntryData( nPos )->m_eState == REGISTERED )
aPopup.InsertItem( CMD_DISABLE, DialogHelper::getResourceString( RID_CTX_ITEM_DISABLE ) );
else if ( GetEntryData( nPos )->m_eState != NOT_AVAILABLE )
aPopup.InsertItem( CMD_ENABLE, DialogHelper::getResourceString( RID_CTX_ITEM_ENABLE ) );
}
aPopup.InsertItem( CMD_REMOVE, DialogHelper::getResourceString( RID_CTX_ITEM_REMOVE ) );
}

View File

@ -1136,6 +1136,14 @@ sal_Bool ExtensionManager::synchronize(
bModified |= m_bundledRepository->synchronize(xAbortChannel, xCmdEnv);
progressBundled.update(OUSTR("\n\n"));
//Always determine the active extension. This is necessary for the
//first-start optimization. The setup creates the registration data for the
//bundled extensions (brand_layer/share/prereg/bundled), which is copied to the user
//installation (user_installation/extension/bundled) when a user starts OOo
//for the first time after running setup. All bundled extensions are registered
//at that moment. However, extensions with the same identifier can be in the
//shared or user repository, in which case the respective bundled extensions must
//be revoked.
try
{
const uno::Sequence<uno::Sequence<Reference<deploy::XPackage> > >

View File

@ -2,7 +2,7 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_manager.h,v $
* $Revision: 1.17 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -589,6 +589,11 @@ void TRACE(::rtl::OString const & sText)
void syncRepositories(Reference<ucb::XCommandEnvironment> const & xCmdEnv)
{
OUString sDisable;
::rtl::Bootstrap::get( OUSTR( "DISABLE_EXTENSION_SYNCHRONIZATION" ), sDisable, OUString() );
if (sDisable.getLength() > 0)
return;
Reference<deployment::XExtensionManager> xExtensionManager;
//synchronize shared before bundled otherewise there are
//more revoke and registration calls.

View File

@ -367,16 +367,11 @@ void BackendImpl::configmgrini_verify_init(
do {
OUString token( line.getToken( 0, ' ', index ).trim() );
if (token.getLength() > 0) {
// cleanup, check if existing:
if (create_ucb_content(
0, expandUnoRcTerm(token), xCmdEnv,
false /* no throw */ )) {
//The file may not exist anymore if a shared or bundled
//extension was removed, but it can still be in the configmgrini.
//After running XExtensionManager::synchronize, the configmgrini is
//cleaned up
m_xcs_files.push_back( token );
}
//The file may not exist anymore if a shared or bundled
//extension was removed, but it can still be in the configmgrini.
//After running XExtensionManager::synchronize, the configmgrini is
//cleaned up
m_xcs_files.push_back( token );
}
}
while (index >= 0);
@ -386,31 +381,15 @@ void BackendImpl::configmgrini_verify_init(
sal_Int32 index = sizeof ("DATA=") - 1;
do {
OUString token( line.getToken( 0, ' ', index ).trim() );
if (token.getLength() > 0) {
if (token.getLength() > 0)
{
if (token[ 0 ] == '?')
token = token.copy( 1 );
// cleanup, check if existing:
if (create_ucb_content(
0, expandUnoRcTerm(token),
xCmdEnv, false /* no throw */ )) {
//The file may not exist anymore if a shared or bundled
//extension was removed, but it can still be in the configmgrini.
//After running XExtensionManager::synchronize, the configmgrini is
//cleaned up
m_xcu_files.push_back( token );
}
else
{
//Check if it was removed. Only when the file contained %origin, so that
//a new file was writen in the user installation (e.g. $BUNDLED_EXTENSIONS_USER)
//See also ConfigurationBackendDb.iniEntry
::std::list<OUString> iniEntries = getAllIniEntries();
if (::std::find(iniEntries.begin(), iniEntries.end(), token)
!= iniEntries.end())
m_xcu_files.push_back( token );
else
OSL_ENSURE(0, "Extension manager: Invalid configmgr.ini entry.");
}
//The file may not exist anymore if a shared or bundled
//extension was removed, but it can still be in the configmgrini.
//After running XExtensionManager::synchronize, the configmgrini is
//cleaned up
m_xcu_files.push_back( token );
}
}
while (index >= 0);
@ -510,6 +489,8 @@ bool BackendImpl::removeFromConfigmgrIni(
{
//in case the xcu contained %origin% then the configmr.ini contains the
//url to the file in the user installation (e.g. $BUNDLED_EXTENSIONS_USER)
//However, m_url (getURL()) contains the URL for the file in the actual
//extension installatation.
::boost::optional<ConfigurationBackendDb::Data> data = readDataFromDb(url_);
if (data)
i = std::find(rSet.begin(), rSet.end(), data->iniEntry);
@ -766,10 +747,17 @@ void BackendImpl::PackageImpl::processPackage_(
}
that->m_registeredPackages->erase(i->first);
}
::ucbhelper::Content(
makeURL( that->getCachePath(), OUSTR("registry") ),
xCmdEnv ).executeCommand(
OUSTR("delete"), Any( true /* delete physically */ ) );
try
{
::ucbhelper::Content(
makeURL( that->getCachePath(), OUSTR("registry") ),
xCmdEnv ).executeCommand(
OUSTR("delete"), Any( true /* delete physically */ ) );
}
catch(Exception&)
{
OSL_ASSERT(0);
}
}
url = that->deleteDataFromDb(url);
if (!m_isSchema) {

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_package.cxx,v $
* $Revision: 1.34.16.2 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_backend.h,v $
* $Revision: 1.18 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -129,7 +129,9 @@ public:
virtual Reference<deployment::XPackage> SAL_CALL bindPackage(
OUString const & url, OUString const & mediaType, sal_Bool bRemoved,
OUString const & identifier, Reference<XCommandEnvironment> const & xCmdEnv )
throw (deployment::DeploymentException, CommandFailedException,
throw (deployment::DeploymentException,
deployment::InvalidRemovedParameterException,
CommandFailedException,
lang::IllegalArgumentException, RuntimeException);
virtual Sequence< Reference<deployment::XPackageTypeInfo> > SAL_CALL
getSupportedPackageTypes() throw (RuntimeException);
@ -461,7 +463,8 @@ void PackageRegistryImpl::update() throw (RuntimeException)
Reference<deployment::XPackage> PackageRegistryImpl::bindPackage(
OUString const & url, OUString const & mediaType_, sal_Bool bRemoved,
OUString const & identifier, Reference<XCommandEnvironment> const & xCmdEnv )
throw (deployment::DeploymentException, CommandFailedException,
throw (deployment::DeploymentException, deployment::InvalidRemovedParameterException,
CommandFailedException,
lang::IllegalArgumentException, RuntimeException)
{
check();

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_package.cxx,v $
* $Revision: 1.34.16.2 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_backend.h,v $
* $Revision: 1.18 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_package.cxx,v $
* $Revision: 1.34.16.2 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_backend.h,v $
* $Revision: 1.18 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -866,14 +866,10 @@ void BackendImpl::PackageImpl::processPackage_(
try {
xPackage->registerPackage( startup, xSubAbortChannel, xCmdEnv );
}
catch (RuntimeException &) {
throw;
}
catch (ucb::CommandAbortedException &) {
throw;
}
catch (Exception &) {
// CommandFailedException, DeploymentException:
catch (Exception &)
{
//We even try a rollback if the user cancelled the action (CommandAbortedException)
//in order to prevent invalid database entries.
Any exc( ::cppu::getCaughtException() );
// try to handle exception, notify:
bool approve = false, abort = false;
@ -904,14 +900,8 @@ void BackendImpl::PackageImpl::processPackage_(
bundle[ pos ]->revokePackage(
xSubAbortChannel, xCmdEnv );
}
catch (RuntimeException &) {
throw;
}
catch (ucb::CommandAbortedException &) {
throw;
}
catch (Exception &) {
// bundle rollback error:
catch (Exception &)
{
OSL_ENSURE( 0, ::rtl::OUStringToOString(
::comphelper::anyToString(
::cppu::getCaughtException() ),

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_package.cxx,v $
* $Revision: 1.34.16.2 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dp_backend.h,v $
* $Revision: 1.18 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

5
desktop/source/migration/services/cexportsoo3.cxx Executable file → Normal file
View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: cexports.cxx,v $
* $Revision: 1.9 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: extensionmigration.cxx,v $
* $Revision: 1.2 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -2,13 +2,10 @@
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: extensionmigration.hxx,v $
* $Revision: 1.2 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify

View File

@ -39,6 +39,7 @@
#include "osl/thread.h"
#include "osl/process.h"
#include "osl/conditn.hxx"
#include "osl/file.hxx"
#include "cppuhelper/implbase1.hxx"
#include "cppuhelper/exc_hlp.hxx"
#include "comphelper/anytostring.hxx"
@ -377,6 +378,29 @@ extern "C" int unopkg_main()
if (e != osl_File_E_None && e != osl_File_E_NOENT)
throw Exception(OUSTR("Could not delete ") + extensionUnorc, 0);
}
else if (subCommand.equals(OUSTR("sync")))
{
//sync is private!!!! Only for bundled extensions!!!
//For performance reasons unopkg sync is called during the setup and
//creates the registration data for the repository of the bundled
//extensions. It is then copied to the user installation during
//startup of OOo (userdata/extensions/bundled). The registration
//data is in the brand installation and must be removed when
//uninstalling OOo. We do this here, before UNO is
//bootstrapped. Otherwies files could be locked by this process.
//If there is no folder left in
//$BRAND_BASE_DIR/share/extensions
//then we can delete the registration data at
//$BUNDLED_EXTENSIONS_USER
if (hasNoFolder(OUSTR("$BRAND_BASE_DIR/share/extensions")))
{
removeFolder(OUSTR("$BUNDLED_EXTENSIONS_USER"));
//return otherwise we create the registration data again
return 0;
}
}
xComponentContext = getUNO(
disposeGuard, option_verbose, option_shared, subcmd_gui,
@ -587,6 +611,15 @@ extern "C" int unopkg_main()
xDialog->startExecuteModal(xListener);
dialogEnded.wait();
}
else if (subCommand.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("sync")))
{
//This sub command may be removed later and is only there to have a
//possibility to start extension synching without any output.
//This is just here so we do not get an error, because of an unknown
//sub-command. We do synching before
//the sub-commands are processed.
}
else
{
dp_misc::writeConsoleError(

View File

@ -528,5 +528,110 @@ Reference<XComponentContext> getUNO(
return xComponentContext;
}
//Determines if a folder does not contains a folder.
//Return false may also mean that the status could not be determined
//because some error occurred.
bool hasNoFolder(OUString const & folderUrl)
{
bool ret = false;
OUString url = folderUrl;
::rtl::Bootstrap::expandMacros(url);
::osl::Directory dir(url);
osl::File::RC rc = dir.open();
if (rc == osl::File::E_None)
{
bool bFolderExist = false;
osl::DirectoryItem i;
osl::File::RC rcNext = osl::File::E_None;
while ( (rcNext = dir.getNextItem(i)) == osl::File::E_None)
{
osl::FileStatus stat(FileStatusMask_Type);
if (i.getFileStatus(stat) == osl::File::E_None)
{
if (stat.getFileType() == osl::FileStatus::Directory)
{
bFolderExist = true;
break;
}
}
else
{
dp_misc::writeConsole(
OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
break;
}
i = osl::DirectoryItem();
}
if (rcNext == osl::File::E_NOENT ||
rcNext == osl::File::E_None)
{
if (!bFolderExist)
ret = true;
}
else
{
dp_misc::writeConsole(
OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
}
dir.close();
}
else
{
dp_misc::writeConsole(
OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
}
return ret;
}
void removeFolder(OUString const & folderUrl)
{
OUString url = folderUrl;
::rtl::Bootstrap::expandMacros(url);
::osl::Directory dir(url);
::osl::File::RC rc = dir.open();
if (rc == osl::File::E_None)
{
::osl::DirectoryItem i;
::osl::File::RC rcNext = ::osl::File::E_None;
while ( (rcNext = dir.getNextItem(i)) == ::osl::File::E_None)
{
::osl::FileStatus stat(FileStatusMask_Type | FileStatusMask_FileURL);
if (i.getFileStatus(stat) == ::osl::File::E_None)
{
::osl::FileStatus::Type t = stat.getFileType();
if (t == ::osl::FileStatus::Directory)
{
//remove folder
removeFolder(stat.getFileURL());
}
else if (t == ::osl::FileStatus::Regular)
{
//remove file
::osl::File::remove(stat.getFileURL());
}
else
{
OSL_ASSERT(0);
}
}
else
{
dp_misc::writeConsole(
OUSTR("unopkg: Error while investigating ") + url + OUSTR("\n"));
break;
}
i = ::osl::DirectoryItem();
}
dir.close();
::osl::Directory::remove(url);
}
else
{
dp_misc::writeConsole(
OUSTR("unopkg: Error while removing ") + url + OUSTR("\n"));
}
}
}

View File

@ -178,5 +178,11 @@ css::uno::Reference<css::uno::XComponentContext> getUNO(
DisposeGuard & disposeGuard, bool verbose, bool shared, bool bGui,
css::uno::Reference<css::uno::XComponentContext> & out_LocalComponentContext);
bool hasNoFolder(::rtl::OUString const & folderUrl);
void removeFolder(::rtl::OUString const & folderUrl);
}

View File

@ -1458,7 +1458,11 @@ Reference< XSpellChecker1 > ImpEditEngine::GetSpeller()
SpellInfo * ImpEditEngine::CreateSpellInfo( const EditSelection &rSel, bool bMultipleDocs )
{
pSpellInfo = new SpellInfo;
if (!pSpellInfo)
pSpellInfo = new SpellInfo;
else
*pSpellInfo = SpellInfo(); // reset to default values
pSpellInfo->bMultipleDoc = bMultipleDocs;
EditSelection aSentenceSel( SelectSentence( rSel ) );
// pSpellInfo->aSpellStart = CreateEPaM( aSentenceSel.Min() );
@ -2023,7 +2027,6 @@ bool ImpEditEngine::SpellSentence(EditView& rEditView,
#else
bool bRet = false;
EditSelection aCurSel( rEditView.pImpEditView->GetEditSelection() );
//the pSpellInfo has to be created on demand
if(!pSpellInfo)
pSpellInfo = CreateSpellInfo( aCurSel, true );
pSpellInfo->aCurSentenceStart = aCurSel.Min();
@ -2191,8 +2194,12 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView,
{
#ifdef SVX_LIGHT
#else
// Note: rNewPortions.size() == 0 is valid and happens when the whole
// sentence got removed in the dialog
DBG_ASSERT(pSpellInfo, "pSpellInfo not initialized");
if(pSpellInfo)
if (pSpellInfo &&
pSpellInfo->aLastSpellPortions.size() > 0) // no portions -> no text to be changed
{
// get current paragraph length to calculate later on how the sentence length changed,
// in order to place the cursor at the end of the sentence again
@ -2202,6 +2209,10 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView,
UndoActionStart( EDITUNDO_INSERT );
if(pSpellInfo->aLastSpellPortions.size() == rNewPortions.size())
{
DBG_ASSERT( rNewPortions.size() > 0, "rNewPortions should not be empty here" );
DBG_ASSERT( pSpellInfo->aLastSpellPortions.size() == pSpellInfo->aLastSpellContentSelections.size(),
"aLastSpellPortions and aLastSpellContentSelections size mismatch" );
//the simple case: the same number of elements on both sides
//each changed element has to be applied to the corresponding source element
svx::SpellPortions::const_iterator aCurrentNewPortion = rNewPortions.end();
@ -2252,6 +2263,8 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView,
}
else
{
DBG_ASSERT( pSpellInfo->aLastSpellContentSelections.size() > 0, "aLastSpellContentSelections should not be empty here" );
//select the complete sentence
SpellContentSelections::const_iterator aCurrentEndPosition = pSpellInfo->aLastSpellContentSelections.end();
--aCurrentEndPosition;

View File

@ -96,6 +96,8 @@
#include <svtools/acceleratorexecute.hxx>
#include <stdio.h>
//_______________________________________________
// const
@ -1248,7 +1250,6 @@ void SAL_CALL XCUBasedAcceleratorConfiguration::changesOccurred(const css::util:
const sal_Int32 c = aEvent.Changes.getLength();
sal_Int32 i = 0;
for (i=0; i<c; ++i)
{
const css::util::ElementChange& aChange = aEvent.Changes[i];
@ -1264,27 +1265,25 @@ void SAL_CALL XCUBasedAcceleratorConfiguration::changesOccurred(const css::util:
aChange.Accessor >>= sOrgPath;
sPath = sOrgPath;
::rtl::OUString sPrimarySecondary = ::utl::extractFirstFromConfigurationPath(sPath);
sPath = ::utl::dropPrefixFromConfigurationPath(sPath, sPrimarySecondary);
::rtl::OUString sGlobalModules = ::utl::extractFirstFromConfigurationPath(sPath);
sPath = ::utl::dropPrefixFromConfigurationPath(sPath, sGlobalModules);
::rtl::OUString sPrimarySecondary = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
::rtl::OUString sGlobalModules = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
if ( sGlobalModules.equals(CFG_ENTRY_GLOBAL) )
{
::rtl::OUString sModule;
sKey = ::utl::extractFirstFromConfigurationPath(sPath);
if ( sKey.getLength() )
sKey = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
if (( sKey.getLength() > 0 ) && ( sPath.getLength() > 0 ))
reloadChanged(sPrimarySecondary, sGlobalModules, sModule, sKey);
}
else if ( sGlobalModules.equals(CFG_ENTRY_MODULES) )
{
::rtl::OUString sModule = ::utl::extractFirstFromConfigurationPath(sPath);
::rtl::OUString sDropModule = ::rtl::OUString::createFromAscii("Module['") + sModule + ::rtl::OUString::createFromAscii("']");
sPath = ::utl::dropPrefixFromConfigurationPath(sPath, sDropModule);
sKey = ::utl::extractFirstFromConfigurationPath(sPath);
if ( sKey.getLength() )
::rtl::OUString sModule = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
sKey = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
if (( sKey.getLength() > 0 ) && ( sPath.getLength() > 0 ))
{
reloadChanged(sPrimarySecondary, sGlobalModules, sModule, sKey);
}
}
}
}
@ -1385,8 +1384,8 @@ void XCUBasedAcceleratorConfiguration::impl_ts_load( sal_Bool bPreferred, const
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD1;
else if (sToken[k].equalsAscii("MOD2"))
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD2;
else if (sToken[k].equalsAscii("MOD3"))
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD3;
else if (sToken[k].equalsAscii("MOD3"))
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD3;
else
{
bValid = sal_False;

5
officecfg/registry/data/org/openoffice/Office/Math.xcu Normal file → Executable file
View File

@ -48,6 +48,8 @@
<value>0</value>
</prop>
</node>
<!-- only used for symbols with the 'Greek' symbol set name -->
<node oor:name="Id2" oor:op="replace">
<prop oor:name="Name">
<value>OpenSymbol</value>
@ -65,10 +67,11 @@
<value>0</value>
</prop>
<prop oor:name="Italic">
<value>2</value>
<value>0</value>
</prop>
</node>
</node>
<node oor:name="SymbolList">
<node oor:name="alpha" oor:op="replace">
<prop oor:name="Char">

View File

@ -402,7 +402,28 @@
</info>
<value>false</value>
</prop>
<prop oor:name="ScaleNormalBracket" oor:type="xs:boolean">
<prop oor:name="GreekCharStyle" oor:type="xs:short">
<!-- UIHints: n/a yet -->
<info>
<author>TL</author>
<desc>Specifies the default layout for symbols from the 'Greek' symbol set.</desc>
<label>Greek character style</label>
</info>
<constraints>
<minInclusive oor:value="0">
<info>
<desc>Specifies the minimum value allowed</desc>
</info>
</minInclusive>
<maxInclusive oor:value="2">
<info>
<desc>Specifies the maximum value allowed</desc>
</info>
</maxInclusive>
</constraints>
<value>0</value>
</prop>
<prop oor:name="ScaleNormalBracket" oor:type="xs:boolean">
<!-- OldPath: Math/StandardFormat -->
<!-- OldLocation: Soffice.cfg -->
<!-- UIHints: Format - Spacing - Category - Brackets - Scale all brackets -->

View File

@ -15,7 +15,7 @@
OpenOffice.org Improvement Program. If this is zero the user will get asked.
</desc>
</info>
<value>2</value>
<value>1</value>
</prop>
<prop oor:name="InvitationAccepted" oor:type="xs:boolean">
<info>

30
sfx2/source/dialog/securitypage.cxx Executable file → Normal file
View File

@ -245,6 +245,36 @@ SfxSecurityPage_Impl::SfxSecurityPage_Impl( SfxSecurityPage &rTabPage, const Sfx
m_aRecordChangesCB.SetStyle( m_aRecordChangesCB.GetStyle() | WB_EARLYTOGGLE );
m_aRecordChangesCB.SetToggleHdl( LINK( this, SfxSecurityPage_Impl, RecordChangesCBToggleHdl ) );
m_aChangeProtectionPB.SetClickHdl( LINK( this, SfxSecurityPage_Impl, ChangeProtectionPBHdl ) );
// #i112277: for the time being (OOO 3.3) the following options should not
// be available. In the long run however it is planned to implement the yet
// missing functionality. Thus now we hide them and move the remaining ones up.
m_aNewPasswordToOpenFL.Hide();
m_aNewPasswordToOpenFT.Hide();
m_aNewPasswordToOpenED.Hide();
m_aConfirmPasswordToOpenFT.Hide();
m_aConfirmPasswordToOpenED.Hide();
m_aNewPasswordInfoFT.Hide();
m_aNewPasswordToModifyFL.Hide();
m_aNewPasswordToModifyFT.Hide();
m_aNewPasswordToModifyED.Hide();
m_aConfirmPasswordToModifyFT.Hide();
m_aConfirmPasswordToModifyED.Hide();
const long nDelta = m_aOptionsFL.GetPosPixel().Y() - m_aNewPasswordToOpenFL.GetPosPixel().Y();
Point aPos;
aPos = m_aOptionsFL.GetPosPixel();
aPos.Y() -= nDelta;
m_aOptionsFL.SetPosPixel( aPos );
aPos = m_aOpenReadonlyCB.GetPosPixel();
aPos.Y() -= nDelta;
m_aOpenReadonlyCB.SetPosPixel( aPos );
aPos = m_aRecordChangesCB.GetPosPixel();
aPos.Y() -= nDelta;
m_aRecordChangesCB.SetPosPixel( aPos );
aPos = m_aChangeProtectionPB.GetPosPixel();
aPos.Y() -= nDelta;
m_aChangeProtectionPB.SetPosPixel( aPos );
}

0
sfx2/source/dialog/securitypage.src Executable file → Normal file
View File

View File

@ -977,6 +977,8 @@ sal_Bool SAL_CALL SfxBaseModel::attachResource( const ::rtl::OUString&
aArgs.remove( "BreakMacroSignature" );
aArgs.remove( "Stream" );
aArgs.remove( "InputStream" );
aArgs.remove( "URL" );
aArgs.remove( "Frame" );
// TODO/LATER: all the parameters that are accepted by ItemSet of the DocShell must be removed here
@ -988,6 +990,10 @@ sal_Bool SAL_CALL SfxBaseModel::attachResource( const ::rtl::OUString&
SfxAllItemSet aSet( pObjectShell->GetPool() );
TransformParameters( SID_OPENDOC, rArgs, aSet );
// the arguments are not allowed to reach the medium
aSet.ClearItem( SID_FILE_NAME );
aSet.ClearItem( SID_FILLFRAME );
pMedium->GetItemSet()->Put( aSet );
SFX_ITEMSET_ARG( &aSet, pItem, SfxStringItem, SID_FILTER_NAME, sal_False );
if ( pItem )

View File

@ -813,6 +813,13 @@ void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq )
xNewObj->SetModifyPasswordEntered( sal_False );
xNewObj->SetReadOnly();
}
else if ( rReq.GetSlot() == SID_EDITDOC && bForEdit && !xNewObj->IsReadOnlyMedium() )
{
// the filter might request setting of the document to readonly state
// but in case of SID_EDITDOC it should not happen if the document
// can be opened for editing
xNewObj->SetReadOnlyUI( sal_False );
}
if ( xNewObj->IsDocShared() )
{
@ -2144,6 +2151,8 @@ SfxViewShell* SfxViewFrame::LoadViewIntoFrame_Impl( const SfxObjectShell& i_rDoc
aTransformLoadArgs.remove( "Hidden" );
::rtl::OUString sURL( RTL_CONSTASCII_USTRINGPARAM( "private:object" ) );
if ( !sURL.getLength() )
sURL = i_rDoc.GetFactory().GetFactoryURL();
Reference< XComponentLoader > xLoader( i_rFrame, UNO_QUERY_THROW );
xLoader->loadComponentFromURL( sURL, ::rtl::OUString::createFromAscii( "_self" ), 0,

View File

@ -1063,8 +1063,7 @@ void SdrMarkView::AddDragModeHdl(SdrDragMode eMode)
/** handle mouse over effects for handles */
BOOL SdrMarkView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
{
const ULONG nHdlCount = aHdl.GetHdlCount();
if( nHdlCount )
if(aHdl.GetHdlCount())
{
SdrHdl* pMouseOverHdl = 0;
if( !rMEvt.IsLeaveWindow() && pWin )
@ -1074,6 +1073,8 @@ BOOL SdrMarkView::MouseMove(const MouseEvent& rMEvt, Window* pWin)
}
// notify last mouse over handle that he lost the mouse
const ULONG nHdlCount = aHdl.GetHdlCount();
for(ULONG nHdl = 0; nHdl < nHdlCount; nHdl++ )
{
SdrHdl* pCurrentHdl = GetHdl(nHdl);

View File

@ -68,6 +68,7 @@ SHL1IMPLIB=i$(TARGET)
SHL1VERSIONMAP=$(SOLARENV)/src/component.map
SHL1STDLIBS=\
$(COMPHELPERLIB) \
$(CPPUHELPERLIB) \
$(CPPULIB) \
$(SALLIB) \

View File

@ -36,6 +36,7 @@
#include "rtl/ustrbuf.hxx"
#include "osl/diagnose.h"
#include "comphelper/storagehelper.hxx"
#include "../inc/urihelper.hxx"
@ -85,7 +86,7 @@ void PackageUri::init() const
if ( ( m_aUri.getLength() < PACKAGE_URL_SCHEME_LENGTH + 4 ) )
{
// error, but remember that we did a init().
m_aPath = rtl::OUString::createFromAscii( "/" );
m_aPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
return;
}
@ -100,7 +101,7 @@ void PackageUri::init() const
!= sal_Unicode( '/' ) ) )
{
// error, but remember that we did a init().
m_aPath = rtl::OUString::createFromAscii( "/" );
m_aPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
return;
}
@ -128,8 +129,8 @@ void PackageUri::init() const
{
m_aParam +=
( m_aParam.getLength()
? ::rtl::OUString::createFromAscii( "&purezip" )
: ::rtl::OUString::createFromAscii( "?purezip" ) );
? ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "&purezip" ) )
: ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "?purezip" ) ) );
}
aPureUri = aPureUri.replaceAt( 0,
@ -143,7 +144,7 @@ void PackageUri::init() const
// Only <scheme>:/// - Empty authority
// error, but remember that we did a init().
m_aPath = rtl::OUString::createFromAscii( "/" );
m_aPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
return;
}
else if ( nEnd == ( aPureUri.getLength() - 1 ) )
@ -154,7 +155,7 @@ void PackageUri::init() const
// Only <scheme>://// or <scheme>://<something>//
// error, but remember that we did a init().
m_aPath = rtl::OUString::createFromAscii( "/" );
m_aPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
return;
}
@ -175,7 +176,7 @@ void PackageUri::init() const
nStart, aPureUri.getLength() - nStart, aNormPackage );
m_aPackage
= ::ucb_impl::urihelper::decodeSegment( aNormPackage );
m_aPath = rtl::OUString::createFromAscii( "/" );
m_aPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
m_aUri = m_aUri.replaceAt( 0,
( nParam >= 0 )
? nParam
@ -193,16 +194,19 @@ void PackageUri::init() const
{
m_aPath = aPureUri.copy( nEnd + 1 );
// Empty path segments or encoded slashes?
if ( m_aPath.indexOf(
rtl::OUString::createFromAscii( "//" ) ) != -1
|| m_aPath.indexOf(
rtl::OUString::createFromAscii( "%2F" ) ) != -1
|| m_aPath.indexOf(
rtl::OUString::createFromAscii( "%2f" ) ) != -1 )
// Unexpected sequences of characters:
// - empty path segments
// - encoded slashes
// - parent folder segments ".."
// - current folder segments "."
if ( m_aPath.indexOf( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "//" ) ) ) != -1
|| m_aPath.indexOf( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "%2F" ) ) ) != -1
|| m_aPath.indexOf( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "%2f" ) ) ) != -1
|| ::comphelper::OStorageHelper::PathHasSegment( m_aPath, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".." ) ) )
|| ::comphelper::OStorageHelper::PathHasSegment( m_aPath, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "." ) ) ) )
{
// error, but remember that we did a init().
m_aPath = rtl::OUString::createFromAscii( "/" );
m_aPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
return;
}
@ -239,7 +243,7 @@ void PackageUri::init() const
else
{
// error, but remember that we did a init().
m_aPath = rtl::OUString::createFromAscii( "/" );
m_aPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) );
}
}
}