Added Ninject, configuration and default logger.
Made DefaultLogger use the eventlog rather than debug.writeline(..) renamed service1 to CardReaderService #22
This commit is contained in:
parent
1335dbddc7
commit
9dc4832471
@ -1,6 +1,6 @@
|
||||
namespace CardReaderService
|
||||
{
|
||||
partial class Service1
|
||||
partial class CardReaderService
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
@ -1,23 +1,26 @@
|
||||
using PCSC;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Linq;
|
||||
using System.ServiceProcess;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using Interfaces;
|
||||
|
||||
namespace CardReaderService
|
||||
{
|
||||
public partial class Service1 : ServiceBase
|
||||
public partial class CardReaderService : ServiceBase
|
||||
{
|
||||
private Thread _mainWorkThread;
|
||||
private bool _stopMainWorkerThread;
|
||||
|
||||
private string _readerName = "";
|
||||
//private SCardReader _reader;
|
||||
private SCardMonitor _cardMonitor;
|
||||
|
||||
public Service1()
|
||||
private ILogger _logger;
|
||||
|
||||
public CardReaderService()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
@ -26,21 +29,40 @@ namespace CardReaderService
|
||||
{
|
||||
OnStart(new string[] {});
|
||||
}
|
||||
//
|
||||
|
||||
protected override void OnStart(string[] args)
|
||||
{
|
||||
Console.WriteLine("Starting.. Getting available readers");
|
||||
_logger = NinjectHelper.GetInstance().Get<ILogger>();
|
||||
_logger.Trace("Starting Service.. Getting available readers");
|
||||
|
||||
var ctxFactory = ContextFactory.Instance;
|
||||
using(var context = ctxFactory.Establish(SCardScope.System))
|
||||
{
|
||||
var readerNames = context.GetReaders();
|
||||
if (NoReaderAvailable(readerNames))
|
||||
{
|
||||
Console.WriteLine("No Card Reader is available, Exiting..");
|
||||
return;
|
||||
_logger.Trace("No Card Reader is available, Exiting..");
|
||||
throw new ApplicationException("A card reader must be provided in order to operate.");
|
||||
}
|
||||
Console.WriteLine("Choosing first available reader: " + readerNames.First());
|
||||
_readerName = readerNames.First();
|
||||
foreach (var reader in readerNames)
|
||||
{
|
||||
_logger.Trace("Found reader: {0}", reader);
|
||||
}
|
||||
|
||||
var readerNameConfig = ConfigurationManager.AppSettings["ReaderName"];
|
||||
if (string.IsNullOrEmpty(readerNameConfig))
|
||||
{
|
||||
if (!readerNames.Contains(readerNameConfig))
|
||||
{
|
||||
_logger.Warn("No reader found with the name: {0}, defaulting to first available reader {1}",
|
||||
readerNameConfig, readerNames.First());
|
||||
|
||||
readerNameConfig=readerNames.First();
|
||||
}
|
||||
}
|
||||
_logger.Trace("Choosing reader: {0}", readerNameConfig);
|
||||
_readerName = readerNameConfig;
|
||||
|
||||
_cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System);
|
||||
_cardMonitor.CardInserted += _cardMonitor_CardInserted;
|
||||
_cardMonitor.Start(_readerName);
|
||||
@ -49,7 +71,7 @@ namespace CardReaderService
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
public void StopService()
|
||||
{
|
||||
OnStop();
|
||||
}
|
||||
@ -65,13 +87,12 @@ namespace CardReaderService
|
||||
_mainWorkThread.Interrupt();
|
||||
}
|
||||
}
|
||||
if (_cardMonitor != null)
|
||||
{
|
||||
if (_cardMonitor == null) return;
|
||||
|
||||
_cardMonitor.Cancel();
|
||||
_cardMonitor.Dispose();
|
||||
_cardMonitor = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void StartWorkerThread()
|
||||
{
|
||||
@ -91,11 +112,11 @@ namespace CardReaderService
|
||||
{
|
||||
var reader = new SCardReader(ctx);
|
||||
var pioSendPci = new IntPtr();
|
||||
byte[] rcvBuffer = new byte[256];
|
||||
var rcvBuffer = new byte[256];
|
||||
|
||||
if (_readerName == string.Empty)
|
||||
{
|
||||
Console.WriteLine("Reader name is somehow empty... WTF!");
|
||||
_logger.Fatal("Reader name is somehow empty...exiting");
|
||||
_stopMainWorkerThread = true;
|
||||
return;
|
||||
}
|
||||
@ -107,20 +128,19 @@ namespace CardReaderService
|
||||
var uIdcmd = new byte[] { 0xFF, 0xCA, 0x00, 0x00, 0x00 };
|
||||
|
||||
err = reader.Transmit(pioSendPci, uIdcmd, ref rcvBuffer);
|
||||
if (err == SCardError.Success)
|
||||
{
|
||||
if (err != SCardError.Success) return;
|
||||
|
||||
var uid = ConvertByteUIDToString(rcvBuffer);
|
||||
var atrString = ConvertByteUIDToString(e.Atr);
|
||||
Console.WriteLine("Card Inserted, ATR: " + atrString + ", and UID is: " + uid);
|
||||
_logger.Trace("Card Inserted, ATR: " + atrString + ", and UID is: " + uid);
|
||||
|
||||
CardDataPost postObj = new CardDataPost {CardUId = uid};
|
||||
var postObj = new CardDataPost {CardUId = uid};
|
||||
DataCenterHelper.PostAsync(postObj, "/api/swipedata");
|
||||
Console.WriteLine("Posted to Server");
|
||||
}
|
||||
_logger.Trace("Posted to Server");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Reader failed to connect, error: " + Enum.GetName(typeof(SCardError), err));
|
||||
_logger.Trace("Reader failed to connect, error: " + Enum.GetName(typeof(SCardError), err));
|
||||
}
|
||||
|
||||
}
|
||||
@ -137,13 +157,11 @@ namespace CardReaderService
|
||||
|
||||
private string ConvertByteUIDToString(byte[] uid)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
var sb = new StringBuilder();
|
||||
foreach(var b in uid)
|
||||
{
|
||||
sb.AppendFormat("{0:X2}", b);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
@ -37,6 +37,10 @@
|
||||
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Ninject, Version=3.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="pcsc-sharp, Version=3.6.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\PCSC.3.6.0\lib\net40\pcsc-sharp.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
@ -53,13 +57,16 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Configuration.cs" />
|
||||
<Compile Include="ConfigureService.cs" />
|
||||
<Compile Include="DataCenterHelper.cs" />
|
||||
<Compile Include="Service1.cs">
|
||||
<Compile Include="DefaultComponents\DefaultLogger.cs" />
|
||||
<Compile Include="NinjectHelper.cs" />
|
||||
<Compile Include="CardReaderService.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Service1.Designer.cs">
|
||||
<DependentUpon>Service1.cs</DependentUpon>
|
||||
<Compile Include="CardReaderService.Designer.cs">
|
||||
<DependentUpon>CardReaderService.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
@ -68,6 +75,17 @@
|
||||
<None Include="App.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Interfaces\Interfaces.csproj">
|
||||
<Project>{B7347B72-E208-423A-9D99-723B558EA3D7}</Project>
|
||||
<Name>Interfaces</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="NinjectConfig.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using CardReaderService.DefaultComponents;
|
||||
using Interfaces;
|
||||
using Ninject;
|
||||
|
||||
namespace CardReaderService
|
||||
{
|
||||
public static class Configuration
|
||||
{
|
||||
public static StandardKernel ConfigureNinject()
|
||||
{
|
||||
var kernel = new StandardKernel();
|
||||
var ninjectConfigPath =
|
||||
new Uri(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().CodeBase), "NinjectConfig.xml"))
|
||||
.LocalPath;
|
||||
if (File.Exists(ninjectConfigPath))
|
||||
{
|
||||
kernel.Load(ninjectConfigPath);
|
||||
}
|
||||
|
||||
var logger = kernel.TryGet<ILogger>();
|
||||
if (logger == null)
|
||||
{
|
||||
kernel.Bind<ILogger>().To<DefaultLogger>();
|
||||
logger = kernel.Get<ILogger>();
|
||||
}
|
||||
logger.Fatal("test message - ninject stuff loaded.");
|
||||
|
||||
return kernel;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,151 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using Interfaces;
|
||||
|
||||
namespace CardReaderService.DefaultComponents
|
||||
{
|
||||
public class DefaultLogger : ILogger
|
||||
{
|
||||
private string _eventLogSource = "CardRdrSvc";
|
||||
private string _logName = "CardReaderServiceLog";
|
||||
private EventLog _eventLog;
|
||||
|
||||
public DefaultLogger()
|
||||
{
|
||||
if (!EventLog.SourceExists(_eventLogSource))
|
||||
{
|
||||
EventLog.CreateEventSource(_eventLogSource, _logName);
|
||||
}
|
||||
}
|
||||
public bool IsDebugEnabled { get { return true; } }
|
||||
public bool IsErrorEnabled { get { return true; } }
|
||||
public bool IsFatalEnabled { get { return true; } }
|
||||
public bool IsInfoEnabled { get { return true; } }
|
||||
public bool IsTraceEnabled { get { return true; } }
|
||||
public bool IsWarnEnabled { get { return true; } }
|
||||
|
||||
public void Debug(Exception exception)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(exception.ToString(), EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Debug(string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(format, args), EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Debug(Exception exception, string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(exception + ", " + format, args),
|
||||
EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Error(Exception exception)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(exception.ToString(), EventLogEntryType.Error);
|
||||
}
|
||||
|
||||
public void Error(string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(format, args), EventLogEntryType.Error);
|
||||
}
|
||||
|
||||
public void Error(Exception exception, string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(exception + ", " + format, args),
|
||||
EventLogEntryType.Error);
|
||||
}
|
||||
|
||||
public void Fatal(Exception exception)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(exception.ToString(), EventLogEntryType.Error);
|
||||
}
|
||||
|
||||
public void Fatal(string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(format, args), EventLogEntryType.Error);
|
||||
}
|
||||
|
||||
public void Fatal(Exception exception, string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(exception + ", " + format, args),
|
||||
EventLogEntryType.Error);
|
||||
}
|
||||
|
||||
public void Info(Exception exception)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(exception.ToString(), EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Info(string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(format, args), EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Info(Exception exception, string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(exception + ", " + format, args),
|
||||
EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Trace(Exception exception)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(exception.ToString(), EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Trace(string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(format, args), EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Trace(Exception exception, string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(exception + ", " + format, args),
|
||||
EventLogEntryType.Information);
|
||||
}
|
||||
|
||||
public void Warn(Exception exception)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(exception.ToString(), EventLogEntryType.Warning);
|
||||
}
|
||||
|
||||
public void Warn(string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(format, args), EventLogEntryType.Warning);
|
||||
}
|
||||
|
||||
public void Warn(Exception exception, string format, params object[] args)
|
||||
{
|
||||
CheckEventLog();
|
||||
_eventLog.WriteEntry(string.Format(exception + ", " + format, args),
|
||||
EventLogEntryType.Warning);
|
||||
}
|
||||
|
||||
private void CheckEventLog()
|
||||
{
|
||||
if (_eventLog == null)
|
||||
{
|
||||
_eventLog = new EventLog();
|
||||
_eventLog.Source = _eventLogSource;
|
||||
_eventLog.Log = _logName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<module name="NinjectAssemblies">
|
||||
<bind service="Interfaces.ILogger, Interfaces"
|
||||
to="NLogLogger.NLogger, NLogLogger" scope="singleton" />
|
||||
</module>
|
||||
@ -0,0 +1,43 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Ninject;
|
||||
|
||||
namespace CardReaderService
|
||||
{
|
||||
public class NinjectHelper
|
||||
{
|
||||
private static NinjectHelper _instance;
|
||||
private static readonly object LockObject = new object();
|
||||
|
||||
public StandardKernel Kernel { get; private set; }
|
||||
|
||||
public static NinjectHelper GetInstance()
|
||||
{
|
||||
if (_instance != null)
|
||||
return _instance;
|
||||
lock (LockObject)
|
||||
{
|
||||
_instance = new NinjectHelper();
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
private NinjectHelper()
|
||||
{
|
||||
Kernel = Configuration.ConfigureNinject();
|
||||
}
|
||||
|
||||
public T Get<T>()
|
||||
{
|
||||
return Kernel.Get<T>();
|
||||
}
|
||||
|
||||
public IEnumerable<T> GetAll<T>()
|
||||
{
|
||||
return Kernel.GetAll<T>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -18,7 +18,7 @@ namespace CardReaderService
|
||||
ServiceBase[] ServicesToRun;
|
||||
ServicesToRun = new ServiceBase[]
|
||||
{
|
||||
new Service1()
|
||||
new CardReaderService()
|
||||
};
|
||||
ServiceBase.Run(ServicesToRun);
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
|
||||
<package id="Ninject" version="3.2.2.0" targetFramework="net452" />
|
||||
<package id="PCSC" version="3.6.0" targetFramework="net452" />
|
||||
</packages>
|
||||
@ -7,11 +7,11 @@ namespace CardReaderServiceHost
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Service1 service1 = new Service1();
|
||||
CardReaderService.CardReaderService service1 = new CardReaderService.CardReaderService();
|
||||
service1.Start();
|
||||
Console.WriteLine("Service Running...");
|
||||
Console.ReadLine();
|
||||
service1.Stop();
|
||||
service1.StopService();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user