| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 | // This code is derived from jcifs smb client library <jcifs at samba dot org>// Ported by J. Arturo <webmaster at komodosoft dot net>//  // 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  USAusing System;using System.IO;using SharpCifs.Util;using SharpCifs.Util.Sharpen;namespace SharpCifs.Smb{	/// <summary>	/// There are hundreds of error codes that may be returned by a CIFS	/// server.	/// </summary>	/// <remarks>	/// There are hundreds of error codes that may be returned by a CIFS	/// server. Rather than represent each with it's own <code>Exception</code>	/// 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.	/// <p>	/// The jCIFS client maps DOS error codes to NTSTATUS codes. This means that	/// the user may recieve a different error from a legacy server than that of	/// a newer varient 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.	/// </remarks>		public class SmbException : IOException	{               internal static string GetMessageByCode(int errcode)		{			if (errcode == 0)			{				return "NT_STATUS_SUCCESS";			}			if ((errcode & unchecked((int)(0xC0000000))) == unchecked((int)(0xC0000000)))			{				int min = 1;				int max = NtStatus.NtStatusCodes.Length - 1;				while (max >= min)				{					int mid = (min + max) / 2;                    if (errcode > NtStatus.NtStatusCodes[mid])					{						min = mid + 1;					}					else					{                        if (errcode < NtStatus.NtStatusCodes[mid])						{							max = mid - 1;						}						else						{                            return NtStatus.NtStatusMessages[mid];						}					}				}			}			else			{				int min = 0;				int max = DosError.DosErrorCodes.Length - 1;				while (max >= min)				{					int mid = (min + max) / 2;                    if (errcode > DosError.DosErrorCodes[mid][0])					{						min = mid + 1;					}					else					{                        if (errcode < DosError.DosErrorCodes[mid][0])						{							max = mid - 1;						}						else						{                            return DosError.DosErrorMessages[mid];						}					}				}			}			return "0x" + Hexdump.ToHexString(errcode, 8);		}		internal static int GetStatusByCode(int errcode)		{			if ((errcode & unchecked((int)(0xC0000000))) != 0)			{				return errcode;			}		    int min = 0;		    int max = DosError.DosErrorCodes.Length - 1;		    while (max >= min)		    {		        int mid = (min + max) / 2;		        if (errcode > DosError.DosErrorCodes[mid][0])		        {		            min = mid + 1;		        }		        else		        {		            if (errcode < DosError.DosErrorCodes[mid][0])		            {		                max = mid - 1;		            }		            else		            {		                return DosError.DosErrorCodes[mid][1];		            }		        }		    }		    return NtStatus.NtStatusUnsuccessful;		}		internal static string GetMessageByWinerrCode(int errcode)		{			int min = 0;			int max = WinError.WinerrCodes.Length - 1;			while (max >= min)			{				int mid = (min + max) / 2;                if (errcode > WinError.WinerrCodes[mid])				{					min = mid + 1;				}				else				{                    if (errcode < WinError.WinerrCodes[mid])					{						max = mid - 1;					}					else					{                        return WinError.WinerrMessages[mid];					}				}			}			return errcode + string.Empty;		}		private int _status;		private Exception _rootCause;		public SmbException()		{		}		internal SmbException(int errcode, Exception rootCause) : base(GetMessageByCode(errcode			))		{			_status = GetStatusByCode(errcode);			this._rootCause = rootCause;		}		public SmbException(string msg) : base(msg)		{            _status = NtStatus.NtStatusUnsuccessful;		}		public SmbException(string msg, Exception rootCause) : base(msg)		{			this._rootCause = rootCause;            _status = NtStatus.NtStatusUnsuccessful;		}		public SmbException(int errcode, bool winerr) : base(winerr ? GetMessageByWinerrCode			(errcode) : GetMessageByCode(errcode))		{			_status = winerr ? errcode : GetStatusByCode(errcode);		}		public virtual int GetNtStatus()		{			return _status;		}		public virtual Exception GetRootCause()		{			return _rootCause;		}		public override string ToString()		{		    if (_rootCause != null)			{				StringWriter sw = new StringWriter();				PrintWriter pw = new PrintWriter(sw);				Runtime.PrintStackTrace(_rootCause, pw);				return base.ToString() + "\n" + sw;			}		    return base.ToString();		}	}}
 |