1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #include "com/sun/star/beans/PropertyValue.hpp" 25 #include "com/sun/star/task/XInteractionRequest.hpp" 26 #include "com/sun/star/ucb/InteractiveAugmentedIOException.hpp" 27 28 #include "ids.hrc" 29 30 #include "iahndl.hxx" 31 32 using namespace com::sun::star; 33 34 namespace { 35 36 bool 37 getStringRequestArgument(uno::Sequence< uno::Any > const & rArguments, 38 rtl::OUString const & rKey, 39 rtl::OUString * pValue) 40 SAL_THROW(()) 41 { 42 for (sal_Int32 i = 0; i < rArguments.getLength(); ++i) 43 { 44 beans::PropertyValue aProperty; 45 if ((rArguments[i] >>= aProperty) && aProperty.Name == rKey) 46 { 47 rtl::OUString aValue; 48 if (aProperty.Value >>= aValue) 49 { 50 if (pValue) 51 *pValue = aValue; 52 return true; 53 } 54 } 55 } 56 return false; 57 } 58 59 bool 60 getBoolRequestArgument(uno::Sequence< uno::Any > const & rArguments, 61 rtl::OUString const & rKey, 62 bool * pValue) 63 SAL_THROW(()) 64 { 65 for (sal_Int32 i = 0; i < rArguments.getLength(); ++i) 66 { 67 beans::PropertyValue aProperty; 68 if ((rArguments[i] >>= aProperty) && aProperty.Name == rKey) 69 { 70 sal_Bool bValue = sal_Bool(); 71 if (aProperty.Value >>= bValue) 72 { 73 if (pValue) 74 *pValue = bValue; 75 return true; 76 } 77 } 78 } 79 return false; 80 } 81 82 bool 83 getResourceNameRequestArgument(uno::Sequence< uno::Any > const & rArguments, 84 rtl::OUString * pValue) 85 SAL_THROW(()) 86 { 87 if (!getStringRequestArgument(rArguments, 88 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 89 "Uri")), 90 pValue)) 91 return false; 92 // Use the resource name only for file URLs, to avoid confusion: 93 //TODO! work with ucp locality concept instead of hardcoded "file"? 94 if (pValue 95 && pValue->matchIgnoreAsciiCaseAsciiL(RTL_CONSTASCII_STRINGPARAM( 96 "file:"))) 97 getStringRequestArgument(rArguments, 98 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 99 "ResourceName")), 100 pValue); 101 return true; 102 } 103 104 } // namespace 105 106 bool 107 UUIInteractionHelper::handleInteractiveIOException( 108 uno::Reference< task::XInteractionRequest > const & rRequest, 109 bool bObtainErrorStringOnly, 110 bool & bHasErrorString, 111 rtl::OUString & rErrorString) 112 SAL_THROW((uno::RuntimeException)) 113 { 114 uno::Any aAnyRequest(rRequest->getRequest()); 115 bHasErrorString = false; 116 117 ucb::InteractiveIOException aIoException; 118 if (aAnyRequest >>= aIoException) 119 { 120 uno::Sequence< uno::Any > aRequestArguments; 121 ucb::InteractiveAugmentedIOException aAugmentedIoException; 122 if (aAnyRequest >>= aAugmentedIoException) 123 aRequestArguments = aAugmentedIoException.Arguments; 124 125 ErrCode nErrorCode; 126 std::vector< rtl::OUString > aArguments; 127 static ErrCode const 128 aErrorCode[ucb::IOErrorCode_WRONG_VERSION + 1][2] 129 = { { ERRCODE_IO_ABORT, ERRCODE_UUI_IO_ABORT }, // ABORT 130 { ERRCODE_IO_ACCESSDENIED, ERRCODE_UUI_IO_ACCESSDENIED }, 131 // ACCESS_DENIED 132 { ERRCODE_IO_ALREADYEXISTS, 133 ERRCODE_UUI_IO_ALREADYEXISTS }, // ALREADY_EXISTING 134 { ERRCODE_IO_BADCRC, ERRCODE_UUI_IO_BADCRC }, // BAD_CRC 135 { ERRCODE_IO_CANTCREATE, ERRCODE_UUI_IO_CANTCREATE }, 136 // CANT_CREATE 137 { ERRCODE_IO_CANTREAD, ERRCODE_UUI_IO_CANTREAD }, 138 // CANT_READ 139 { ERRCODE_IO_CANTSEEK, ERRCODE_UUI_IO_CANTSEEK }, 140 // CANT_SEEK 141 { ERRCODE_IO_CANTTELL, ERRCODE_UUI_IO_CANTTELL }, 142 // CANT_TELL 143 { ERRCODE_IO_CANTWRITE, ERRCODE_UUI_IO_CANTWRITE }, 144 // CANT_WRITE 145 { ERRCODE_IO_CURRENTDIR, ERRCODE_UUI_IO_CURRENTDIR }, 146 // CURRENT_DIRECTORY 147 { ERRCODE_IO_DEVICENOTREADY, ERRCODE_UUI_IO_NOTREADY }, 148 // DEVICE_NOT_READY 149 { ERRCODE_IO_NOTSAMEDEVICE, 150 ERRCODE_UUI_IO_NOTSAMEDEVICE }, // DIFFERENT_DEVICES 151 { ERRCODE_IO_GENERAL, ERRCODE_UUI_IO_GENERAL }, // GENERAL 152 { ERRCODE_IO_INVALIDACCESS, 153 ERRCODE_UUI_IO_INVALIDACCESS }, // INVALID_ACCESS 154 { ERRCODE_IO_INVALIDCHAR, ERRCODE_UUI_IO_INVALIDCHAR }, 155 // INVALID_CHARACTER 156 { ERRCODE_IO_INVALIDDEVICE, 157 ERRCODE_UUI_IO_INVALIDDEVICE }, // INVALID_DEVICE 158 { ERRCODE_IO_INVALIDLENGTH, 159 ERRCODE_UUI_IO_INVALIDLENGTH }, // INVALID_LENGTH 160 { ERRCODE_IO_INVALIDPARAMETER, 161 ERRCODE_UUI_IO_INVALIDPARAMETER }, // INVALID_PARAMETER 162 { ERRCODE_IO_ISWILDCARD, ERRCODE_UUI_IO_ISWILDCARD }, 163 // IS_WILDCARD 164 { ERRCODE_IO_LOCKVIOLATION, 165 ERRCODE_UUI_IO_LOCKVIOLATION }, // LOCKING_VIOLATION 166 { ERRCODE_IO_MISPLACEDCHAR, 167 ERRCODE_UUI_IO_MISPLACEDCHAR }, // MISPLACED_CHARACTER 168 { ERRCODE_IO_NAMETOOLONG, ERRCODE_UUI_IO_NAMETOOLONG }, 169 // NAME_TOO_LONG 170 { ERRCODE_IO_NOTEXISTS, ERRCODE_UUI_IO_NOTEXISTS }, 171 // NOT_EXISTING 172 { ERRCODE_IO_NOTEXISTSPATH, 173 ERRCODE_UUI_IO_NOTEXISTSPATH }, // NOT_EXISTING_PATH 174 { ERRCODE_IO_NOTSUPPORTED, ERRCODE_UUI_IO_NOTSUPPORTED }, 175 // NOT_SUPPORTED 176 { ERRCODE_IO_NOTADIRECTORY, 177 ERRCODE_UUI_IO_NOTADIRECTORY }, // NO_DIRECTORY 178 { ERRCODE_IO_NOTAFILE, ERRCODE_UUI_IO_NOTAFILE }, 179 // NO_FILE 180 { ERRCODE_IO_OUTOFSPACE, ERRCODE_UUI_IO_OUTOFSPACE }, 181 // OUT_OF_DISK_SPACE 182 { ERRCODE_IO_TOOMANYOPENFILES, 183 ERRCODE_UUI_IO_TOOMANYOPENFILES }, 184 // OUT_OF_FILE_HANDLES 185 { ERRCODE_IO_OUTOFMEMORY, ERRCODE_UUI_IO_OUTOFMEMORY }, 186 // OUT_OF_MEMORY 187 { ERRCODE_IO_PENDING, ERRCODE_UUI_IO_PENDING }, // PENDING 188 { ERRCODE_IO_RECURSIVE, ERRCODE_UUI_IO_RECURSIVE }, 189 // RECURSIVE 190 { ERRCODE_IO_UNKNOWN, ERRCODE_UUI_IO_UNKNOWN }, // UNKNOWN 191 { ERRCODE_IO_WRITEPROTECTED, 192 ERRCODE_UUI_IO_WRITEPROTECTED }, // WRITE_PROTECTED 193 { ERRCODE_IO_WRONGFORMAT, ERRCODE_UUI_IO_WRONGFORMAT }, 194 // WRONG_FORMAT 195 { ERRCODE_IO_WRONGVERSION, 196 ERRCODE_UUI_IO_WRONGVERSION } }; // WRONG_VERSION 197 switch (aIoException.Code) 198 { 199 case ucb::IOErrorCode_CANT_CREATE: 200 { 201 rtl::OUString aArgFolder; 202 if (getStringRequestArgument( 203 aRequestArguments, 204 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 205 "Folder")), 206 &aArgFolder)) 207 { 208 rtl::OUString aArgUri; 209 if (getResourceNameRequestArgument(aRequestArguments, 210 &aArgUri)) 211 { 212 nErrorCode = ERRCODE_UUI_IO_CANTCREATE; 213 aArguments.reserve(2); 214 aArguments.push_back(aArgUri); 215 aArguments.push_back(aArgFolder); 216 } 217 else 218 { 219 nErrorCode = ERRCODE_UUI_IO_CANTCREATE_NONAME; 220 aArguments.push_back(aArgFolder); 221 } 222 } 223 else 224 nErrorCode = aErrorCode[aIoException.Code][0]; 225 break; 226 } 227 228 case ucb::IOErrorCode_DEVICE_NOT_READY: 229 { 230 rtl::OUString aArgUri; 231 if (getResourceNameRequestArgument(aRequestArguments, 232 &aArgUri)) 233 { 234 rtl::OUString aResourceType; 235 getStringRequestArgument( 236 aRequestArguments, 237 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 238 "ResourceType")), 239 &aResourceType); 240 bool bRemovable = false; 241 getBoolRequestArgument(aRequestArguments, 242 rtl::OUString( 243 RTL_CONSTASCII_USTRINGPARAM( 244 "Removable")), 245 &bRemovable); 246 nErrorCode 247 = aResourceType.equalsAsciiL( 248 RTL_CONSTASCII_STRINGPARAM("volume")) 249 ? (bRemovable 250 ? ERRCODE_UUI_IO_NOTREADY_VOLUME_REMOVABLE 251 : ERRCODE_UUI_IO_NOTREADY_VOLUME) 252 : (bRemovable 253 ? ERRCODE_UUI_IO_NOTREADY_REMOVABLE 254 : ERRCODE_UUI_IO_NOTREADY); 255 aArguments.push_back(aArgUri); 256 } 257 else 258 nErrorCode = aErrorCode[aIoException.Code][0]; 259 break; 260 } 261 262 case ucb::IOErrorCode_DIFFERENT_DEVICES: 263 { 264 rtl::OUString aArgVolume; 265 rtl::OUString aArgOtherVolume; 266 if (getStringRequestArgument( 267 aRequestArguments, 268 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 269 "Volume")), 270 &aArgVolume) 271 && getStringRequestArgument( 272 aRequestArguments, 273 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 274 "OtherVolume")), 275 &aArgOtherVolume)) 276 { 277 nErrorCode = aErrorCode[aIoException.Code][1]; 278 aArguments.reserve(2); 279 aArguments.push_back(aArgVolume); 280 aArguments.push_back(aArgOtherVolume); 281 } 282 else 283 nErrorCode = aErrorCode[aIoException.Code][0]; 284 break; 285 } 286 287 case ucb::IOErrorCode_NOT_EXISTING: 288 { 289 rtl::OUString aArgUri; 290 if (getResourceNameRequestArgument(aRequestArguments, 291 &aArgUri)) 292 { 293 rtl::OUString aResourceType; 294 getStringRequestArgument( 295 aRequestArguments, 296 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 297 "ResourceType")), 298 &aResourceType); 299 nErrorCode 300 = aResourceType.equalsAsciiL( 301 RTL_CONSTASCII_STRINGPARAM("volume")) 302 ? ERRCODE_UUI_IO_NOTEXISTS_VOLUME 303 : (aResourceType.equalsAsciiL( 304 RTL_CONSTASCII_STRINGPARAM("folder")) 305 ? ERRCODE_UUI_IO_NOTEXISTS_FOLDER 306 : ERRCODE_UUI_IO_NOTEXISTS); 307 aArguments.push_back(aArgUri); 308 } 309 else 310 nErrorCode = aErrorCode[aIoException.Code][0]; 311 break; 312 } 313 314 default: 315 { 316 rtl::OUString aArgUri; 317 if (getResourceNameRequestArgument(aRequestArguments, 318 &aArgUri)) 319 { 320 nErrorCode = aErrorCode[aIoException.Code][1]; 321 aArguments.push_back(aArgUri); 322 } 323 else 324 nErrorCode = aErrorCode[aIoException.Code][0]; 325 break; 326 } 327 } 328 329 handleErrorHandlerRequest(aIoException.Classification, 330 nErrorCode, 331 aArguments, 332 rRequest->getContinuations(), 333 bObtainErrorStringOnly, 334 bHasErrorString, 335 rErrorString); 336 return true; 337 } 338 return false; 339 } 340