| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 | // 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.Text;using SharpCifs.Util;using SharpCifs.Util.Sharpen;namespace SharpCifs.Netbios{	public class Name	{		private const int TypeOffset = 31;		private const int ScopeOffset = 33;		private static readonly string DefaultScope = Config.GetProperty("jcifs.netbios.scope"			);		internal static readonly string OemEncoding = Config.GetProperty("jcifs.encoding"			, Runtime.GetProperty("file.encoding"));		public string name;		public string Scope;		public int HexCode;		internal int SrcHashCode;		public Name()		{		}		public Name(string name, int hexCode, string scope)		{			if (name.Length > 15)			{				name = Runtime.Substring(name, 0, 15);			}			this.name = name.ToUpper();			this.HexCode = hexCode;			this.Scope = !string.IsNullOrEmpty(scope) ? scope : DefaultScope;			SrcHashCode = 0;		}		internal virtual int WriteWireFormat(byte[] dst, int dstIndex)		{			// write 0x20 in first byte			dst[dstIndex] = unchecked(0x20);			// write name			try			{				byte[] tmp = Runtime.GetBytesForString(name, OemEncoding					);				int i;				for (i = 0; i < tmp.Length; i++)				{					dst[dstIndex + (2 * i + 1)] = unchecked((byte)(((tmp[i] & unchecked(0xF0))						 >> 4) + unchecked(0x41)));					dst[dstIndex + (2 * i + 2)] = unchecked((byte)((tmp[i] & unchecked(0x0F)) 						+ unchecked(0x41)));				}				for (; i < 15; i++)				{					dst[dstIndex + (2 * i + 1)] = unchecked(unchecked(0x43));					dst[dstIndex + (2 * i + 2)] = unchecked(unchecked(0x41));				}				dst[dstIndex + TypeOffset] = unchecked((byte)(((HexCode & unchecked(0xF0)					) >> 4) + unchecked(0x41)));				dst[dstIndex + TypeOffset + 1] = unchecked((byte)((HexCode & unchecked(0x0F)) + unchecked(0x41)));			}			catch (UnsupportedEncodingException)			{			}			return ScopeOffset + WriteScopeWireFormat(dst, dstIndex + ScopeOffset);		}		internal virtual int ReadWireFormat(byte[] src, int srcIndex)		{			byte[] tmp = new byte[ScopeOffset];			int length = 15;			for (int i = 0; i < 15; i++)			{				tmp[i] = unchecked((byte)(((src[srcIndex + (2 * i + 1)] & unchecked(0xFF))					 - unchecked(0x41)) << 4));				tmp[i] |= unchecked((byte)(((src[srcIndex + (2 * i + 2)] & unchecked(0xFF)					) - unchecked(0x41)) & unchecked(0x0F)));				if (tmp[i] != unchecked((byte)' '))				{					length = i + 1;				}			}			try			{				name = Runtime.GetStringForBytes(tmp, 0, length, OemEncoding					);			}			catch (UnsupportedEncodingException)			{			}			HexCode = ((src[srcIndex + TypeOffset] & unchecked(0xFF)) - unchecked(0x41)) << 4;			HexCode |= ((src[srcIndex + TypeOffset + 1] & unchecked(0xFF)) - unchecked(				0x41)) & unchecked(0x0F);			return ScopeOffset + ReadScopeWireFormat(src, srcIndex + ScopeOffset);		}        internal int ReadWireFormatDos(byte[] src, int srcIndex)        {            int length = 15;            byte[] tmp = new byte[length];            Array.Copy(src, srcIndex, tmp, 0, length);            try            {                name = Runtime.GetStringForBytes(tmp, 0, length).Trim();            }            catch (Exception ex)            {            }            HexCode = src[srcIndex + length];            return length + 1;        }		internal virtual int WriteScopeWireFormat(byte[] dst, int dstIndex)		{			if (Scope == null)			{				dst[dstIndex] = unchecked(unchecked(0x00));				return 1;			}			// copy new scope in			dst[dstIndex++] = unchecked((byte)('.'));			try			{				Array.Copy(Runtime.GetBytesForString(Scope, OemEncoding					), 0, dst, dstIndex, Scope.Length);			}			catch (UnsupportedEncodingException)			{			}			dstIndex += Scope.Length;			dst[dstIndex++] = unchecked(unchecked(0x00));			// now go over scope backwards converting '.' to label length			int i = dstIndex - 2;			int e = i - Scope.Length;			int c = 0;			do			{				if (dst[i] == '.')				{					dst[i] = unchecked((byte)c);					c = 0;				}				else				{					c++;				}			}			while (i-- > e);			return Scope.Length + 2;		}		internal virtual int ReadScopeWireFormat(byte[] src, int srcIndex)		{			int start = srcIndex;			int n;			StringBuilder sb;			if ((n = src[srcIndex++] & unchecked(0xFF)) == 0)			{				Scope = null;				return 1;			}			try			{				sb = new StringBuilder(Runtime.GetStringForBytes(src, srcIndex, n, OemEncoding));				srcIndex += n;				while ((n = src[srcIndex++] & unchecked(0xFF)) != 0)				{					sb.Append('.').Append(Runtime.GetStringForBytes(src, srcIndex, n, OemEncoding));					srcIndex += n;				}				Scope = sb.ToString();			}			catch (UnsupportedEncodingException)			{			}			return srcIndex - start;		}		public override int GetHashCode()		{			int result;			result = name.GetHashCode();			result += 65599 * HexCode;			result += 65599 * SrcHashCode;			if (Scope != null && Scope.Length != 0)			{				result += Scope.GetHashCode();			}			return result;		}		public override bool Equals(object obj)		{			Name n;			if (!(obj is Name))			{				return false;			}			n = (Name)obj;			if (Scope == null && n.Scope == null)			{				return name.Equals(n.name) && HexCode == n.HexCode;			}			return name.Equals(n.name) && HexCode == n.HexCode && Scope.Equals(n.Scope);		}		public override string ToString()		{			StringBuilder sb = new StringBuilder();		    //return "";			string n = name;			// fix MSBROWSE name			if (n == null)			{				n = "null";			}			else			{				if (n[0] == unchecked(0x01))				{					char[] c = n.ToCharArray();					c[0] = '.';					c[1] = '.';					c[14] = '.';					n = new string(c);				}			}			sb.Append(n).Append("<").Append(Hexdump.ToHexString(HexCode, 2)).Append(">");			if (Scope != null)			{				sb.Append(".").Append(Scope);			}			return sb.ToString();		}	}}
 |