Line data Source code
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/beans/PropertyValue.hpp"
21 : #include "com/sun/star/task/XInteractionRequest.hpp"
22 : #include "com/sun/star/ucb/InteractiveAugmentedIOException.hpp"
23 :
24 : #include "ids.hrc"
25 :
26 : #include "iahndl.hxx"
27 :
28 : using namespace com::sun::star;
29 :
30 : namespace {
31 :
32 : bool
33 0 : getStringRequestArgument(uno::Sequence< uno::Any > const & rArguments,
34 : rtl::OUString const & rKey,
35 : rtl::OUString * pValue)
36 : SAL_THROW(())
37 : {
38 0 : for (sal_Int32 i = 0; i < rArguments.getLength(); ++i)
39 : {
40 0 : beans::PropertyValue aProperty;
41 0 : if ((rArguments[i] >>= aProperty) && aProperty.Name == rKey)
42 : {
43 0 : rtl::OUString aValue;
44 0 : if (aProperty.Value >>= aValue)
45 : {
46 0 : if (pValue)
47 0 : *pValue = aValue;
48 0 : return true;
49 0 : }
50 : }
51 0 : }
52 0 : return false;
53 : }
54 :
55 : bool
56 0 : getBoolRequestArgument(uno::Sequence< uno::Any > const & rArguments,
57 : rtl::OUString const & rKey,
58 : bool * pValue)
59 : SAL_THROW(())
60 : {
61 0 : for (sal_Int32 i = 0; i < rArguments.getLength(); ++i)
62 : {
63 0 : beans::PropertyValue aProperty;
64 0 : if ((rArguments[i] >>= aProperty) && aProperty.Name == rKey)
65 : {
66 0 : sal_Bool bValue = sal_Bool();
67 0 : if (aProperty.Value >>= bValue)
68 : {
69 0 : if (pValue)
70 0 : *pValue = bValue;
71 0 : return true;
72 : }
73 : }
74 0 : }
75 0 : return false;
76 : }
77 :
78 : bool
79 0 : getResourceNameRequestArgument(uno::Sequence< uno::Any > const & rArguments,
80 : rtl::OUString * pValue)
81 : SAL_THROW(())
82 : {
83 0 : if (!getStringRequestArgument(rArguments, "Uri", pValue))
84 0 : return false;
85 : // Use the resource name only for file URLs, to avoid confusion:
86 : //TODO! work with ucp locality concept instead of hardcoded "file"?
87 0 : if (pValue
88 0 : && pValue->matchIgnoreAsciiCase("file:"))
89 0 : getStringRequestArgument(rArguments, "ResourceName", pValue);
90 0 : return true;
91 : }
92 :
93 : } // namespace
94 :
95 : bool
96 0 : UUIInteractionHelper::handleInteractiveIOException(
97 : uno::Reference< task::XInteractionRequest > const & rRequest,
98 : bool bObtainErrorStringOnly,
99 : bool & bHasErrorString,
100 : rtl::OUString & rErrorString)
101 : SAL_THROW((uno::RuntimeException))
102 : {
103 0 : uno::Any aAnyRequest(rRequest->getRequest());
104 0 : bHasErrorString = false;
105 :
106 0 : ucb::InteractiveIOException aIoException;
107 0 : if (aAnyRequest >>= aIoException)
108 : {
109 0 : uno::Sequence< uno::Any > aRequestArguments;
110 0 : ucb::InteractiveAugmentedIOException aAugmentedIoException;
111 0 : if (aAnyRequest >>= aAugmentedIoException)
112 0 : aRequestArguments = aAugmentedIoException.Arguments;
113 :
114 : ErrCode nErrorCode;
115 0 : std::vector< rtl::OUString > aArguments;
116 : static ErrCode const
117 : aErrorCode[ucb::IOErrorCode_WRONG_VERSION + 1][2]
118 : = { { ERRCODE_IO_ABORT, ERRCODE_UUI_IO_ABORT }, // ABORT
119 : { ERRCODE_IO_ACCESSDENIED, ERRCODE_UUI_IO_ACCESSDENIED },
120 : // ACCESS_DENIED
121 : { ERRCODE_IO_ALREADYEXISTS,
122 : ERRCODE_UUI_IO_ALREADYEXISTS }, // ALREADY_EXISTING
123 : { ERRCODE_IO_BADCRC, ERRCODE_UUI_IO_BADCRC }, // BAD_CRC
124 : { ERRCODE_IO_CANTCREATE, ERRCODE_UUI_IO_CANTCREATE },
125 : // CANT_CREATE
126 : { ERRCODE_IO_CANTREAD, ERRCODE_UUI_IO_CANTREAD },
127 : // CANT_READ
128 : { ERRCODE_IO_CANTSEEK, ERRCODE_UUI_IO_CANTSEEK },
129 : // CANT_SEEK
130 : { ERRCODE_IO_CANTTELL, ERRCODE_UUI_IO_CANTTELL },
131 : // CANT_TELL
132 : { ERRCODE_IO_CANTWRITE, ERRCODE_UUI_IO_CANTWRITE },
133 : // CANT_WRITE
134 : { ERRCODE_IO_CURRENTDIR, ERRCODE_UUI_IO_CURRENTDIR },
135 : // CURRENT_DIRECTORY
136 : { ERRCODE_IO_DEVICENOTREADY, ERRCODE_UUI_IO_NOTREADY },
137 : // DEVICE_NOT_READY
138 : { ERRCODE_IO_NOTSAMEDEVICE,
139 : ERRCODE_UUI_IO_NOTSAMEDEVICE }, // DIFFERENT_DEVICES
140 : { ERRCODE_IO_GENERAL, ERRCODE_UUI_IO_GENERAL }, // GENERAL
141 : { ERRCODE_IO_INVALIDACCESS,
142 : ERRCODE_UUI_IO_INVALIDACCESS }, // INVALID_ACCESS
143 : { ERRCODE_IO_INVALIDCHAR, ERRCODE_UUI_IO_INVALIDCHAR },
144 : // INVALID_CHARACTER
145 : { ERRCODE_IO_INVALIDDEVICE,
146 : ERRCODE_UUI_IO_INVALIDDEVICE }, // INVALID_DEVICE
147 : { ERRCODE_IO_INVALIDLENGTH,
148 : ERRCODE_UUI_IO_INVALIDLENGTH }, // INVALID_LENGTH
149 : { ERRCODE_IO_INVALIDPARAMETER,
150 : ERRCODE_UUI_IO_INVALIDPARAMETER }, // INVALID_PARAMETER
151 : { ERRCODE_IO_ISWILDCARD, ERRCODE_UUI_IO_ISWILDCARD },
152 : // IS_WILDCARD
153 : { ERRCODE_IO_LOCKVIOLATION,
154 : ERRCODE_UUI_IO_LOCKVIOLATION }, // LOCKING_VIOLATION
155 : { ERRCODE_IO_MISPLACEDCHAR,
156 : ERRCODE_UUI_IO_MISPLACEDCHAR }, // MISPLACED_CHARACTER
157 : { ERRCODE_IO_NAMETOOLONG, ERRCODE_UUI_IO_NAMETOOLONG },
158 : // NAME_TOO_LONG
159 : { ERRCODE_IO_NOTEXISTS, ERRCODE_UUI_IO_NOTEXISTS },
160 : // NOT_EXISTING
161 : { ERRCODE_IO_NOTEXISTSPATH,
162 : ERRCODE_UUI_IO_NOTEXISTSPATH }, // NOT_EXISTING_PATH
163 : { ERRCODE_IO_NOTSUPPORTED, ERRCODE_UUI_IO_NOTSUPPORTED },
164 : // NOT_SUPPORTED
165 : { ERRCODE_IO_NOTADIRECTORY,
166 : ERRCODE_UUI_IO_NOTADIRECTORY }, // NO_DIRECTORY
167 : { ERRCODE_IO_NOTAFILE, ERRCODE_UUI_IO_NOTAFILE },
168 : // NO_FILE
169 : { ERRCODE_IO_OUTOFSPACE, ERRCODE_UUI_IO_OUTOFSPACE },
170 : // OUT_OF_DISK_SPACE
171 : { ERRCODE_IO_TOOMANYOPENFILES,
172 : ERRCODE_UUI_IO_TOOMANYOPENFILES },
173 : // OUT_OF_FILE_HANDLES
174 : { ERRCODE_IO_OUTOFMEMORY, ERRCODE_UUI_IO_OUTOFMEMORY },
175 : // OUT_OF_MEMORY
176 : { ERRCODE_IO_PENDING, ERRCODE_UUI_IO_PENDING }, // PENDING
177 : { ERRCODE_IO_RECURSIVE, ERRCODE_UUI_IO_RECURSIVE },
178 : // RECURSIVE
179 : { ERRCODE_IO_UNKNOWN, ERRCODE_UUI_IO_UNKNOWN }, // UNKNOWN
180 : { ERRCODE_IO_WRITEPROTECTED,
181 : ERRCODE_UUI_IO_WRITEPROTECTED }, // WRITE_PROTECTED
182 : { ERRCODE_IO_WRONGFORMAT, ERRCODE_UUI_IO_WRONGFORMAT },
183 : // WRONG_FORMAT
184 : { ERRCODE_IO_WRONGVERSION,
185 : ERRCODE_UUI_IO_WRONGVERSION } }; // WRONG_VERSION
186 0 : switch (aIoException.Code)
187 : {
188 : case ucb::IOErrorCode_CANT_CREATE:
189 : {
190 0 : OUString aArgFolder;
191 0 : if (getStringRequestArgument(aRequestArguments, "Folder", &aArgFolder))
192 : {
193 0 : OUString aArgUri;
194 0 : if (getResourceNameRequestArgument(aRequestArguments,
195 : &aArgUri))
196 : {
197 0 : nErrorCode = ERRCODE_UUI_IO_CANTCREATE;
198 0 : aArguments.reserve(2);
199 0 : aArguments.push_back(aArgUri);
200 0 : aArguments.push_back(aArgFolder);
201 : }
202 : else
203 : {
204 0 : nErrorCode = ERRCODE_UUI_IO_CANTCREATE_NONAME;
205 0 : aArguments.push_back(aArgFolder);
206 0 : }
207 : }
208 : else
209 0 : nErrorCode = aErrorCode[aIoException.Code][0];
210 0 : break;
211 : }
212 :
213 : case ucb::IOErrorCode_DEVICE_NOT_READY:
214 : {
215 0 : rtl::OUString aArgUri;
216 0 : if (getResourceNameRequestArgument(aRequestArguments,
217 : &aArgUri))
218 : {
219 0 : OUString aResourceType;
220 0 : getStringRequestArgument(aRequestArguments, "ResourceType", &aResourceType);
221 0 : bool bRemovable = false;
222 0 : getBoolRequestArgument(aRequestArguments, "Removable", &bRemovable);
223 0 : nErrorCode = aResourceType == "volume"
224 : ? (bRemovable
225 : ? ERRCODE_UUI_IO_NOTREADY_VOLUME_REMOVABLE
226 : : ERRCODE_UUI_IO_NOTREADY_VOLUME)
227 : : (bRemovable
228 : ? ERRCODE_UUI_IO_NOTREADY_REMOVABLE
229 0 : : ERRCODE_UUI_IO_NOTREADY);
230 0 : aArguments.push_back(aArgUri);
231 : }
232 : else
233 0 : nErrorCode = aErrorCode[aIoException.Code][0];
234 0 : break;
235 : }
236 :
237 : case ucb::IOErrorCode_DIFFERENT_DEVICES:
238 : {
239 0 : rtl::OUString aArgVolume;
240 0 : rtl::OUString aArgOtherVolume;
241 0 : if (getStringRequestArgument(aRequestArguments, "Volume", &aArgVolume)
242 : && getStringRequestArgument(aRequestArguments, "OtherVolume",
243 0 : &aArgOtherVolume))
244 : {
245 0 : nErrorCode = aErrorCode[aIoException.Code][1];
246 0 : aArguments.reserve(2);
247 0 : aArguments.push_back(aArgVolume);
248 0 : aArguments.push_back(aArgOtherVolume);
249 : }
250 : else
251 0 : nErrorCode = aErrorCode[aIoException.Code][0];
252 0 : break;
253 : }
254 :
255 : case ucb::IOErrorCode_NOT_EXISTING:
256 : {
257 0 : rtl::OUString aArgUri;
258 0 : if (getResourceNameRequestArgument(aRequestArguments,
259 : &aArgUri))
260 : {
261 0 : rtl::OUString aResourceType;
262 : getStringRequestArgument(aRequestArguments, "ResourceType",
263 0 : &aResourceType);
264 0 : nErrorCode = aResourceType == "volume"
265 : ? ERRCODE_UUI_IO_NOTEXISTS_VOLUME
266 0 : : (aResourceType == "folder"
267 : ? ERRCODE_UUI_IO_NOTEXISTS_FOLDER
268 0 : : ERRCODE_UUI_IO_NOTEXISTS);
269 0 : aArguments.push_back(aArgUri);
270 : }
271 : else
272 0 : nErrorCode = aErrorCode[aIoException.Code][0];
273 0 : break;
274 : }
275 :
276 : default:
277 : {
278 0 : rtl::OUString aArgUri;
279 0 : if (getResourceNameRequestArgument(aRequestArguments,
280 : &aArgUri))
281 : {
282 0 : nErrorCode = aErrorCode[aIoException.Code][1];
283 0 : aArguments.push_back(aArgUri);
284 : }
285 : else
286 0 : nErrorCode = aErrorCode[aIoException.Code][0];
287 0 : break;
288 : }
289 : }
290 :
291 : handleErrorHandlerRequest(aIoException.Classification,
292 : nErrorCode,
293 : aArguments,
294 0 : rRequest->getContinuations(),
295 : bObtainErrorStringOnly,
296 : bHasErrorString,
297 0 : rErrorString);
298 0 : return true;
299 : }
300 0 : return false;
301 : }
302 :
303 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|