All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jcifs.smb.SmbException Maven / Gradle / Ivy

There is a newer version: 2.1.10
Show newest version
/* jcifs smb client library in Java
 * Copyright (C) 2000  "Michael B. Allen" 
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package jcifs.smb;


import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import jcifs.CIFSException;
import jcifs.util.Hexdump;


/**
 * There are hundreds of error codes that may be returned by a CIFS
 * server. Rather than represent each with it's own Exception
 * class, this class represents all of them. For many of the popular
 * error codes, constants and text messages like "The device is not ready"
 * are provided.
 * 

* The jCIFS client maps DOS error codes to NTSTATUS codes. This means that * the user may receive a different error from a legacy server than that of * a newer variant such as Windows NT and above. If you should encounter * such a case, please report it to jcifs at samba dot org and we will * change the mapping. */ public class SmbException extends CIFSException implements NtStatus, DosError, WinError { /** * */ private static final long serialVersionUID = 484863569441792249L; // to replace a bunch of one-off binary searches private static final Map errorCodeMessages; private static final Map winErrorCodeMessages; private static final Map dosErrorCodeStatuses; static { Map errorCodeMessagesTmp = new HashMap<>(); for (int i = 0; i < NT_STATUS_CODES.length; i++) { errorCodeMessagesTmp.put(NT_STATUS_CODES[i], NT_STATUS_MESSAGES[i]); } Map dosErrorCodeStatusesTmp = new HashMap<>(); for (int i = 0; i < DOS_ERROR_CODES.length; i++) { dosErrorCodeStatusesTmp.put(DOS_ERROR_CODES[i][0], DOS_ERROR_CODES[i][1]); int mappedNtCode = DOS_ERROR_CODES[i][1]; String mappedNtMessage = errorCodeMessagesTmp.get(mappedNtCode); if (mappedNtMessage != null) { errorCodeMessagesTmp.put(DOS_ERROR_CODES[i][0], mappedNtMessage); } } // for backward compatibility since this is was different message in the NtStatus.NT_STATUS_CODES than returned // by getMessageByCode errorCodeMessagesTmp.put(0, "NT_STATUS_SUCCESS"); errorCodeMessages = Collections.unmodifiableMap(errorCodeMessagesTmp); dosErrorCodeStatuses = Collections.unmodifiableMap(dosErrorCodeStatusesTmp); Map winErrorCodeMessagesTmp = new HashMap<>(); for (int i = 0; i < WINERR_CODES.length; i++) { winErrorCodeMessagesTmp.put(WINERR_CODES[i], WINERR_MESSAGES[i]); } winErrorCodeMessages = Collections.unmodifiableMap(winErrorCodeMessagesTmp); } /** * * @param errcode * @return message for NT STATUS code * @internal */ public static String getMessageByCode ( int errcode ) { String message = errorCodeMessages.get(errcode); if (message == null) { message = "0x" + Hexdump.toHexString(errcode, 8); } return message; } static int getStatusByCode ( int errcode ) { int statusCode; if ( ( errcode & 0xC0000000 ) != 0 ) { statusCode = errcode; } else if (dosErrorCodeStatuses.containsKey(errcode)) { statusCode = dosErrorCodeStatuses.get(errcode); } else { statusCode = NT_STATUS_UNSUCCESSFUL; } return statusCode; } static String getMessageByWinerrCode ( int errcode ) { String message = winErrorCodeMessages.get(errcode); if (message == null) { message = "W" + Hexdump.toHexString(errcode, 8); } return message; } private int status; /** * */ public SmbException () {} /** * * @param errcode * @param rootCause */ public SmbException ( int errcode, Throwable rootCause ) { super(getMessageByCode(errcode), rootCause); this.status = getStatusByCode(errcode); } /** * * @param msg */ public SmbException ( String msg ) { super(msg); this.status = NT_STATUS_UNSUCCESSFUL; } /** * * @param msg * @param rootCause */ public SmbException ( String msg, Throwable rootCause ) { super(msg, rootCause); this.status = NT_STATUS_UNSUCCESSFUL; } /** * * @param errcode * @param winerr */ public SmbException ( int errcode, boolean winerr ) { super(winerr ? getMessageByWinerrCode(errcode) : getMessageByCode(errcode)); this.status = winerr ? errcode : getStatusByCode(errcode); } /** * * @return status code */ public int getNtStatus () { return this.status; } /** * * @return cause */ @Deprecated public Throwable getRootCause () { return this.getCause(); } /** * @param e * @return a CIFS exception wrapped in an SmbException */ static SmbException wrap ( CIFSException e ) { if ( e instanceof SmbException ) { return (SmbException) e; } return new SmbException(e.getMessage(), e); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy