001: /* jcifs smb client library in Java
002: * Copyright (C) 2000 "Michael B. Allen" <jcifs at samba dot org>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package com.knowgate.jcifs.smb;
020:
021: import java.io.IOException;
022: import java.io.StringWriter;
023: import java.io.PrintWriter;
024:
025: /**
026: * There are hundreds of error codes that may be returned by a CIFS
027: * server. Rather than represent each with it's own <code>Exception</code>
028: * class, this class represents all of them. For many of the popular
029: * error codes, constants and text messages like "The device is not ready"
030: * are provided.
031: * <p>
032: * The jCIFS client maps DOS error codes to NTSTATUS codes. This means that
033: * the user may recieve a different error from a legacy server than that of
034: * a newer varient such as Windows NT and above. If you should encounter
035: * such a case, please report it to jcifs at samba dot org and we will
036: * change the mapping.
037: */
038:
039: public class SmbException extends IOException implements NtStatus,
040: DosError, WinError {
041:
042: static String getMessageByCode(int errcode) {
043: if ((errcode & 0xC0000000) == 0xC0000000) {
044: int min = 0;
045: int max = NT_STATUS_CODES.length;
046:
047: while (max >= min) {
048: int mid = (min + max) / 2;
049:
050: if (errcode > NT_STATUS_CODES[mid]) {
051: min = mid + 1;
052: } else if (errcode < NT_STATUS_CODES[mid]) {
053: max = mid - 1;
054: } else {
055: return NT_STATUS_MESSAGES[mid];
056: }
057: }
058: } else {
059: int min = 0;
060: int max = DOS_ERROR_CODES.length;
061:
062: while (max >= min) {
063: int mid = (min + max) / 2;
064:
065: if (errcode > DOS_ERROR_CODES[mid][0]) {
066: min = mid + 1;
067: } else if (errcode < DOS_ERROR_CODES[mid][0]) {
068: max = mid - 1;
069: } else {
070: return DOS_ERROR_MESSAGES[mid];
071: }
072: }
073: }
074:
075: return "0x" + com.knowgate.misc.Gadgets.toHexString(errcode, 8);
076: }
077:
078: static int getStatusByCode(int errcode) {
079: if ((errcode & 0xC0000000) == 0xC0000000) {
080: return errcode;
081: } else {
082: int min = 0;
083: int max = DOS_ERROR_CODES.length;
084:
085: while (max >= min) {
086: int mid = (min + max) / 2;
087:
088: if (errcode > DOS_ERROR_CODES[mid][0]) {
089: min = mid + 1;
090: } else if (errcode < DOS_ERROR_CODES[mid][0]) {
091: max = mid - 1;
092: } else {
093: return DOS_ERROR_CODES[mid][1];
094: }
095: }
096: }
097:
098: return NT_STATUS_UNSUCCESSFUL;
099: }
100:
101: static String getMessageByWinerrCode(int errcode) {
102: int min = 0;
103: int max = WINERR_CODES.length;
104:
105: while (max >= min) {
106: int mid = (min + max) / 2;
107:
108: if (errcode > WINERR_CODES[mid]) {
109: min = mid + 1;
110: } else if (errcode < WINERR_CODES[mid]) {
111: max = mid - 1;
112: } else {
113: return WINERR_MESSAGES[mid];
114: }
115: }
116:
117: return errcode + "";
118: }
119:
120: private int status;
121: private Throwable rootCause;
122:
123: SmbException() {
124: }
125:
126: SmbException(int errcode, Throwable rootCause) {
127: super (getMessageByCode(errcode));
128: status = getStatusByCode(errcode);
129: this .rootCause = rootCause;
130: }
131:
132: SmbException(String msg) {
133: super (msg);
134: status = NT_STATUS_UNSUCCESSFUL;
135: }
136:
137: SmbException(String msg, Throwable rootCause) {
138: super (msg);
139: this .rootCause = rootCause;
140: status = NT_STATUS_UNSUCCESSFUL;
141: }
142:
143: SmbException(int errcode, boolean winerr) {
144: super (winerr ? getMessageByWinerrCode(errcode)
145: : getMessageByCode(errcode));
146: status = winerr ? errcode : getStatusByCode(errcode);
147: }
148:
149: public int getNtStatus() {
150: return status;
151: }
152:
153: public Throwable getRootCause() {
154: return rootCause;
155: }
156:
157: public String toString() {
158: if (rootCause != null) {
159: StringWriter sw = new StringWriter();
160: PrintWriter pw = new PrintWriter(sw);
161: rootCause.printStackTrace(pw);
162: return super .toString() + "\n" + sw;
163: } else {
164: return super.toString();
165: }
166: }
167: }
|