if (osl::FileBase::getSystemPathFromFileURL(
rPhysicalUrl,
aResourceName)
== osl::FileBase::E_None)
bResourceName = true;
// The resource types "folder" (i.e., directory) and // "volume" seem to be // the most interesting when producing meaningful error messages:
osl::DirectoryItem aItem; if (osl::DirectoryItem::get(rPhysicalUrl, aItem) ==
osl::FileBase::E_None)
{
osl::FileStatus aStatus( osl_FileStatus_Mask_Type ); if (aItem.getFileStatus(aStatus) == osl::FileBase::E_None) switch (aStatus.getFileType())
{ case osl::FileStatus::Directory:
aResourceType = "folder";
bResourceType = true; break;
case osl::FileStatus::Volume:
{
aResourceType = "volume";
bResourceType = true;
osl::VolumeInfo aVolumeInfo(
osl_VolumeInfo_Mask_Attributes ); if( osl::Directory::getVolumeInfo(
rPhysicalUrl,aVolumeInfo ) ==
osl::FileBase::E_None )
{
bRemovable = aVolumeInfo.getRemoveableFlag();
bRemoveProperty = true;
}
} break; case osl::FileStatus::Regular: case osl::FileStatus::Fifo: case osl::FileStatus::Socket: case osl::FileStatus::Link: case osl::FileStatus::Special: case osl::FileStatus::Unknown: // do nothing for now break;
}
}
if( errorCode == TaskHandlerErr::UNSUPPORTED_COMMAND )
{
aAny <<= UnsupportedCommandException( OSL_LOG_PREFIX );
cancelCommandExecution( aAny,xEnv );
} elseif( errorCode == TaskHandlerErr::WRONG_SETPROPERTYVALUES_ARGUMENT ||
errorCode == TaskHandlerErr::WRONG_GETPROPERTYVALUES_ARGUMENT ||
errorCode == TaskHandlerErr::WRONG_OPEN_ARGUMENT ||
errorCode == TaskHandlerErr::WRONG_DELETE_ARGUMENT ||
errorCode == TaskHandlerErr::WRONG_TRANSFER_ARGUMENT ||
errorCode == TaskHandlerErr::WRONG_INSERT_ARGUMENT ||
errorCode == TaskHandlerErr::WRONG_CREATENEWCONTENT_ARGUMENT )
{
IllegalArgumentException excep;
excep.ArgumentPosition = 0;
cancelCommandExecution(Any(excep), xEnv);
} elseif( errorCode == TaskHandlerErr::UNSUPPORTED_OPEN_MODE )
{
UnsupportedOpenModeException excep;
excep.Mode = sal::static_int_cast< sal_Int16 >(minorCode);
cancelCommandExecution( Any(excep),xEnv );
} elseif(errorCode == TaskHandlerErr::DELETED_STATE_IN_OPEN_COMMAND ||
errorCode == TaskHandlerErr::INSERTED_STATE_IN_OPEN_COMMAND ||
errorCode == TaskHandlerErr::NOFRESHINSERT_IN_INSERT_COMMAND )
{ // What to do here?
} elseif( // error in opening file
errorCode == TaskHandlerErr::NO_OPEN_FILE_FOR_OVERWRITE || // error in opening file
errorCode == TaskHandlerErr::NO_OPEN_FILE_FOR_WRITE || // error in opening file
errorCode == TaskHandlerErr::OPEN_FOR_STREAM || // error in opening file
errorCode == TaskHandlerErr::OPEN_FOR_INPUTSTREAM || // error in opening file
errorCode == TaskHandlerErr::OPEN_FILE_FOR_PAGING )
{ switch( minorCode )
{ case FileBase::E_NAMETOOLONG: // pathname was too long
ioErrorCode = IOErrorCode_NAME_TOO_LONG; break; case FileBase::E_NXIO: // No such device or address case FileBase::E_NODEV: // No such device
ioErrorCode = IOErrorCode_INVALID_DEVICE; break; case FileBase::E_NOTDIR:
ioErrorCode = IOErrorCode_NOT_EXISTING_PATH; break; case FileBase::E_NOENT: // No such file or directory
ioErrorCode = IOErrorCode_NOT_EXISTING; break; case FileBase::E_ROFS: // #i4735# handle ROFS transparently as ACCESS_DENIED case FileBase::E_ACCES: case FileBase::E_PERM: // permission denied<P>
ioErrorCode = IOErrorCode_ACCESS_DENIED; break; case FileBase::E_ISDIR: // Is a directory<p>
ioErrorCode = IOErrorCode_NO_FILE; break; case FileBase::E_NOTREADY:
ioErrorCode = IOErrorCode_DEVICE_NOT_READY; break; case FileBase::E_MFILE: // too many open files used by the process case FileBase::E_NFILE: // too many open files in the system
ioErrorCode = IOErrorCode_OUT_OF_FILE_HANDLES; break; case FileBase::E_INVAL: // the format of the parameters was not valid
ioErrorCode = IOErrorCode_INVALID_PARAMETER; break; case FileBase::E_NOMEM: // not enough memory for allocating structures
ioErrorCode = IOErrorCode_OUT_OF_MEMORY; break; case FileBase::E_BUSY: // Text file busy case FileBase::E_AGAIN: // Operation would block case FileBase::E_NOLCK: // No record locks available
ioErrorCode = IOErrorCode_LOCKING_VIOLATION; break; case FileBase::E_NOSYS:
ioErrorCode = IOErrorCode_NOT_SUPPORTED; break; case FileBase::E_FAULT: // Bad address case FileBase::E_LOOP: // Too many symbolic links encountered case FileBase::E_NOSPC: // No space left on device case FileBase::E_INTR: // function call was interrupted case FileBase::E_IO: // I/O error case FileBase::E_MULTIHOP: // Multihop attempted case FileBase::E_NOLINK: // Link has been severed default:
ioErrorCode = IOErrorCode_GENERAL; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv, "an error occurred during file opening ("
+ OUString::number(o3tl::to_underlying(errorCode)) + "/"
+ OUString::number(minorCode) + ")",
xComProc);
} elseif( errorCode == TaskHandlerErr::OPEN_FOR_DIRECTORYLISTING ||
errorCode == TaskHandlerErr::OPENDIRECTORY_FOR_REMOVE )
{ switch( minorCode )
{ case FileBase::E_INVAL: // the format of the parameters was not valid
ioErrorCode = IOErrorCode_INVALID_PARAMETER; break; case FileBase::E_NOENT: // the specified path doesn't exist
ioErrorCode = IOErrorCode_NOT_EXISTING; break; case FileBase::E_NOTDIR: // the specified path is not a directory
ioErrorCode = IOErrorCode_NO_DIRECTORY; break; case FileBase::E_NOMEM: // not enough memory for allocating structures
ioErrorCode = IOErrorCode_OUT_OF_MEMORY; break; case FileBase::E_ROFS: // #i4735# handle ROFS transparently as ACCESS_DENIED case FileBase::E_ACCES: // permission denied
ioErrorCode = IOErrorCode_ACCESS_DENIED; break; case FileBase::E_NOTREADY:
ioErrorCode = IOErrorCode_DEVICE_NOT_READY; break; case FileBase::E_MFILE: // too many open files used by the process case FileBase::E_NFILE: // too many open files in the system
ioErrorCode = IOErrorCode_OUT_OF_FILE_HANDLES; break; case FileBase::E_NAMETOOLONG: // File name too long
ioErrorCode = IOErrorCode_NAME_TOO_LONG; break; case FileBase::E_LOOP: // Too many symbolic links encountered<p> default:
ioErrorCode = IOErrorCode_GENERAL; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
u"an error occurred during opening a directory"_ustr,
xComProc);
} elseif( errorCode == TaskHandlerErr::NOTCONNECTED_FOR_WRITE ||
errorCode == TaskHandlerErr::BUFFERSIZEEXCEEDED_FOR_WRITE ||
errorCode == TaskHandlerErr::IOEXCEPTION_FOR_WRITE ||
errorCode == TaskHandlerErr::NOTCONNECTED_FOR_PAGING ||
errorCode == TaskHandlerErr::BUFFERSIZEEXCEEDED_FOR_PAGING ||
errorCode == TaskHandlerErr::IOEXCEPTION_FOR_PAGING )
{
ioErrorCode = IOErrorCode_UNKNOWN;
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
u"an error occurred writing or reading from a file"_ustr,
xComProc );
} elseif( errorCode == TaskHandlerErr::FILEIOERROR_FOR_NO_SPACE )
{
ioErrorCode = IOErrorCode_OUT_OF_DISK_SPACE;
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
u"device full"_ustr,
xComProc);
} elseif( errorCode == TaskHandlerErr::FILEIOERROR_FOR_WRITE ||
errorCode == TaskHandlerErr::READING_FILE_FOR_PAGING )
{ switch( minorCode )
{ case FileBase::E_INVAL: // the format of the parameters was not valid
ioErrorCode = IOErrorCode_INVALID_PARAMETER; break; case FileBase::E_FBIG: // File too large
ioErrorCode = IOErrorCode_CANT_WRITE; break; case FileBase::E_NOSPC: // No space left on device
ioErrorCode = IOErrorCode_OUT_OF_DISK_SPACE; break; case FileBase::E_NXIO: // No such device or address
ioErrorCode = IOErrorCode_INVALID_DEVICE; break; case FileBase::E_NOLINK: // Link has been severed case FileBase::E_ISDIR: // Is a directory
ioErrorCode = IOErrorCode_NO_FILE; break; case FileBase::E_AGAIN: // Operation would block case FileBase::E_NOLCK: // No record locks available
ioErrorCode = IOErrorCode_LOCKING_VIOLATION; break; case FileBase::E_TIMEDOUT:
ioErrorCode = IOErrorCode_DEVICE_NOT_READY; break; case FileBase::E_IO: // I/O error case FileBase::E_BADF: // Bad file case FileBase::E_FAULT: // Bad address case FileBase::E_INTR: // function call was interrupted default:
ioErrorCode = IOErrorCode_GENERAL; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
u"an error occurred during opening a file"_ustr,
xComProc);
} elseif( errorCode == TaskHandlerErr::NONAMESET_INSERT_COMMAND ||
errorCode == TaskHandlerErr::NOCONTENTTYPE_INSERT_COMMAND )
{ static constexpr OUString sTitle = u"Title"_ustr; static constexpr OUString sContentType = u"ContentType"_ustr;
Sequence< OUString > aSeq{ (errorCode == TaskHandlerErr::NONAMESET_INSERT_COMMAND)
? sTitle
: sContentType };
aAny <<= MissingPropertiesException(
u"a property is missing, necessary to create a content"_ustr,
xComProc,
aSeq);
cancelCommandExecution(aAny,xEnv);
} elseif( errorCode == TaskHandlerErr::FILESIZE_FOR_WRITE )
{ switch( minorCode )
{ case FileBase::E_INVAL: // the format of the parameters was not valid case FileBase::E_OVERFLOW: // The resulting file offset would be a value which cannot // be represented correctly for regular files
ioErrorCode = IOErrorCode_INVALID_PARAMETER; break; default:
ioErrorCode = IOErrorCode_GENERAL; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
u"there were problems with the filesize"_ustr,
xComProc);
} elseif(errorCode == TaskHandlerErr::INPUTSTREAM_FOR_WRITE)
{
aAny <<=
MissingInputStreamException(
u"the inputstream is missing, necessary to create a content"_ustr,
xComProc);
cancelCommandExecution(aAny,xEnv);
} elseif( errorCode == TaskHandlerErr::NOREPLACE_FOR_WRITE ) // Overwrite = false and file exists
{
NameClashException excep(u"file exists and overwrite forbidden"_ustr,
Reference<XInterface>(xComProc, UNO_QUERY),
InteractionClassification_ERROR, OUString(getTitle(aUncPath)));
cancelCommandExecution( Any(excep), xEnv );
} elseif( errorCode == TaskHandlerErr::INVALID_NAME_MKDIR )
{
PropertyValue prop;
prop.Name = "ResourceName";
prop.Handle = -1;
OUString aClashingName(
rtl::Uri::decode(
OUString(getTitle(aUncPath)),
rtl_UriDecodeWithCharset,
RTL_TEXTENCODING_UTF8));
prop.Value <<= aClashingName;
InteractiveAugmentedIOException excep(
u"the name contained invalid characters"_ustr, Reference<XInterface>(xComProc, UNO_QUERY),
InteractionClassification_ERROR, IOErrorCode_INVALID_CHARACTER, { Any(prop) }); if(isHandled) throw excep;
cancelCommandExecution( Any(excep), xEnv ); // ioErrorCode = IOErrorCode_INVALID_CHARACTER; // cancelCommandExecution( // ioErrorCode, // generateErrorArguments(aUncPath), // xEnv, // OUString( "the name contained invalid characters"), // xComProc );
} elseif( errorCode == TaskHandlerErr::FOLDER_EXISTS_MKDIR )
{
NameClashException excep(u"folder exists and overwrite forbidden"_ustr, xComProc,
InteractionClassification_ERROR, OUString(getTitle(aUncPath))); if(isHandled) throw excep;
cancelCommandExecution( Any(excep), xEnv ); // ioErrorCode = IOErrorCode_ALREADY_EXISTING; // cancelCommandExecution( // ioErrorCode, // generateErrorArguments(aUncPath), // xEnv, // OUString( "the folder exists"), // xComProc );
} elseif( errorCode == TaskHandlerErr::ENSUREDIR_FOR_WRITE ||
errorCode == TaskHandlerErr::CREATEDIRECTORY_MKDIR )
{ switch( minorCode )
{ case FileBase::E_ACCES:
ioErrorCode = IOErrorCode_ACCESS_DENIED; break; case FileBase::E_ROFS:
ioErrorCode = IOErrorCode_WRITE_PROTECTED; break; case FileBase::E_NAMETOOLONG:
ioErrorCode = IOErrorCode_NAME_TOO_LONG; break; default:
ioErrorCode = IOErrorCode_NOT_EXISTING_PATH; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(getParentName(aUncPath)), //TODO! ok to supply physical URL to getParentName()?
xEnv,
u"a folder could not be created"_ustr,
xComProc );
} elseif( errorCode == TaskHandlerErr::VALIDFILESTATUSWHILE_FOR_REMOVE ||
errorCode == TaskHandlerErr::VALIDFILESTATUS_FOR_REMOVE ||
errorCode == TaskHandlerErr::NOSUCHFILEORDIR_FOR_REMOVE )
{ switch( minorCode )
{ case FileBase::E_INVAL: // the format of the parameters was not valid
ioErrorCode = IOErrorCode_INVALID_PARAMETER; break; case FileBase::E_NOMEM: // not enough memory for allocating structures
ioErrorCode = IOErrorCode_OUT_OF_MEMORY; break; case FileBase::E_ROFS: // #i4735# handle ROFS transparently as ACCESS_DENIED case FileBase::E_ACCES: // permission denied
ioErrorCode = IOErrorCode_ACCESS_DENIED; break; case FileBase::E_MFILE: // too many open files used by the process case FileBase::E_NFILE: // too many open files in the system
ioErrorCode = IOErrorCode_OUT_OF_FILE_HANDLES; break; case FileBase::E_NOLINK: // Link has been severed case FileBase::E_NOENT: // No such file or directory
ioErrorCode = IOErrorCode_NOT_EXISTING; break; case FileBase::E_NAMETOOLONG: // File name too long
ioErrorCode = IOErrorCode_NAME_TOO_LONG; break; case FileBase::E_NOTDIR: // A component of the path prefix of path is not a directory
ioErrorCode = IOErrorCode_NOT_EXISTING_PATH; break; case FileBase::E_LOOP: // Too many symbolic links encountered case FileBase::E_IO: // I/O error case FileBase::E_MULTIHOP: // Multihop attempted case FileBase::E_FAULT: // Bad address case FileBase::E_INTR: // function call was interrupted case FileBase::E_NOSYS: // Function not implemented case FileBase::E_NOSPC: // No space left on device case FileBase::E_NXIO: // No such device or address case FileBase::E_OVERFLOW: // Value too large for defined data type case FileBase::E_BADF: // Invalid oslDirectoryItem parameter default:
ioErrorCode = IOErrorCode_GENERAL; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
u"a file status object could not be filled"_ustr,
xComProc );
} elseif( errorCode == TaskHandlerErr::DELETEFILE_FOR_REMOVE ||
errorCode == TaskHandlerErr::DELETEDIRECTORY_FOR_REMOVE )
{ switch( minorCode )
{ case FileBase::E_INVAL: // the format of the parameters was not valid
ioErrorCode = IOErrorCode_INVALID_PARAMETER; break; case FileBase::E_NOMEM: // not enough memory for allocating structures
ioErrorCode = IOErrorCode_OUT_OF_MEMORY; break; case FileBase::E_ACCES: // Permission denied
ioErrorCode = IOErrorCode_ACCESS_DENIED; break; case FileBase::E_PERM: // Operation not permitted case FileBase::E_ISDIR: // Is a directory case FileBase::E_ROFS: // Read-only file system
ioErrorCode = IOErrorCode_NOT_SUPPORTED; break; case FileBase::E_NAMETOOLONG: // File name too long
ioErrorCode = IOErrorCode_NAME_TOO_LONG; break; case FileBase::E_NOLINK: // Link has been severed case FileBase::E_NOENT: // No such file or directory
ioErrorCode = IOErrorCode_NOT_EXISTING; break; case FileBase::E_BUSY: // Device or resource busy
ioErrorCode = IOErrorCode_LOCKING_VIOLATION; break; case FileBase::E_FAULT: // Bad address case FileBase::E_LOOP: // Too many symbolic links encountered case FileBase::E_IO: // I/O error case FileBase::E_INTR: // function call was interrupted case FileBase::E_MULTIHOP: // Multihop attempted default:
ioErrorCode = IOErrorCode_GENERAL; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
u"a file or directory could not be deleted"_ustr,
xComProc );
} elseif( errorCode == TaskHandlerErr::TRANSFER_BY_COPY_SOURCE ||
errorCode == TaskHandlerErr::TRANSFER_BY_COPY_SOURCESTAT ||
errorCode == TaskHandlerErr::TRANSFER_BY_MOVE_SOURCE ||
errorCode == TaskHandlerErr::TRANSFER_BY_MOVE_SOURCESTAT ||
errorCode == TaskHandlerErr::TRANSFER_DESTFILETYPE ||
errorCode == TaskHandlerErr::FILETYPE_FOR_REMOVE ||
errorCode == TaskHandlerErr::DIRECTORYEXHAUSTED_FOR_REMOVE ||
errorCode == TaskHandlerErr::TRANSFER_INVALIDURL )
{
OUString aMsg; switch( minorCode )
{ case FileBase::E_NOENT: // No such file or directory if ( errorCode == TaskHandlerErr::TRANSFER_BY_COPY_SOURCE ||
errorCode == TaskHandlerErr::TRANSFER_BY_COPY_SOURCESTAT ||
errorCode == TaskHandlerErr::TRANSFER_BY_MOVE_SOURCE ||
errorCode == TaskHandlerErr::TRANSFER_BY_MOVE_SOURCESTAT )
{
ioErrorCode = IOErrorCode_NOT_EXISTING;
aMsg = "source file/folder does not exist"; break;
} else
{
ioErrorCode = IOErrorCode_GENERAL;
aMsg = "a general error during transfer command"; break;
} default:
ioErrorCode = IOErrorCode_GENERAL;
aMsg = "a general error during transfer command"; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
aMsg,
xComProc );
} elseif( errorCode == TaskHandlerErr::TRANSFER_INVALIDSCHEME )
{
aAny <<= InteractiveBadTransferURLException(
u"bad transfer url"_ustr,
xComProc);
cancelCommandExecution( aAny,xEnv );
} elseif( errorCode == TaskHandlerErr::OVERWRITE_FOR_MOVE ||
errorCode == TaskHandlerErr::OVERWRITE_FOR_COPY ||
errorCode == TaskHandlerErr::NAMECLASHMOVE_FOR_MOVE ||
errorCode == TaskHandlerErr::NAMECLASHMOVE_FOR_COPY ||
errorCode == TaskHandlerErr::KEEPERROR_FOR_MOVE ||
errorCode == TaskHandlerErr::KEEPERROR_FOR_COPY ||
errorCode == TaskHandlerErr::RENAME_FOR_MOVE ||
errorCode == TaskHandlerErr::RENAME_FOR_COPY ||
errorCode == TaskHandlerErr::RENAMEMOVE_FOR_MOVE ||
errorCode == TaskHandlerErr::RENAMEMOVE_FOR_COPY )
{
OUString aMsg(
u"general error during transfer"_ustr);
switch( minorCode )
{ case FileBase::E_EXIST:
ioErrorCode = IOErrorCode_ALREADY_EXISTING; break; case FileBase::E_INVAL: // the format of the parameters was not valid
ioErrorCode = IOErrorCode_INVALID_PARAMETER; break; case FileBase::E_NOMEM: // not enough memory for allocating structures
ioErrorCode = IOErrorCode_OUT_OF_MEMORY; break; case FileBase::E_ACCES: // Permission denied
ioErrorCode = IOErrorCode_ACCESS_DENIED; break; case FileBase::E_PERM: // Operation not permitted
ioErrorCode = IOErrorCode_NOT_SUPPORTED; break; case FileBase::E_NAMETOOLONG: // File name too long
ioErrorCode = IOErrorCode_NAME_TOO_LONG; break; case FileBase::E_NOENT: // No such file or directory
ioErrorCode = IOErrorCode_NOT_EXISTING;
aMsg = "file/folder does not exist"; break; case FileBase::E_ROFS: // Read-only file system<p>
ioErrorCode = IOErrorCode_NOT_EXISTING; break; default:
ioErrorCode = IOErrorCode_GENERAL; break;
}
cancelCommandExecution(
ioErrorCode,
generateErrorArguments(aUncPath),
xEnv,
aMsg,
xComProc );
} elseif( errorCode == TaskHandlerErr::NAMECLASH_FOR_COPY ||
errorCode == TaskHandlerErr::NAMECLASH_FOR_MOVE )
{
NameClashException excep(u"name clash during copy or move"_ustr,
Reference<XInterface>(xComProc, UNO_QUERY),
InteractionClassification_ERROR, OUString(getTitle(aUncPath)));
cancelCommandExecution(Any(excep), xEnv);
} elseif( errorCode == TaskHandlerErr::NAMECLASHSUPPORT_FOR_MOVE ||
errorCode == TaskHandlerErr::NAMECLASHSUPPORT_FOR_COPY )
{
UnsupportedNameClashException excep(
u"name clash value not supported during copy or move"_ustr,
Reference<XInterface>(xComProc, UNO_QUERY), minorCode);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.