Kaydet (Commit) 6ca3b364 authored tarafından Juergen Funk's avatar Juergen Funk Kaydeden (comit) Katarina Behrens

tdf#106942 Wrong message when lock file is empty or corrupt

1. Erase empty or corrupt lockfile, when reading it fails and
   skip "Locked Document Dialog" in that case
2. Show Dialog (use LockFileIgnoreRequest -> LockFailedQueryBox)
   when create lock file is not possible.
   Two Dialogs:  "lock file create error" and
                 "empty lockfile is present"
   Set the document to read-only when creating lockfile is not
   possible. If lockfile is corrupt or empty, inform the user.
   They can interrupt loading the document or open it read-only,
   which also erases the corrupt lock file after closing
   the document
3. Handling for the two Dialogs
   Use LockFileIgnoreRequst for create lockfile error and
   add a new LockFileCorruptRequest, (lock file is corrupt).
   Change and generate new messages for both dialogs in english

Change-Id: I35c377f85b5113e8ffb89d83b9544b8ebc81d89f
Reviewed-on: https://gerrit.libreoffice.org/36658Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarKatarina Behrens <Katarina.Behrens@cib.de>
üst cab3468e
...@@ -163,8 +163,10 @@ public: ...@@ -163,8 +163,10 @@ public:
bool IsStorage(); bool IsStorage();
enum class ShowLockResult { NoLock, Succeeded,Try }; enum class ShowLockResult { NoLock, Succeeded,Try };
ShowLockResult ShowLockedDocumentDialog( const LockFileEntry& aData, bool bIsLoading, bool bOwnLock ); ShowLockResult ShowLockedDocumentDialog( const LockFileEntry& aData, bool bIsLoading, bool bOwnLock, bool bHandleSysLocked);
void LockOrigFileOnDemand( bool bLoading, bool bNoUI ); void LockOrigFileOnDemand( bool bLoading, bool bNoUI );
enum class MessageDlg { LockFileIgnore, LockFileCorrupt };
bool ShowLockFileProblemDialog(MessageDlg nWhichDlg);
void DisableUnlockWebDAV( bool bDisableUnlockWebDAV = true ); void DisableUnlockWebDAV( bool bDisableUnlockWebDAV = true );
void UnlockFile( bool bReleaseLockStream ); void UnlockFile( bool bReleaseLockStream );
......
...@@ -48,7 +48,10 @@ public: ...@@ -48,7 +48,10 @@ public:
bool CreateOwnLockFile(); bool CreateOwnLockFile();
LockFileEntry GetLockData(); LockFileEntry GetLockData();
bool OverwriteOwnLockFile(); bool OverwriteOwnLockFile();
/// Delete the Lockfile, if current user is the owner
void RemoveFile(); void RemoveFile();
/// Only delete lockfile, disregarding ownership
void RemoveFileDirectly();
static bool IsInteractionAllowed() { return m_bAllowInteraction; } static bool IsInteractionAllowed() { return m_bAllowInteraction; }
}; };
......
...@@ -490,7 +490,7 @@ ${MYCMD} --base sw/source/uibase/utlui --files attrdesc.src initui.src navipi.sr ...@@ -490,7 +490,7 @@ ${MYCMD} --base sw/source/uibase/utlui --files attrdesc.src initui.src navipi.sr
${MYCMD} --files sw/source/uibase/wrtsh/wrtsh.src ${MYCMD} --files sw/source/uibase/wrtsh/wrtsh.src
${MYCMD} --base uui/source --files alreadyopen.src filechanged.src ids.src lockfailed.src nameclashdlg.src openlocked.src passworddlg.src passworderrs.src trylater.src ${MYCMD} --base uui/source --files alreadyopen.src filechanged.src ids.src lockfailed.src lockcorrupt.src nameclashdlg.src openlocked.src passworddlg.src passworderrs.src trylater.src
${MYCMD} --files vcl/source/edit/textundo.src ${MYCMD} --files vcl/source/edit/textundo.src
......
...@@ -2190,6 +2190,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/document,\ ...@@ -2190,6 +2190,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/document,\
FilterOptionsRequest \ FilterOptionsRequest \
LinkUpdateModes \ LinkUpdateModes \
LockFileIgnoreRequest \ LockFileIgnoreRequest \
LockFileCorruptRequest \
LockedDocumentRequest \ LockedDocumentRequest \
LockedOnSavingRequest \ LockedOnSavingRequest \
MacroExecMode \ MacroExecMode \
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef __com_sun_star_document_LockFileCorruptRequest_idl__
#define __com_sun_star_document_LockFileCorruptRequest_idl__
#include <com/sun/star/io/IOException.idl>
#include <com/sun/star/beans/PropertyValue.idl>
#include <com/sun/star/frame/XModel.idl>
module com { module sun { module star { module document {
/** Is used for interaction handle to query user's decision
when the lock file is corrupt.
@since OOo 5.5
*/
exception LockFileCorruptRequest : ::com::sun::star::io::IOException
{
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <com/sun/star/document/LockedDocumentRequest.hpp> #include <com/sun/star/document/LockedDocumentRequest.hpp>
#include <com/sun/star/document/OwnLockOnDocumentRequest.hpp> #include <com/sun/star/document/OwnLockOnDocumentRequest.hpp>
#include <com/sun/star/document/LockFileIgnoreRequest.hpp> #include <com/sun/star/document/LockFileIgnoreRequest.hpp>
#include <com/sun/star/document/LockFileCorruptRequest.hpp>
#include <com/sun/star/document/ChangedByOthersRequest.hpp> #include <com/sun/star/document/ChangedByOthersRequest.hpp>
#include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/embed/XTransactedObject.hpp> #include <com/sun/star/embed/XTransactedObject.hpp>
...@@ -120,6 +121,8 @@ ...@@ -120,6 +121,8 @@
#include <sfx2/sfxresid.hxx> #include <sfx2/sfxresid.hxx>
#include <officecfg/Office/Common.hxx> #include <officecfg/Office/Common.hxx>
#include <com/sun/star/io/WrongFormatException.hpp>
#include <memory> #include <memory>
using namespace ::com::sun::star; using namespace ::com::sun::star;
...@@ -817,12 +820,12 @@ void SfxMedium::SetEncryptionDataToStorage_Impl() ...@@ -817,12 +820,12 @@ void SfxMedium::SetEncryptionDataToStorage_Impl()
// not for some URL scheme belongs in UCB, not here. // not for some URL scheme belongs in UCB, not here.
SfxMedium::ShowLockResult SfxMedium::ShowLockedDocumentDialog( const LockFileEntry& aData, bool bIsLoading, bool bOwnLock ) SfxMedium::ShowLockResult SfxMedium::ShowLockedDocumentDialog( const LockFileEntry& aData, bool bIsLoading, bool bOwnLock, bool bHandleSysLocked )
{ {
ShowLockResult nResult = ShowLockResult::NoLock; ShowLockResult nResult = ShowLockResult::NoLock;
// tdf#92817: Simple check for empty lock file that needs to be deleted // tdf#92817: Simple check for empty lock file that needs to be deleted, when system locking is enabled
if( aData[LockFileComponent::OOOUSERNAME].isEmpty() && aData[LockFileComponent::SYSUSERNAME].isEmpty() ) if( aData[LockFileComponent::OOOUSERNAME].isEmpty() && aData[LockFileComponent::SYSUSERNAME].isEmpty() && !bHandleSysLocked )
bOwnLock=true; bOwnLock=true;
// show the interaction regarding the document opening // show the interaction regarding the document opening
...@@ -916,6 +919,51 @@ SfxMedium::ShowLockResult SfxMedium::ShowLockedDocumentDialog( const LockFileEnt ...@@ -916,6 +919,51 @@ SfxMedium::ShowLockResult SfxMedium::ShowLockedDocumentDialog( const LockFileEnt
return nResult; return nResult;
} }
bool SfxMedium::ShowLockFileProblemDialog(MessageDlg nWhichDlg)
{
// system file locking is not active, ask user whether he wants to open the document without any locking
uno::Reference< task::XInteractionHandler > xHandler = GetInteractionHandler();
if (xHandler.is())
{
::rtl::Reference< ::ucbhelper::InteractionRequest > xIgnoreRequestImpl;
switch (nWhichDlg)
{
case MessageDlg::LockFileIgnore:
xIgnoreRequestImpl = new ::ucbhelper::InteractionRequest(uno::makeAny( document::LockFileIgnoreRequest() ));
break;
case MessageDlg::LockFileCorrupt:
xIgnoreRequestImpl = new ::ucbhelper::InteractionRequest(uno::makeAny( document::LockFileCorruptRequest() ));
break;
}
uno::Sequence< uno::Reference< task::XInteractionContinuation > > aContinuations(2);
aContinuations[0] = new ::ucbhelper::InteractionAbort(xIgnoreRequestImpl.get());
aContinuations[1] = new ::ucbhelper::InteractionApprove(xIgnoreRequestImpl.get());
xIgnoreRequestImpl->setContinuations(aContinuations);
xHandler->handle(xIgnoreRequestImpl.get());
::rtl::Reference< ::ucbhelper::InteractionContinuation > xSelected = xIgnoreRequestImpl->getSelection();
bool bReadOnly = uno::Reference< task::XInteractionApprove >(xSelected.get(), uno::UNO_QUERY).is();
if (bReadOnly)
{
GetItemSet()->Put(SfxBoolItem(SID_DOC_READONLY, true));
}
else
{
SetError(ERRCODE_ABORT);
}
return bReadOnly;
}
return false;
}
namespace namespace
{ {
bool isSuitableProtocolForLocking(const OUString & rLogicName) bool isSuitableProtocolForLocking(const OUString & rLogicName)
...@@ -1011,7 +1059,7 @@ void SfxMedium::LockOrigFileOnDemand( bool bLoading, bool bNoUI ) ...@@ -1011,7 +1059,7 @@ void SfxMedium::LockOrigFileOnDemand( bool bLoading, bool bNoUI )
if ( !bResult && !bNoUI ) if ( !bResult && !bNoUI )
{ {
bUIStatus = ShowLockedDocumentDialog( aLockData, bLoading, false ); bUIStatus = ShowLockedDocumentDialog( aLockData, bLoading, false , false );
} }
} }
catch( ucb::InteractiveNetworkWriteException& ) catch( ucb::InteractiveNetworkWriteException& )
...@@ -1136,59 +1184,34 @@ void SfxMedium::LockOrigFileOnDemand( bool bLoading, bool bNoUI ) ...@@ -1136,59 +1184,34 @@ void SfxMedium::LockOrigFileOnDemand( bool bLoading, bool bNoUI )
try try
{ {
::svt::DocumentLockFile aLockFile( pImpl->m_aLogicName ); ::svt::DocumentLockFile aLockFile( pImpl->m_aLogicName );
if ( !bHandleSysLocked ) bool bIoErr = false;
if (!bHandleSysLocked)
{ {
try try
{ {
bResult = aLockFile.CreateOwnLockFile(); bResult = aLockFile.CreateOwnLockFile();
} }
catch ( const ucb::InteractiveIOException& e ) catch (const ucb::InteractiveIOException&)
{
// exception means that the lock file can not be successfully accessed
// in this case it should be ignored if system file locking is anyway active
if ( bUseSystemLock || !IsOOoLockFileUsed() )
{
bResult = true;
// take the ownership over the lock file
aLockFile.OverwriteOwnLockFile();
}
else if ( e.Code == IOErrorCode_INVALID_PARAMETER )
{ {
// system file locking is not active, ask user whether he wants to open the document without any locking if (bLoading && !bNoUI)
uno::Reference< task::XInteractionHandler > xHandler = GetInteractionHandler();
if ( xHandler.is() )
{ {
::rtl::Reference< ::ucbhelper::InteractionRequest > xIgnoreRequestImpl bIoErr = true;
= new ::ucbhelper::InteractionRequest( uno::makeAny( document::LockFileIgnoreRequest() ) ); bResult = ShowLockFileProblemDialog(MessageDlg::LockFileIgnore);
uno::Sequence< uno::Reference< task::XInteractionContinuation > > aContinuations( 2 );
aContinuations[0] = new ::ucbhelper::InteractionAbort( xIgnoreRequestImpl.get() );
aContinuations[1] = new ::ucbhelper::InteractionApprove( xIgnoreRequestImpl.get() );
xIgnoreRequestImpl->setContinuations( aContinuations );
xHandler->handle( xIgnoreRequestImpl.get() );
::rtl::Reference< ::ucbhelper::InteractionContinuation > xSelected = xIgnoreRequestImpl->getSelection();
bResult = uno::Reference< task::XInteractionApprove >( xSelected.get(), uno::UNO_QUERY ).is();
}
} }
} }
catch ( const uno::Exception& ) catch (const uno::Exception&)
{ {
// exception means that the lock file can not be successfully accessed if (bLoading && !bNoUI)
// in this case it should be ignored if system file locking is anyway active
if ( bUseSystemLock || !IsOOoLockFileUsed() )
{ {
bResult = true; bIoErr = true;
// take the ownership over the lock file bResult = ShowLockFileProblemDialog(MessageDlg::LockFileIgnore);
aLockFile.OverwriteOwnLockFile();
} }
} }
// in case OOo locking is turned off the lock file is still written if possible // in case OOo locking is turned off the lock file is still written if possible
// but it is ignored while deciding whether the document should be opened for editing or not // but it is ignored while deciding whether the document should be opened for editing or not
if ( !bResult && !IsOOoLockFileUsed() ) if (!bResult && !IsOOoLockFileUsed() && !bIoErr)
{ {
bResult = true; bResult = true;
// take the ownership over the lock file // take the ownership over the lock file
...@@ -1196,46 +1219,54 @@ void SfxMedium::LockOrigFileOnDemand( bool bLoading, bool bNoUI ) ...@@ -1196,46 +1219,54 @@ void SfxMedium::LockOrigFileOnDemand( bool bLoading, bool bNoUI )
} }
} }
if ( !bResult ) if ( !bResult )
{ {
LockFileEntry aData; LockFileEntry aData;
try try
{ {
// impossibility to get data is no real problem
aData = aLockFile.GetLockData(); aData = aLockFile.GetLockData();
} }
catch (const io::WrongFormatException&)
{
// we get empty or corrupt data
// info to the user
if (!bIoErr && bLoading && !bNoUI )
bResult = ShowLockFileProblemDialog(MessageDlg::LockFileCorrupt);
// not show the Lock Document Dialog
bIoErr = true;
}
catch( const uno::Exception& ) catch( const uno::Exception& )
{ {
// show the Lock Document Dialog, when locked from other app
bIoErr = !bHandleSysLocked;
} }
bool bOwnLock = false; bool bOwnLock = false;
if ( !bHandleSysLocked ) if (!bHandleSysLocked)
{ {
LockFileEntry aOwnData = svt::LockFileCommon::GenerateOwnEntry(); LockFileEntry aOwnData = svt::LockFileCommon::GenerateOwnEntry();
bOwnLock = aOwnData[LockFileComponent::SYSUSERNAME].equals( aData[LockFileComponent::SYSUSERNAME] ); bOwnLock = aOwnData[LockFileComponent::SYSUSERNAME].equals(aData[LockFileComponent::SYSUSERNAME]);
if ( bOwnLock if (bOwnLock
&& aOwnData[LockFileComponent::LOCALHOST].equals( aData[LockFileComponent::LOCALHOST] ) && aOwnData[LockFileComponent::LOCALHOST].equals(aData[LockFileComponent::LOCALHOST])
&& aOwnData[LockFileComponent::USERURL].equals( aData[LockFileComponent::USERURL] ) ) && aOwnData[LockFileComponent::USERURL].equals(aData[LockFileComponent::USERURL]))
{ {
// this is own lock from the same installation, it could remain because of crash // this is own lock from the same installation, it could remain because of crash
bResult = true; bResult = true;
} }
} }
if ( !bResult && !bNoUI ) if ( !bResult && !bNoUI && !bIoErr)
{ {
bUIStatus = ShowLockedDocumentDialog( aData, bLoading, bOwnLock ); bUIStatus = ShowLockedDocumentDialog( aData, bLoading, bOwnLock, bHandleSysLocked );
if ( bUIStatus == ShowLockResult::Succeeded ) if ( bUIStatus == ShowLockResult::Succeeded )
{ {
// take the ownership over the lock file // take the ownership over the lock file
bResult = aLockFile.OverwriteOwnLockFile(); bResult = aLockFile.OverwriteOwnLockFile();
} }
} }
bHandleSysLocked = false;
} }
} }
catch( const uno::Exception& ) catch( const uno::Exception& )
...@@ -2736,13 +2767,24 @@ void SfxMedium::UnlockFile( bool bReleaseLockStream ) ...@@ -2736,13 +2767,24 @@ void SfxMedium::UnlockFile( bool bReleaseLockStream )
if ( pImpl->m_bLocked ) if ( pImpl->m_bLocked )
{ {
::svt::DocumentLockFile aLockFile( pImpl->m_aLogicName );
try try
{ {
pImpl->m_bLocked = false; pImpl->m_bLocked = false;
::svt::DocumentLockFile aLockFile( pImpl->m_aLogicName );
// TODO/LATER: A warning could be shown in case the file is not the own one // TODO/LATER: A warning could be shown in case the file is not the own one
aLockFile.RemoveFile(); aLockFile.RemoveFile();
} }
catch( const io::WrongFormatException& )
{
try
{
// erase the empty or corrupt file
aLockFile.RemoveFileDirectly();
}
catch( const uno::Exception& )
{}
}
catch( const uno::Exception& ) catch( const uno::Exception& )
{} {}
} }
......
...@@ -207,12 +207,19 @@ void DocumentLockFile::RemoveFile() ...@@ -207,12 +207,19 @@ void DocumentLockFile::RemoveFile()
|| !aFileData[LockFileComponent::USERURL].equals( aNewEntry[LockFileComponent::USERURL] ) ) || !aFileData[LockFileComponent::USERURL].equals( aNewEntry[LockFileComponent::USERURL] ) )
throw io::IOException(); // not the owner, access denied throw io::IOException(); // not the owner, access denied
RemoveFileDirectly();
}
void DocumentLockFile::RemoveFileDirectly()
{
uno::Reference < css::ucb::XCommandEnvironment > xEnv; uno::Reference < css::ucb::XCommandEnvironment > xEnv;
::ucbhelper::Content aCnt(m_aURL, xEnv, comphelper::getProcessComponentContext()); ::ucbhelper::Content aCnt(m_aURL, xEnv, comphelper::getProcessComponentContext());
aCnt.executeCommand("delete", aCnt.executeCommand("delete",
uno::makeAny(true)); uno::makeAny(true));
} }
} // namespace svt } // namespace svt
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -25,6 +25,7 @@ $(eval $(call gb_SrsTarget_add_files,uui/res,\ ...@@ -25,6 +25,7 @@ $(eval $(call gb_SrsTarget_add_files,uui/res,\
uui/source/filechanged.src \ uui/source/filechanged.src \
uui/source/ids.src \ uui/source/ids.src \
uui/source/lockfailed.src \ uui/source/lockfailed.src \
uui/source/lockcorrupt.src \
uui/source/nameclashdlg.src \ uui/source/nameclashdlg.src \
uui/source/openlocked.src \ uui/source/openlocked.src \
uui/source/passworddlg.src \ uui/source/passworddlg.src \
......
...@@ -49,6 +49,7 @@ $(eval $(call gb_Library_add_exception_objects,uui,\ ...@@ -49,6 +49,7 @@ $(eval $(call gb_Library_add_exception_objects,uui,\
uui/source/iahndl-ssl \ uui/source/iahndl-ssl \
uui/source/interactionhandler \ uui/source/interactionhandler \
uui/source/lockfailed \ uui/source/lockfailed \
uui/source/lockcorrupt \
uui/source/logindlg \ uui/source/logindlg \
uui/source/masterpasscrtdlg \ uui/source/masterpasscrtdlg \
uui/source/masterpassworddlg \ uui/source/masterpassworddlg \
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <com/sun/star/document/LockedDocumentRequest.hpp> #include <com/sun/star/document/LockedDocumentRequest.hpp>
#include <com/sun/star/document/LockedOnSavingRequest.hpp> #include <com/sun/star/document/LockedOnSavingRequest.hpp>
#include <com/sun/star/document/LockFileIgnoreRequest.hpp> #include <com/sun/star/document/LockFileIgnoreRequest.hpp>
#include <com/sun/star/document/LockFileCorruptRequest.hpp>
#include <com/sun/star/document/OwnLockOnDocumentRequest.hpp> #include <com/sun/star/document/OwnLockOnDocumentRequest.hpp>
#include <com/sun/star/task/XInteractionApprove.hpp> #include <com/sun/star/task/XInteractionApprove.hpp>
#include <com/sun/star/task/XInteractionDisapprove.hpp> #include <com/sun/star/task/XInteractionDisapprove.hpp>
...@@ -40,6 +41,7 @@ ...@@ -40,6 +41,7 @@
#include "alreadyopen.hxx" #include "alreadyopen.hxx"
#include "filechanged.hxx" #include "filechanged.hxx"
#include "lockfailed.hxx" #include "lockfailed.hxx"
#include "lockcorrupt.hxx"
#include "iahndl.hxx" #include "iahndl.hxx"
...@@ -172,11 +174,16 @@ handleChangedByOthersRequest_( ...@@ -172,11 +174,16 @@ handleChangedByOthersRequest_(
} }
} }
const sal_uInt16 UUI_DOC_CreateErrDlg = 0;
const sal_uInt16 UUI_DOC_CorruptErrDlg = 1;
void void
handleLockFileIgnoreRequest_( handleLockFileProblemRequest_(
vcl::Window * pParent, vcl::Window * pParent,
uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
rContinuations ) rContinuations, sal_uInt16 nWhichDlg )
{ {
uno::Reference< task::XInteractionApprove > xApprove; uno::Reference< task::XInteractionApprove > xApprove;
uno::Reference< task::XInteractionAbort > xAbort; uno::Reference< task::XInteractionAbort > xAbort;
...@@ -192,8 +199,19 @@ handleLockFileIgnoreRequest_( ...@@ -192,8 +199,19 @@ handleLockFileIgnoreRequest_(
if (!xManager.get()) if (!xManager.get())
return; return;
sal_Int32 nResult;
if (nWhichDlg == UUI_DOC_CreateErrDlg)
{
ScopedVclPtrInstance< LockFailedQueryBox > xDialog(pParent, xManager.get()); ScopedVclPtrInstance< LockFailedQueryBox > xDialog(pParent, xManager.get());
sal_Int32 nResult = xDialog->Execute(); nResult = xDialog->Execute();
}
else
{
ScopedVclPtrInstance< LockCorruptQueryBox > xDialog(pParent, xManager.get());
nResult = xDialog->Execute();
}
if ( nResult == RET_OK ) if ( nResult == RET_OK )
xApprove->select(); xApprove->select();
...@@ -267,8 +285,9 @@ UUIInteractionHelper::handleChangedByOthersRequest( ...@@ -267,8 +285,9 @@ UUIInteractionHelper::handleChangedByOthersRequest(
return false; return false;
} }
bool bool
UUIInteractionHelper::handleLockFileIgnoreRequest( UUIInteractionHelper::handleLockFileProblemRequest(
uno::Reference< task::XInteractionRequest > const & rRequest) uno::Reference< task::XInteractionRequest > const & rRequest)
{ {
uno::Any aAnyRequest(rRequest->getRequest()); uno::Any aAnyRequest(rRequest->getRequest());
...@@ -276,10 +295,19 @@ UUIInteractionHelper::handleLockFileIgnoreRequest( ...@@ -276,10 +295,19 @@ UUIInteractionHelper::handleLockFileIgnoreRequest(
document::LockFileIgnoreRequest aLockFileIgnoreRequest; document::LockFileIgnoreRequest aLockFileIgnoreRequest;
if (aAnyRequest >>= aLockFileIgnoreRequest ) if (aAnyRequest >>= aLockFileIgnoreRequest )
{ {
handleLockFileIgnoreRequest_( getParentProperty(), handleLockFileProblemRequest_( getParentProperty(),
rRequest->getContinuations() ); rRequest->getContinuations(), UUI_DOC_CreateErrDlg );
return true; return true;
} }
document::LockFileCorruptRequest aLockFileCorruptRequest;
if (aAnyRequest >>= aLockFileCorruptRequest )
{
handleLockFileProblemRequest_( getParentProperty(),
rRequest->getContinuations(), UUI_DOC_CorruptErrDlg );
return true;
}
return false; return false;
} }
......
...@@ -807,7 +807,7 @@ UUIInteractionHelper::handleRequest_impl( ...@@ -807,7 +807,7 @@ UUIInteractionHelper::handleRequest_impl(
if ( handleChangedByOthersRequest( rRequest ) ) if ( handleChangedByOthersRequest( rRequest ) )
return true; return true;
if ( handleLockFileIgnoreRequest( rRequest ) ) if ( handleLockFileProblemRequest( rRequest ) )
return true; return true;
task::DocumentMacroConfirmationRequest aMacroConfirmRequest; task::DocumentMacroConfirmationRequest aMacroConfirmRequest;
......
...@@ -232,7 +232,7 @@ private: ...@@ -232,7 +232,7 @@ private:
css::uno::Reference< css::uno::Reference<
css::task::XInteractionRequest > const & rRequest); css::task::XInteractionRequest > const & rRequest);
bool handleLockFileIgnoreRequest( bool handleLockFileProblemRequest(
css::uno::Reference< css::task::XInteractionRequest > const & rRequest); css::uno::Reference< css::task::XInteractionRequest > const & rRequest);
bool handleCustomRequest( bool handleCustomRequest(
......
...@@ -47,26 +47,29 @@ ...@@ -47,26 +47,29 @@
#define STR_ALREADYOPEN_OPEN_BTN (RID_UUI_START + 42) #define STR_ALREADYOPEN_OPEN_BTN (RID_UUI_START + 42)
#define STR_LOCKFAILED_TITLE (RID_UUI_START + 43) #define STR_LOCKFAILED_TITLE (RID_UUI_START + 43)
#define STR_LOCKFAILED_MSG (RID_UUI_START + 44) #define STR_LOCKFAILED_MSG (RID_UUI_START + 44)
#define STR_LOCKFAILED_DONTSHOWAGAIN (RID_UUI_START + 45) #define STR_LOCKFAILED_OPENREADONLY_BTN (RID_UUI_START + 45)
#define STR_TRYLATER_TITLE (RID_UUI_START + 46) #define STR_LOCKCORRUPT_TITLE (RID_UUI_START + 46)
#define STR_TRYLATER_MSG (RID_UUI_START + 47) #define STR_LOCKCORRUPT_MSG (RID_UUI_START + 47)
#define STR_TRYLATER_RETRYSAVING_BTN (RID_UUI_START + 48) #define STR_LOCKCORRUPT_OPENREADONLY_BTN (RID_UUI_START + 48)
#define STR_TRYLATER_SAVEAS_BTN (RID_UUI_START + 49) #define STR_TRYLATER_TITLE (RID_UUI_START + 49)
#define STR_ALREADYOPEN_SAVE_MSG (RID_UUI_START + 50) #define STR_TRYLATER_MSG (RID_UUI_START + 50)
#define STR_ALREADYOPEN_RETRY_SAVE_BTN (RID_UUI_START + 51) #define STR_TRYLATER_RETRYSAVING_BTN (RID_UUI_START + 51)
#define STR_ALREADYOPEN_SAVE_BTN (RID_UUI_START + 52) #define STR_TRYLATER_SAVEAS_BTN (RID_UUI_START + 52)
#define STR_ALREADYOPEN_SAVE_MSG (RID_UUI_START + 53)
#define STR_ALREADYOPEN_RETRY_SAVE_BTN (RID_UUI_START + 54)
#define STR_ALREADYOPEN_SAVE_BTN (RID_UUI_START + 55)
#define STR_WARNING_INCOMPLETE_ENCRYPTION_TITLE (RID_UUI_START + 54) #define STR_WARNING_INCOMPLETE_ENCRYPTION_TITLE (RID_UUI_START + 56)
#define STR_ENTER_PASSWORD_TO_OPEN (RID_UUI_START + 56) #define STR_ENTER_PASSWORD_TO_OPEN (RID_UUI_START + 57)
#define STR_ENTER_PASSWORD_TO_MODIFY (RID_UUI_START + 57) #define STR_ENTER_PASSWORD_TO_MODIFY (RID_UUI_START + 58)
#define STR_RENAME_OR_REPLACE (RID_UUI_START + 58) #define STR_RENAME_OR_REPLACE (RID_UUI_START + 59)
#define STR_NAME_CLASH_RENAME_ONLY (RID_UUI_START + 59) #define STR_NAME_CLASH_RENAME_ONLY (RID_UUI_START + 60)
#define STR_SAME_NAME_USED (RID_UUI_START + 60) #define STR_SAME_NAME_USED (RID_UUI_START + 61)
#define STR_ENTER_SIMPLE_PASSWORD (RID_UUI_START + 61) #define STR_ENTER_SIMPLE_PASSWORD (RID_UUI_START + 62)
#define STR_CONFIRM_SIMPLE_PASSWORD (RID_UUI_START + 62) #define STR_CONFIRM_SIMPLE_PASSWORD (RID_UUI_START + 63)
#define STR_TITLE_CREATE_PASSWORD (RID_UUI_START + 63) #define STR_TITLE_CREATE_PASSWORD (RID_UUI_START + 64)
#define STR_TITLE_ENTER_PASSWORD (RID_UUI_START + 64) #define STR_TITLE_ENTER_PASSWORD (RID_UUI_START + 65)
#define STR_PASSWORD_MISMATCH (RID_UUI_START + 65) #define STR_PASSWORD_MISMATCH (RID_UUI_START + 66)
#define ERRCODE_UUI_IO_ABORT (ERRCODE_AREA_UUI + 0) #define ERRCODE_UUI_IO_ABORT (ERRCODE_AREA_UUI + 0)
#define ERRCODE_UUI_IO_ACCESSDENIED (ERRCODE_AREA_UUI + 1) #define ERRCODE_UUI_IO_ACCESSDENIED (ERRCODE_AREA_UUI + 1)
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include "ids.hrc"
#include "lockcorrupt.hxx"
#include <vcl/button.hxx>
LockCorruptQueryBox::LockCorruptQueryBox( vcl::Window* pParent, ResMgr* pResMgr ) :
MessBox(pParent, 0,
ResId(STR_LOCKCORRUPT_TITLE, *pResMgr).toString(),
OUString() )
{
SetImage( ErrorBox::GetStandardImage() );
AddButton(ResId(STR_LOCKCORRUPT_OPENREADONLY_BTN, *pResMgr).toString(), RET_OK,
ButtonDialogFlags::Default | ButtonDialogFlags::OK | ButtonDialogFlags::Focus);
AddButton( StandardButtonType::Cancel, RET_CANCEL, ButtonDialogFlags::Cancel );
SetMessText(ResId(STR_LOCKCORRUPT_MSG, *pResMgr ).toString());
}
LockCorruptQueryBox::~LockCorruptQueryBox()
{
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_UUI_SOURCE_LOCKCORRUPT_HXX
#define INCLUDED_UUI_SOURCE_LOCKCORRUPT_HXX
#include <vcl/msgbox.hxx>
class LockCorruptQueryBox : public MessBox
{
public:
LockCorruptQueryBox( vcl::Window* pParent, ResMgr* pResMgr );
virtual ~LockCorruptQueryBox() override;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#define __RSC
#include "ids.hrc"
String STR_LOCKCORRUPT_TITLE
{
Text [ en-US ] = "Lock file is corrupted";
};
String STR_LOCKCORRUPT_MSG
{
Text [ en-US ] = "The lock file is corrupted and probably empty. Opening the document read-only and closing it again removes the corrupted lock file.";
};
String STR_LOCKCORRUPT_OPENREADONLY_BTN
{
Text [ en-US ] = "Open ~Read-Only";
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -29,11 +29,12 @@ LockFailedQueryBox::LockFailedQueryBox( vcl::Window* pParent, ResMgr* pResMgr ) ...@@ -29,11 +29,12 @@ LockFailedQueryBox::LockFailedQueryBox( vcl::Window* pParent, ResMgr* pResMgr )
{ {
SetImage( ErrorBox::GetStandardImage() ); SetImage( ErrorBox::GetStandardImage() );
AddButton( StandardButtonType::OK, RET_OK, ButtonDialogFlags::OK ); AddButton(ResId(STR_LOCKFAILED_OPENREADONLY_BTN, *pResMgr).toString(), RET_OK,
ButtonDialogFlags::Default | ButtonDialogFlags::OK | ButtonDialogFlags::Focus);
AddButton( StandardButtonType::Cancel, RET_CANCEL, ButtonDialogFlags::Cancel ); AddButton( StandardButtonType::Cancel, RET_CANCEL, ButtonDialogFlags::Cancel );
SetMessText(ResId(STR_LOCKFAILED_MSG, *pResMgr ).toString()); SetMessText(ResId(STR_LOCKFAILED_MSG, *pResMgr ).toString());
SetCheckBoxText(ResId(STR_LOCKFAILED_DONTSHOWAGAIN, *pResMgr).toString());
} }
LockFailedQueryBox::~LockFailedQueryBox() LockFailedQueryBox::~LockFailedQueryBox()
......
...@@ -25,11 +25,11 @@ String STR_LOCKFAILED_TITLE ...@@ -25,11 +25,11 @@ String STR_LOCKFAILED_TITLE
}; };
String STR_LOCKFAILED_MSG String STR_LOCKFAILED_MSG
{ {
Text [ en-US ] = "The file could not be locked for exclusive access by %PRODUCTNAME, due to missing permission to create a lock file on that file location."; Text [ en-US ] = "The lock file could not be created for exclusive access by %PRODUCTNAME, due to missing permission to create a lock file on that file location or lack of free disk space.";
}; };
String STR_LOCKFAILED_DONTSHOWAGAIN String STR_LOCKFAILED_OPENREADONLY_BTN
{ {
Text [ en-US ] = "~Do not show this message again"; Text [ en-US ] = "Open ~Read-Only";
}; };
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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