| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #include <memory> |
| |
| #include "com/sun/star/document/ChangedByOthersRequest.hpp" |
| #include "com/sun/star/document/LockedDocumentRequest.hpp" |
| #include "com/sun/star/document/LockedOnSavingRequest.hpp" |
| #include "com/sun/star/document/LockFileIgnoreRequest.hpp" |
| #include "com/sun/star/document/OwnLockOnDocumentRequest.hpp" |
| #include "com/sun/star/task/XInteractionApprove.hpp" |
| #include "com/sun/star/task/XInteractionDisapprove.hpp" |
| #include "com/sun/star/task/XInteractionAbort.hpp" |
| #include "com/sun/star/task/XInteractionRequest.hpp" |
| |
| #include "vos/mutex.hxx" |
| #include "vcl/svapp.hxx" |
| #include "vcl/msgbox.hxx" |
| |
| #include "ids.hrc" |
| #include "getcontinuations.hxx" |
| #include "openlocked.hxx" |
| #include "trylater.hxx" |
| #include "alreadyopen.hxx" |
| #include "filechanged.hxx" |
| #include "lockfailed.hxx" |
| |
| #include "iahndl.hxx" |
| |
| #define UUI_DOC_LOAD_LOCK 0 |
| #define UUI_DOC_OWN_LOAD_LOCK 1 |
| #define UUI_DOC_SAVE_LOCK 2 |
| #define UUI_DOC_OWN_SAVE_LOCK 3 |
| |
| using namespace com::sun::star; |
| |
| namespace { |
| |
| void |
| handleLockedDocumentRequest_( |
| Window * pParent, |
| const ::rtl::OUString& aDocumentURL, |
| const ::rtl::OUString& aInfo, |
| uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & |
| rContinuations, |
| sal_uInt16 nMode ) |
| SAL_THROW((uno::RuntimeException)) |
| { |
| uno::Reference< task::XInteractionApprove > xApprove; |
| uno::Reference< task::XInteractionDisapprove > xDisapprove; |
| uno::Reference< task::XInteractionAbort > xAbort; |
| getContinuations(rContinuations, &xApprove, &xDisapprove, &xAbort); |
| |
| if ( !xApprove.is() || !xDisapprove.is() || !xAbort.is() ) |
| return; |
| |
| try |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| std::auto_ptr< ResMgr > xManager( |
| ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui))); |
| if (!xManager.get()) |
| return; |
| |
| ::rtl::OUString aMessage; |
| std::vector< rtl::OUString > aArguments; |
| aArguments.push_back( aDocumentURL ); |
| |
| sal_Int32 nResult = RET_CANCEL; |
| if ( nMode == UUI_DOC_LOAD_LOCK ) |
| { |
| aArguments.push_back( aInfo.getLength() |
| ? aInfo |
| : ::rtl::OUString( String( |
| ResId( STR_UNKNOWNUSER, |
| *xManager.get() ) ) ) ); |
| aMessage = String( ResId( STR_OPENLOCKED_MSG, *xManager.get() ) ); |
| aMessage = UUIInteractionHelper::replaceMessageWithArguments( |
| aMessage, aArguments ); |
| |
| std::auto_ptr< OpenLockedQueryBox > xDialog(new OpenLockedQueryBox( |
| pParent, xManager.get(), aMessage ) ); |
| nResult = xDialog->Execute(); |
| } |
| else if ( nMode == UUI_DOC_SAVE_LOCK ) |
| { |
| aArguments.push_back( aInfo.getLength() |
| ? aInfo |
| : ::rtl::OUString( String( |
| ResId( STR_UNKNOWNUSER, |
| *xManager.get() ) ) ) ); |
| aMessage = String( ResId( STR_TRYLATER_MSG, *xManager.get() ) ); |
| aMessage = UUIInteractionHelper::replaceMessageWithArguments( |
| aMessage, aArguments ); |
| |
| std::auto_ptr< TryLaterQueryBox > xDialog( |
| new TryLaterQueryBox( pParent, xManager.get(), aMessage ) ); |
| nResult = xDialog->Execute(); |
| } |
| else if ( nMode == UUI_DOC_OWN_LOAD_LOCK || |
| nMode == UUI_DOC_OWN_SAVE_LOCK ) |
| { |
| aArguments.push_back( aInfo ); |
| aMessage = String( ResId( nMode == UUI_DOC_OWN_SAVE_LOCK |
| ? STR_ALREADYOPEN_SAVE_MSG |
| : STR_ALREADYOPEN_MSG, |
| *xManager.get() ) ); |
| aMessage = UUIInteractionHelper::replaceMessageWithArguments( |
| aMessage, aArguments ); |
| |
| std::auto_ptr< AlreadyOpenQueryBox > xDialog( |
| new AlreadyOpenQueryBox( pParent, |
| xManager.get(), |
| aMessage, |
| nMode == UUI_DOC_OWN_SAVE_LOCK ) ); |
| nResult = xDialog->Execute(); |
| } |
| |
| if ( nResult == RET_YES ) |
| xApprove->select(); |
| else if ( nResult == RET_NO ) |
| xDisapprove->select(); |
| else |
| xAbort->select(); |
| } |
| catch (std::bad_alloc const &) |
| { |
| throw uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")), |
| uno::Reference< uno::XInterface >()); |
| } |
| } |
| |
| void |
| handleChangedByOthersRequest_( |
| Window * pParent, |
| uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & |
| rContinuations ) |
| SAL_THROW((uno::RuntimeException)) |
| { |
| uno::Reference< task::XInteractionApprove > xApprove; |
| uno::Reference< task::XInteractionAbort > xAbort; |
| getContinuations(rContinuations, &xApprove, &xAbort); |
| |
| if ( !xApprove.is() || !xAbort.is() ) |
| return; |
| |
| try |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| std::auto_ptr< ResMgr > xManager( |
| ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui))); |
| if (!xManager.get()) |
| return; |
| |
| std::auto_ptr< FileChangedQueryBox > xDialog( |
| new FileChangedQueryBox( pParent, xManager.get() ) ); |
| sal_Int32 nResult = xDialog->Execute(); |
| |
| if ( nResult == RET_YES ) |
| xApprove->select(); |
| else |
| xAbort->select(); |
| } |
| catch (std::bad_alloc const &) |
| { |
| throw uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")), |
| uno::Reference< uno::XInterface >()); |
| } |
| } |
| |
| void |
| handleLockFileIgnoreRequest_( |
| Window * pParent, |
| uno::Sequence< uno::Reference< task::XInteractionContinuation > > const & |
| rContinuations ) |
| SAL_THROW((uno::RuntimeException)) |
| { |
| uno::Reference< task::XInteractionApprove > xApprove; |
| uno::Reference< task::XInteractionAbort > xAbort; |
| getContinuations(rContinuations, &xApprove, &xAbort); |
| |
| if ( !xApprove.is() || !xAbort.is() ) |
| return; |
| |
| try |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| std::auto_ptr< ResMgr > xManager( |
| ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui))); |
| if (!xManager.get()) |
| return; |
| |
| std::auto_ptr< LockFailedQueryBox > xDialog( |
| new LockFailedQueryBox( pParent, xManager.get() ) ); |
| sal_Int32 nResult = xDialog->Execute(); |
| |
| if ( nResult == RET_OK ) |
| xApprove->select(); |
| else |
| xAbort->select(); |
| } |
| catch (std::bad_alloc const &) |
| { |
| throw uno::RuntimeException( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")), |
| uno::Reference< uno::XInterface >()); |
| } |
| } |
| |
| } // namespace |
| |
| bool |
| UUIInteractionHelper::handleLockedDocumentRequest( |
| uno::Reference< task::XInteractionRequest > const & rRequest) |
| SAL_THROW((::com::sun::star::uno::RuntimeException)) |
| { |
| uno::Any aAnyRequest(rRequest->getRequest()); |
| |
| document::LockedDocumentRequest aLockedDocumentRequest; |
| if (aAnyRequest >>= aLockedDocumentRequest ) |
| { |
| handleLockedDocumentRequest_( getParentProperty(), |
| aLockedDocumentRequest.DocumentURL, |
| aLockedDocumentRequest.UserInfo, |
| rRequest->getContinuations(), |
| UUI_DOC_LOAD_LOCK ); |
| return true; |
| } |
| |
| document::OwnLockOnDocumentRequest aOwnLockOnDocumentRequest; |
| if (aAnyRequest >>= aOwnLockOnDocumentRequest ) |
| { |
| handleLockedDocumentRequest_( getParentProperty(), |
| aOwnLockOnDocumentRequest.DocumentURL, |
| aOwnLockOnDocumentRequest.TimeInfo, |
| rRequest->getContinuations(), |
| aOwnLockOnDocumentRequest.IsStoring |
| ? UUI_DOC_OWN_SAVE_LOCK |
| : UUI_DOC_OWN_LOAD_LOCK ); |
| return true; |
| } |
| |
| document::LockedOnSavingRequest aLockedOnSavingRequest; |
| if (aAnyRequest >>= aLockedOnSavingRequest ) |
| { |
| handleLockedDocumentRequest_( getParentProperty(), |
| aLockedOnSavingRequest.DocumentURL, |
| aLockedOnSavingRequest.UserInfo, |
| rRequest->getContinuations(), |
| UUI_DOC_SAVE_LOCK ); |
| return true; |
| } |
| return false; |
| } |
| |
| bool |
| UUIInteractionHelper::handleChangedByOthersRequest( |
| uno::Reference< task::XInteractionRequest > const & rRequest) |
| SAL_THROW((uno::RuntimeException)) |
| { |
| uno::Any aAnyRequest(rRequest->getRequest()); |
| |
| document::ChangedByOthersRequest aChangedByOthersRequest; |
| if (aAnyRequest >>= aChangedByOthersRequest ) |
| { |
| handleChangedByOthersRequest_( getParentProperty(), |
| rRequest->getContinuations() ); |
| return true; |
| } |
| return false; |
| } |
| |
| bool |
| UUIInteractionHelper::handleLockFileIgnoreRequest( |
| uno::Reference< task::XInteractionRequest > const & rRequest) |
| SAL_THROW((uno::RuntimeException)) |
| { |
| uno::Any aAnyRequest(rRequest->getRequest()); |
| |
| document::LockFileIgnoreRequest aLockFileIgnoreRequest; |
| if (aAnyRequest >>= aLockFileIgnoreRequest ) |
| { |
| handleLockFileIgnoreRequest_( getParentProperty(), |
| rRequest->getContinuations() ); |
| return true; |
| } |
| return false; |
| } |
| |
| |