CarotDav_decompile/Rei.Net.HttpServer/MyHttpListener.cs

228 lines
5.8 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Rei.Net.HttpServer.MyHttpListener
// Assembly: Rei.Net.HttpServer, Version=1.13.2.9297, Culture=neutral, PublicKeyToken=null
// MVID: 6174F8E9-E7BA-46AD-8F2E-196645884F28
// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\Rei.Net.HttpServer.dll
using Microsoft.VisualBasic.CompilerServices;
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Runtime.CompilerServices;
using System.Threading;
namespace Rei.Net.HttpServer
{
[DebuggerDisplay("{toString}")]
public class MyHttpListener : IDisposable
{
private TcpListener m_listener;
private IPEndPoint m_endpoint;
private object m_syncobject;
private string m_servername;
private bool disposedValue;
public MyHttpListener()
{
this.disposedValue = false;
this.m_servername = nameof (ServerName);
this.m_syncobject = RuntimeHelpers.GetObjectValue(new object());
this.m_endpoint = new IPEndPoint(IPAddress.Loopback, 0);
}
public void Start()
{
object syncobject = this.m_syncobject;
ObjectFlowControl.CheckForSyncLockOnValueType(syncobject);
Monitor.Enter(syncobject);
try
{
if (this.m_listener != null)
throw new ApplicationException();
this.m_listener = new TcpListener(this.m_endpoint);
this.m_listener.Start(100);
}
finally
{
Monitor.Exit(syncobject);
}
}
public void Stop()
{
object syncobject = this.m_syncobject;
ObjectFlowControl.CheckForSyncLockOnValueType(syncobject);
Monitor.Enter(syncobject);
try
{
if (this.m_listener != null)
this.m_listener.Stop();
this.m_listener = (TcpListener) null;
}
finally
{
Monitor.Exit(syncobject);
}
}
public void Close()
{
((IDisposable)this).Dispose();
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposedValue && disposing)
{
object syncobject = this.m_syncobject;
ObjectFlowControl.CheckForSyncLockOnValueType(syncobject);
Monitor.Enter(syncobject);
try
{
if (this.m_listener != null)
this.m_listener.Stop();
this.m_listener = (TcpListener) null;
}
finally
{
Monitor.Exit(syncobject);
}
}
this.disposedValue = true;
}
void IDisposable.Dispose()
{
this.Dispose(true);
GC.SuppressFinalize((object) this);
}
public IPEndPoint EndPoint
{
get
{
return this.m_endpoint;
}
set
{
if (value == null)
throw new ArgumentNullException();
this.m_endpoint = value;
}
}
public bool IsListening
{
get
{
object syncobject = this.m_syncobject;
ObjectFlowControl.CheckForSyncLockOnValueType(syncobject);
Monitor.Enter(syncobject);
try
{
return this.m_listener != null;
}
finally
{
Monitor.Exit(syncobject);
}
}
}
public bool IsPending
{
get
{
object syncobject = this.m_syncobject;
ObjectFlowControl.CheckForSyncLockOnValueType(syncobject);
Monitor.Enter(syncobject);
try
{
return this.m_listener != null && this.m_listener.Pending();
}
finally
{
Monitor.Exit(syncobject);
}
}
}
public string ServerName
{
get
{
return this.m_servername;
}
set
{
if (value == null)
throw new ArgumentNullException();
this.m_servername = value;
}
}
public MyHttpServerConnection GetConnection()
{
return this.EndGetConnection(this.BeginGetConnection((AsyncCallback) null, (object) null));
}
public IAsyncResult BeginGetConnection(AsyncCallback callback, object asyncstate)
{
MyAsyncResult myAsyncResult = new MyAsyncResult(callback, RuntimeHelpers.GetObjectValue(asyncstate));
object syncobject = this.m_syncobject;
ObjectFlowControl.CheckForSyncLockOnValueType(syncobject);
Monitor.Enter(syncobject);
try
{
if (this.m_listener == null)
throw new InvalidOperationException();
myAsyncResult.Tag = (object) this.m_listener;
this.m_listener.BeginAcceptSocket(new AsyncCallback(this.OnGetConnection), (object) myAsyncResult);
}
finally
{
Monitor.Exit(syncobject);
}
return (IAsyncResult) myAsyncResult;
}
private void OnGetConnection(IAsyncResult asyncresult)
{
MyAsyncResult asyncState = (MyAsyncResult) asyncresult.AsyncState;
if (!asyncresult.CompletedSynchronously)
asyncState.SetAsync();
TcpListener tag = (TcpListener) asyncState.Tag;
try
{
Socket basesocket = tag.EndAcceptSocket(asyncresult);
basesocket.SendTimeout = 1000;
basesocket.ReceiveTimeout = 1000;
MyHttpServerConnection serverConnection = new MyHttpServerConnection(basesocket);
asyncState.ReturnValue = (object) serverConnection;
}
catch (Exception ex1)
{
ProjectData.SetProjectError(ex1);
Exception ex2 = ex1;
asyncState.Complete(ex2);
ProjectData.ClearProjectError();
return;
}
asyncState.Complete();
}
public MyHttpServerConnection EndGetConnection(IAsyncResult ar)
{
MyAsyncResult myAsyncResult = (MyAsyncResult) ar;
myAsyncResult.AsyncEnd();
return (MyHttpServerConnection) myAsyncResult.ReturnValue;
}
public override string ToString()
{
return this.m_servername + " endpoint:" + this.m_endpoint.ToString();
}
}
}