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