xref: /aoo41x/main/uui/source/iahndl-locking.cxx (revision 859212d1)
1*859212d1SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*859212d1SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*859212d1SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*859212d1SAndrew Rist  * distributed with this work for additional information
6*859212d1SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*859212d1SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*859212d1SAndrew Rist  * "License"); you may not use this file except in compliance
9*859212d1SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*859212d1SAndrew Rist  *
11*859212d1SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*859212d1SAndrew Rist  *
13*859212d1SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*859212d1SAndrew Rist  * software distributed under the License is distributed on an
15*859212d1SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*859212d1SAndrew Rist  * KIND, either express or implied.  See the License for the
17*859212d1SAndrew Rist  * specific language governing permissions and limitations
18*859212d1SAndrew Rist  * under the License.
19*859212d1SAndrew Rist  *
20*859212d1SAndrew Rist  *************************************************************/
21*859212d1SAndrew Rist 
22*859212d1SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include <memory>
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "com/sun/star/document/ChangedByOthersRequest.hpp"
27cdf0e10cSrcweir #include "com/sun/star/document/LockedDocumentRequest.hpp"
28cdf0e10cSrcweir #include "com/sun/star/document/LockedOnSavingRequest.hpp"
29cdf0e10cSrcweir #include "com/sun/star/document/LockFileIgnoreRequest.hpp"
30cdf0e10cSrcweir #include "com/sun/star/document/OwnLockOnDocumentRequest.hpp"
31cdf0e10cSrcweir #include "com/sun/star/task/XInteractionApprove.hpp"
32cdf0e10cSrcweir #include "com/sun/star/task/XInteractionDisapprove.hpp"
33cdf0e10cSrcweir #include "com/sun/star/task/XInteractionAbort.hpp"
34cdf0e10cSrcweir #include "com/sun/star/task/XInteractionRequest.hpp"
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include "vos/mutex.hxx"
37cdf0e10cSrcweir #include "vcl/svapp.hxx"
38cdf0e10cSrcweir #include "vcl/msgbox.hxx"
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include "ids.hrc"
41cdf0e10cSrcweir #include "getcontinuations.hxx"
42cdf0e10cSrcweir #include "openlocked.hxx"
43cdf0e10cSrcweir #include "trylater.hxx"
44cdf0e10cSrcweir #include "alreadyopen.hxx"
45cdf0e10cSrcweir #include "filechanged.hxx"
46cdf0e10cSrcweir #include "lockfailed.hxx"
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include "iahndl.hxx"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #define UUI_DOC_LOAD_LOCK       0
51cdf0e10cSrcweir #define UUI_DOC_OWN_LOAD_LOCK   1
52cdf0e10cSrcweir #define UUI_DOC_SAVE_LOCK       2
53cdf0e10cSrcweir #define UUI_DOC_OWN_SAVE_LOCK   3
54cdf0e10cSrcweir 
55cdf0e10cSrcweir using namespace com::sun::star;
56cdf0e10cSrcweir 
57cdf0e10cSrcweir namespace {
58cdf0e10cSrcweir 
59cdf0e10cSrcweir void
handleLockedDocumentRequest_(Window * pParent,const::rtl::OUString & aDocumentURL,const::rtl::OUString & aInfo,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations,sal_uInt16 nMode)60cdf0e10cSrcweir handleLockedDocumentRequest_(
61cdf0e10cSrcweir     Window * pParent,
62cdf0e10cSrcweir     const ::rtl::OUString& aDocumentURL,
63cdf0e10cSrcweir     const ::rtl::OUString& aInfo,
64cdf0e10cSrcweir     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
65cdf0e10cSrcweir         rContinuations,
66cdf0e10cSrcweir     sal_uInt16 nMode )
67cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
68cdf0e10cSrcweir {
69cdf0e10cSrcweir     uno::Reference< task::XInteractionApprove > xApprove;
70cdf0e10cSrcweir     uno::Reference< task::XInteractionDisapprove > xDisapprove;
71cdf0e10cSrcweir     uno::Reference< task::XInteractionAbort > xAbort;
72cdf0e10cSrcweir     getContinuations(rContinuations, &xApprove, &xDisapprove, &xAbort);
73cdf0e10cSrcweir 
74cdf0e10cSrcweir     if ( !xApprove.is() || !xDisapprove.is() || !xAbort.is() )
75cdf0e10cSrcweir         return;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir     try
78cdf0e10cSrcweir     {
79cdf0e10cSrcweir         vos::OGuard aGuard(Application::GetSolarMutex());
80cdf0e10cSrcweir         std::auto_ptr< ResMgr > xManager(
81cdf0e10cSrcweir             ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
82cdf0e10cSrcweir         if (!xManager.get())
83cdf0e10cSrcweir             return;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir         ::rtl::OUString aMessage;
86cdf0e10cSrcweir         std::vector< rtl::OUString > aArguments;
87cdf0e10cSrcweir         aArguments.push_back( aDocumentURL );
88cdf0e10cSrcweir 
89cdf0e10cSrcweir         sal_Int32 nResult = RET_CANCEL;
90cdf0e10cSrcweir         if ( nMode == UUI_DOC_LOAD_LOCK )
91cdf0e10cSrcweir         {
92cdf0e10cSrcweir             aArguments.push_back( aInfo.getLength()
93cdf0e10cSrcweir                                   ? aInfo
94cdf0e10cSrcweir                                   : ::rtl::OUString( String(
95cdf0e10cSrcweir                                         ResId( STR_UNKNOWNUSER,
96cdf0e10cSrcweir                                                *xManager.get() ) ) ) );
97cdf0e10cSrcweir             aMessage = String( ResId( STR_OPENLOCKED_MSG, *xManager.get() ) );
98cdf0e10cSrcweir             aMessage = UUIInteractionHelper::replaceMessageWithArguments(
99cdf0e10cSrcweir                 aMessage, aArguments );
100cdf0e10cSrcweir 
101cdf0e10cSrcweir             std::auto_ptr< OpenLockedQueryBox > xDialog(new OpenLockedQueryBox(
102cdf0e10cSrcweir                             pParent, xManager.get(), aMessage ) );
103cdf0e10cSrcweir             nResult = xDialog->Execute();
104cdf0e10cSrcweir         }
105cdf0e10cSrcweir         else if ( nMode == UUI_DOC_SAVE_LOCK )
106cdf0e10cSrcweir         {
107cdf0e10cSrcweir             aArguments.push_back( aInfo.getLength()
108cdf0e10cSrcweir                                   ? aInfo
109cdf0e10cSrcweir                                   : ::rtl::OUString( String(
110cdf0e10cSrcweir                                         ResId( STR_UNKNOWNUSER,
111cdf0e10cSrcweir                                                *xManager.get() ) ) ) );
112cdf0e10cSrcweir             aMessage = String( ResId( STR_TRYLATER_MSG, *xManager.get() ) );
113cdf0e10cSrcweir             aMessage = UUIInteractionHelper::replaceMessageWithArguments(
114cdf0e10cSrcweir                 aMessage, aArguments );
115cdf0e10cSrcweir 
116cdf0e10cSrcweir             std::auto_ptr< TryLaterQueryBox > xDialog(
117cdf0e10cSrcweir                 new TryLaterQueryBox( pParent, xManager.get(), aMessage ) );
118cdf0e10cSrcweir             nResult = xDialog->Execute();
119cdf0e10cSrcweir         }
120cdf0e10cSrcweir         else if ( nMode == UUI_DOC_OWN_LOAD_LOCK ||
121cdf0e10cSrcweir                   nMode == UUI_DOC_OWN_SAVE_LOCK )
122cdf0e10cSrcweir         {
123cdf0e10cSrcweir             aArguments.push_back( aInfo );
124cdf0e10cSrcweir             aMessage = String( ResId( nMode == UUI_DOC_OWN_SAVE_LOCK
125cdf0e10cSrcweir                                           ? STR_ALREADYOPEN_SAVE_MSG
126cdf0e10cSrcweir                                           : STR_ALREADYOPEN_MSG,
127cdf0e10cSrcweir                                       *xManager.get() ) );
128cdf0e10cSrcweir             aMessage = UUIInteractionHelper::replaceMessageWithArguments(
129cdf0e10cSrcweir                 aMessage, aArguments );
130cdf0e10cSrcweir 
131cdf0e10cSrcweir             std::auto_ptr< AlreadyOpenQueryBox > xDialog(
132cdf0e10cSrcweir                 new AlreadyOpenQueryBox( pParent,
133cdf0e10cSrcweir                                          xManager.get(),
134cdf0e10cSrcweir                                          aMessage,
135cdf0e10cSrcweir                                          nMode == UUI_DOC_OWN_SAVE_LOCK ) );
136cdf0e10cSrcweir             nResult = xDialog->Execute();
137cdf0e10cSrcweir         }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir         if ( nResult == RET_YES )
140cdf0e10cSrcweir             xApprove->select();
141cdf0e10cSrcweir         else if ( nResult == RET_NO )
142cdf0e10cSrcweir             xDisapprove->select();
143cdf0e10cSrcweir         else
144cdf0e10cSrcweir             xAbort->select();
145cdf0e10cSrcweir     }
146cdf0e10cSrcweir     catch (std::bad_alloc const &)
147cdf0e10cSrcweir     {
148cdf0e10cSrcweir         throw uno::RuntimeException(
149cdf0e10cSrcweir                   rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
150cdf0e10cSrcweir                   uno::Reference< uno::XInterface >());
151cdf0e10cSrcweir     }
152cdf0e10cSrcweir }
153cdf0e10cSrcweir 
154cdf0e10cSrcweir void
handleChangedByOthersRequest_(Window * pParent,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations)155cdf0e10cSrcweir handleChangedByOthersRequest_(
156cdf0e10cSrcweir     Window * pParent,
157cdf0e10cSrcweir     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
158cdf0e10cSrcweir         rContinuations )
159cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
160cdf0e10cSrcweir {
161cdf0e10cSrcweir     uno::Reference< task::XInteractionApprove > xApprove;
162cdf0e10cSrcweir     uno::Reference< task::XInteractionAbort > xAbort;
163cdf0e10cSrcweir     getContinuations(rContinuations, &xApprove, &xAbort);
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     if ( !xApprove.is() || !xAbort.is() )
166cdf0e10cSrcweir         return;
167cdf0e10cSrcweir 
168cdf0e10cSrcweir     try
169cdf0e10cSrcweir     {
170cdf0e10cSrcweir         vos::OGuard aGuard(Application::GetSolarMutex());
171cdf0e10cSrcweir         std::auto_ptr< ResMgr > xManager(
172cdf0e10cSrcweir             ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
173cdf0e10cSrcweir         if (!xManager.get())
174cdf0e10cSrcweir             return;
175cdf0e10cSrcweir 
176cdf0e10cSrcweir         std::auto_ptr< FileChangedQueryBox > xDialog(
177cdf0e10cSrcweir             new FileChangedQueryBox( pParent, xManager.get() ) );
178cdf0e10cSrcweir         sal_Int32 nResult = xDialog->Execute();
179cdf0e10cSrcweir 
180cdf0e10cSrcweir         if ( nResult == RET_YES )
181cdf0e10cSrcweir             xApprove->select();
182cdf0e10cSrcweir         else
183cdf0e10cSrcweir             xAbort->select();
184cdf0e10cSrcweir     }
185cdf0e10cSrcweir     catch (std::bad_alloc const &)
186cdf0e10cSrcweir     {
187cdf0e10cSrcweir         throw uno::RuntimeException(
188cdf0e10cSrcweir                   rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
189cdf0e10cSrcweir                   uno::Reference< uno::XInterface >());
190cdf0e10cSrcweir     }
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir void
handleLockFileIgnoreRequest_(Window * pParent,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations)194cdf0e10cSrcweir handleLockFileIgnoreRequest_(
195cdf0e10cSrcweir     Window * pParent,
196cdf0e10cSrcweir     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
197cdf0e10cSrcweir         rContinuations )
198cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     uno::Reference< task::XInteractionApprove > xApprove;
201cdf0e10cSrcweir     uno::Reference< task::XInteractionAbort > xAbort;
202cdf0e10cSrcweir     getContinuations(rContinuations, &xApprove, &xAbort);
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     if ( !xApprove.is() || !xAbort.is() )
205cdf0e10cSrcweir         return;
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     try
208cdf0e10cSrcweir     {
209cdf0e10cSrcweir         vos::OGuard aGuard(Application::GetSolarMutex());
210cdf0e10cSrcweir         std::auto_ptr< ResMgr > xManager(
211cdf0e10cSrcweir             ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
212cdf0e10cSrcweir         if (!xManager.get())
213cdf0e10cSrcweir             return;
214cdf0e10cSrcweir 
215cdf0e10cSrcweir         std::auto_ptr< LockFailedQueryBox > xDialog(
216cdf0e10cSrcweir             new LockFailedQueryBox( pParent, xManager.get() ) );
217cdf0e10cSrcweir         sal_Int32 nResult = xDialog->Execute();
218cdf0e10cSrcweir 
219cdf0e10cSrcweir         if ( nResult == RET_OK )
220cdf0e10cSrcweir             xApprove->select();
221cdf0e10cSrcweir         else
222cdf0e10cSrcweir             xAbort->select();
223cdf0e10cSrcweir     }
224cdf0e10cSrcweir     catch (std::bad_alloc const &)
225cdf0e10cSrcweir     {
226cdf0e10cSrcweir         throw uno::RuntimeException(
227cdf0e10cSrcweir                   rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
228cdf0e10cSrcweir                   uno::Reference< uno::XInterface >());
229cdf0e10cSrcweir     }
230cdf0e10cSrcweir }
231cdf0e10cSrcweir 
232cdf0e10cSrcweir } // namespace
233cdf0e10cSrcweir 
234cdf0e10cSrcweir bool
handleLockedDocumentRequest(uno::Reference<task::XInteractionRequest> const & rRequest)235cdf0e10cSrcweir UUIInteractionHelper::handleLockedDocumentRequest(
236cdf0e10cSrcweir     uno::Reference< task::XInteractionRequest > const & rRequest)
237cdf0e10cSrcweir     SAL_THROW((::com::sun::star::uno::RuntimeException))
238cdf0e10cSrcweir {
239cdf0e10cSrcweir     uno::Any aAnyRequest(rRequest->getRequest());
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     document::LockedDocumentRequest aLockedDocumentRequest;
242cdf0e10cSrcweir     if (aAnyRequest >>= aLockedDocumentRequest )
243cdf0e10cSrcweir     {
244cdf0e10cSrcweir         handleLockedDocumentRequest_( getParentProperty(),
245cdf0e10cSrcweir                                       aLockedDocumentRequest.DocumentURL,
246cdf0e10cSrcweir                                       aLockedDocumentRequest.UserInfo,
247cdf0e10cSrcweir                                       rRequest->getContinuations(),
248cdf0e10cSrcweir                                       UUI_DOC_LOAD_LOCK );
249cdf0e10cSrcweir         return true;
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir     document::OwnLockOnDocumentRequest aOwnLockOnDocumentRequest;
253cdf0e10cSrcweir     if (aAnyRequest >>= aOwnLockOnDocumentRequest )
254cdf0e10cSrcweir     {
255cdf0e10cSrcweir         handleLockedDocumentRequest_( getParentProperty(),
256cdf0e10cSrcweir                                       aOwnLockOnDocumentRequest.DocumentURL,
257cdf0e10cSrcweir                                       aOwnLockOnDocumentRequest.TimeInfo,
258cdf0e10cSrcweir                                       rRequest->getContinuations(),
259cdf0e10cSrcweir                                       aOwnLockOnDocumentRequest.IsStoring
260cdf0e10cSrcweir                                           ? UUI_DOC_OWN_SAVE_LOCK
261cdf0e10cSrcweir                                           : UUI_DOC_OWN_LOAD_LOCK );
262cdf0e10cSrcweir         return true;
263cdf0e10cSrcweir     }
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     document::LockedOnSavingRequest aLockedOnSavingRequest;
266cdf0e10cSrcweir     if (aAnyRequest >>= aLockedOnSavingRequest )
267cdf0e10cSrcweir     {
268cdf0e10cSrcweir         handleLockedDocumentRequest_( getParentProperty(),
269cdf0e10cSrcweir                                       aLockedOnSavingRequest.DocumentURL,
270cdf0e10cSrcweir                                       aLockedOnSavingRequest.UserInfo,
271cdf0e10cSrcweir                                       rRequest->getContinuations(),
272cdf0e10cSrcweir                                       UUI_DOC_SAVE_LOCK );
273cdf0e10cSrcweir         return true;
274cdf0e10cSrcweir     }
275cdf0e10cSrcweir     return false;
276cdf0e10cSrcweir }
277cdf0e10cSrcweir 
278cdf0e10cSrcweir bool
handleChangedByOthersRequest(uno::Reference<task::XInteractionRequest> const & rRequest)279cdf0e10cSrcweir UUIInteractionHelper::handleChangedByOthersRequest(
280cdf0e10cSrcweir     uno::Reference< task::XInteractionRequest > const & rRequest)
281cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
282cdf0e10cSrcweir {
283cdf0e10cSrcweir     uno::Any aAnyRequest(rRequest->getRequest());
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     document::ChangedByOthersRequest aChangedByOthersRequest;
286cdf0e10cSrcweir     if (aAnyRequest >>= aChangedByOthersRequest )
287cdf0e10cSrcweir     {
288cdf0e10cSrcweir         handleChangedByOthersRequest_( getParentProperty(),
289cdf0e10cSrcweir                                        rRequest->getContinuations() );
290cdf0e10cSrcweir         return true;
291cdf0e10cSrcweir     }
292cdf0e10cSrcweir     return false;
293cdf0e10cSrcweir }
294cdf0e10cSrcweir 
295cdf0e10cSrcweir bool
handleLockFileIgnoreRequest(uno::Reference<task::XInteractionRequest> const & rRequest)296cdf0e10cSrcweir UUIInteractionHelper::handleLockFileIgnoreRequest(
297cdf0e10cSrcweir     uno::Reference< task::XInteractionRequest > const & rRequest)
298cdf0e10cSrcweir     SAL_THROW((uno::RuntimeException))
299cdf0e10cSrcweir {
300cdf0e10cSrcweir     uno::Any aAnyRequest(rRequest->getRequest());
301cdf0e10cSrcweir 
302cdf0e10cSrcweir     document::LockFileIgnoreRequest aLockFileIgnoreRequest;
303cdf0e10cSrcweir     if (aAnyRequest >>= aLockFileIgnoreRequest )
304cdf0e10cSrcweir     {
305cdf0e10cSrcweir         handleLockFileIgnoreRequest_( getParentProperty(),
306cdf0e10cSrcweir                                       rRequest->getContinuations() );
307cdf0e10cSrcweir         return true;
308cdf0e10cSrcweir     }
309cdf0e10cSrcweir     return false;
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 
313