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