From 2614d9c3bc3d249f4546bce96a4bfe74947d443e Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 16 Mar 2017 19:10:25 +0700 Subject: [PATCH 1/7] #83: don't rely on APIs not supported by .NET Standard in Netlib --- src/JabberNet.Netlib.Dns/dns.cs | 143 ++++---------------------------- 1 file changed, 17 insertions(+), 126 deletions(-) diff --git a/src/JabberNet.Netlib.Dns/dns.cs b/src/JabberNet.Netlib.Dns/dns.cs index 97222e4..4a916c5 100644 --- a/src/JabberNet.Netlib.Dns/dns.cs +++ b/src/JabberNet.Netlib.Dns/dns.cs @@ -1,8 +1,8 @@ -using System; -using System.Collections; +using System; +using System.Collections.Generic; +using System.Linq; using System.Net; using System.Runtime.InteropServices; -using System.Runtime.Serialization; using JabberNet.Netlib.Dns.Records; namespace JabberNet.Netlib.Dns @@ -343,8 +343,7 @@ enum DnsFreeType: uint /// InnerException property. /// /// - [Serializable] - public class DnsException: ApplicationException, ISerializable + public class DnsException: Exception { private readonly uint errcode = (uint) DnsQueryReturnCode.SUCCESS; @@ -460,25 +459,6 @@ public uint ErrorCode public DnsException(string message, Exception innerException): base(message, innerException) { } - - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("errcode", errcode); - base.GetObjectData(info, context); - } - - /// - /// Initializes a new instance of for - /// - /// the serialization information - /// the context - /// - /// Used by the interface. - /// - public DnsException(SerializationInfo info, StreamingContext context): base(info, context) - { - errcode = info.GetUInt32("errcode"); - } } /// @@ -729,93 +709,6 @@ public int CompareTo(object obj) #endregion } - /// - /// Represents a collection of objects. - /// - /// - /// The DnsWrapperCollection is a collection of - /// objects. The resultant collection represents all of the DNS records - /// for the given domain that was looked up. This class cannot be directly - /// created - it is created by the and - /// classes to hold the returned DNS - /// records for the given domain. - /// - public class DnsWrapperCollection: ReadOnlyCollectionBase, IEnumerable - { - internal DnsWrapperCollection() - { - } - - internal bool Contains(DnsWrapper w) - { - foreach(DnsWrapper wrapper in InnerList) - if (w.Equals(wrapper)) - return true; - - return false; - } - - internal void Add(DnsWrapper w) - { - InnerList.Add(w); - } - - /// - /// Gets the at the specified - /// ordinal in the collection - /// - /// - /// Gets the at the specified - /// index of the collection. - /// - /// The index to retrieve from the collection. - /// The at the specified index of - /// the collection. - public DnsWrapper this[int i] - { - get - { - return (DnsWrapper) InnerList[i]; - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return new DnsWrapperCollectionEnumerator(this); - } - - class DnsWrapperCollectionEnumerator: IEnumerator - { - private int idx = -1; - private readonly DnsWrapperCollection coll; - - public DnsWrapperCollectionEnumerator(DnsWrapperCollection coll) - { - this.coll = coll; - } - - void IEnumerator.Reset() - { - idx=-1; - } - - bool IEnumerator.MoveNext() - { - idx++; - - return idx < coll.Count; - } - - object IEnumerator.Current - { - get - { - return coll[idx]; - } - } - } - } - /// /// Represents one DNS request. Allows for a complete DNS record lookup /// on a given _Domain using the Windows API. @@ -1453,8 +1346,6 @@ private void Initialize(string domain) /// public DnsResponse GetResponse(DnsRecordType dnstype) { - if (Environment.OSVersion.Platform != PlatformID.Win32NT) - throw new NotSupportedException("This API is found only on Windows NT or better."); if (_domain == null) throw new ArgumentNullException(); @@ -1567,11 +1458,11 @@ private static void GetData(IntPtr ptr, ref DnsRecord dnsrec, ref object Data) /// public class DnsResponse { - private readonly DnsWrapperCollection rawrecords; + private readonly List rawrecords; internal DnsResponse() { - rawrecords = new DnsWrapperCollection(); + rawrecords = new List(); } /// @@ -1585,7 +1476,7 @@ internal DnsResponse() /// is wrapped by the method. /// /// Gets a collection of objects. - public DnsWrapperCollection RawRecords + public List RawRecords { get { @@ -1603,8 +1494,8 @@ public DnsWrapperCollection RawRecords /// value indicating the type of DNS record to get from the list of /// all DNS records (available in the /// property. - /// an of one of the types - /// specified in the namespace based + /// a of one of the types + /// specified in the namespace based /// on the argument representing the /// type of DNS record desired. /// @@ -1651,9 +1542,9 @@ public DnsWrapperCollection RawRecords /// /// /// - public ArrayList GetRecords(DnsRecordType type) + public List GetRecords(DnsRecordType type) { - ArrayList arr = new ArrayList(); + List arr = new List(); foreach(DnsWrapper dnsentry in rawrecords) if (dnsentry.Equals(type)) arr.Add(dnsentry.RecordData); @@ -1674,8 +1565,8 @@ public SRVRecord[] SRVRecords { get { - ArrayList arr = GetRecords(DnsRecordType.SRV); - return (SRVRecord[])arr.ToArray(typeof(SRVRecord)); + List arr = GetRecords(DnsRecordType.SRV); + return arr.Cast().ToArray(); } } @@ -1692,8 +1583,8 @@ public TXTRecord[] TXTRecords { get { - ArrayList arr = GetRecords(DnsRecordType.TEXT); - return (TXTRecord[])arr.ToArray(typeof(TXTRecord)); + List arr = GetRecords(DnsRecordType.TEXT); + return arr.Cast().ToArray(); } } /// @@ -1709,8 +1600,8 @@ public MXRecord[] MXRecords { get { - ArrayList arr = GetRecords(DnsRecordType.MX); - return (MXRecord[]) arr.ToArray(typeof(MXRecord)); + List arr = GetRecords(DnsRecordType.MX); + return arr.Cast().ToArray(); } } } From 91217d9d29d6ad360fa269fd3b5de7f8fe621f77 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 16 Mar 2017 19:10:46 +0700 Subject: [PATCH 2/7] #83: port Netlib.Dns to .NET Standard --- .../JabberNet.Netlib.Dns.csproj | 104 +++--------------- .../Properties/AssemblyInfo.cs | 11 -- 2 files changed, 16 insertions(+), 99 deletions(-) delete mode 100644 src/JabberNet.Netlib.Dns/Properties/AssemblyInfo.cs diff --git a/src/JabberNet.Netlib.Dns/JabberNet.Netlib.Dns.csproj b/src/JabberNet.Netlib.Dns/JabberNet.Netlib.Dns.csproj index 32c9b1d..13554cf 100644 --- a/src/JabberNet.Netlib.Dns/JabberNet.Netlib.Dns.csproj +++ b/src/JabberNet.Netlib.Dns/JabberNet.Netlib.Dns.csproj @@ -1,93 +1,21 @@ - - + + - Debug - AnyCPU - 8.0.50727 - 2.0 - {40AC7A7C-D3E5-46DF-B740-06BD9D2A00E1} - Library - Properties - JabberNet.Netlib.Dns - JabberNet.Netlib.Dns - false - - - v4.0 - - - 2.0 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - + netstandard1.3 + 3.0.0.0 + 3.0.0.0 + 3.0.0-preview1 + The ASP Emporium (http://www.aspemporium.com/); Jabber-Net contributors + ForNeVeR + Jabber-Net + Allows for a complete DNS record lookup on a given domain using the Windows API. + The ASP Emporium (http://www.aspemporium.com/); Copyright (c) Jabber-Net Contributors, 2008—2017 - - true - full - false - bin\Debug\ - TRACE;DEBUG - prompt - 4 - bin\Debug\JabberNet.Netlib.Dns.xml - AllRules.ruleset - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - AllRules.ruleset - bin\Release\JabberNet.Netlib.Dns.xml - - - - - - - - - - + - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - + + + - - + \ No newline at end of file diff --git a/src/JabberNet.Netlib.Dns/Properties/AssemblyInfo.cs b/src/JabberNet.Netlib.Dns/Properties/AssemblyInfo.cs deleted file mode 100644 index efe69fd..0000000 --- a/src/JabberNet.Netlib.Dns/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyCompany("The ASP Emporium (http://www.aspemporium.com/); Jabber-Net contributors")] -[assembly: AssemblyProduct("Jabber-Net")] -[assembly: AssemblyTitle("JabberNet.Netlib.Dns")] -[assembly: AssemblyDescription("Allows for a complete DNS record lookup on a given domain using the Windows API.")] -[assembly: AssemblyCopyright("The ASP Emporium (http://www.aspemporium.com/); Copyright (c) Jabber-Net Contributors, 2008—2017")] -[assembly: Guid("f0ccd899-310f-40e3-aa25-ff151d23b11a")] -[assembly: AssemblyVersion("3.0.0.*")] -[assembly: AssemblyInformationalVersion("3.0.0-preview1")] From 1ceb4f9cb2cca2c84fe4cb86f8e1c9c546f757ae Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 16 Mar 2017 21:23:01 +0700 Subject: [PATCH 3/7] #83: partially port JabberNet to .NET Standard --- JabberNet.sln | 4 +- src/JabberNet/AssemblyInfo.cs | 9 - src/JabberNet/JabberNet.csproj | 460 +++-------- .../bedrock/collections/IndexedTrie.cs | 145 ---- .../bedrock/collections/StringSet.cs | 14 +- src/JabberNet/bedrock/io/ReadEventStream.cs | 64 +- src/JabberNet/bedrock/net/AsyncSocket.cs | 1 - src/JabberNet/bedrock/net/Exceptions.cs | 21 +- src/JabberNet/stringprep/steps/RFC3454.resx | 745 ------------------ 9 files changed, 113 insertions(+), 1350 deletions(-) delete mode 100644 src/JabberNet/AssemblyInfo.cs delete mode 100644 src/JabberNet/bedrock/collections/IndexedTrie.cs delete mode 100644 src/JabberNet/stringprep/steps/RFC3454.resx diff --git a/JabberNet.sln b/JabberNet.sln index 7f8ac8b..a70b7dc 100644 --- a/JabberNet.sln +++ b/JabberNet.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.9 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{BFD2D70D-3C18-4BFD-B70E-38ED872B8F67}" ProjectSection(SolutionItems) = preProject diff --git a/src/JabberNet/AssemblyInfo.cs b/src/JabberNet/AssemblyInfo.cs deleted file mode 100644 index aec9e40..0000000 --- a/src/JabberNet/AssemblyInfo.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Reflection; - -[assembly: AssemblyCompany("Cursive Systems, Inc.; Jabber-Net contributors")] -[assembly: AssemblyProduct("Jabber-Net")] -[assembly: AssemblyTitle("JabberNet")] -[assembly: AssemblyDescription("Connect to Jabber (http://www.jabber.org/) from .Net")] -[assembly: AssemblyCopyright("Copyright (c) Cursive, Inc. 2000—2008; Jabber-Net Contributors, 2008—2017")] -[assembly: AssemblyVersion("3.0.0.*")] -[assembly: AssemblyInformationalVersion("3.0.0-preview1")] diff --git a/src/JabberNet/JabberNet.csproj b/src/JabberNet/JabberNet.csproj index bf4415d..551dd98 100644 --- a/src/JabberNet/JabberNet.csproj +++ b/src/JabberNet/JabberNet.csproj @@ -1,507 +1,225 @@ - - - - Local - 8.0.50727 - 2.0 - {6CAE854A-F202-4D2B-B10E-E8D8E81E5EF5} - Debug - AnyCPU - - - - - jabber-net - JScript - Grid - IE50 - false - Library - - - OnBuildSuccess - - - - - - - true - - - bin5\Debug\ - obj\ - obj\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;NET20 NO_SRV - TRACE;DEBUG;NO_SRV - 2005-jabber-net.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin5\Release\ - obj\ - obj\Debug\ - false - 285212672 - false - - - TRACE;NET20 NO_SRV - TRACE;NO_SRV - 2005-jabber-net.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - TRACE;DEBUG;NET20 - TRACE;DEBUG - AllRules.ruleset - bin\Debug\ - true - TRACE;DEBUG - bin\Debug\JabberNet.xml - false - - - TRACE - AllRules.ruleset - bin\Release\ - true - bin\Release\JabberNet.xml - false - - - JabberNet - - + + - JabberNet + netstandard1.3 + 3.0.0.0 + 3.0.0.0 + 3.0.0-preview1 + ForNeVeR + Cursive Systems, Inc.; Jabber-Net contributors + Jabber-Net + Connect to Jabber (http://www.jabber.org/) from .NET + Copyright (c) Cursive, Inc. 2000—2008; Jabber-Net Contributors, 2008—2017 - - - System - - - - - System.XML - + + + + + - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - Code - - - - Code - - - Code - - - Code - - - - - - Code - - + + + + + Code - + Code - + Code - + Code - + Code - - - + Code - + Code - - - - - - - - - - + Code - - - - - - + Code - + Code - + Code - - - - - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - - + Code - + Code - - + Code - + Code - + Code - + Code - + Code - - - + Code - - - - - - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - - + Code - + Code - + Code - - + Code - + Code - + Code - + Code - + Code - - + Code - + Code - + Code - + Code - - + Code - - - - - - - - - - - - - - - - - - + Code - + Code - + Code - + Code - + Code - + Code - - RosterManager.cs - - - - - - - - - - - - {40AC7A7C-D3E5-46DF-B740-06BD9D2A00E1} - JabberNet.Netlib.Dns - + - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - - - - + + RosterManager.cs + - - - - - - - false - v4.0 - 2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - - - ..\..\packages\zlib.net\lib\zlib.net.dll - True - True - - - - + \ No newline at end of file diff --git a/src/JabberNet/bedrock/collections/IndexedTrie.cs b/src/JabberNet/bedrock/collections/IndexedTrie.cs deleted file mode 100644 index db7fa20..0000000 --- a/src/JabberNet/bedrock/collections/IndexedTrie.cs +++ /dev/null @@ -1,145 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyrights - * - * Portions created by or assigned to Cursive Systems, Inc. are - * Copyright (c) 2002-2008 Cursive Systems, Inc. All Rights Reserved. Contact - * information for Cursive Systems, Inc. is available at - * http://www.cursive.net/. - * - * License - * - * Jabber-Net is licensed under the LGPL. - * See licenses/Jabber-Net_LGPLv3.txt for details. - * --------------------------------------------------------------------------*/ - -using System; -using System.Collections; - -namespace JabberNet.bedrock.collections -{ - /// - /// A Trie that is searchable for substrings. Uses a separate set of indexes - /// to allow entry into the Trie at any point. Yes, this - /// - public class IndexedTrie : Trie - { - private Tree m_indexes = new Tree(); - private int m_maxResults = 100; - - /// - /// Creates the indexed trie. - /// - public IndexedTrie() {} - - /// - /// Creates the indexed trie and sets the maximum number of query results returned. - /// - /// Maximum number of query results returned. - public IndexedTrie(int maxResults) - { - m_maxResults = maxResults; - } - - /// - /// The maximum number of results to return from any query. This is an approximate number. - /// - public int MaxResults - { - get - { - return m_maxResults; - } - set - { - m_maxResults = value; - } - } - /// - /// Finds the index for the given byte. - /// - protected ArrayList this[byte b] - { - get - { - return (ArrayList) m_indexes[b]; - } - } - /// - /// Traverse the trie, computing indexes. - /// - /// - /// - private bool IndexWalker(TrieNode n, object data) - { - if (n.Parent != null) - { - this[n.Byte].Add(new WeakReference(n)); - } - return true; - } - /// - /// Computes the index. - /// - public void Index() - { - Traverse(new TrieWalker(IndexWalker), null); - foreach (ArrayList al in m_indexes) - { - al.TrimToSize(); - } - } - /// - /// Copy the keys from the sub-tree into an ArrayList. - /// - /// - /// - /// - private bool CopyWalker(TrieNode n, object data, ByteStack key) - { - if (n.Value != null) - { - ArrayList al = (ArrayList) data; - al.Add((byte[]) key); - if (al.Count >= m_maxResults) - { - return false; - } - } - return true; - } - /// - /// Return a list of keys that contain the given substring. - /// - /// The substring to search for. - public ArrayList SubString(byte[] lookFor) - { - ArrayList starts = (ArrayList) m_indexes[lookFor[0]]; - ArrayList finds = new ArrayList(); - byte[] nBuf = new byte[lookFor.Length - 1]; - Buffer.BlockCopy(lookFor, 1, nBuf, 0, lookFor.Length - 1); - TrieKeyWalker w = new TrieKeyWalker(CopyWalker); - foreach (WeakReference wref in starts) - { - if (finds.Count >= m_maxResults) - { - break; - } - TrieNode first = (TrieNode) wref.Target; - if (first == null) - { - // node got removed out from underneath. - starts.Remove(wref); - } - else - { - TrieNode last = FindNode(nBuf, first, false); - if (last != null) - { - Traverse(w, finds, last, new ByteStack(last.Key)); - } - } - } - return finds; - } - } -} diff --git a/src/JabberNet/bedrock/collections/StringSet.cs b/src/JabberNet/bedrock/collections/StringSet.cs index e9e4621..cc31fb0 100644 --- a/src/JabberNet/bedrock/collections/StringSet.cs +++ b/src/JabberNet/bedrock/collections/StringSet.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -22,12 +22,11 @@ namespace JabberNet.bedrock.collections /// A set of strings, backed into a BitArray. Any given string that is inserted /// into any instance of a StringSet increases the size of all StringSets over time. /// - public class StringSet : IEnumerable, IEnumerable, ICloneable + public class StringSet : IEnumerable, IEnumerable { private BitArray m_bits = null; - // List.Add doesn't return an int. - private static ArrayList s_strings = new ArrayList(); + private static List s_strings = new List(); private static Dictionary s_bits = new Dictionary(); /// @@ -45,7 +44,7 @@ public StringSet() public StringSet(StringSet other) { if (other != null) - m_bits = (BitArray)other.m_bits.Clone(); + m_bits = new BitArray(other.m_bits); } /// @@ -76,7 +75,8 @@ private static int GetStringValue(string s) { if (!s_bits.TryGetValue(s, out val)) { - s_bits[s] = val = s_strings.Add(s); + s_strings.Add(s); + s_bits[s] = val = s_strings.Count - 1; } } return val; @@ -135,7 +135,7 @@ public void Remove(StringSet set) { m_bits.Length = set.m_bits.Length = Math.Max(m_bits.Length, set.m_bits.Length); // Not is destructive. Stupid. - BitArray os = (BitArray)set.m_bits.Clone(); + BitArray os = new BitArray(set.m_bits); os.Not(); m_bits.And(os); } diff --git a/src/JabberNet/bedrock/io/ReadEventStream.cs b/src/JabberNet/bedrock/io/ReadEventStream.cs index 94e5230..e63100b 100644 --- a/src/JabberNet/bedrock/io/ReadEventStream.cs +++ b/src/JabberNet/bedrock/io/ReadEventStream.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -12,8 +12,9 @@ * See licenses/Jabber-Net_LGPLv3.txt for details. * --------------------------------------------------------------------------*/ -using System; using System.IO; +using System.Threading; +using System.Threading.Tasks; namespace JabberNet.bedrock.io { @@ -79,62 +80,23 @@ public override long Position set { m_stream.Position = value; } } - /// - /// Begins an asynchronous read operation. - /// - /// - /// - /// - /// - /// - /// - public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { - return m_stream.BeginRead (buffer, offset, count, callback, state); + return m_stream.ReadAsync(buffer, offset, count, cancellationToken); } - /// - /// Begins an asynchronous write operation. - /// - /// - /// - /// - /// - /// - /// - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { - return m_stream.BeginWrite (buffer, offset, count, callback, state); + return m_stream.WriteAsync(buffer, offset, count, cancellationToken); } - /// - /// Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. - /// - public override void Close() + protected override void Dispose(bool disposing) { - m_stream.Close (); - } - - /// - /// Waits for the pending asynchronous read to complete. - /// - /// - /// - public override int EndRead(IAsyncResult asyncResult) - { - int count = m_stream.EndRead(asyncResult); - byte[] buf = System.Text.Encoding.UTF8.GetBytes("Read " + count + " bytes from async stream"); - FireOnRead(buf, 0, buf.Length); - return count; - } - - /// - /// Ends an asynchronous write operation. - /// - /// - public override void EndWrite(IAsyncResult asyncResult) - { - m_stream.EndWrite (asyncResult); + base.Dispose(disposing); + if (disposing) + { + m_stream.Dispose(); + } } /// diff --git a/src/JabberNet/bedrock/net/AsyncSocket.cs b/src/JabberNet/bedrock/net/AsyncSocket.cs index bc28377..1298990 100644 --- a/src/JabberNet/bedrock/net/AsyncSocket.cs +++ b/src/JabberNet/bedrock/net/AsyncSocket.cs @@ -20,7 +20,6 @@ using System.Net.Sockets; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; -using zlib; namespace JabberNet.bedrock.net { diff --git a/src/JabberNet/bedrock/net/Exceptions.cs b/src/JabberNet/bedrock/net/Exceptions.cs index 27bb61c..f6485c0 100644 --- a/src/JabberNet/bedrock/net/Exceptions.cs +++ b/src/JabberNet/bedrock/net/Exceptions.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -19,8 +19,7 @@ namespace JabberNet.bedrock.net /// /// Lame exception, since I couldn't find one I liked. /// - [Serializable] - public class AsyncSocketConnectionException : System.SystemException + public class AsyncSocketConnectionException : Exception { /// /// Create a new exception instance. @@ -48,21 +47,5 @@ public AsyncSocketConnectionException(string description, Exception e) : base(description, e) { } - - /// - /// Initializes a new instance of the - /// AsyncSocketConnectionException class with serialized - /// data. - /// - /// The object that holds the serialized - /// object data. - /// The contextual information about the - /// source or destination. - protected AsyncSocketConnectionException(System.Runtime.Serialization.SerializationInfo info, - System.Runtime.Serialization.StreamingContext ctx) - : - base(info, ctx) - { - } } } diff --git a/src/JabberNet/stringprep/steps/RFC3454.resx b/src/JabberNet/stringprep/steps/RFC3454.resx deleted file mode 100644 index 043398a..0000000 --- a/src/JabberNet/stringprep/steps/RFC3454.resx +++ /dev/null @@ -1,745 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 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 - BhoAAAAD77iOBhsAAAAD77iPBhwAAAAD77u/Cw== - - - - - AAEAAAD/////AQAAAAAAAAARAQAAAHUDAAAGAgAAAAJBYQYDAAAAAkJiBgQAAAACQ2MGBQAAAAJEZAYG - AAAAAkVlBgcAAAACRmYGCAAAAAJHZwYJAAAAAkhoBgoAAAACSWkGCwAAAAJKagYMAAAAAktrBg0AAAAC - TGwGDgAAAAJNbQYPAAAAAk5uBhAAAAACT28GEQAAAAJQcAYSAAAAAlFxBhMAAAACUnIGFAAAAAJTcwYV - AAAAAlR0BhYAAAACVXUGFwAAAAJWdgYYAAAAAld3BhkAAAACWHgGGgAAAAJZeQYbAAAAAlp6BhwAAAAE - wrXOvAYdAAAABMOAw6AGHgAAAATDgcOhBh8AAAAEw4LDogYgAAAABMODw6MGIQAAAATDhMOkBiIAAAAE - w4XDpQYjAAAABMOGw6YGJAAAAATDh8OnBiUAAAAEw4jDqAYmAAAABMOJw6kGJwAAAATDisOqBigAAAAE - w4vDqwYpAAAABMOMw6wGKgAAAATDjcOtBisAAAAEw47DrgYsAAAABMOPw68GLQAAAATDkMOwBi4AAAAE - w5HDsQYvAAAABMOSw7IGMAAAAATDk8OzBjEAAAAEw5TDtAYyAAAABMOVw7UGMwAAAATDlsO2BjQAAAAE - w5jDuAY1AAAABMOZw7kGNgAAAATDmsO6BjcAAAAEw5vDuwY4AAAABMOcw7wGOQAAAATDncO9BjoAAAAE - w57DvgY7AAAABMOfc3MGPAAAAATEgMSBBj0AAAAExILEgwY+AAAABMSExIUGPwAAAATEhsSHBkAAAAAE - xIjEiQZBAAAABMSKxIsGQgAAAATEjMSNBkMAAAAExI7EjwZEAAAABMSQxJEGRQAAAATEksSTBkYAAAAE - xJTElQZHAAAABMSWxJcGSAAAAATEmMSZBkkAAAAExJrEmwZKAAAABMScxJ0GSwAAAATEnsSfBkwAAAAE - xKDEoQZNAAAABMSixKMGTgAAAATEpMSlBk8AAAAExKbEpwZQAAAABMSoxKkGUQAAAATEqsSrBlIAAAAE - xKzErQZTAAAABMSuxK8GVAAAAAXEsGnMhwZVAAAABMSyxLMGVgAAAATEtMS1BlcAAAAExLbEtwZYAAAA - BMS5xLoGWQAAAATEu8S8BloAAAAExL3EvgZbAAAABMS/xYAGXAAAAATFgcWCBl0AAAAExYPFhAZeAAAA - BMWFxYYGXwAAAATFh8WIBmAAAAAFxYnKvG4GYQAAAATFisWLBmIAAAAExYzFjQZjAAAABMWOxY8GZAAA - AATFkMWRBmUAAAAExZLFkwZmAAAABMWUxZUGZwAAAATFlsWXBmgAAAAExZjFmQZpAAAABMWaxZsGagAA - AATFnMWdBmsAAAAExZ7FnwZsAAAABMWgxaEGbQAAAATFosWjBm4AAAAExaTFpQZvAAAABMWmxacGcAAA - AATFqMWpBnEAAAAExarFqwZyAAAABMWsxa0GcwAAAATFrsWvBnQAAAAExbDFsQZ1AAAABMWyxbMGdgAA - AATFtMW1BncAAAAExbbFtwZ4AAAABMW4w78GeQAAAATFucW6BnoAAAAExbvFvAZ7AAAABMW9xb4GfAAA - AAPFv3MGfQAAAATGgcmTBn4AAAAExoLGgwZ/AAAABMaExoUGgAAAAATGhsmUBoEAAAAExofGiAaCAAAA - BMaJyZYGgwAAAATGismXBoQAAAAExovGjAaFAAAABMaOx50GhgAAAATGj8mZBocAAAAExpDJmwaIAAAA - BMaRxpIGiQAAAATGk8mgBooAAAAExpTJowaLAAAABMaWyakGjAAAAATGl8moBo0AAAAExpjGmQaOAAAA - BMacya8GjwAAAATGncmyBpAAAAAExp/JtQaRAAAABMagxqEGkgAAAATGosajBpMAAAAExqTGpQaUAAAA - BMamyoAGlQAAAATGp8aoBpYAAAAExqnKgwaXAAAABMasxq0GmAAAAATGrsqIBpkAAAAExq/GsAaaAAAA - BMaxyooGmwAAAATGssqLBpwAAAAExrPGtAadAAAABMa1xrYGngAAAATGt8qSBp8AAAAExrjGuQagAAAA - BMa8xr0GoQAAAATHhMeGBqIAAAAEx4XHhgajAAAABMeHx4kGpAAAAATHiMeJBqUAAAAEx4rHjAamAAAA - BMeLx4wGpwAAAATHjceOBqgAAAAEx4/HkAapAAAABMeRx5IGqgAAAATHk8eUBqsAAAAEx5XHlgasAAAA - BMeXx5gGrQAAAATHmceaBq4AAAAEx5vHnAavAAAABMeex58GsAAAAATHoMehBrEAAAAEx6LHowayAAAA - BMekx6UGswAAAATHpsenBrQAAAAEx6jHqQa1AAAABMeqx6sGtgAAAATHrMetBrcAAAAEx67Hrwa4AAAA - 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 - AgAABuKEoXRlbAbnAgAABeKEonRtBugCAAAE4oSkegbpAgAABeKEps+JBuoCAAAE4oSoegbrAgAABOKE - qmsG7AIAAAXihKvDpQbtAgAABOKErGIG7gIAAATihK1jBu8CAAAE4oSwZQbwAgAABOKEsWYG8QIAAATi - hLNtBvICAAAF4oS+zrMG8wIAAAXihL/PgAb0AgAABOKFhWQG9QIAAAbihaDihbAG9gIAAAbihaHihbEG - 9wIAAAbihaLihbIG+AIAAAbihaPihbMG+QIAAAbihaTihbQG+gIAAAbihaXihbUG+wIAAAbihabihbYG - /AIAAAbihafihbcG/QIAAAbihajihbgG/gIAAAbihanihbkG/wIAAAbiharihboGAAMAAAbihavihbsG - AQMAAAbihazihbwGAgMAAAbiha3ihb0GAwMAAAbiha7ihb4GBAMAAAbiha/ihb8GBQMAAAbikrbik5AG - BgMAAAbikrfik5EGBwMAAAbikrjik5IGCAMAAAbikrnik5MGCQMAAAbikrrik5QGCgMAAAbikrvik5UG - CwMAAAbikrzik5YGDAMAAAbikr3ik5cGDQMAAAbikr7ik5gGDgMAAAbikr/ik5kGDwMAAAbik4Dik5oG - EAMAAAbik4Hik5sGEQMAAAbik4Lik5wGEgMAAAbik4Pik50GEwMAAAbik4Tik54GFAMAAAbik4Xik58G - FQMAAAbik4bik6AGFgMAAAbik4fik6EGFwMAAAbik4jik6IGGAMAAAbik4nik6MGGQMAAAbik4rik6QG - GgMAAAbik4vik6UGGwMAAAbik4zik6YGHAMAAAbik43ik6cGHQMAAAbik47ik6gGHgMAAAbik4/ik6kG - HwMAAAbjjbFocGEGIAMAAAXjjbNhdQYhAwAABeONtW92BiIDAAAF446AcGEGIwMAAAXjjoFuYQYkAwAA - BuOOgs68YQYlAwAABeOOg21hBiYDAAAF446Ea2EGJwMAAAXjjoVrYgYoAwAABeOOhm1iBikDAAAF446H - Z2IGKgMAAAXjjopwZgYrAwAABeOOi25mBiwDAAAG446MzrxmBi0DAAAF446QaHoGLgMAAAbjjpFraHoG - LwMAAAbjjpJtaHoGMAMAAAbjjpNnaHoGMQMAAAbjjpR0aHoGMgMAAAXjjqlwYQYzAwAABuOOqmtwYQY0 - AwAABuOOq21wYQY1AwAABuOOrGdwYQY2AwAABeOOtHB2BjcDAAAF4461bnYGOAMAAAbjjrbOvHYGOQMA - AAXjjrdtdgY6AwAABeOOuGt2BjsDAAAF4465bXYGPAMAAAXjjrpwdwY9AwAABeOOu253Bj4DAAAG4468 - zrx3Bj8DAAAF4469bXcGQAMAAAXjjr5rdwZBAwAABeOOv213BkIDAAAG44+Aa8+JBkMDAAAG44+Bbc+J - BkQDAAAF44+DYnEGRQMAAAnjj4Zj4oiVa2cGRgMAAAbjj4djby4GRwMAAAXjj4hkYgZIAwAABeOPiWd5 - BkkDAAAF44+LaHAGSgMAAAXjj41rawZLAwAABeOPjmttBkwDAAAF44+XcGgGTQMAAAbjj5lwcG0GTgMA - AAXjj5pwcgZPAwAABeOPnHN2BlADAAAF44+dd2IGUQMAAAXvrIBmZgZSAwAABe+sgWZpBlMDAAAF76yC - ZmwGVAMAAAbvrINmZmkGVQMAAAbvrIRmZmwGVgMAAAXvrIVzdAZXAwAABe+shnN0BlgDAAAH76yT1bTV - tgZZAwAAB++slNW01aUGWgMAAAfvrJXVtNWrBlsDAAAH76yW1b7VtgZcAwAAB++sl9W01a0GXQMAAAbv - vKHvvYEGXgMAAAbvvKLvvYIGXwMAAAbvvKPvvYMGYAMAAAbvvKTvvYQGYQMAAAbvvKXvvYUGYgMAAAbv - vKbvvYYGYwMAAAbvvKfvvYcGZAMAAAbvvKjvvYgGZQMAAAbvvKnvvYkGZgMAAAbvvKrvvYoGZwMAAAbv - vKvvvYsGaAMAAAbvvKzvvYwGaQMAAAbvvK3vvY0GagMAAAbvvK7vvY4GawMAAAbvvK/vvY8GbAMAAAbv - vLDvvZAGbQMAAAbvvLHvvZEGbgMAAAbvvLLvvZIGbwMAAAbvvLPvvZMGcAMAAAbvvLTvvZQGcQMAAAbv - vLXvvZUGcgMAAAbvvLbvvZYGcwMAAAbvvLfvvZcGdAMAAAbvvLjvvZgGdQMAAAbvvLnvvZkGdgMAAAbv - vLrvvZoL - - - - - AAEAAAD/////AQAAAAAAAAARAQAAACADAAAGAgAAAAJBYQYDAAAAAkJiBgQAAAACQ2MGBQAAAAJEZAYG - AAAAAkVlBgcAAAACRmYGCAAAAAJHZwYJAAAAAkhoBgoAAAACSWkGCwAAAAJKagYMAAAAAktrBg0AAAAC - TGwGDgAAAAJNbQYPAAAAAk5uBhAAAAACT28GEQAAAAJQcAYSAAAAAlFxBhMAAAACUnIGFAAAAAJTcwYV - AAAAAlR0BhYAAAACVXUGFwAAAAJWdgYYAAAAAld3BhkAAAACWHgGGgAAAAJZeQYbAAAAAlp6BhwAAAAE - wrXOvAYdAAAABMOAw6AGHgAAAATDgcOhBh8AAAAEw4LDogYgAAAABMODw6MGIQAAAATDhMOkBiIAAAAE - w4XDpQYjAAAABMOGw6YGJAAAAATDh8OnBiUAAAAEw4jDqAYmAAAABMOJw6kGJwAAAATDisOqBigAAAAE - w4vDqwYpAAAABMOMw6wGKgAAAATDjcOtBisAAAAEw47DrgYsAAAABMOPw68GLQAAAATDkMOwBi4AAAAE - w5HDsQYvAAAABMOSw7IGMAAAAATDk8OzBjEAAAAEw5TDtAYyAAAABMOVw7UGMwAAAATDlsO2BjQAAAAE - w5jDuAY1AAAABMOZw7kGNgAAAATDmsO6BjcAAAAEw5vDuwY4AAAABMOcw7wGOQAAAATDncO9BjoAAAAE - w57DvgY7AAAABMOfc3MGPAAAAATEgMSBBj0AAAAExILEgwY+AAAABMSExIUGPwAAAATEhsSHBkAAAAAE - xIjEiQZBAAAABMSKxIsGQgAAAATEjMSNBkMAAAAExI7EjwZEAAAABMSQxJEGRQAAAATEksSTBkYAAAAE - xJTElQZHAAAABMSWxJcGSAAAAATEmMSZBkkAAAAExJrEmwZKAAAABMScxJ0GSwAAAATEnsSfBkwAAAAE - xKDEoQZNAAAABMSixKMGTgAAAATEpMSlBk8AAAAExKbEpwZQAAAABMSoxKkGUQAAAATEqsSrBlIAAAAE - xKzErQZTAAAABMSuxK8GVAAAAAXEsGnMhwZVAAAABMSyxLMGVgAAAATEtMS1BlcAAAAExLbEtwZYAAAA - BMS5xLoGWQAAAATEu8S8BloAAAAExL3EvgZbAAAABMS/xYAGXAAAAATFgcWCBl0AAAAExYPFhAZeAAAA - BMWFxYYGXwAAAATFh8WIBmAAAAAFxYnKvG4GYQAAAATFisWLBmIAAAAExYzFjQZjAAAABMWOxY8GZAAA - AATFkMWRBmUAAAAExZLFkwZmAAAABMWUxZUGZwAAAATFlsWXBmgAAAAExZjFmQZpAAAABMWaxZsGagAA - AATFnMWdBmsAAAAExZ7FnwZsAAAABMWgxaEGbQAAAATFosWjBm4AAAAExaTFpQZvAAAABMWmxacGcAAA - AATFqMWpBnEAAAAExarFqwZyAAAABMWsxa0GcwAAAATFrsWvBnQAAAAExbDFsQZ1AAAABMWyxbMGdgAA - AATFtMW1BncAAAAExbbFtwZ4AAAABMW4w78GeQAAAATFucW6BnoAAAAExbvFvAZ7AAAABMW9xb4GfAAA - AAPFv3MGfQAAAATGgcmTBn4AAAAExoLGgwZ/AAAABMaExoUGgAAAAATGhsmUBoEAAAAExofGiAaCAAAA - BMaJyZYGgwAAAATGismXBoQAAAAExovGjAaFAAAABMaOx50GhgAAAATGj8mZBocAAAAExpDJmwaIAAAA - BMaRxpIGiQAAAATGk8mgBooAAAAExpTJowaLAAAABMaWyakGjAAAAATGl8moBo0AAAAExpjGmQaOAAAA - BMacya8GjwAAAATGncmyBpAAAAAExp/JtQaRAAAABMagxqEGkgAAAATGosajBpMAAAAExqTGpQaUAAAA - BMamyoAGlQAAAATGp8aoBpYAAAAExqnKgwaXAAAABMasxq0GmAAAAATGrsqIBpkAAAAExq/GsAaaAAAA - BMaxyooGmwAAAATGssqLBpwAAAAExrPGtAadAAAABMa1xrYGngAAAATGt8qSBp8AAAAExrjGuQagAAAA - BMa8xr0GoQAAAATHhMeGBqIAAAAEx4XHhgajAAAABMeHx4kGpAAAAATHiMeJBqUAAAAEx4rHjAamAAAA - BMeLx4wGpwAAAATHjceOBqgAAAAEx4/HkAapAAAABMeRx5IGqgAAAATHk8eUBqsAAAAEx5XHlgasAAAA - BMeXx5gGrQAAAATHmceaBq4AAAAEx5vHnAavAAAABMeex58GsAAAAATHoMehBrEAAAAEx6LHowayAAAA - BMekx6UGswAAAATHpsenBrQAAAAEx6jHqQa1AAAABMeqx6sGtgAAAATHrMetBrcAAAAEx67Hrwa4AAAA - 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 - AgAAAAN/AAs= - - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAADwAAAAcDCQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkH - AAAACQgAAAAJCQAAAAkKAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAADwIAAAACAAAAA8KA - wp8PAwAAAAIAAAAD250ADwQAAAACAAAAA9yPAA8FAAAAAgAAAAPhoI4ADwYAAAACAAAAA+KAjAAPBwAA - AAIAAAAD4oCNAA8IAAAAAgAAAAPigKgADwkAAAACAAAAA+KAqQAPCgAAAAIAAAAD4oGgAA8LAAAAAgAA - AAPigaEADwwAAAACAAAAA+KBogAPDQAAAAIAAAAD4oGjAA8OAAAAAgAAAAPigariga8PDwAAAAIAAAAD - 77u/AA8QAAAAAgAAAAPvv7nvv7wL - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAAAQAAAAcDCQIAAAAPAgAAAAIAAAAD7oCA76O/Cw== - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAAAgAAAAcDCQIAAAAJAwAAAA8CAAAAAgAAAAPvt5Dvt68P - AwAAAAIAAAAD77++77+/Cw== - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAAAQAAAAcDCQIAAAAPAgAAAAIAAAAD8JCPvws= - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAABQAAAAcDCQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAA8C - AAAAAgAAAAPvv7kADwMAAAACAAAAA++/ugAPBAAAAAIAAAAD77+7AA8FAAAAAgAAAAPvv7wADwYAAAAC - AAAAA++/vQAL - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAAAQAAAAcDCQIAAAAPAgAAAAIAAAAD4r+w4r+7Cw== - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAADwAAAAcDCQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkH - AAAACQgAAAAJCQAAAAkKAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAADwIAAAACAAAAA82A - AA8DAAAAAgAAAAPNgQAPBAAAAAIAAAAD4oCOAA8FAAAAAgAAAAPigI8ADwYAAAACAAAAA+KAqgAPBwAA - AAIAAAAD4oCrAA8IAAAAAgAAAAPigKwADwkAAAACAAAAA+KArQAPCgAAAAIAAAAD4oCuAA8LAAAAAgAA - AAPigaoADwwAAAACAAAAA+KBqwAPDQAAAAIAAAAD4oGsAA8OAAAAAgAAAAPiga0ADw8AAAACAAAAA+KB - rgAPEAAAAAIAAAAD4oGvAAs= - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAAAAAAAAcDCw== - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAAIgAAAAcDCQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkH - AAAACQgAAAAJCQAAAAkKAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAAAkT - AAAACRQAAAAJFQAAAAkWAAAACRcAAAAJGAAAAAkZAAAACRoAAAAJGwAAAAkcAAAACR0AAAAJHgAAAAkf - AAAACSAAAAAJIQAAAAkiAAAACSMAAAAPAgAAAAIAAAAD1r4ADwMAAAACAAAAA9eAAA8EAAAAAgAAAAPX - gwAPBQAAAAIAAAAD15DXqg8GAAAAAgAAAAPXsNe0DwcAAAACAAAAA9ibAA8IAAAAAgAAAAPYnwAPCQAA - AAIAAAAD2KHYug8KAAAAAgAAAAPZgNmKDwsAAAACAAAAA9mt2a8PDAAAAAIAAAAD2bHblQ8NAAAAAgAA - AAPbnQAPDgAAAAIAAAAD26Xbpg8PAAAAAgAAAAPbutu+DxAAAAACAAAAA9yA3I0PEQAAAAIAAAAD3JAA - DxIAAAACAAAAA9yS3KwPEwAAAAIAAAAD3oDepQ8UAAAAAgAAAAPesQAPFQAAAAIAAAAD4oCPAA8WAAAA - AgAAAAPvrJ0ADxcAAAACAAAAA++sn++sqA8YAAAAAgAAAAPvrKrvrLYPGQAAAAIAAAAD76y476y8DxoA - AAACAAAAA++svgAPGwAAAAIAAAAD762A762BDxwAAAACAAAAA++tg++thA8dAAAAAgAAAAPvrYbvrrEP - HgAAAAIAAAAD76+T77S9Dx8AAAACAAAAA++1kO+2jw8gAAAAAgAAAAPvtpLvt4cPIQAAAAIAAAAD77ew - 77e8DyIAAAACAAAAA++5sO+5tA8jAAAAAgAAAAPvubbvu7wL - - - - - AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAAQwEAAAcDCQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkH - AAAACQgAAAAJCQAAAAkKAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAAAkT - AAAACRQAAAAJFQAAAAkWAAAACRcAAAAJGAAAAAkZAAAACRoAAAAJGwAAAAkcAAAACR0AAAAJHgAAAAkf - AAAACSAAAAAJIQAAAAkiAAAACSMAAAAJJAAAAAklAAAACSYAAAAJJwAAAAkoAAAACSkAAAAJKgAAAAkr - AAAACSwAAAAJLQAAAAkuAAAACS8AAAAJMAAAAAkxAAAACTIAAAAJMwAAAAk0AAAACTUAAAAJNgAAAAk3 - AAAACTgAAAAJOQAAAAk6AAAACTsAAAAJPAAAAAk9AAAACT4AAAAJPwAAAAlAAAAACUEAAAAJQgAAAAlD - AAAACUQAAAAJRQAAAAlGAAAACUcAAAAJSAAAAAlJAAAACUoAAAAJSwAAAAlMAAAACU0AAAAJTgAAAAlP - AAAACVAAAAAJUQAAAAlSAAAACVMAAAAJVAAAAAlVAAAACVYAAAAJVwAAAAlYAAAACVkAAAAJWgAAAAlb - AAAACVwAAAAJXQAAAAleAAAACV8AAAAJYAAAAAlhAAAACWIAAAAJYwAAAAlkAAAACWUAAAAJZgAAAAln - AAAACWgAAAAJaQAAAAlqAAAACWsAAAAJbAAAAAltAAAACW4AAAAJbwAAAAlwAAAACXEAAAAJcgAAAAlz - AAAACXQAAAAJdQAAAAl2AAAACXcAAAAJeAAAAAl5AAAACXoAAAAJewAAAAl8AAAACX0AAAAJfgAAAAl/ - AAAACYAAAAAJgQAAAAmCAAAACYMAAAAJhAAAAAmFAAAACYYAAAAJhwAAAAmIAAAACYkAAAAJigAAAAmL - AAAACYwAAAAJjQAAAAmOAAAACY8AAAAJkAAAAAmRAAAACZIAAAAJkwAAAAmUAAAACZUAAAAJlgAAAAmX - AAAACZgAAAAJmQAAAAmaAAAACZsAAAAJnAAAAAmdAAAACZ4AAAAJnwAAAAmgAAAACaEAAAAJogAAAAmj - AAAACaQAAAAJpQAAAAmmAAAACacAAAAJqAAAAAmpAAAACaoAAAAJqwAAAAmsAAAACa0AAAAJrgAAAAmv - AAAACbAAAAAJsQAAAAmyAAAACbMAAAAJtAAAAAm1AAAACbYAAAAJtwAAAAm4AAAACbkAAAAJugAAAAm7 - AAAACbwAAAAJvQAAAAm+AAAACb8AAAAJwAAAAAnBAAAACcIAAAAJwwAAAAnEAAAACcUAAAAJxgAAAAnH - AAAACcgAAAAJyQAAAAnKAAAACcsAAAAJzAAAAAnNAAAACc4AAAAJzwAAAAnQAAAACdEAAAAJ0gAAAAnT - AAAACdQAAAAJ1QAAAAnWAAAACdcAAAAJ2AAAAAnZAAAACdoAAAAJ2wAAAAncAAAACd0AAAAJ3gAAAAnf - AAAACeAAAAAJ4QAAAAniAAAACeMAAAAJ5AAAAAnlAAAACeYAAAAJ5wAAAAnoAAAACekAAAAJ6gAAAAnr - AAAACewAAAAJ7QAAAAnuAAAACe8AAAAJ8AAAAAnxAAAACfIAAAAJ8wAAAAn0AAAACfUAAAAJ9gAAAAn3 - AAAACfgAAAAJ+QAAAAn6AAAACfsAAAAJ/AAAAAn9AAAACf4AAAAJ/wAAAAkAAQAACQEBAAAJAgEAAAkD - AQAACQQBAAAJBQEAAAkGAQAACQcBAAAJCAEAAAkJAQAACQoBAAAJCwEAAAkMAQAACQ0BAAAJDgEAAAkP - AQAACRABAAAJEQEAAAkSAQAACRMBAAAJFAEAAAkVAQAACRYBAAAJFwEAAAkYAQAACRkBAAAJGgEAAAkb - AQAACRwBAAAJHQEAAAkeAQAACR8BAAAJIAEAAAkhAQAACSIBAAAJIwEAAAkkAQAACSUBAAAJJgEAAAkn - AQAACSgBAAAJKQEAAAkqAQAACSsBAAAJLAEAAAktAQAACS4BAAAJLwEAAAkwAQAACTEBAAAJMgEAAAkz - AQAACTQBAAAJNQEAAAk2AQAACTcBAAAJOAEAAAk5AQAACToBAAAJOwEAAAk8AQAACT0BAAAJPgEAAAk/ - AQAACUABAAAJQQEAAAlCAQAACUMBAAAJRAEAAA8CAAAAAgAAAANBWg8DAAAAAgAAAANheg8EAAAAAgAA - AAPCqgAPBQAAAAIAAAADwrUADwYAAAACAAAAA8K6AA8HAAAAAgAAAAPDgMOWDwgAAAACAAAAA8OYw7YP - CQAAAAIAAAADw7jIoA8KAAAAAgAAAAPIosizDwsAAAACAAAAA8mQyq0PDAAAAAIAAAADyrDKuA8NAAAA - AgAAAAPKu8uBDw4AAAACAAAAA8uQy5EPDwAAAAIAAAADy6DLpA8QAAAAAgAAAAPLrgAPEQAAAAIAAAAD - zboADxIAAAACAAAAA86GAA8TAAAAAgAAAAPOiM6KDxQAAAACAAAAA86MAA8VAAAAAgAAAAPOjs6hDxYA - AAACAAAAA86jz44PFwAAAAIAAAADz5DPtQ8YAAAAAgAAAAPQgNKCDxkAAAACAAAAA9KK044PGgAAAAIA - AAAD05DTtQ8bAAAAAgAAAAPTuNO5DxwAAAACAAAAA9SA1I8PHQAAAAIAAAAD1LHVlg8eAAAAAgAAAAPV - mdWfDx8AAAACAAAAA9Wh1ocPIAAAAAIAAAAD1okADyEAAAACAAAAA+CkgwAPIgAAAAIAAAAD4KSF4KS5 - DyMAAAACAAAAA+CkveClgA8kAAAAAgAAAAPgpYngpYwPJQAAAAIAAAAD4KWQAA8mAAAAAgAAAAPgpZjg - paEPJwAAAAIAAAAD4KWk4KWwDygAAAACAAAAA+CmguCmgw8pAAAAAgAAAAPgpoXgpowPKgAAAAIAAAAD - 4KaP4KaQDysAAAACAAAAA+Cmk+CmqA8sAAAAAgAAAAPgpqrgprAPLQAAAAIAAAAD4KayAA8uAAAAAgAA - AAPgprbgprkPLwAAAAIAAAAD4Ka+4KeADzAAAAACAAAAA+Cnh+CniA8xAAAAAgAAAAPgp4vgp4wPMgAA - AAIAAAAD4KeXAA8zAAAAAgAAAAPgp5zgp50PNAAAAAIAAAAD4Kef4KehDzUAAAACAAAAA+CnpuCnsQ82 - AAAAAgAAAAPgp7Tgp7oPNwAAAAIAAAAD4KiF4KiKDzgAAAACAAAAA+Coj+CokA85AAAAAgAAAAPgqJPg - qKgPOgAAAAIAAAAD4Kiq4KiwDzsAAAACAAAAA+CosuCosw88AAAAAgAAAAPgqLXgqLYPPQAAAAIAAAAD - 4Ki44Ki5Dz4AAAACAAAAA+CovuCpgA8/AAAAAgAAAAPgqZngqZwPQAAAAAIAAAAD4KmeAA9BAAAAAgAA - AAPgqabgqa8PQgAAAAIAAAAD4Kmy4Km0D0MAAAACAAAAA+CqgwAPRAAAAAIAAAAD4KqF4KqLD0UAAAAC - AAAAA+CqjQAPRgAAAAIAAAAD4KqP4KqRD0cAAAACAAAAA+Cqk+CqqA9IAAAAAgAAAAPgqqrgqrAPSQAA - AAIAAAAD4Kqy4KqzD0oAAAACAAAAA+CqteCquQ9LAAAAAgAAAAPgqr3gq4APTAAAAAIAAAAD4KuJAA9N - AAAAAgAAAAPgq4vgq4wPTgAAAAIAAAAD4KuQAA9PAAAAAgAAAAPgq6AAD1AAAAACAAAAA+CrpuCrrw9R - AAAAAgAAAAPgrILgrIMPUgAAAAIAAAAD4KyF4KyMD1MAAAACAAAAA+Csj+CskA9UAAAAAgAAAAPgrJPg - rKgPVQAAAAIAAAAD4Kyq4KywD1YAAAACAAAAA+CssuCssw9XAAAAAgAAAAPgrLbgrLkPWAAAAAIAAAAD - 4Ky94Ky+D1kAAAACAAAAA+CtgAAPWgAAAAIAAAAD4K2H4K2ID1sAAAACAAAAA+Cti+CtjA9cAAAAAgAA - AAPgrZcAD10AAAACAAAAA+CtnOCtnQ9eAAAAAgAAAAPgrZ/graEPXwAAAAIAAAAD4K2m4K2wD2AAAAAC - AAAAA+CugwAPYQAAAAIAAAAD4K6F4K6KD2IAAAACAAAAA+CujuCukA9jAAAAAgAAAAPgrpLgrpUPZAAA - AAIAAAAD4K6Z4K6aD2UAAAACAAAAA+CunAAPZgAAAAIAAAAD4K6e4K6fD2cAAAACAAAAA+Cuo+CupA9o - AAAAAgAAAAPgrqjgrqoPaQAAAAIAAAAD4K6u4K61D2oAAAACAAAAA+Cut+CuuQ9rAAAAAgAAAAPgrr7g - rr8PbAAAAAIAAAAD4K+B4K+CD20AAAACAAAAA+CvhuCviA9uAAAAAgAAAAPgr4rgr4wPbwAAAAIAAAAD - 4K+XAA9wAAAAAgAAAAPgr6fgr7IPcQAAAAIAAAAD4LCB4LCDD3IAAAACAAAAA+CwheCwjA9zAAAAAgAA - AAPgsI7gsJAPdAAAAAIAAAAD4LCS4LCoD3UAAAACAAAAA+CwquCwsw92AAAAAgAAAAPgsLXgsLkPdwAA - AAIAAAAD4LGB4LGED3gAAAACAAAAA+CxoOCxoQ95AAAAAgAAAAPgsabgsa8PegAAAAIAAAAD4LKC4LKD - D3sAAAACAAAAA+CyheCyjA98AAAAAgAAAAPgso7gspAPfQAAAAIAAAAD4LKS4LKoD34AAAACAAAAA+Cy - quCysw9/AAAAAgAAAAPgsrXgsrkPgAAAAAIAAAAD4LK+AA+BAAAAAgAAAAPgs4Dgs4QPggAAAAIAAAAD - 4LOH4LOID4MAAAACAAAAA+CziuCziw+EAAAAAgAAAAPgs5Xgs5YPhQAAAAIAAAAD4LOeAA+GAAAAAgAA - AAPgs6Dgs6EPhwAAAAIAAAAD4LOm4LOvD4gAAAACAAAAA+C0guC0gw+JAAAAAgAAAAPgtIXgtIwPigAA - AAIAAAAD4LSO4LSQD4sAAAACAAAAA+C0kuC0qA+MAAAAAgAAAAPgtKrgtLkPjQAAAAIAAAAD4LS+4LWA - D44AAAACAAAAA+C1huC1iA+PAAAAAgAAAAPgtYrgtYwPkAAAAAIAAAAD4LWXAA+RAAAAAgAAAAPgtaDg - taEPkgAAAAIAAAAD4LWm4LWvD5MAAAACAAAAA+C2guC2gw+UAAAAAgAAAAPgtoXgtpYPlQAAAAIAAAAD - 4Laa4LaxD5YAAAACAAAAA+C2s+C2uw+XAAAAAgAAAAPgtr0AD5gAAAACAAAAA+C3gOC3hg+ZAAAAAgAA - AAPgt4/gt5EPmgAAAAIAAAAD4LeY4LefD5sAAAACAAAAA+C3suC3tA+cAAAAAgAAAAPguIHguLAPnQAA - AAIAAAAD4Liy4LizD54AAAACAAAAA+C5gOC5hg+fAAAAAgAAAAPguY/guZsPoAAAAAIAAAAD4LqB4LqC - D6EAAAACAAAAA+C6hAAPogAAAAIAAAAD4LqH4LqID6MAAAACAAAAA+C6igAPpAAAAAIAAAAD4LqNAA+l - AAAAAgAAAAPgupTgupcPpgAAAAIAAAAD4LqZ4LqfD6cAAAACAAAAA+C6oeC6ow+oAAAAAgAAAAPguqUA - D6kAAAACAAAAA+C6pwAPqgAAAAIAAAAD4Lqq4LqrD6sAAAACAAAAA+C6reC6sA+sAAAAAgAAAAPgurLg - urMPrQAAAAIAAAAD4Lq9AA+uAAAAAgAAAAPgu4Dgu4QPrwAAAAIAAAAD4LuGAA+wAAAAAgAAAAPgu5Dg - u5kPsQAAAAIAAAAD4Luc4LudD7IAAAACAAAAA+C8gOC8lw+zAAAAAgAAAAPgvJrgvLQPtAAAAAIAAAAD - 4Ly2AA+1AAAAAgAAAAPgvLgAD7YAAAACAAAAA+C8vuC9hw+3AAAAAgAAAAPgvYngvaoPuAAAAAIAAAAD - 4L2/AA+5AAAAAgAAAAPgvoUAD7oAAAACAAAAA+C+iOC+iw+7AAAAAgAAAAPgvr7gv4UPvAAAAAIAAAAD - 4L+H4L+MD70AAAACAAAAA+C/jwAPvgAAAAIAAAAD4YCA4YChD78AAAACAAAAA+GAo+GApw/AAAAAAgAA - AAPhgKnhgKoPwQAAAAIAAAAD4YCsAA/CAAAAAgAAAAPhgLEAD8MAAAACAAAAA+GAuAAPxAAAAAIAAAAD - 4YGA4YGXD8UAAAACAAAAA+GCoOGDhQ/GAAAAAgAAAAPhg5Dhg7gPxwAAAAIAAAAD4YO7AA/IAAAAAgAA - AAPhhIDhhZkPyQAAAAIAAAAD4YWf4YaiD8oAAAACAAAAA+GGqOGHuQ/LAAAAAgAAAAPhiIDhiIYPzAAA - AAIAAAAD4YiI4YmGD80AAAACAAAAA+GJiAAPzgAAAAIAAAAD4YmK4YmND88AAAACAAAAA+GJkOGJlg/Q - AAAAAgAAAAPhiZgAD9EAAAACAAAAA+GJmuGJnQ/SAAAAAgAAAAPhiaDhioYP0wAAAAIAAAAD4YqIAA/U - AAAAAgAAAAPhiorhio0P1QAAAAIAAAAD4YqQ4YquD9YAAAACAAAAA+GKsAAP1wAAAAIAAAAD4Yqy4Yq1 - D9gAAAACAAAAA+GKuOGKvg/ZAAAAAgAAAAPhi4AAD9oAAAACAAAAA+GLguGLhQ/bAAAAAgAAAAPhi4jh - i44P3AAAAAIAAAAD4YuQ4YuWD90AAAACAAAAA+GLmOGLrg/eAAAAAgAAAAPhi7DhjI4P3wAAAAIAAAAD - 4YyQAA/gAAAAAgAAAAPhjJLhjJUP4QAAAAIAAAAD4YyY4YyeD+IAAAACAAAAA+GMoOGNhg/jAAAAAgAA - AAPhjYjhjZoP5AAAAAIAAAAD4Y2h4Y28D+UAAAACAAAAA+GOoOGPtA/mAAAAAgAAAAPhkIHhmbYP5wAA - AAIAAAAD4ZqB4ZqaD+gAAAACAAAAA+GaoOGbsA/pAAAAAgAAAAPhnIDhnIwP6gAAAAIAAAAD4ZyO4ZyR - D+sAAAACAAAAA+GcoOGcsQ/sAAAAAgAAAAPhnLXhnLYP7QAAAAIAAAAD4Z2A4Z2RD+4AAAACAAAAA+Gd - oOGdrA/vAAAAAgAAAAPhna7hnbAP8AAAAAIAAAAD4Z6A4Z62D/EAAAACAAAAA+GevuGfhQ/yAAAAAgAA - AAPhn4fhn4gP8wAAAAIAAAAD4Z+U4Z+aD/QAAAACAAAAA+GfnAAP9QAAAAIAAAAD4Z+g4Z+pD/YAAAAC - AAAAA+GgkOGgmQ/3AAAAAgAAAAPhoKDhobcP+AAAAAIAAAAD4aKA4aKoD/kAAAACAAAAA+G4gOG6mw/6 - AAAAAgAAAAPhuqDhu7kP+wAAAAIAAAAD4byA4byVD/wAAAACAAAAA+G8mOG8nQ/9AAAAAgAAAAPhvKDh - vYUP/gAAAAIAAAAD4b2I4b2ND/8AAAACAAAAA+G9kOG9lw8AAQAAAgAAAAPhvZkADwEBAAACAAAAA+G9 - mwAPAgEAAAIAAAAD4b2dAA8DAQAAAgAAAAPhvZ/hvb0PBAEAAAIAAAAD4b6A4b60DwUBAAACAAAAA+G+ - tuG+vA8GAQAAAgAAAAPhvr4ADwcBAAACAAAAA+G/guG/hA8IAQAAAgAAAAPhv4bhv4wPCQEAAAIAAAAD - 4b+Q4b+TDwoBAAACAAAAA+G/luG/mw8LAQAAAgAAAAPhv6Dhv6wPDAEAAAIAAAAD4b+y4b+0Dw0BAAAC - AAAAA+G/tuG/vA8OAQAAAgAAAAPigI4ADw8BAAACAAAAA+KBsQAPEAEAAAIAAAAD4oG/AA8RAQAAAgAA - AAPihIIADxIBAAACAAAAA+KEhwAPEwEAAAIAAAAD4oSK4oSTDxQBAAACAAAAA+KElQAPFQEAAAIAAAAD - 4oSZ4oSdDxYBAAACAAAAA+KEpAAPFwEAAAIAAAAD4oSmAA8YAQAAAgAAAAPihKgADxkBAAACAAAAA+KE - quKErQ8aAQAAAgAAAAPihK/ihLEPGwEAAAIAAAAD4oSz4oS5DxwBAAACAAAAA+KEveKEvw8dAQAAAgAA - AAPihYXihYkPHgEAAAIAAAAD4oWg4oaDDx8BAAACAAAAA+KMtuKNug8gAQAAAgAAAAPijpUADyEBAAAC - AAAAA+KSnOKTqQ8iAQAAAgAAAAPjgIXjgIcPIwEAAAIAAAAD44Ch44CpDyQBAAACAAAAA+OAseOAtQ8l - AQAAAgAAAAPjgLjjgLwPJgEAAAIAAAAD44GB44KWDycBAAACAAAAA+OCneOCnw8oAQAAAgAAAAPjgqHj - g7oPKQEAAAIAAAAD44O844O/DyoBAAACAAAAA+OEheOErA8rAQAAAgAAAAPjhLHjho4PLAEAAAIAAAAD - 44aQ44a3Dy0BAAACAAAAA+OHsOOInA8uAQAAAgAAAAPjiKDjiYMPLwEAAAIAAAAD44mg44m7DzABAAAC - AAAAA+OJv+OKsA8xAQAAAgAAAAPji4Dji4sPMgEAAAIAAAAD44uQ44u+DzMBAAACAAAAA+OMgOONtg80 - AQAAAgAAAAPjjbvjj50PNQEAAAIAAAAD44+g44++DzYBAAACAAAAA+OQgOS2tQ83AQAAAgAAAAPkuIDp - vqUPOAEAAAIAAAAD6oCA6pKMDzkBAAACAAAAA+qwgO2eow86AQAAAgAAAAPtoIDvqK0POwEAAAIAAAAD - 76iw76mqDzwBAAACAAAAA++sgO+shg89AQAAAgAAAAPvrJPvrJcPPgEAAAIAAAAD77yh77y6Dz8BAAAC - AAAAA++9ge+9mg9AAQAAAgAAAAPvvabvvr4PQQEAAAIAAAAD77+C77+HD0IBAAACAAAAA++/iu+/jw9D - AQAAAgAAAAPvv5Lvv5cPRAEAAAIAAAAD77+a77+cCw== - - - \ No newline at end of file From c78646eb6cd4514e9f4c84c851f568b6a62a8cf2 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 16 Mar 2017 21:44:24 +0700 Subject: [PATCH 4/7] #83: port some classes --- src/JabberNet/JabberNet.csproj | 9 +++++---- src/JabberNet/bedrock/io/ZlibStream.cs | 4 ++-- src/JabberNet/bedrock/util/ConfigFile.cs | 16 +++++++++------- src/JabberNet/jabber/JID.cs | 15 ++------------- src/JabberNet/xpnet/Position.cs | 12 ++---------- 5 files changed, 20 insertions(+), 36 deletions(-) diff --git a/src/JabberNet/JabberNet.csproj b/src/JabberNet/JabberNet.csproj index 551dd98..2d95365 100644 --- a/src/JabberNet/JabberNet.csproj +++ b/src/JabberNet/JabberNet.csproj @@ -1,7 +1,7 @@  - netstandard1.3 + netstandard1.6 3.0.0.0 3.0.0.0 3.0.0-preview1 @@ -13,8 +13,12 @@ + + + + @@ -208,9 +212,6 @@ Code - - Code - Code diff --git a/src/JabberNet/bedrock/io/ZlibStream.cs b/src/JabberNet/bedrock/io/ZlibStream.cs index 7f7e3b1..63c5960 100644 --- a/src/JabberNet/bedrock/io/ZlibStream.cs +++ b/src/JabberNet/bedrock/io/ZlibStream.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -14,7 +14,7 @@ using System; using System.IO; -using zlib; +using ComponentAce.Compression.Libs.zlib; namespace JabberNet.bedrock.io { diff --git a/src/JabberNet/bedrock/util/ConfigFile.cs b/src/JabberNet/bedrock/util/ConfigFile.cs index 6342ff5..64b1386 100644 --- a/src/JabberNet/bedrock/util/ConfigFile.cs +++ b/src/JabberNet/bedrock/util/ConfigFile.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -12,7 +12,7 @@ * See licenses/Jabber-Net_LGPLv3.txt for details. * --------------------------------------------------------------------------*/ -using System.Collections; +using System.Collections.Generic; using System.IO; using System.Xml; @@ -25,7 +25,7 @@ public class ConfigFile { private string m_file; private XmlDocument m_doc; - private static Hashtable s_instances = new Hashtable(); + private static Dictionary s_instances = new Dictionary(); private FileSystemWatcher m_watcher; /// @@ -38,7 +38,7 @@ public static ConfigFile GetInstance(string name) ConfigFile inst = (ConfigFile) s_instances[name]; if (inst == null) { - lock (s_instances.SyncRoot) + lock (s_instances) { if (inst == null) { @@ -81,7 +81,8 @@ private ConfigFile(string name) private void Load(FileInfo info) { m_file = info.FullName; - m_doc.Load(m_file); + using (var stream = new FileStream(m_file, FileMode.Open)) + m_doc.Load(stream); m_watcher = new FileSystemWatcher(info.DirectoryName, info.Name); m_watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size | NotifyFilters.CreationTime; m_watcher.Changed += new FileSystemEventHandler(m_watcher_Changed); @@ -91,7 +92,8 @@ private void Load(FileInfo info) private void m_watcher_Changed(object sender, FileSystemEventArgs e) { m_doc = new XmlDocument(); - m_doc.Load(m_file); + using (var stream = new FileStream(m_file, FileMode.Open)) + m_doc.Load(stream); if (OnFileChange != null) OnFileChange(this, e); } @@ -112,7 +114,7 @@ public string Filename /// public XmlNode GetNode(string xpath) { - return m_doc.SelectSingleNode(xpath); + return m_doc. SelectSingleNode(xpath); //ConfigFile f; } /// diff --git a/src/JabberNet/jabber/JID.cs b/src/JabberNet/jabber/JID.cs index 05402ac..3eac6e9 100644 --- a/src/JabberNet/jabber/JID.cs +++ b/src/JabberNet/jabber/JID.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -22,7 +22,7 @@ namespace JabberNet.jabber /// /// Informs the client that an invalid JID was entered. /// - public class JIDFormatException : ApplicationException + public class JIDFormatException : Exception { /// /// Creates a new exception for an invalid JID. @@ -47,17 +47,6 @@ public JIDFormatException() : base() public JIDFormatException(string badJid, Exception e) : base("Bad JID: (" + badJid + ")", e) { } - - /// - /// Initializes a new instance of the AsyncSocketConnectionException class with serialized data. - /// - /// The object that holds the serialized object data. - /// The contextual information about the source or destination. - protected JIDFormatException(System.Runtime.Serialization.SerializationInfo info, - System.Runtime.Serialization.StreamingContext ctx) : - base(info, ctx) - { - } } /// diff --git a/src/JabberNet/xpnet/Position.cs b/src/JabberNet/xpnet/Position.cs index fb05772..da03e00 100644 --- a/src/JabberNet/xpnet/Position.cs +++ b/src/JabberNet/xpnet/Position.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -26,7 +26,7 @@ namespace JabberNet.xpnet /// /// Position of an entry in a table. /// - public class Position : System.ICloneable + public class Position { private int lineNumber; private int columnNumber; @@ -61,13 +61,5 @@ public int ColumnNumber get { return columnNumber; } set { columnNumber = value; } } - - /** - * Returns a copy of this position. - */ - public object Clone() - { - throw new System.NotImplementedException(); - } } } From 4d473b8328b6072575be43775d2d402a403e3a75 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 16 Mar 2017 22:44:18 +0700 Subject: [PATCH 5/7] #83: fixes in ZlibStream, XEP25Socket, KerbProcessor --- src/JabberNet/JabberNet.csproj | 8 + src/JabberNet/bedrock/io/ZlibStream.cs | 154 ++---------------- src/JabberNet/bedrock/net/XEP25Socket.cs | 130 +++++++-------- .../jabber/connection/sasl/KerbProcessor.cs | 26 +-- 4 files changed, 99 insertions(+), 219 deletions(-) diff --git a/src/JabberNet/JabberNet.csproj b/src/JabberNet/JabberNet.csproj index 2d95365..0e8545c 100644 --- a/src/JabberNet/JabberNet.csproj +++ b/src/JabberNet/JabberNet.csproj @@ -12,11 +12,19 @@ Copyright (c) Cursive, Inc. 2000—2008; Jabber-Net Contributors, 2008—2017 + + True + + + + + + diff --git a/src/JabberNet/bedrock/io/ZlibStream.cs b/src/JabberNet/bedrock/io/ZlibStream.cs index 63c5960..e7101b8 100644 --- a/src/JabberNet/bedrock/io/ZlibStream.cs +++ b/src/JabberNet/bedrock/io/ZlibStream.cs @@ -14,6 +14,8 @@ using System; using System.IO; +using System.Threading; +using System.Threading.Tasks; using ComponentAce.Compression.Libs.zlib; namespace JabberNet.bedrock.io @@ -21,7 +23,7 @@ namespace JabberNet.bedrock.io /// /// Compression failed. /// - public class CompressionFailedException : ApplicationException + public class CompressionFailedException : Exception { /// /// @@ -161,16 +163,7 @@ public override long Position set { throw new NotImplementedException("The method or operation is not implemented."); } } - /// - /// Start an async read. Implemented locally, since Stream.BeginRead() isn't really asynch. - /// - /// - /// - /// - /// - /// - /// - public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (count <= 0) throw new ArgumentException("Can't read 0 bytes", "count"); @@ -181,23 +174,10 @@ public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, Asy if (m_in.avail_in == 0) { m_in.next_in_index = 0; - return m_stream.BeginRead(m_inbuf, 0, bufsize, callback, state); + return m_stream.ReadAsync(m_inbuf, 0, bufsize, cancellationToken); } - ZlibStreamAsyncResult ar = new ZlibStreamAsyncResult(state); - callback(ar); - return ar; - } - /// - /// Complete a pending read, when the callback passed to BeginRead fires. - /// - /// - /// - public override int EndRead(IAsyncResult asyncResult) - { - if (!(asyncResult is ZlibStreamAsyncResult)) - m_in.avail_in = m_stream.EndRead(asyncResult); - return Inflate(); + return Task.FromResult(Inflate()); } /// @@ -260,17 +240,7 @@ public override void SetLength(long value) throw new NotImplementedException("The method or operation is not implemented."); } - /// - /// Begin an asynch write, compressing first. Implemented locally, since Stream.BeginWrite isn't asynch. - /// Note: may call Write() on the underlying stream more than once. - /// - /// - /// - /// - /// - /// - /// - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (count <= 0) throw new ArgumentException("Can't write 0 bytes", "count"); @@ -286,31 +256,20 @@ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, As { if (err != zlibConst.Z_OK) { - ZlibStreamAsyncResult res = new ZlibStreamAsyncResult(state, new CompressionFailedException("Compress failed: " + err)); - callback(res); - return res; + throw new CompressionFailedException("Compress failed: " + err); } } if (m_out.avail_in == 0) - return m_stream.BeginWrite(m_outbuf, 0, bufsize - m_out.avail_out, callback, state); + await m_stream.WriteAsync(m_outbuf, 0, bufsize - m_out.avail_out, cancellationToken); else - return m_stream.BeginWrite(m_outbuf, 0, bufsize - m_out.avail_out, new AsyncCallback(IntermediateWrite), new ZlibState(callback, state)); - } - - private void IntermediateWrite(IAsyncResult asyncResult) - { - ZlibState state = (ZlibState)asyncResult.AsyncState; - try { - m_stream.EndWrite(asyncResult); - } - catch (Exception e) - { - ZlibStreamAsyncResult res = new ZlibStreamAsyncResult(state.state, e); - state.callback(res); - return; + await m_stream.WriteAsync(m_outbuf, 0, bufsize - m_out.avail_out, cancellationToken); + await IntermediateWrite(cancellationToken); } + } + private async Task IntermediateWrite(CancellationToken cancellationToken) + { m_out.next_out_index = 0; m_out.avail_out = bufsize; int err = m_out.deflate(m_flush); @@ -318,32 +277,16 @@ private void IntermediateWrite(IAsyncResult asyncResult) { if (err != zlibConst.Z_OK) { - ZlibStreamAsyncResult res = new ZlibStreamAsyncResult(state.state, new CompressionFailedException("Compress failed: " + err)); - state.callback(res); - return; + throw new CompressionFailedException("Compress failed: " + err); } } if (m_out.avail_in == 0) - m_stream.BeginWrite(m_outbuf, 0, bufsize - m_out.avail_out, state.callback, state.state); + await m_stream.WriteAsync(m_outbuf, 0, bufsize - m_out.avail_out, cancellationToken); else - m_stream.BeginWrite(m_outbuf, 0, bufsize - m_out.avail_out, new AsyncCallback(IntermediateWrite), state); - } - - /// - /// Complete a pending write, when the callback given to BeginWrite is called. - /// - /// - public override void EndWrite(IAsyncResult asyncResult) - { - if (asyncResult is ZlibStreamAsyncResult) { - ZlibStreamAsyncResult ar = (ZlibStreamAsyncResult)asyncResult; - if (ar.Exception != null) - throw ar.Exception; + await m_stream.WriteAsync(m_outbuf, 0, bufsize - m_out.avail_out, cancellationToken); + await IntermediateWrite(cancellationToken); } - else - m_stream.EndWrite(asyncResult); - return; } /// @@ -373,66 +316,5 @@ public override void Write(byte[] buffer, int offset, int count) m_stream.Write(m_outbuf, 0, bufsize - m_out.avail_out); } } - - private class ZlibStreamAsyncResult : IAsyncResult - { - private object m_state = null; - private Exception m_exception; - - public ZlibStreamAsyncResult(object state) - { - m_state = state; - } - - public ZlibStreamAsyncResult(object state, Exception except) - { - m_state = state; - m_exception = except; - } - - public Exception Exception - { - get { return m_exception; } - } - - #region IAsyncResult Members - - public object AsyncState - { - get { return m_state; } - } - - public System.Threading.WaitHandle AsyncWaitHandle - { - get - { - throw new Exception("The method or operation is not implemented."); - } - } - - public bool CompletedSynchronously - { - get { return true; } - } - - public bool IsCompleted - { - get { return true; } - } - - #endregion - } - - private class ZlibState - { - public AsyncCallback callback; - public object state; - - public ZlibState(AsyncCallback callback, object state) - { - this.callback = callback; - this.state = state; - } - } } } diff --git a/src/JabberNet/bedrock/net/XEP25Socket.cs b/src/JabberNet/bedrock/net/XEP25Socket.cs index e0e1c09..b99b432 100644 --- a/src/JabberNet/bedrock/net/XEP25Socket.cs +++ b/src/JabberNet/bedrock/net/XEP25Socket.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -17,6 +17,7 @@ using System.Diagnostics; using System.IO; using System.Net; +using System.Net.Http; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; @@ -45,9 +46,8 @@ public XEP25Exception(string reason) : base(reason) public class XEP25Socket : BaseSocket, IHttpSocket { private const string CONTENT_TYPE = "application/x-www-form-urlencoded"; - private const string METHOD = "POST"; - private readonly RandomNumberGenerator s_rng = RNGCryptoServiceProvider.Create(); + private readonly RandomNumberGenerator s_rng = RandomNumberGenerator.Create(); private readonly Queue m_writeQ = new Queue(); private readonly Object m_lock = new Object(); @@ -61,9 +61,8 @@ public class XEP25Socket : BaseSocket, IHttpSocket private int m_curKey = 511; private bool m_running = false; private string m_id = null; - private WebProxy m_proxy = null; + private IWebProxy m_proxy = null; private X509Certificate m_cert = null; - private X509Certificate m_remote_cert = null; /// /// Do trust all server sertificates? @@ -122,7 +121,7 @@ public int NumKeys /// Proxy information. My guess is if you leave this null, the IE proxy /// info may be used. Not tested. /// - public WebProxy Proxy + public IWebProxy Proxy { get { return m_proxy; } set { m_proxy = value; } @@ -137,15 +136,6 @@ public X509Certificate LocalCertificate set { m_cert = value; } } - /// - /// The remote certificate. - /// - public X509Certificate RemoteCertificate - { - get { return m_remote_cert; } - set { m_remote_cert = value; } - } - /// /// Accept a socket. Not implemented. /// @@ -290,14 +280,32 @@ private void PollThread() m_id = null; MemoryStream ms = new MemoryStream(); - CookieContainer cookies = new CookieContainer(5); + CookieContainer cookies = new CookieContainer(); byte[] readbuf = new byte[1024]; - Stream rs; byte[] buf; - HttpWebResponse resp; - HttpWebRequest req; - Stream s; + HttpResponseMessage response; + var handler = new HttpClientHandler + { + CookieContainer = cookies, + Proxy = m_proxy, + ServerCertificateCustomValidationCallback = ValidateRemoteCertificate + }; + if (m_cert != null) + handler.ClientCertificates.Add(m_cert); + var client = new HttpClient(handler) + { + DefaultRequestHeaders = + { + ConnectionClose = true, + CacheControl = + { + NoCache = true, + NoStore = true + } + } + }; + WriteBuf start; while (m_running) @@ -344,59 +352,41 @@ private void PollThread() } POLL: - req = (HttpWebRequest)WebRequest.Create(m_url); - req.CookieContainer = cookies; - req.ContentType = CONTENT_TYPE; - req.Method = METHOD; - - if (m_cert != null) - req.ClientCertificates.Add(m_cert); - - req.KeepAlive = false; - - req.CachePolicy = new System.Net.Cache.HttpRequestCachePolicy(System.Net.Cache.HttpRequestCacheLevel.NoCacheNoStore); - req.CachePolicy = new System.Net.Cache.HttpRequestCachePolicy(System.Net.Cache.HttpRequestCacheLevel.NoCacheNoStore); - - if (m_proxy != null) - req.Proxy = m_proxy; - req.ContentLength = count; - - - try + using (var requestStream = new MemoryStream()) { - ServicePointManager.ServerCertificateValidationCallback = - ValidateRemoteCertificate; - - s = req.GetRequestStream(); - s.Write(start.buf, start.offset, start.len); - - m_remote_cert = req.ServicePoint.Certificate; - - buf = ms.ToArray(); - s.Write(buf, 0, buf.Length); - s.Close(); + var message = new HttpRequestMessage(HttpMethod.Post, m_url) + { + Content = new StreamContent(requestStream) + { + Headers = { ContentLength = count } + } + }; - resp = (HttpWebResponse) req.GetResponse(); - } - catch (WebException ex) - { - if (ex.Status != WebExceptionStatus.KeepAliveFailure) + try + { + requestStream.Write(start.buf, start.offset, start.len); + response = client.SendAsync(message).Result; + buf = ms.ToArray(); + requestStream.Write(buf, 0, buf.Length); + } + catch (WebException ex) { - m_listener.OnError(this, ex); - return; + if (ex.Status != WebExceptionStatus.KeepAliveFailure) + { + m_listener.OnError(this, ex); + return; + } + goto POLL; } - goto POLL; } - - - if (resp.StatusCode != HttpStatusCode.OK) + if (response.StatusCode != HttpStatusCode.OK) { - m_listener.OnError(this, new WebException("Invalid HTTP return code: " + resp.StatusCode)); + m_listener.OnError(this, new WebException("Invalid HTTP return code: " + response.StatusCode)); return; } - CookieCollection cc = resp.Cookies; + CookieCollection cc = cookies.GetCookies(new Uri(m_url)); Debug.Assert(cc != null); Cookie c = cc["ID"]; @@ -441,15 +431,15 @@ private void PollThread() } ms.SetLength(0); - rs = resp.GetResponseStream(); - - - int readlen; - while ((readlen = rs.Read(readbuf, 0, readbuf.Length)) > 0) + using (var rs = response.Content.ReadAsStreamAsync().Result) { - ms.Write(readbuf, 0, readlen); + int readlen; + while ((readlen = rs.Read(readbuf, 0, readbuf.Length)) > 0) + { + ms.Write(readbuf, 0, readlen); + } } - rs.Close(); + if (ms.Length > 0) { buf = ms.ToArray(); diff --git a/src/JabberNet/jabber/connection/sasl/KerbProcessor.cs b/src/JabberNet/jabber/connection/sasl/KerbProcessor.cs index ccc1603..e4ac9de 100644 --- a/src/JabberNet/jabber/connection/sasl/KerbProcessor.cs +++ b/src/JabberNet/jabber/connection/sasl/KerbProcessor.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -427,7 +427,7 @@ internal class SSPIHelper bool _bGotClientCredentials = false; - [DllImport("secur32", CharSet = CharSet.Auto)] + [DllImport("secur32", CharSet = CharSet.Unicode)] static extern uint AcquireCredentialsHandle( string pszPrincipal, //SEC_CHAR* string pszPackage, //SEC_CHAR* //"Kerberos","NTLM","Negotiative" @@ -439,7 +439,7 @@ static extern uint AcquireCredentialsHandle( ref SECURITY_HANDLE phCredential, //SecHandle //PCtxtHandle ref ref SECURITY_INTEGER ptsExpiry); //PTimeStamp //TimeStamp ref - [DllImport("secur32", CharSet = CharSet.Auto)] + [DllImport("secur32", CharSet = CharSet.Unicode)] static extern uint AcquireCredentialsHandle( string pszPrincipal, //SEC_CHAR* string pszPackage, //SEC_CHAR* //"Kerberos","NTLM","Negotiative" @@ -451,7 +451,7 @@ static extern uint AcquireCredentialsHandle( ref SECURITY_HANDLE phCredential, //SecHandle //PCtxtHandle ref ref SECURITY_INTEGER ptsExpiry); //PTimeStamp //TimeStamp ref - [DllImport("secur32", CharSet = CharSet.Auto, SetLastError = true)] + [DllImport("secur32", CharSet = CharSet.Unicode, SetLastError = true)] static extern uint InitializeSecurityContext( ref SECURITY_HANDLE phCredential,//PCredHandle IntPtr phContext, //PCtxtHandle @@ -466,7 +466,7 @@ static extern uint InitializeSecurityContext( out uint pfContextAttr, //managed ulong == 64 bits!!! out SECURITY_INTEGER ptsExpiry); //PTimeStamp - [DllImport("secur32", CharSet = CharSet.Auto, SetLastError = true)] + [DllImport("secur32", CharSet = CharSet.Unicode, SetLastError = true)] static extern uint InitializeSecurityContext( ref SECURITY_HANDLE phCredential,//PCredHandle ref SECURITY_HANDLE phContext, //PCtxtHandle @@ -482,7 +482,7 @@ static extern uint InitializeSecurityContext( out SECURITY_INTEGER ptsExpiry); //PTimeStamp /* - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] static extern int AcceptSecurityContext(ref SECURITY_HANDLE phCredential, IntPtr phContext, ref SecBufferDesc pInput, @@ -493,7 +493,7 @@ static extern int AcceptSecurityContext(ref SECURITY_HANDLE phCredential, out uint pfContextAttr, //managed ulong == 64 bits!!! out SECURITY_INTEGER ptsTimeStamp); - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] static extern int AcceptSecurityContext(ref SECURITY_HANDLE phCredential, ref SECURITY_HANDLE phContext, ref SecBufferDesc pInput, @@ -505,33 +505,33 @@ static extern int AcceptSecurityContext(ref SECURITY_HANDLE phCredential, out SECURITY_INTEGER ptsTimeStamp); */ - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] public static extern int ImpersonateSecurityContext(ref SECURITY_HANDLE phContext); - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] public static extern int QueryContextAttributes(ref SECURITY_HANDLE phContext, uint ulAttribute, out SecPkgContext_Sizes pContextAttributes); - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] public static extern int EncryptMessage(ref SECURITY_HANDLE phContext, uint fQOP, //managed ulong == 64 bits!!! ref SecBufferDesc pMessage, uint MessageSeqNo); //managed ulong == 64 bits!!! - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] public static extern int DecryptMessage(ref SECURITY_HANDLE phContext, ref SecBufferDesc pMessage, uint MessageSeqNo, out uint pfQOP); - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] public static extern int MakeSignature(ref SECURITY_HANDLE phContext, // Context to use uint fQOP, // Quality of Protection ref SecBufferDesc pMessage, // Message to sign uint MessageSeqNo); // Message Sequence Num. - [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] + [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] public static extern int VerifySignature(ref SECURITY_HANDLE phContext, // Context to use ref SecBufferDesc pMessage, // Message to sign uint MessageSeqNo, // Message Sequence Num. From 630c96a99da7acd69ee806156ba8ffaa824e6149 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Thu, 16 Mar 2017 22:49:54 +0700 Subject: [PATCH 6/7] #83: fix MD5Processor and SASLProcessor --- src/JabberNet/JabberNet.csproj | 197 +----------------- .../jabber/connection/sasl/MD5Processor.cs | 4 +- .../jabber/connection/sasl/SASLProcessor.cs | 4 +- 3 files changed, 9 insertions(+), 196 deletions(-) diff --git a/src/JabberNet/JabberNet.csproj b/src/JabberNet/JabberNet.csproj index 0e8545c..19038f3 100644 --- a/src/JabberNet/JabberNet.csproj +++ b/src/JabberNet/JabberNet.csproj @@ -18,12 +18,17 @@ + + + + + @@ -33,198 +38,6 @@ - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - RosterManager.cs diff --git a/src/JabberNet/jabber/connection/sasl/MD5Processor.cs b/src/JabberNet/jabber/connection/sasl/MD5Processor.cs index 5c440ec..baf2633 100644 --- a/src/JabberNet/jabber/connection/sasl/MD5Processor.cs +++ b/src/JabberNet/jabber/connection/sasl/MD5Processor.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -43,7 +43,7 @@ public class MD5Processor : SASLProcessor private string m_charset; private string m_authzid; - private readonly MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider(); + private readonly MD5 MD5 = MD5.Create(); private readonly Regex CSV = new Regex(@"(?[^= \t\r\n]+)=(?:(?[^,"" \t\r\n]+)|(?:""(?[^""]*)"")),?", RegexOptions.ExplicitCapture); diff --git a/src/JabberNet/jabber/connection/sasl/SASLProcessor.cs b/src/JabberNet/jabber/connection/sasl/SASLProcessor.cs index b20bea0..a193f37 100644 --- a/src/JabberNet/jabber/connection/sasl/SASLProcessor.cs +++ b/src/JabberNet/jabber/connection/sasl/SASLProcessor.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -28,7 +28,7 @@ namespace JabberNet.jabber.connection.sasl /// /// Some sort of SASL error /// - public class SASLException : ApplicationException + public class SASLException : Exception { /// /// From 2e843ad231f4504216459753e067963130935a23 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Sat, 18 Mar 2017 11:25:39 +0700 Subject: [PATCH 7/7] #83: drop unused classes, fix some .NET Standard issues --- .../bedrock/collections/ByteStack.cs | 159 ------ src/JabberNet/bedrock/collections/Trie.cs | 464 ------------------ src/JabberNet/bedrock/net/Address.cs | 7 +- src/JabberNet/stringprep/steps/MapStep.cs | 4 +- .../stringprep/steps/ProhibitStep.cs | 4 +- 5 files changed, 8 insertions(+), 630 deletions(-) delete mode 100644 src/JabberNet/bedrock/collections/ByteStack.cs delete mode 100644 src/JabberNet/bedrock/collections/Trie.cs diff --git a/src/JabberNet/bedrock/collections/ByteStack.cs b/src/JabberNet/bedrock/collections/ByteStack.cs deleted file mode 100644 index eb96e45..0000000 --- a/src/JabberNet/bedrock/collections/ByteStack.cs +++ /dev/null @@ -1,159 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyrights - * - * Portions created by or assigned to Cursive Systems, Inc. are - * Copyright (c) 2002-2008 Cursive Systems, Inc. All Rights Reserved. Contact - * information for Cursive Systems, Inc. is available at - * http://www.cursive.net/. - * - * License - * - * Jabber-Net is licensed under the LGPL. - * See licenses/Jabber-Net_LGPLv3.txt for details. - * --------------------------------------------------------------------------*/ - -using System; - -namespace JabberNet.bedrock.collections -{ - /// - /// A type-safe stack for bytes, implemented as a growable - /// buffer. - /// - public class ByteStack - { - private const double GROWTH_FACTOR = 1.5d; - private const int DEFAULT_SIZE = 16; - private const int MIN_SIZE = 2; - private static readonly System.Text.Encoding ENCODING = System.Text.Encoding.Default; - private int m_count = 0; - private int m_capacity = 0; - private byte[] m_buffer; - /// - /// Creates an instance with the default initial capacity. - /// - public ByteStack() : this(DEFAULT_SIZE) - { - } - /// - /// Create an instance with the given initial capacity. - /// - /// The initial capacity - public ByteStack(int initialSize) - { - if (initialSize < MIN_SIZE) - { - initialSize = DEFAULT_SIZE; - } - m_capacity = initialSize; - m_buffer = new byte[m_capacity]; - } - /// - /// Create an instance with the given initial value. The initial size - /// will be grown from the size of the given bytes. A copy is made of - /// the given bytes. - /// - /// byte array copied into this ByteStack - public ByteStack(byte[] start) - { - m_count = m_capacity = start.Length; - m_buffer = start; - IncreaseSize(); - } - /// - /// Increase the size of the stack by GROWTH_FACTOR times. - /// - private void IncreaseSize() - { - m_capacity = (int) (m_capacity * GROWTH_FACTOR); - // if the size is 1, we'll never get bigger. - if (m_capacity < MIN_SIZE) - { - m_capacity = DEFAULT_SIZE; - } - byte[] newBuf = new byte[m_capacity]; - Buffer.BlockCopy(m_buffer, 0, newBuf, 0, m_count); - m_buffer = newBuf; - } - /// - /// Gets the number of bytes that are currently in the stack. - /// - public int Count - { - get - { - return m_count; - } - } - /// - /// Gets the number of bytes that the stack can hold. - /// - public int Capacity - { - get - { - return m_capacity; - } - } - /// - /// Push a byte onto the stack. - /// - /// - public void Push(byte b) - { - if (m_count >= m_capacity) - { - IncreaseSize(); - } - m_buffer[m_count] = b; - m_count++; - } - /// - /// Pop a byte off of the stack. - /// - public byte Pop() - { - if (m_count <= 0) - { - throw new InvalidOperationException("Empty stack"); - } - m_count--; - byte b = m_buffer[m_count]; - return b; - } - /// - /// Non-destructively read the byte on the top of the stack. - /// - public byte Peek() - { - if (m_count <= 0) - { - throw new InvalidOperationException("Empty stack"); - } - return m_buffer[m_count - 1]; - } - /// - /// Converts to byte[] by making a trimmed copy. - /// - /// The ByteStack to convert to a byte array. - /// The byte array containing a copy of the passed in ByteStack. - public static implicit operator byte[](ByteStack bs) - { - if (bs.m_count == 0) - { - return new byte[0]; - } - byte[] newBuf = new byte[bs.m_count]; - Buffer.BlockCopy(bs.m_buffer, 0, newBuf, 0, bs.m_count); - return newBuf; - } - /// - /// Convert to a string, using the default encoding. This is probably not - /// right, but it's really nice for debugging and testing. - /// - public override string ToString() - { - return ENCODING.GetString(m_buffer, 0, m_count); - } - } -} diff --git a/src/JabberNet/bedrock/collections/Trie.cs b/src/JabberNet/bedrock/collections/Trie.cs deleted file mode 100644 index a18ab27..0000000 --- a/src/JabberNet/bedrock/collections/Trie.cs +++ /dev/null @@ -1,464 +0,0 @@ -/* -------------------------------------------------------------------------- - * Copyrights - * - * Portions created by or assigned to Cursive Systems, Inc. are - * Copyright (c) 2002-2008 Cursive Systems, Inc. All Rights Reserved. Contact - * information for Cursive Systems, Inc. is available at - * http://www.cursive.net/. - * - * License - * - * Jabber-Net is licensed under the LGPL. - * See licenses/Jabber-Net_LGPLv3.txt for details. - * --------------------------------------------------------------------------*/ - -using System; -using System.Collections; - -namespace JabberNet.bedrock.collections -{ - /// - /// The method signature used by when it encounters a key. - /// - public delegate bool TrieKeyWalker(TrieNode e, object data, ByteStack key); - /// - /// The method signature used by when it encounters a node. - /// - public delegate bool TrieWalker(TrieNode e, object data); - /// - /// A trie is a tree structure that implements a radix search. Each node of the tree has a - /// sub-node for each possible next byte. - /// - public class Trie : IDictionary - { - private static readonly System.Text.Encoding ENCODING = System.Text.Encoding.Default; - - /// - /// The root node of the trie. - /// - private TrieNode m_root = new TrieNode(null, 0); - - /// - /// The number of nodes are in the trie - /// - private int m_count = 0; - - /// - /// Creates an empty trie. - /// - public Trie() {} - - /// - /// Find a node for a given key, somewhere under the root. - /// - /// The bytes to search for, where key[0] corresponds to a child - /// node of the root. - /// Create nodes that don't exist, while searching. - /// The node if found. If the node doesn't exist and create is true, the node created; otherwise null. - protected virtual TrieNode FindNode(byte[] key, bool create) - { - return FindNode(key, m_root, create); - } - /// - /// Finds a node in the given sub-tree. - /// - /// The key to search on, where key[0] corresponds to a child of startAt. - /// The node to search under - /// Create nodes that don't exist, while searching. - /// The node if found. If the node doesn't exist and create is true, the node created; otherwise null. - protected virtual TrieNode FindNode(byte[] key, TrieNode startAt, bool create) - { - TrieNode current = startAt; - byte b; - - for (int i=0; (i - /// Compute the byte array corresping to the given object. - /// This is likely to cause problems for non 7-bit ASCII text. - /// - /// - protected static byte[] KeyBytes(object key) - { - if (key is byte[]) - { - return (byte[]) key; - } - - return ENCODING.GetBytes(key.ToString()); - } - /// - /// Extra functionality for trie's whose values are integers. - /// Increment the value corresponding to the key. If - /// the key doesn't exist, put in a value of '1'. - /// - /// - public virtual void Increment(object key) - { - TrieNode e = FindNode(KeyBytes(key), true); - if (e.Value == null) - { - e.Value = 1; - } - else - { - e.Value = ((int) e.Value) + 1; - } - } - /// - /// Performs the given function on every element of the trie. This is equivalent to Perl's map() operator. - /// - /// The function to call - /// Extra data to pass along to the function. - public void Traverse(TrieKeyWalker w, object data) - { - Traverse(w, data, m_root, new ByteStack()); - } - - /// - /// Perform the given function on every element of the trie. Perl's map() operator. - /// - /// The function to call - /// Extra data to pass along to the function. - /// What node are we currently on? - /// A stack holding the current key value - protected void Traverse(TrieKeyWalker w, object data, TrieNode current, ByteStack key) - { - if (!w(current, data, key)) - { - return; - } - foreach (TrieNode e in current) - { - key.Push(e.Byte); - Traverse(w, data, e, key); - key.Pop(); - } - } - /// - /// Perform the given function on every element of the trie. Perl's map() operator. - /// Don't keep track of the keys (slightly faster than the other Traverse() method). - /// - /// The function to call - /// Extra data to pass along to the function. - public void Traverse(TrieWalker w, object data) - { - Traverse(w, data, m_root); - } - /// - /// Perform the given function on every element of the trie. Perl's map() operator. - /// - /// The function to call - /// Extra data to pass along to the function. - /// What node are we currently on? - protected void Traverse(TrieWalker w, object data, TrieNode current) - { - if (! w(current, data)) - { - return; - } - foreach (TrieNode e in current) - { - Traverse(w, data, e); - } - } - #region System.Collections.IDictionary - - /// - /// Retrieve the value associated with the given key. - /// - public virtual object this[object key] - { - get - { - TrieNode e = FindNode(KeyBytes(key), false); - return (e == null) ? null : e.Value; - } - set - { - TrieNode e = FindNode(KeyBytes(key), true); - e.Value = value; - m_count++; - } - } - - /// - /// Always "false" for now. - /// - public bool IsFixedSize - { - get { return false; } - } - - - /// - /// Find all of the keys. - /// - /// - /// - /// - private bool KeyWalker(TrieNode n, object data, ByteStack key) - { - if (n.Value != null) - { - ArrayList al = (ArrayList) data; - al.Add((byte[]) key); - } - return true; - } - - /// - /// Get a list of all of the keys. Hope this doesn't get called often, since it has to make copies - /// of all of the possible keys. - /// - public ICollection Keys - { - get - { - ArrayList al = new ArrayList(m_count); - Traverse(new TrieKeyWalker(KeyWalker), al); - al.TrimToSize(); - return al; - } - } - - /// - /// Returns a collection containing all of the values. - /// - public ICollection Values - { - get - { - // pretty easy, since we implement ICollection. - return new ArrayList(this); - } - } - - /// - /// Removes the node associated with the given key, along with all newly empty ancestors. - /// - /// Key to remove. - public void Remove(object key) - { - TrieNode current = FindNode(KeyBytes(key), false); - if (current == null) - { - return; - } - - current.Value = null; - m_count--; - - if (m_count == 0) - { - Clear(); - return; - } - - // prune - byte last; - while (current.IsEmpty) - { - last = current.Byte; - current = current.Parent; - if (current == null) - { - // all the way empty. - break; - } - current.Remove(last); - } - } - - /// - /// Iterate the dictionary way. - /// - IDictionaryEnumerator IDictionary.GetEnumerator() - { - return new TrieEnumerator(this); - } - - /// - /// Deletes all nodes. - /// - public void Clear() - { - m_root = new TrieNode(null, 0); - m_count = 0; - } - - /// - /// Add a new key/value pair. - /// - /// - /// - public void Add(object key, object value) - { - this[key] = value; - } - - /// - /// Is the given key in the trie? - /// - /// - public bool Contains(object key) - { - TrieNode current = FindNode(KeyBytes(key), false); - return current != null; - } - - #endregion - #region System.Collections.ICollection - - /// - /// How many values are stored? Note: NOT how many nodes. - /// - public int Count - { - get - { - return m_count; - } - } - - /// - /// Object to synchronize on, if in thread-safe mode. - /// TODO: implement settable SyncRoot - /// - public object SyncRoot - { - get - { - return this; - } - } - - /// - /// Always "false" for now - /// - public bool IsReadOnly - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether access to the trie is synchronized in thread-safe mode. - /// Only returns false now. - /// - public bool IsSynchronized - { - get - { - return false; - } - } - - /// - /// Copy into an array. - /// - /// - /// - public void CopyTo(Array array, int index) - { - int i = index; - foreach (object o in this) - { - array.SetValue(o, i); - i++; - } - } - - #endregion - #region System.Collections.IEnumerable - - /// - /// Iterate over the keys. Each key will be a byte[]. - /// - public IEnumerator GetEnumerator() - { - return new TrieEnumerator(this); - } - - #endregion - - private class TrieEnumerator : IDictionaryEnumerator - { - protected Trie m_trie; - protected Stack m_pos = new Stack(); - protected TrieNode m_current = null; - public TrieEnumerator(Trie t) - { - m_trie = t; - m_pos.Push(m_trie.m_root); - } - - public object Current - { - get - { - return Entry; - } - } - - public void Reset() - { - m_pos.Clear(); - m_pos.Push(m_trie.m_root); - } - - public bool MoveNext() - { - if (m_pos.Count <= 0) - { - return false; - } - - m_current = (TrieNode) m_pos.Pop(); - - foreach (TrieNode e in m_current) - { - m_pos.Push(e); - } - - if (m_current.Value != null) - { - return true; - } - - return MoveNext(); - } - - public object Key - { - get - { - return m_current.Key; - } - } - - public object Value - { - get - { - return m_current.Value; - } - } - - public DictionaryEntry Entry - { - get - { - return new DictionaryEntry(m_current.Key, m_current.Value); - } - } - } - } -} diff --git a/src/JabberNet/bedrock/net/Address.cs b/src/JabberNet/bedrock/net/Address.cs index 0f7c33e..a2ec400 100644 --- a/src/JabberNet/bedrock/net/Address.cs +++ b/src/JabberNet/bedrock/net/Address.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -15,6 +15,7 @@ using System; using System.Diagnostics; using System.Net; +using System.Runtime.InteropServices; using JabberNet.Netlib.Dns; using JabberNet.Netlib.Dns.Records; @@ -131,7 +132,7 @@ public static void LookupSRV(string prefix, string domain, ref string host, ref try { SRVRecord record; - if (Environment.OSVersion.Platform != PlatformID.Unix) { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { DnsRequest request = new DnsRequest(prefix + domain); DnsResponse response = request.GetResponse(DnsRecordType.SRV); record = PickSRV(response.SRVRecords); @@ -169,7 +170,7 @@ public static string LookupTXT(string prefix, string domain, string attribute) try { - if (Environment.OSVersion.Platform != PlatformID.Unix) { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { DnsRequest request = new DnsRequest(prefix + domain); DnsResponse response = request.GetResponse(DnsRecordType.TEXT); string attr = attribute + "="; diff --git a/src/JabberNet/stringprep/steps/MapStep.cs b/src/JabberNet/stringprep/steps/MapStep.cs index f5721a9..a509489 100644 --- a/src/JabberNet/stringprep/steps/MapStep.cs +++ b/src/JabberNet/stringprep/steps/MapStep.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -79,7 +79,7 @@ private class CharMapComparer : IComparer { public int Compare(object x, object y) { - return ((string)x)[0].CompareTo(y); + return ((string)x)[0].CompareTo((char)y); } } } diff --git a/src/JabberNet/stringprep/steps/ProhibitStep.cs b/src/JabberNet/stringprep/steps/ProhibitStep.cs index 572f319..ca31cc7 100644 --- a/src/JabberNet/stringprep/steps/ProhibitStep.cs +++ b/src/JabberNet/stringprep/steps/ProhibitStep.cs @@ -1,4 +1,4 @@ -/* -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are @@ -117,7 +117,7 @@ public int Compare(object x, object y) { char[] bounds = (char[]) x; if (bounds[1] == '\x0000') - return bounds[0].CompareTo(y); + return bounds[0].CompareTo((char)y); char c = (char) y; if (c < bounds[0])