xref: /core/uui/source/iahndl-locking.cxx (revision ff9ff6018bea7c1a4524c8edca8ef554c74e4b3f)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <com/sun/star/document/ChangedByOthersRequest.hpp>
21 #include <com/sun/star/document/LockedDocumentRequest.hpp>
22 #include <com/sun/star/document/LockedOnSavingRequest.hpp>
23 #include <com/sun/star/document/LockFileIgnoreRequest.hpp>
24 #include <com/sun/star/document/LockFileCorruptRequest.hpp>
25 #include <com/sun/star/document/OwnLockOnDocumentRequest.hpp>
26 #include <com/sun/star/document/ReloadEditableRequest.hpp>
27 #include <com/sun/star/task/XInteractionApprove.hpp>
28 #include <com/sun/star/task/XInteractionDisapprove.hpp>
29 #include <com/sun/star/task/XInteractionAbort.hpp>
30 #include <com/sun/star/task/XInteractionRequest.hpp>
31 #include <com/sun/star/task/XInteractionRetry.hpp>
32 
33 #include <unotools/resmgr.hxx>
34 #include <vcl/svapp.hxx>
35 #include <officecfg/Office/Common.hxx>
36 
37 #include <strings.hrc>
38 #include "getcontinuations.hxx"
39 #include "openlocked.hxx"
40 #include "trylater.hxx"
41 #include "alreadyopen.hxx"
42 #include "filechanged.hxx"
43 #include "lockfailed.hxx"
44 #include "lockcorrupt.hxx"
45 #include "reloadeditable.hxx"
46 
47 #include "iahndl.hxx"
48 
49 #define UUI_DOC_LOAD_LOCK       0
50 #define UUI_DOC_OWN_LOAD_LOCK   1
51 #define UUI_DOC_SAVE_LOCK       2
52 #define UUI_DOC_OWN_SAVE_LOCK   3
53 
54 using namespace com::sun::star;
55 
56 namespace {
57 
handleReloadEditableRequest_(weld::Window * pParent,const OUString & aDocumentURL,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations)58 void handleReloadEditableRequest_(
59     weld::Window* pParent, const OUString& aDocumentURL,
60     uno::Sequence<uno::Reference<task::XInteractionContinuation>> const& rContinuations)
61 {
62     uno::Reference<task::XInteractionApprove> xApprove;
63     uno::Reference<task::XInteractionAbort> xAbort;
64     getContinuations(rContinuations, &xApprove, &xAbort);
65 
66     if (!xApprove.is() || !xAbort.is())
67         return;
68 
69     SolarMutexGuard aGuard;
70     std::locale aResLocale = Translate::Create("uui");
71 
72     OUString aMessage;
73     std::vector<OUString> aArguments { aDocumentURL };
74 
75     aMessage = Translate::get(STR_RELOADEDITABLE_MSG, aResLocale);
76     aMessage = UUIInteractionHelper::replaceMessageWithArguments(aMessage, aArguments);
77 
78     ReloadEditableQueryBox aDialog(pParent, aResLocale, aMessage);
79     int nResult = aDialog.run();
80 
81     if (nResult == RET_YES)
82         xApprove->select();
83     else
84         xAbort->select();
85 }
86 
87 void
handleLockedDocumentRequest_(weld::Window * pParent,const OUString & aDocumentURL,const OUString & aInfo,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations,sal_uInt16 nMode)88 handleLockedDocumentRequest_(
89     weld::Window * pParent,
90     const OUString& aDocumentURL,
91     const OUString& aInfo,
92     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
93         rContinuations,
94     sal_uInt16 nMode )
95 {
96     uno::Reference< task::XInteractionApprove > xApprove;
97     uno::Reference< task::XInteractionDisapprove > xDisapprove;
98     uno::Reference< task::XInteractionAbort > xAbort;
99     // In case an option to ignore lock and open the file is available
100     uno::Reference< task::XInteractionRetry > xRetry;
101     getContinuations(rContinuations, &xApprove, &xDisapprove, &xAbort, &xRetry);
102 
103     if ( !xApprove.is() || !xDisapprove.is() || !xAbort.is() )
104         return;
105 
106     SolarMutexGuard aGuard;
107     std::locale aResLocale = Translate::Create("uui");
108 
109     OUString aMessage;
110     OUString aHiddenData;
111     std::vector< OUString > aArguments { aDocumentURL };
112 
113     bool bAllowOverride = xRetry.is() && officecfg::Office::Common::Misc::AllowOverrideLocking::get();
114 
115     sal_Int32 nResult = RET_CANCEL;
116     if ( nMode == UUI_DOC_LOAD_LOCK )
117     {
118         aArguments.push_back( !aInfo.isEmpty()
119                               ? aInfo
120                               : Translate::get( STR_UNKNOWNUSER, aResLocale) );
121 
122         aHiddenData = Translate::get(STR_OPENLOCKED_HIDDEN_DATA, aResLocale);
123         aHiddenData = UUIInteractionHelper::replaceMessageWithArguments(
124             aHiddenData, aArguments );
125 
126         vcl::OpenLockedQueryBox aDialog(pParent, aHiddenData, bAllowOverride);
127         nResult = aDialog.run();
128     }
129     else if ( nMode == UUI_DOC_SAVE_LOCK )
130     {
131         aArguments.push_back( !aInfo.isEmpty()
132                               ? aInfo
133                               : Translate::get( STR_UNKNOWNUSER,
134                                            aResLocale ) );
135         aMessage = Translate::get(bAllowOverride ? STR_OVERWRITE_IGNORELOCK_MSG : STR_TRYLATER_MSG,
136             aResLocale);
137         aMessage = UUIInteractionHelper::replaceMessageWithArguments(
138             aMessage, aArguments );
139 
140         TryLaterQueryBox aDialog(pParent, aResLocale, aMessage, bAllowOverride);
141         nResult = aDialog.run();
142     }
143     else if ( nMode == UUI_DOC_OWN_LOAD_LOCK ||
144               nMode == UUI_DOC_OWN_SAVE_LOCK )
145     {
146         aArguments.push_back( aInfo );
147         aMessage = Translate::get(nMode == UUI_DOC_OWN_SAVE_LOCK
148                                       ? STR_ALREADYOPEN_SAVE_MSG
149                                       : STR_ALREADYOPEN_MSG,
150                                   aResLocale );
151         aMessage = UUIInteractionHelper::replaceMessageWithArguments(
152             aMessage, aArguments );
153 
154         AlreadyOpenQueryBox aDialog(pParent, aResLocale, aMessage, nMode == UUI_DOC_OWN_SAVE_LOCK);
155         nResult = aDialog.run();
156     }
157 
158     if ( nResult == RET_YES )
159         xApprove->select();
160     else if ( nResult == RET_NO )
161         xDisapprove->select();
162     else if ( nResult == RET_IGNORE && xRetry.is() )
163         xRetry->select();
164     else if ( nResult != RET_RETRY )
165         xAbort->select();
166 }
167 
168 void
handleChangedByOthersRequest_(weld::Window * pParent,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations)169 handleChangedByOthersRequest_(
170     weld::Window * pParent,
171     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
172         rContinuations )
173 {
174     uno::Reference< task::XInteractionApprove > xApprove;
175     uno::Reference< task::XInteractionAbort > xAbort;
176     getContinuations(rContinuations, &xApprove, &xAbort);
177 
178     if ( !xApprove.is() || !xAbort.is() )
179         return;
180 
181     SolarMutexGuard aGuard;
182     std::locale aResLocale = Translate::Create("uui");
183     FileChangedQueryBox aDialog(pParent, aResLocale);
184     sal_Int32 nResult = aDialog.run();
185 
186     if ( nResult == RET_YES )
187         xApprove->select();
188     else
189         xAbort->select();
190 }
191 
192 const sal_uInt16  UUI_DOC_CreateErrDlg  = 0;
193 const sal_uInt16  UUI_DOC_CorruptErrDlg = 1;
194 
195 
196 
197 void
handleLockFileProblemRequest_(weld::Window * pParent,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations,sal_uInt16 nWhichDlg)198 handleLockFileProblemRequest_(
199     weld::Window * pParent,
200     uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
201         rContinuations, sal_uInt16 nWhichDlg )
202 {
203     uno::Reference< task::XInteractionApprove > xApprove;
204     uno::Reference< task::XInteractionAbort > xAbort;
205     getContinuations(rContinuations, &xApprove, &xAbort);
206 
207     if ( !xApprove.is() || !xAbort.is() )
208         return;
209 
210     SolarMutexGuard aGuard;
211     std::locale aResLocale = Translate::Create("uui");
212 
213     sal_Int32 nResult;
214 
215     if (nWhichDlg == UUI_DOC_CreateErrDlg)
216     {
217         LockFailedQueryBox aDialog(pParent, aResLocale);
218         nResult = aDialog.run();
219     }
220     else
221     {
222         LockCorruptQueryBox aDialog(pParent, aResLocale);
223         nResult = aDialog.run();
224     }
225 
226     if ( nResult == RET_OK )
227         xApprove->select();
228     else if ( nResult != RET_RETRY )
229         xAbort->select();
230 }
231 
232 } // namespace
233 
234 bool
handleLockedDocumentRequest(uno::Reference<task::XInteractionRequest> const & rRequest)235 UUIInteractionHelper::handleLockedDocumentRequest(
236     uno::Reference< task::XInteractionRequest > const & rRequest)
237 {
238     uno::Any aAnyRequest(rRequest->getRequest());
239 
240     document::LockedDocumentRequest aLockedDocumentRequest;
241     if (aAnyRequest >>= aLockedDocumentRequest )
242     {
243         uno::Reference<awt::XWindow> xParent = getParentXWindow();
244         handleLockedDocumentRequest_(Application::GetFrameWeld(xParent),
245                                      aLockedDocumentRequest.DocumentURL,
246                                      aLockedDocumentRequest.UserInfo,
247                                      rRequest->getContinuations(),
248                                      UUI_DOC_LOAD_LOCK);
249         return true;
250     }
251 
252     document::OwnLockOnDocumentRequest aOwnLockOnDocumentRequest;
253     if (aAnyRequest >>= aOwnLockOnDocumentRequest )
254     {
255         uno::Reference<awt::XWindow> xParent = getParentXWindow();
256         handleLockedDocumentRequest_(Application::GetFrameWeld(xParent),
257                                      aOwnLockOnDocumentRequest.DocumentURL,
258                                      aOwnLockOnDocumentRequest.TimeInfo,
259                                      rRequest->getContinuations(),
260                                      aOwnLockOnDocumentRequest.IsStoring
261                                          ? UUI_DOC_OWN_SAVE_LOCK
262                                          : UUI_DOC_OWN_LOAD_LOCK);
263         return true;
264     }
265 
266     document::LockedOnSavingRequest aLockedOnSavingRequest;
267     if (aAnyRequest >>= aLockedOnSavingRequest )
268     {
269         uno::Reference<awt::XWindow> xParent = getParentXWindow();
270         handleLockedDocumentRequest_(Application::GetFrameWeld(xParent),
271                                      aLockedOnSavingRequest.DocumentURL,
272                                      aLockedOnSavingRequest.UserInfo,
273                                      rRequest->getContinuations(),
274                                      UUI_DOC_SAVE_LOCK);
275         return true;
276     }
277     return false;
278 }
279 
280 bool
handleChangedByOthersRequest(uno::Reference<task::XInteractionRequest> const & rRequest)281 UUIInteractionHelper::handleChangedByOthersRequest(
282     uno::Reference< task::XInteractionRequest > const & rRequest)
283 {
284     uno::Any aAnyRequest(rRequest->getRequest());
285 
286     document::ChangedByOthersRequest aChangedByOthersRequest;
287     if (aAnyRequest >>= aChangedByOthersRequest )
288     {
289         uno::Reference<awt::XWindow> xParent = getParentXWindow();
290         handleChangedByOthersRequest_(Application::GetFrameWeld(xParent),
291                                       rRequest->getContinuations());
292         return true;
293     }
294     return false;
295 }
296 
297 
298 bool
handleLockFileProblemRequest(uno::Reference<task::XInteractionRequest> const & rRequest)299 UUIInteractionHelper::handleLockFileProblemRequest(
300     uno::Reference< task::XInteractionRequest > const & rRequest)
301 {
302     uno::Any aAnyRequest(rRequest->getRequest());
303 
304     document::LockFileIgnoreRequest aLockFileIgnoreRequest;
305     if (aAnyRequest >>= aLockFileIgnoreRequest )
306     {
307         uno::Reference<awt::XWindow> xParent = getParentXWindow();
308         handleLockFileProblemRequest_(Application::GetFrameWeld(xParent),
309                                       rRequest->getContinuations(), UUI_DOC_CreateErrDlg);
310         return true;
311     }
312 
313     document::LockFileCorruptRequest aLockFileCorruptRequest;
314     if (aAnyRequest >>= aLockFileCorruptRequest )
315     {
316         uno::Reference<awt::XWindow> xParent = getParentXWindow();
317         handleLockFileProblemRequest_(Application::GetFrameWeld(xParent),
318                                       rRequest->getContinuations(), UUI_DOC_CorruptErrDlg);
319         return true;
320     }
321 
322     return false;
323 }
324 
handleReloadEditableRequest(uno::Reference<task::XInteractionRequest> const & rRequest)325 bool UUIInteractionHelper::handleReloadEditableRequest(
326     uno::Reference<task::XInteractionRequest> const& rRequest)
327 {
328     uno::Any aAnyRequest(rRequest->getRequest());
329 
330     document::ReloadEditableRequest aReloadEditableRequest;
331     if (aAnyRequest >>= aReloadEditableRequest)
332     {
333         uno::Reference<awt::XWindow> xParent = getParentXWindow();
334         handleReloadEditableRequest_(
335             Application::GetFrameWeld(xParent), aReloadEditableRequest.DocumentURL,
336             rRequest->getContinuations());
337         return true;
338     }
339 
340     return false;
341 }
342 
343 
344 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
345