From 620a88dcb214ecfb82b1edf3b751721250de6a54 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 29 Apr 2012 19:42:49 -0700 Subject: [PATCH] Updated exceptron driver --- NzbDrone.Common/NzbDrone.Common.csproj | 4 +- NzbDrone.Common/ReportingService.cs | 9 +- NzbDrone.Common/packages.config | 2 +- .../ServiceIntegerationFixture.cs | 1 - .../Exceptron.Driver.0.1.0.3.nupkg | Bin 61690 -> 0 bytes .../lib/net20/Exceptron.Driver.pdb | Bin 60928 -> 0 bytes .../src/ExceptionClient.cs | 116 --- .../src/ExceptionData.cs | 12 - .../src/ExceptionReport.cs | 22 - .../Exceptron.Driver.0.1.0.3/src/Frame.cs | 9 - .../src/Properties/AssemblyInfo.cs | 36 - .../src/fastJSON/Getters.cs | 21 - .../src/fastJSON/JSON.cs | 906 ------------------ .../src/fastJSON/JsonParser.cs | 408 -------- .../src/fastJSON/JsonSerializer.cs | 518 ---------- .../src/fastJSON/SafeDictionary.cs | 39 - .../Exceptron.Driver.0.1.0.4.nupkg | Bin 0 -> 22976 bytes .../lib/net20/Exceptron.Driver.dll | Bin 35328 -> 35328 bytes 18 files changed, 8 insertions(+), 2095 deletions(-) delete mode 100644 packages/Exceptron.Driver.0.1.0.3/Exceptron.Driver.0.1.0.3.nupkg delete mode 100644 packages/Exceptron.Driver.0.1.0.3/lib/net20/Exceptron.Driver.pdb delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/ExceptionClient.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/ExceptionData.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/ExceptionReport.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/Frame.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/Properties/AssemblyInfo.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/fastJSON/Getters.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JSON.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonParser.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonSerializer.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.3/src/fastJSON/SafeDictionary.cs create mode 100644 packages/Exceptron.Driver.0.1.0.4/Exceptron.Driver.0.1.0.4.nupkg rename packages/{Exceptron.Driver.0.1.0.3 => Exceptron.Driver.0.1.0.4}/lib/net20/Exceptron.Driver.dll (58%) diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index 459787216..f56f102a4 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -36,8 +36,8 @@ ..\Libraries\Exceptioneer.WindowsFormsClient.dll - - ..\packages\Exceptron.Driver.0.1.0.3\lib\net20\Exceptron.Driver.dll + + ..\packages\Exceptron.Driver.0.1.0.4\lib\net20\Exceptron.Driver.dll ..\packages\Newtonsoft.Json.4.5.4\lib\net40\Newtonsoft.Json.dll diff --git a/NzbDrone.Common/ReportingService.cs b/NzbDrone.Common/ReportingService.cs index 4f6a95431..49670add8 100644 --- a/NzbDrone.Common/ReportingService.cs +++ b/NzbDrone.Common/ReportingService.cs @@ -77,9 +77,10 @@ namespace NzbDrone.Common { throw; } - - //this shouldn't log an exception since it will cause a recursive loop. - logger.Info("Unable to report exception. " + e); + if (logEvent.LoggerName != logger.Name)//prevents a recursive loop. + { + logger.WarnException("Unable to report exception. ", e); + } } return null; @@ -91,7 +92,7 @@ namespace NzbDrone.Common ExceptronDriver = new ExceptionClient( "CB230C312E5C4FF38B4FB9644B05E60E", new EnvironmentProvider().Version.ToString(), - new Uri("http://api.Exceptron.com/v1aa/")); + new Uri("http://api.Exceptron.com/v1a/")); ExceptronDriver.ThrowsExceptions = !EnvironmentProvider.IsProduction; ExceptronDriver.Enviroment = EnvironmentProvider.IsProduction ? "Prod" : "Dev"; diff --git a/NzbDrone.Common/packages.config b/NzbDrone.Common/packages.config index 855d77fe3..68b55093d 100644 --- a/NzbDrone.Common/packages.config +++ b/NzbDrone.Common/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/NzbDrone.Core.Test/Integeration/ServiceIntegerationFixture.cs b/NzbDrone.Core.Test/Integeration/ServiceIntegerationFixture.cs index 7e310d018..f65a20adb 100644 --- a/NzbDrone.Core.Test/Integeration/ServiceIntegerationFixture.cs +++ b/NzbDrone.Core.Test/Integeration/ServiceIntegerationFixture.cs @@ -15,7 +15,6 @@ using PetaPoco; namespace NzbDrone.Core.Test.Integeration { [TestFixture(Category = "ServiceIngeneration")] - [Explicit] public class ServiceIntegerationFixture : CoreTest { private KernelBase _kernel; diff --git a/packages/Exceptron.Driver.0.1.0.3/Exceptron.Driver.0.1.0.3.nupkg b/packages/Exceptron.Driver.0.1.0.3/Exceptron.Driver.0.1.0.3.nupkg deleted file mode 100644 index 99a62c50d4a09a52566a83e59df401ead174d6ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61690 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 UC&vb6F;3vu9|-%6zcN4lA04&5Q2+n{ diff --git a/packages/Exceptron.Driver.0.1.0.3/lib/net20/Exceptron.Driver.pdb b/packages/Exceptron.Driver.0.1.0.3/lib/net20/Exceptron.Driver.pdb deleted file mode 100644 index dda2a75645c5851f255d646c3a36847a2e2ef54d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60928 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 GetExceptionFrames(Exception exception) - { - if (exception == null) return null; - - var stackTrace = new StackTrace(exception, true); - - var frames = stackTrace.GetFrames(); - - if (frames == null) return null; - - var result = new List(); - - foreach (var frame in frames) - { - result.Add(new Frame { FileName = frame.GetFileName(), LineNumber = frame.GetFileLineNumber(), Method = frame.GetMethod().Name }); - } - - - return result; - } - - public string SubmitException(ExceptionData exceptionData) - { - try - { - VerifyErrorData(exceptionData); - - var report = new ExceptionReport(); - - report.AppId = _appId; - report.DriverName = DriverName; - report.DriverVersion = DriverVersion; - report.AppVersion = _appVersion; - - report.ExceptionType = exceptionData.Exception.GetType().FullName; - report.ExceptionMessage = exceptionData.Exception.Message; - report.StackTrace = GetExceptionFrames(exceptionData.Exception); - - report.Location = exceptionData.Location; - report.Uid = exceptionData.UserId; - report.Enviroment = Enviroment; - report.Message = exceptionData.Message; - - var response = PutObject(report); - return response; - } - catch (Exception) - { - if (ThrowsExceptions) throw; - return null; - } - } - - private void VerifyErrorData(ExceptionData exceptionData) - { - if (exceptionData == null) - throw new ArgumentNullException("exceptionData"); - - if (exceptionData.Exception == null) - throw new ArgumentException("ExceptionData.Exception Cannot be null.", "exceptionData"); - } - - private string PutObject(ExceptionReport exceptionReport) - { - string exceptionData = JSON.Instance.ToJSON(exceptionReport); - byte[] bytes = Encoding.UTF8.GetBytes(exceptionData); - var request = (HttpWebRequest)WebRequest.Create(_serverUrl); - request.Method = "PUT"; - request.ContentType = "application/json"; - request.ContentLength = bytes.Length; - request.Accept = "application/json"; - - var dataStream = request.GetRequestStream(); - dataStream.Write(bytes, 0, bytes.Length); - dataStream.Close(); - - var responseStream = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.GetEncoding(1252)); - - string response = responseStream.ReadToEnd(); - - return response; - } - } -} diff --git a/packages/Exceptron.Driver.0.1.0.3/src/ExceptionData.cs b/packages/Exceptron.Driver.0.1.0.3/src/ExceptionData.cs deleted file mode 100644 index 20fda0172..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/ExceptionData.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Exceptron.Driver -{ - public class ExceptionData - { - public Exception Exception { get; set; } - public string Location { get; set; } - public string UserId { get; set; } - public string Message { get; set; } - } -} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.3/src/ExceptionReport.cs b/packages/Exceptron.Driver.0.1.0.3/src/ExceptionReport.cs deleted file mode 100644 index a645a2941..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/ExceptionReport.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel; - -namespace Exceptron.Driver -{ - [EditorBrowsable(EditorBrowsableState.Never)] - public class ExceptionReport - { - public string AppId { get; set; } - public string AppVersion { get; set; } - public string Uid { get; set; } - public string ExceptionType { get; set; } - public string ExceptionMessage { get; set; } - public List StackTrace { get; set; } - public string Location { get; set; } - public string Enviroment { get; set; } - public string Message { get; set; } - - public string DriverName { get; set; } - public string DriverVersion { get; set; } - } -} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.3/src/Frame.cs b/packages/Exceptron.Driver.0.1.0.3/src/Frame.cs deleted file mode 100644 index 263d40d34..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/Frame.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Exceptron.Driver -{ - public class Frame - { - public int LineNumber { get; set; } - public string FileName { get; set; } - public string Method { get; set; } - } -} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.3/src/Properties/AssemblyInfo.cs b/packages/Exceptron.Driver.0.1.0.3/src/Properties/AssemblyInfo.cs deleted file mode 100644 index 349b74fee..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Exceptron.Driver")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Exceptron.Driver")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a463887e-594f-4733-b227-a79f4ffb2158")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/Getters.cs b/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/Getters.cs deleted file mode 100644 index 5263a13bc..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/Getters.cs +++ /dev/null @@ -1,21 +0,0 @@ -//http://fastjson.codeplex.com/ - -using System; -using System.Collections.Generic; -using Exceptron.Driver.fastJSON; - -namespace Exceptron.Driver.fastJSON -{ - internal class Getters - { - public string Name; - public JSON.GenericGetter Getter; - public Type propertyType; - } - - internal class DatasetSchema - { - public List Info { get; set; } - public string Name { get; set; } - } -} diff --git a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JSON.cs b/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JSON.cs deleted file mode 100644 index aae0142a8..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JSON.cs +++ /dev/null @@ -1,906 +0,0 @@ -//http://fastjson.codeplex.com/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Reflection.Emit; -using Exceptron.Driver.fastJSON; - -namespace Exceptron.Driver.fastJSON -{ - internal delegate string Serialize(object data); - internal delegate object Deserialize(string data); - - internal class JSON - { - public readonly static JSON Instance = new JSON(); - - private JSON() - { - } - public bool UseOptimizedDatasetSchema = true; - public bool UseFastGuid = true; - public bool UseSerializerExtension = true; - public bool IndentOutput = false; - public bool SerializeNullValues = true; - public bool UseUTCDateTime = false; - public bool ShowReadOnlyProperties = false; - public bool UsingGlobalTypes = true; - - public string ToJSON(object obj) - { - return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); - } - - public string ToJSON(object obj, - bool enableSerializerExtensions) - { - return ToJSON(obj, enableSerializerExtensions, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); - } - - public string ToJSON(object obj, - bool enableSerializerExtensions, - bool enableFastGuid) - { - return ToJSON(obj, enableSerializerExtensions, enableFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); - } - - public string ToJSON(object obj, - bool enableSerializerExtensions, - bool enableFastGuid, - bool enableOptimizedDatasetSchema, - bool serializeNullValues) - { - return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj); - } - - public object Parse(string json) - { - return new JsonParser(json).Decode(); - } - - public T ToObject(string json) - { - return (T)ToObject(json, typeof(T)); - } - - public object ToObject(string json) - { - return ToObject(json, null); - } - - public object ToObject(string json, Type type) - { - Dictionary ht = new JsonParser(json).Decode() as Dictionary; - if (ht == null) return null; - return ParseDictionary(ht, null, type); - } - -#if CUSTOMTYPE - internal SafeDictionary _customSerializer = new SafeDictionary(); - internal SafeDictionary _customDeserializer = new SafeDictionary(); - - public void RegisterCustomType(Type type, Serialize serializer, Deserialize deserializer) - { - if (type != null && serializer != null && deserializer != null) - { - _customSerializer.Add(type, serializer); - _customDeserializer.Add(type, deserializer); - // reset property cache - _propertycache = new SafeDictionary>(); - } - } - - internal bool IsTypeRegistered(Type t) - { - Serialize s; - return _customSerializer.TryGetValue(t, out s); - } -#endif - - #region [ PROPERTY GET SET CACHE ] - SafeDictionary _tyname = new SafeDictionary(); - internal string GetTypeAssemblyName(Type t) - { - string val = ""; - if (_tyname.TryGetValue(t, out val)) - return val; - else - { - string s = t.AssemblyQualifiedName; - _tyname.Add(t, s); - return s; - } - } - - SafeDictionary _typecache = new SafeDictionary(); - private Type GetTypeFromCache(string typename) - { - Type val = null; - if (_typecache.TryGetValue(typename, out val)) - return val; - else - { - Type t = Type.GetType(typename); - _typecache.Add(typename, t); - return t; - } - } - - SafeDictionary _constrcache = new SafeDictionary(); - private delegate object CreateObject(); - private object FastCreateInstance(Type objtype) - { - try - { - CreateObject c = null; - if (_constrcache.TryGetValue(objtype, out c)) - { - return c(); - } - else - { - DynamicMethod dynMethod = new DynamicMethod("_", objtype, null); - ILGenerator ilGen = dynMethod.GetILGenerator(); - - ilGen.Emit(OpCodes.Newobj, objtype.GetConstructor(Type.EmptyTypes)); - ilGen.Emit(OpCodes.Ret); - c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); - _constrcache.Add(objtype, c); - return c(); - } - } - catch (Exception exc) - { - throw new Exception(string.Format("Failed to fast create instance for type '{0}' from assemebly '{1}'", - objtype.FullName, objtype.AssemblyQualifiedName), exc); - } - } - - private struct myPropInfo - { - public bool filled; - public Type pt; - public Type bt; - public Type changeType; - public bool isDictionary; - public bool isValueType; - public bool isGenericType; - public bool isArray; - public bool isByteArray; - public bool isGuid; -#if !SILVERLIGHT - public bool isDataSet; - public bool isDataTable; - public bool isHashtable; -#endif - public GenericSetter setter; - public bool isEnum; - public bool isDateTime; - public Type[] GenericTypes; - public bool isInt; - public bool isLong; - public bool isString; - public bool isBool; - public bool isClass; - public GenericGetter getter; - public bool isStringDictionary; - public string Name; -#if CUSTOMTYPE - public bool isCustomType; -#endif - public bool CanWrite; - } - - SafeDictionary> _propertycache = new SafeDictionary>(); - private SafeDictionary Getproperties(Type type, string typename) - { - SafeDictionary sd = null; - if (_propertycache.TryGetValue(typename, out sd)) - { - return sd; - } - else - { - sd = new SafeDictionary(); - PropertyInfo[] pr = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); - foreach (PropertyInfo p in pr) - { - myPropInfo d = CreateMyProp(p.PropertyType, p.Name); - d.CanWrite = p.CanWrite; - d.setter = CreateSetMethod(p); - d.getter = CreateGetMethod(p); - sd.Add(p.Name, d); - } - FieldInfo[] fi = type.GetFields(BindingFlags.Public | BindingFlags.Instance); - foreach (FieldInfo f in fi) - { - myPropInfo d = CreateMyProp(f.FieldType, f.Name); - d.setter = CreateSetField(type, f); - d.getter = CreateGetField(type, f); - sd.Add(f.Name, d); - } - - _propertycache.Add(typename, sd); - return sd; - } - } - - private myPropInfo CreateMyProp(Type t, string name) - { - myPropInfo d = new myPropInfo(); - d.filled = true; - d.CanWrite = true; - d.pt = t; - d.Name = name; - d.isDictionary = t.Name.Contains("Dictionary"); - if (d.isDictionary) - d.GenericTypes = t.GetGenericArguments(); - d.isValueType = t.IsValueType; - d.isGenericType = t.IsGenericType; - d.isArray = t.IsArray; - if (d.isArray) - d.bt = t.GetElementType(); - if (d.isGenericType) - d.bt = t.GetGenericArguments()[0]; - d.isByteArray = t == typeof(byte[]); - d.isGuid = (t == typeof(Guid) || t == typeof(Guid?)); -#if !SILVERLIGHT - d.isHashtable = t == typeof(Hashtable); - d.isDataSet = t == typeof(DataSet); - d.isDataTable = t == typeof(DataTable); -#endif - - d.changeType = GetChangeType(t); - d.isEnum = t.IsEnum; - d.isDateTime = t == typeof(DateTime) || t == typeof(DateTime?); - d.isInt = t == typeof(int) || t == typeof(int?); - d.isLong = t == typeof(long) || t == typeof(long?); - d.isString = t == typeof(string); - d.isBool = t == typeof(bool) || t == typeof(bool?); - d.isClass = t.IsClass; - - if (d.isDictionary && d.GenericTypes.Length>0 && d.GenericTypes[0] == typeof(string)) - d.isStringDictionary = true; - -#if CUSTOMTYPE - if (IsTypeRegistered(t)) - d.isCustomType = true; -#endif - return d; - } - - private delegate void GenericSetter(object target, object value); - - private static GenericSetter CreateSetMethod(PropertyInfo propertyInfo) - { - MethodInfo setMethod = propertyInfo.GetSetMethod(); - if (setMethod == null) - return null; - - Type[] arguments = new Type[2]; - arguments[0] = arguments[1] = typeof(object); - - DynamicMethod setter = new DynamicMethod("_", typeof(void), arguments); - ILGenerator il = setter.GetILGenerator(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); - il.Emit(OpCodes.Ldarg_1); - - if (propertyInfo.PropertyType.IsClass) - il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); - else - il.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); - - il.EmitCall(OpCodes.Callvirt, setMethod, null); - il.Emit(OpCodes.Ret); - - return (GenericSetter)setter.CreateDelegate(typeof(GenericSetter)); - } - - internal delegate object GenericGetter(object obj); - - private static GenericGetter CreateGetField(Type type, FieldInfo fieldInfo) - { - DynamicMethod dynamicGet = new DynamicMethod("_", typeof(object), new Type[] { typeof(object) }, type, true); - ILGenerator il = dynamicGet.GetILGenerator(); - - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldfld, fieldInfo); - if (fieldInfo.FieldType.IsValueType) - il.Emit(OpCodes.Box, fieldInfo.FieldType); - il.Emit(OpCodes.Ret); - - return (GenericGetter)dynamicGet.CreateDelegate(typeof(GenericGetter)); - } - - private static GenericSetter CreateSetField(Type type, FieldInfo fieldInfo) - { - Type[] arguments = new Type[2]; - arguments[0] = arguments[1] = typeof(object); - - DynamicMethod dynamicSet = new DynamicMethod("_", typeof(void), arguments, type, true); - ILGenerator il = dynamicSet.GetILGenerator(); - - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - if (fieldInfo.FieldType.IsValueType) - il.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType); - il.Emit(OpCodes.Stfld, fieldInfo); - il.Emit(OpCodes.Ret); - - return (GenericSetter)dynamicSet.CreateDelegate(typeof(GenericSetter)); - } - - private GenericGetter CreateGetMethod(PropertyInfo propertyInfo) - { - MethodInfo getMethod = propertyInfo.GetGetMethod(); - if (getMethod == null) - return null; - - Type[] arguments = new Type[1]; - arguments[0] = typeof(object); - - DynamicMethod getter = new DynamicMethod("_", typeof(object), arguments); - ILGenerator il = getter.GetILGenerator(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); - il.EmitCall(OpCodes.Callvirt, getMethod, null); - - if (!propertyInfo.PropertyType.IsClass) - il.Emit(OpCodes.Box, propertyInfo.PropertyType); - - il.Emit(OpCodes.Ret); - - return (GenericGetter)getter.CreateDelegate(typeof(GenericGetter)); - } - - readonly SafeDictionary> _getterscache = new SafeDictionary>(); - internal List GetGetters(Type type) - { - List val = null; - if (_getterscache.TryGetValue(type, out val)) - return val; - - PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); - List getters = new List(); - foreach (PropertyInfo p in props) - { - if (!p.CanWrite && ShowReadOnlyProperties == false) continue; - - object[] att = p.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false); - if (att != null && att.Length > 0) - continue; - - JSON.GenericGetter g = CreateGetMethod(p); - if (g != null) - { - Getters gg = new Getters(); - gg.Name = p.Name; - gg.Getter = g; - gg.propertyType = p.PropertyType; - getters.Add(gg); - } - } - - FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.Public); - foreach (var f in fi) - { - object[] att = f.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false); - if (att != null && att.Length > 0) - continue; - - JSON.GenericGetter g = CreateGetField(type, f); - if (g != null) - { - Getters gg = new Getters(); - gg.Name = f.Name; - gg.Getter = g; - gg.propertyType = f.FieldType; - getters.Add(gg); - } - } - - _getterscache.Add(type, getters); - return getters; - } - - private object ChangeType(object value, Type conversionType) - { - if (conversionType == typeof(int)) - return (int)CreateLong((string)value); - - else if (conversionType == typeof(long)) - return CreateLong((string)value); - - else if (conversionType == typeof(string)) - return (string)value; - - else if (conversionType == typeof(Guid)) - return CreateGuid((string)value); - - else if (conversionType.IsEnum) - return CreateEnum(conversionType, (string)value); - - return Convert.ChangeType(value, conversionType, CultureInfo.InvariantCulture); - } - #endregion - - - private object ParseDictionary(Dictionary d, Dictionary globaltypes, Type type) - { - object tn = ""; - if (d.TryGetValue("$types", out tn)) - { - UsingGlobalTypes = true; - globaltypes = new Dictionary(); - foreach (var kv in (Dictionary)tn) - { - globaltypes.Add((string)kv.Value, kv.Key); - } - } - - bool found = d.TryGetValue("$type", out tn); -#if !SILVERLIGHT - if (found == false && type == typeof(System.Object)) - { - return CreateDataset(d, globaltypes); - } -#endif - if (found) - { - if (UsingGlobalTypes) - { - object tname = ""; - if (globaltypes.TryGetValue((string)tn, out tname)) - tn = tname; - } - type = GetTypeFromCache((string)tn); - } - - if (type == null) - throw new Exception("Cannot determine type"); - - string typename = type.FullName; - object o = FastCreateInstance(type); - SafeDictionary props = Getproperties(type, typename); - foreach (string name in d.Keys) - { - if (name == "$map") - { - ProcessMap(o, props, (Dictionary)d[name]); - continue; - } - myPropInfo pi; - if (props.TryGetValue(name, out pi) == false) - continue; - if (pi.filled == true) - { - object v = d[name]; - - if (v != null) - { - object oset = null; - - if (pi.isInt) - oset = (int)CreateLong((string)v); -#if CUSTOMTYPE - else if (pi.isCustomType) - oset = CreateCustom((string)v, pi.pt); -#endif - else if (pi.isLong) - oset = CreateLong((string)v); - - else if (pi.isString) - oset = (string)v; - - else if (pi.isBool) - oset = (bool)v; - - else if (pi.isGenericType && pi.isValueType == false && pi.isDictionary == false) -#if SILVERLIGHT - oset = CreateGenericList((List)v, pi.pt, pi.bt, globaltypes); -#else - oset = CreateGenericList((ArrayList)v, pi.pt, pi.bt, globaltypes); -#endif - else if (pi.isByteArray) - oset = Convert.FromBase64String((string)v); - - else if (pi.isArray && pi.isValueType == false) -#if SILVERLIGHT - oset = CreateArray((List)v, pi.pt, pi.bt, globaltypes); -#else - oset = CreateArray((ArrayList)v, pi.pt, pi.bt, globaltypes); -#endif - else if (pi.isGuid) - oset = CreateGuid((string)v); -#if !SILVERLIGHT - else if (pi.isDataSet) - oset = CreateDataset((Dictionary)v, globaltypes); - - else if (pi.isDataTable) - oset = this.CreateDataTable((Dictionary)v, globaltypes); -#endif - - else if (pi.isStringDictionary) - oset = CreateStringKeyDictionary((Dictionary)v, pi.pt, pi.GenericTypes, globaltypes); - -#if !SILVERLIGHT - else if (pi.isDictionary || pi.isHashtable) - oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes); -#else - else if (pi.isDictionary) - oset = CreateDictionary((List)v, pi.pt, pi.GenericTypes, globaltypes); -#endif - - else if (pi.isEnum) - oset = CreateEnum(pi.pt, (string)v); - - else if (pi.isDateTime) - oset = CreateDateTime((string)v); - - else if (pi.isClass && v is Dictionary) - oset = ParseDictionary((Dictionary)v, globaltypes, pi.pt); - - else if (pi.isValueType) - oset = ChangeType(v, pi.changeType); - -#if SILVERLIGHT - else if (v is List) - oset = CreateArray((List)v, pi.pt, typeof(object), globaltypes); -#else - else if (v is ArrayList) - oset = CreateArray((ArrayList)v, pi.pt, typeof(object), globaltypes); -#endif - else - oset = v; - - if (pi.CanWrite) - pi.setter(o, oset); - } - } - } - return o; - } - -#if CUSTOMTYPE - private object CreateCustom(string v, Type type) - { - Deserialize d; - _customDeserializer.TryGetValue(type, out d); - return d(v); - } -#endif - - private void ProcessMap(object obj, SafeDictionary props, Dictionary dic) - { - foreach (KeyValuePair kv in dic) - { - myPropInfo p = props[kv.Key]; - object o = p.getter(obj); - Type t = Type.GetType((string)kv.Value); - if (t == typeof(Guid)) - p.setter(obj, CreateGuid((string)o)); - } - } - - private long CreateLong(string s) - { - long num = 0; - bool neg = false; - foreach (char cc in s) - { - if (cc == '-') - neg = true; - else if (cc == '+') - neg = false; - else - { - num *= 10; - num += (int)(cc - '0'); - } - } - - return neg ? -num : num; - } - - private object CreateEnum(Type pt, string v) - { - // TODO : optimize create enum -#if !SILVERLIGHT - return Enum.Parse(pt, v); -#else - return Enum.Parse(pt, v, true); -#endif - } - - private Guid CreateGuid(string s) - { - if (s.Length > 30) - return new Guid(s); - else - return new Guid(Convert.FromBase64String(s)); - } - - private DateTime CreateDateTime(string value) - { - bool utc = false; - // 0123456789012345678 - // datetime format = yyyy-MM-dd HH:mm:ss - int year = (int)CreateLong(value.Substring(0, 4)); - int month = (int)CreateLong(value.Substring(5, 2)); - int day = (int)CreateLong(value.Substring(8, 2)); - int hour = (int)CreateLong(value.Substring(11, 2)); - int min = (int)CreateLong(value.Substring(14, 2)); - int sec = (int)CreateLong(value.Substring(17, 2)); - - if (value.EndsWith("Z")) - utc = true; - - if (UseUTCDateTime == false && utc == false) - return new DateTime(year, month, day, hour, min, sec); - else - return new DateTime(year, month, day, hour, min, sec, DateTimeKind.Utc).ToLocalTime(); - } - -#if SILVERLIGHT - private object CreateArray(List data, Type pt, Type bt, Dictionary globalTypes) - { - Array col = Array.CreateInstance(bt, data.Count); - // create an array of objects - for (int i = 0; i < data.Count; i++)// each (object ob in data) - { - object ob = data[i]; - if (ob is IDictionary) - col.SetValue(ParseDictionary((Dictionary)ob, globalTypes, bt), i); - else - col.SetValue(ChangeType(ob, bt), i); - } - - return col; - } -#else - private object CreateArray(ArrayList data, Type pt, Type bt, Dictionary globalTypes) - { - ArrayList col = new ArrayList(); - // create an array of objects - foreach (object ob in data) - { - if (ob is IDictionary) - col.Add(ParseDictionary((Dictionary)ob, globalTypes, bt)); - else - col.Add(ChangeType(ob, bt)); - } - return col.ToArray(bt); - } -#endif - - -#if SILVERLIGHT - private object CreateGenericList(List data, Type pt, Type bt, Dictionary globalTypes) -#else - private object CreateGenericList(ArrayList data, Type pt, Type bt, Dictionary globalTypes) -#endif - { - IList col = (IList)FastCreateInstance(pt); - // create an array of objects - foreach (object ob in data) - { - if (ob is IDictionary) - col.Add(ParseDictionary((Dictionary)ob, globalTypes, bt)); -#if SILVERLIGHT - else if (ob is List) - col.Add(((List)ob).ToArray()); -#else - else if (ob is ArrayList) - col.Add(((ArrayList)ob).ToArray()); -#endif - else - col.Add(ChangeType(ob, bt)); - } - return col; - } - - private object CreateStringKeyDictionary(Dictionary reader, Type pt, Type[] types, Dictionary globalTypes) - { - var col = (IDictionary)FastCreateInstance(pt); - Type t1 = null; - Type t2 = null; - if (types != null) - { - t1 = types[0]; - t2 = types[1]; - } - - foreach (KeyValuePair values in reader) - { - var key = values.Key;//ChangeType(values.Key, t1); - object val = null; - if (values.Value is Dictionary) - val = ParseDictionary((Dictionary)values.Value, globalTypes, t2); - else - val = ChangeType(values.Value, t2); - col.Add(key, val); - } - - return col; - } - -#if SILVERLIGHT - private object CreateDictionary(List reader, Type pt, Type[] types, Dictionary globalTypes) -#else - private object CreateDictionary(ArrayList reader, Type pt, Type[] types, Dictionary globalTypes) -#endif - { - IDictionary col = (IDictionary)FastCreateInstance(pt); - Type t1 = null; - Type t2 = null; - if (types != null) - { - t1 = types[0]; - t2 = types[1]; - } - - foreach (Dictionary values in reader) - { - object key = values["k"]; - object val = values["v"]; - - if (key is Dictionary) - key = ParseDictionary((Dictionary)key, globalTypes, t1); - else - key = ChangeType(key, t1); - - if (val is Dictionary) - val = ParseDictionary((Dictionary)val, globalTypes, t2); - else - val = ChangeType(val, t2); - - col.Add(key, val); - } - - return col; - } - - private Type GetChangeType(Type conversionType) - { - if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) - return conversionType.GetGenericArguments()[0]; - - return conversionType; - } -#if !SILVERLIGHT - private DataSet CreateDataset(Dictionary reader, Dictionary globalTypes) - { - DataSet ds = new DataSet(); - ds.EnforceConstraints = false; - ds.BeginInit(); - - // read dataset schema here - ReadSchema(reader, ds, globalTypes); - - foreach (KeyValuePair pair in reader) - { - if (pair.Key == "$type" || pair.Key == "$schema") continue; - - ArrayList rows = (ArrayList)pair.Value; - if (rows == null) continue; - - DataTable dt = ds.Tables[pair.Key]; - ReadDataTable(rows, dt); - } - - ds.EndInit(); - - return ds; - } - - private void ReadSchema(Dictionary reader, DataSet ds, Dictionary globalTypes) - { - var schema = reader["$schema"]; - - if (schema is string) - { - TextReader tr = new StringReader((string)schema); - ds.ReadXmlSchema(tr); - } - else - { - DatasetSchema ms = (DatasetSchema)ParseDictionary((Dictionary)schema, globalTypes, typeof(DatasetSchema)); - ds.DataSetName = ms.Name; - for (int i = 0; i < ms.Info.Count; i += 3) - { - if (ds.Tables.Contains(ms.Info[i]) == false) - ds.Tables.Add(ms.Info[i]); - ds.Tables[ms.Info[i]].Columns.Add(ms.Info[i + 1], Type.GetType(ms.Info[i + 2])); - } - } - } - - private void ReadDataTable(ArrayList rows, DataTable dt) - { - dt.BeginInit(); - dt.BeginLoadData(); - List guidcols = new List(); - List datecol = new List(); - - foreach (DataColumn c in dt.Columns) - { - if (c.DataType == typeof(Guid) || c.DataType == typeof(Guid?)) - guidcols.Add(c.Ordinal); - if (UseUTCDateTime && (c.DataType == typeof(DateTime) || c.DataType == typeof(DateTime?))) - datecol.Add(c.Ordinal); - } - - foreach (ArrayList row in rows) - { - object[] v = new object[row.Count]; - row.CopyTo(v, 0); - foreach (int i in guidcols) - { - string s = (string)v[i]; - if (s != null && s.Length < 36) - v[i] = new Guid(Convert.FromBase64String(s)); - } - if (UseUTCDateTime) - { - foreach (int i in datecol) - { - string s = (string)v[i]; - if (s != null) - v[i] = CreateDateTime(s); - } - } - dt.Rows.Add(v); - } - - dt.EndLoadData(); - dt.EndInit(); - } - - DataTable CreateDataTable(Dictionary reader, Dictionary globalTypes) - { - var dt = new DataTable(); - - // read dataset schema here - var schema = reader["$schema"]; - - if (schema is string) - { - TextReader tr = new StringReader((string)schema); - dt.ReadXmlSchema(tr); - } - else - { - var ms = (DatasetSchema)this.ParseDictionary((Dictionary)schema, globalTypes, typeof(DatasetSchema)); - dt.TableName = ms.Info[0]; - for (int i = 0; i < ms.Info.Count; i += 3) - { - dt.Columns.Add(ms.Info[i + 1], Type.GetType(ms.Info[i + 2])); - } - } - - foreach (var pair in reader) - { - if (pair.Key == "$type" || pair.Key == "$schema") - continue; - - var rows = (ArrayList)pair.Value; - if (rows == null) - continue; - - if (!dt.TableName.Equals(pair.Key, StringComparison.InvariantCultureIgnoreCase)) - continue; - - ReadDataTable(rows, dt); - } - - return dt; - } -#endif - } -} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonParser.cs b/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonParser.cs deleted file mode 100644 index 569ce1769..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonParser.cs +++ /dev/null @@ -1,408 +0,0 @@ -//http://fastjson.codeplex.com/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; - -namespace Exceptron.Driver.fastJSON -{ - /// - /// This class encodes and decodes JSON strings. - /// Spec. details, see http://www.json.org/ - /// - /// JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. - /// All numbers are parsed to doubles. - /// - internal class JsonParser - { - enum Token - { - None = -1, // Used to denote no Lookahead available - Curly_Open, - Curly_Close, - Squared_Open, - Squared_Close, - Colon, - Comma, - String, - Number, - True, - False, - Null - } - - readonly char[] json; - readonly StringBuilder s = new StringBuilder(); - Token lookAheadToken = Token.None; - int index; - - internal JsonParser(string json) - { - this.json = json.ToCharArray(); - } - - public object Decode() - { - return ParseValue(); - } - - private Dictionary ParseObject() - { - Dictionary table = new Dictionary(); - - ConsumeToken(); // { - - while (true) - { - switch (LookAhead()) - { - - case Token.Comma: - ConsumeToken(); - break; - - case Token.Curly_Close: - ConsumeToken(); - return table; - - default: - { - - // name - string name = ParseString(); - - // : - if (NextToken() != Token.Colon) - { - throw new Exception("Expected colon at index " + index); - } - - // value - object value = ParseValue(); - - table[name] = value; - } - break; - } - } - } - -#if SILVERLIGHT - private List ParseArray() - { - List array = new List(); -#else - private ArrayList ParseArray() - { - ArrayList array = new ArrayList(); -#endif - ConsumeToken(); // [ - - while (true) - { - switch (LookAhead()) - { - - case Token.Comma: - ConsumeToken(); - break; - - case Token.Squared_Close: - ConsumeToken(); - return array; - - default: - { - array.Add(ParseValue()); - } - break; - } - } - } - - private object ParseValue() - { - switch (LookAhead()) - { - case Token.Number: - return ParseNumber(); - - case Token.String: - return ParseString(); - - case Token.Curly_Open: - return ParseObject(); - - case Token.Squared_Open: - return ParseArray(); - - case Token.True: - ConsumeToken(); - return true; - - case Token.False: - ConsumeToken(); - return false; - - case Token.Null: - ConsumeToken(); - return null; - } - - throw new Exception("Unrecognized token at index" + index); - } - - private string ParseString() - { - ConsumeToken(); // " - - s.Length = 0; - - int runIndex = -1; - - while (index < json.Length) - { - var c = json[index++]; - - if (c == '"') - { - if (runIndex != -1) - { - if (s.Length == 0) - return new string(json, runIndex, index - runIndex - 1); - - s.Append(json, runIndex, index - runIndex - 1); - } - return s.ToString(); - } - - if (c != '\\') - { - if (runIndex == -1) - runIndex = index - 1; - - continue; - } - - if (index == json.Length) break; - - if (runIndex != -1) - { - s.Append(json, runIndex, index - runIndex - 1); - runIndex = -1; - } - - switch (json[index++]) - { - case '"': - s.Append('"'); - break; - - case '\\': - s.Append('\\'); - break; - - case '/': - s.Append('/'); - break; - - case 'b': - s.Append('\b'); - break; - - case 'f': - s.Append('\f'); - break; - - case 'n': - s.Append('\n'); - break; - - case 'r': - s.Append('\r'); - break; - - case 't': - s.Append('\t'); - break; - - case 'u': - { - int remainingLength = json.Length - index; - if (remainingLength < 4) break; - - // parse the 32 bit hex into an integer codepoint - uint codePoint = ParseUnicode(json[index], json[index + 1], json[index + 2], json[index + 3]); - s.Append((char)codePoint); - - // skip 4 chars - index += 4; - } - break; - } - } - - throw new Exception("Unexpectedly reached end of string"); - } - - private uint ParseSingleChar(char c1, uint multipliyer) - { - uint p1 = 0; - if (c1 >= '0' && c1 <= '9') - p1 = (uint)(c1 - '0') * multipliyer; - else if (c1 >= 'A' && c1 <= 'F') - p1 = (uint)((c1 - 'A') + 10) * multipliyer; - else if (c1 >= 'a' && c1 <= 'f') - p1 = (uint)((c1 - 'a') + 10) * multipliyer; - return p1; - } - - private uint ParseUnicode(char c1, char c2, char c3, char c4) - { - uint p1 = ParseSingleChar(c1, 0x1000); - uint p2 = ParseSingleChar(c2, 0x100); - uint p3 = ParseSingleChar(c3, 0x10); - uint p4 = ParseSingleChar(c4, 1); - - return p1 + p2 + p3 + p4; - } - - private string ParseNumber() - { - ConsumeToken(); - - // Need to start back one place because the first digit is also a token and would have been consumed - var startIndex = index - 1; - - do - { - var c = json[index]; - - if ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+' || c == 'e' || c == 'E') - { - if (++index == json.Length) throw new Exception("Unexpected end of string whilst parsing number"); - continue; - } - - break; - } while (true); - - return new string(json, startIndex, index - startIndex); - } - - private Token LookAhead() - { - if (lookAheadToken != Token.None) return lookAheadToken; - - return lookAheadToken = NextTokenCore(); - } - - private void ConsumeToken() - { - lookAheadToken = Token.None; - } - - private Token NextToken() - { - var result = lookAheadToken != Token.None ? lookAheadToken : NextTokenCore(); - - lookAheadToken = Token.None; - - return result; - } - - private Token NextTokenCore() - { - char c; - - // Skip past whitespace - do - { - c = json[index]; - - if (c > ' ') break; - if (c != ' ' && c != '\t' && c != '\n' && c != '\r') break; - - } while (++index < json.Length); - - if (index == json.Length) - { - throw new Exception("Reached end of string unexpectedly"); - } - - c = json[index]; - - index++; - - //if (c >= '0' && c <= '9') - // return Token.Number; - - switch (c) - { - case '{': - return Token.Curly_Open; - - case '}': - return Token.Curly_Close; - - case '[': - return Token.Squared_Open; - - case ']': - return Token.Squared_Close; - - case ',': - return Token.Comma; - - case '"': - return Token.String; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case '-': case '+': case '.': - return Token.Number; - - case ':': - return Token.Colon; - - case 'f': - if (json.Length - index >= 4 && - json[index + 0] == 'a' && - json[index + 1] == 'l' && - json[index + 2] == 's' && - json[index + 3] == 'e') - { - index += 4; - return Token.False; - } - break; - - case 't': - if (json.Length - index >= 3 && - json[index + 0] == 'r' && - json[index + 1] == 'u' && - json[index + 2] == 'e') - { - index += 3; - return Token.True; - } - break; - - case 'n': - if (json.Length - index >= 3 && - json[index + 0] == 'u' && - json[index + 1] == 'l' && - json[index + 2] == 'l') - { - index += 3; - return Token.Null; - } - break; - - } - - throw new Exception("Could not find token at index " + --index); - } - } -} diff --git a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonSerializer.cs b/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonSerializer.cs deleted file mode 100644 index 439471fae..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/JsonSerializer.cs +++ /dev/null @@ -1,518 +0,0 @@ -//http://fastjson.codeplex.com/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.IO; -using System.Text; - -namespace Exceptron.Driver.fastJSON -{ - internal class JSONSerializer - { - private readonly StringBuilder _output = new StringBuilder(); - readonly bool useMinimalDataSetSchema; - readonly bool fastguid = true; - readonly bool useExtension = true; - readonly bool serializeNulls = true; - readonly int _MAX_DEPTH = 10; - bool _Indent = false; - bool _useGlobalTypes = true; - int _current_depth = 0; - private Dictionary _globalTypes = new Dictionary(); - - internal JSONSerializer(bool UseMinimalDataSetSchema, bool UseFastGuid, bool UseExtensions, bool SerializeNulls, bool IndentOutput) - { - this.useMinimalDataSetSchema = UseMinimalDataSetSchema; - this.fastguid = UseFastGuid; - this.useExtension = UseExtensions; - _Indent = IndentOutput; - this.serializeNulls = SerializeNulls; - if (useExtension == false) - _useGlobalTypes = false; - } - - internal string ConvertToJSON(object obj) - { - WriteValue(obj); - - string str = ""; - if (_useGlobalTypes) - { - StringBuilder sb = new StringBuilder(); - sb.Append("{\"$types\":{"); - bool pendingSeparator = false; - foreach (var kv in _globalTypes) - { - if (pendingSeparator) sb.Append(','); - pendingSeparator = true; - sb.Append("\""); - sb.Append(kv.Key); - sb.Append("\":\""); - sb.Append(kv.Value); - sb.Append("\""); - } - sb.Append("},"); - str = sb.ToString() + _output.ToString(); - } - else - str = _output.ToString(); - - return str; - } - - private void WriteValue(object obj) - { - if (obj == null || obj is DBNull) - _output.Append("null"); - - else if (obj is string || obj is char) - WriteString((string)obj); - - else if (obj is Guid) - WriteGuid((Guid)obj); - - else if (obj is bool) - _output.Append(((bool)obj) ? "true" : "false"); // conform to standard - - else if ( - obj is int || obj is long || obj is double || - obj is decimal || obj is float || - obj is byte || obj is short || - obj is sbyte || obj is ushort || - obj is uint || obj is ulong - ) - _output.Append(((IConvertible)obj).ToString(NumberFormatInfo.InvariantInfo)); - - else if (obj is DateTime) - WriteDateTime((DateTime)obj); - - else if (obj is IDictionary && obj.GetType().IsGenericType && obj.GetType().GetGenericArguments()[0] == typeof(string)) - WriteStringDictionary((IDictionary)obj); - - else if (obj is IDictionary) - WriteDictionary((IDictionary)obj); -#if !SILVERLIGHT - else if (obj is DataSet) - WriteDataset((DataSet)obj); - - else if (obj is DataTable) - this.WriteDataTable((DataTable)obj); -#endif - else if (obj is byte[]) - WriteBytes((byte[])obj); - - else if (obj is Array || obj is IList || obj is ICollection) - WriteArray((IEnumerable)obj); - - else if (obj is Enum) - WriteEnum((Enum)obj); - -#if CUSTOMTYPE - else if (JSON.Instance.IsTypeRegistered(obj.GetType())) - WriteCustom(obj); -#endif - else - WriteObject(obj); - } - -#if CUSTOMTYPE - private void WriteCustom(object obj) - { - Serialize s; - JSON.Instance._customSerializer.TryGetValue(obj.GetType(), out s); - WriteStringFast(s(obj)); - } -#endif - - private void WriteEnum(Enum e) - { - // TODO : optimize enum write - WriteStringFast(e.ToString()); - } - - private void WriteGuid(Guid g) - { - if (fastguid == false) - WriteStringFast(g.ToString()); - else - WriteBytes(g.ToByteArray()); - } - - private void WriteBytes(byte[] bytes) - { -#if !SILVERLIGHT - WriteStringFast(Convert.ToBase64String(bytes, 0, bytes.Length, Base64FormattingOptions.None)); -#else - WriteStringFast(Convert.ToBase64String(bytes, 0, bytes.Length)); -#endif - } - - private void WriteDateTime(DateTime dateTime) - { - // datetime format standard : yyyy-MM-dd HH:mm:ss - DateTime dt = dateTime; - if (JSON.Instance.UseUTCDateTime) - dt = dateTime.ToUniversalTime(); - - _output.Append("\""); - _output.Append(dt.Year.ToString("0000", NumberFormatInfo.InvariantInfo)); - _output.Append("-"); - _output.Append(dt.Month.ToString("00", NumberFormatInfo.InvariantInfo)); - _output.Append("-"); - _output.Append(dt.Day.ToString("00", NumberFormatInfo.InvariantInfo)); - _output.Append(" "); - _output.Append(dt.Hour.ToString("00", NumberFormatInfo.InvariantInfo)); - _output.Append(":"); - _output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo)); - _output.Append(":"); - _output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo)); - - if (JSON.Instance.UseUTCDateTime) - _output.Append("Z"); - - _output.Append("\""); - } -#if !SILVERLIGHT - private DatasetSchema GetSchema(DataTable ds) - { - if (ds == null) return null; - - DatasetSchema m = new DatasetSchema(); - m.Info = new List(); - m.Name = ds.TableName; - - foreach (DataColumn c in ds.Columns) - { - m.Info.Add(ds.TableName); - m.Info.Add(c.ColumnName); - m.Info.Add(c.DataType.ToString()); - } - // TODO : serialize relations and constraints here - - return m; - } - - private DatasetSchema GetSchema(DataSet ds) - { - if (ds == null) return null; - - DatasetSchema m = new DatasetSchema(); - m.Info = new List(); - m.Name = ds.DataSetName; - - foreach (DataTable t in ds.Tables) - { - foreach (DataColumn c in t.Columns) - { - m.Info.Add(t.TableName); - m.Info.Add(c.ColumnName); - m.Info.Add(c.DataType.ToString()); - } - } - // TODO : serialize relations and constraints here - - return m; - } - - private string GetXmlSchema(DataTable dt) - { - using (var writer = new StringWriter()) - { - dt.WriteXmlSchema(writer); - return dt.ToString(); - } - } - - private void WriteDataset(DataSet ds) - { - _output.Append('{'); - if (useExtension) - { - WritePair("$schema", useMinimalDataSetSchema ? (object)GetSchema(ds) : ds.GetXmlSchema()); - _output.Append(','); - } - bool tablesep = false; - foreach (DataTable table in ds.Tables) - { - if (tablesep) _output.Append(","); - tablesep = true; - WriteDataTableData(table); - } - // end dataset - _output.Append('}'); - } - - private void WriteDataTableData(DataTable table) - { - _output.Append('\"'); - _output.Append(table.TableName); - _output.Append("\":["); - DataColumnCollection cols = table.Columns; - bool rowseparator = false; - foreach (DataRow row in table.Rows) - { - if (rowseparator) _output.Append(","); - rowseparator = true; - _output.Append('['); - - bool pendingSeperator = false; - foreach (DataColumn column in cols) - { - if (pendingSeperator) _output.Append(','); - WriteValue(row[column]); - pendingSeperator = true; - } - _output.Append(']'); - } - - _output.Append(']'); - } - - void WriteDataTable(DataTable dt) - { - this._output.Append('{'); - if (this.useExtension) - { - this.WritePair("$schema", this.useMinimalDataSetSchema ? (object)this.GetSchema(dt) : this.GetXmlSchema(dt)); - this._output.Append(','); - } - - WriteDataTableData(dt); - - // end datatable - this._output.Append('}'); - } -#endif - bool _firstWritten = false; - private void WriteObject(object obj) - { - Indent(); - if (_useGlobalTypes == false) - _output.Append('{'); - else - { - if (_firstWritten) - _output.Append("{"); - } - _firstWritten = true; - _current_depth++; - if (_current_depth > _MAX_DEPTH) - throw new Exception("Serializer encountered maximum depth of " + _MAX_DEPTH); - - - Dictionary map = new Dictionary(); - Type t = obj.GetType(); - bool append = false; - if (useExtension) - { - if (_useGlobalTypes == false) - WritePairFast("$type", JSON.Instance.GetTypeAssemblyName(t)); - else - { - int dt = 0; - string ct = JSON.Instance.GetTypeAssemblyName(t); - if (_globalTypes.TryGetValue(ct, out dt) == false) - { - dt = _globalTypes.Count + 1; - _globalTypes.Add(ct, dt); - } - WritePairFast("$type", dt.ToString()); - } - append = true; - } - - List g = JSON.Instance.GetGetters(t); - foreach (var p in g) - { - if (append) - _output.Append(','); - object o = p.Getter(obj); - if ((o == null || o is DBNull) && serializeNulls == false) - append = false; - else - { - WritePair(p.Name, o); - if (o != null && useExtension) - { - Type tt = o.GetType(); - if (tt == typeof(System.Object)) - map.Add(p.Name, tt.ToString()); - } - append = true; - } - } - if (map.Count > 0 && useExtension) - { - _output.Append(",\"$map\":"); - WriteStringDictionary(map); - } - _current_depth--; - Indent(); - _output.Append('}'); - _current_depth--; - - } - - private void Indent() - { - Indent(false); - } - - private void Indent(bool dec) - { - if (_Indent) - { - _output.Append("\r\n"); - for (int i = 0; i < _current_depth - (dec ? 1 : 0); i++) - _output.Append("\t"); - } - } - - private void WritePairFast(string name, string value) - { - if ((value == null) && serializeNulls == false) - return; - Indent(); - WriteStringFast(name); - - _output.Append(':'); - - WriteStringFast(value); - } - - private void WritePair(string name, object value) - { - if ((value == null || value is DBNull) && serializeNulls == false) - return; - Indent(); - WriteStringFast(name); - - _output.Append(':'); - - WriteValue(value); - } - - private void WriteArray(IEnumerable array) - { - Indent(); - _output.Append('['); - - bool pendingSeperator = false; - - foreach (object obj in array) - { - Indent(); - if (pendingSeperator) _output.Append(','); - - WriteValue(obj); - - pendingSeperator = true; - } - Indent(); - _output.Append(']'); - } - - private void WriteStringDictionary(IDictionary dic) - { - Indent(); - _output.Append('{'); - - bool pendingSeparator = false; - - foreach (DictionaryEntry entry in dic) - { - if (pendingSeparator) _output.Append(','); - - WritePair((string)entry.Key, entry.Value); - - pendingSeparator = true; - } - Indent(); - _output.Append('}'); - } - - private void WriteDictionary(IDictionary dic) - { - Indent(); - _output.Append('['); - - bool pendingSeparator = false; - - foreach (DictionaryEntry entry in dic) - { - if (pendingSeparator) _output.Append(','); - Indent(); - _output.Append('{'); - WritePair("k", entry.Key); - _output.Append(","); - WritePair("v", entry.Value); - Indent(); - _output.Append('}'); - - pendingSeparator = true; - } - Indent(); - _output.Append(']'); - } - - private void WriteStringFast(string s) - { - //Indent(); - _output.Append('\"'); - _output.Append(s); - _output.Append('\"'); - } - - private void WriteString(string s) - { - //Indent(); - _output.Append('\"'); - - int runIndex = -1; - - for (var index = 0; index < s.Length; ++index) - { - var c = s[index]; - - if (c >= ' ' && c < 128 && c != '\"' && c != '\\') - { - if (runIndex == -1) - { - runIndex = index; - } - - continue; - } - - if (runIndex != -1) - { - _output.Append(s, runIndex, index - runIndex); - runIndex = -1; - } - - switch (c) - { - case '\t': _output.Append("\\t"); break; - case '\r': _output.Append("\\r"); break; - case '\n': _output.Append("\\n"); break; - case '"': - case '\\': _output.Append('\\'); _output.Append(c); break; - default: - _output.Append("\\u"); - _output.Append(((int)c).ToString("X4", NumberFormatInfo.InvariantInfo)); - break; - } - } - - if (runIndex != -1) - { - _output.Append(s, runIndex, s.Length - runIndex); - } - - _output.Append('\"'); - } - } -} diff --git a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/SafeDictionary.cs b/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/SafeDictionary.cs deleted file mode 100644 index 191975fb4..000000000 --- a/packages/Exceptron.Driver.0.1.0.3/src/fastJSON/SafeDictionary.cs +++ /dev/null @@ -1,39 +0,0 @@ -//http://fastjson.codeplex.com/ - -using System.Collections.Generic; - -namespace Exceptron.Driver.fastJSON -{ - internal class SafeDictionary - { - private readonly object _Padlock = new object(); - private readonly Dictionary _Dictionary = new Dictionary(); - - - public bool TryGetValue(TKey key, out TValue value) - { - return _Dictionary.TryGetValue(key, out value); - } - - public TValue this[TKey key] - { - get - { - return _Dictionary[key]; - } - } - public IEnumerator> GetEnumerator() - { - return ((ICollection>)_Dictionary).GetEnumerator(); - } - - public void Add(TKey key, TValue value) - { - lock (_Padlock) - { - if (_Dictionary.ContainsKey(key) == false) - _Dictionary.Add(key, value); - } - } - } -} diff --git a/packages/Exceptron.Driver.0.1.0.4/Exceptron.Driver.0.1.0.4.nupkg b/packages/Exceptron.Driver.0.1.0.4/Exceptron.Driver.0.1.0.4.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..971f53accdcea569439dcc446f981c795870e342 GIT binary patch literal 22976 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

?D32s%8I#zLv?J?Q$*4@bt*_jNf*gG}U!j z&ZCi@Q*tSd_4sk0;a9Tdh!CP?V2vDQEgngUvUZQIbg=t9@j!m`bg;c1jxT%sN+)|y z$p0MUNmlM;x;FzD?@fm}!<(zz#|pj42rl>TS^0c{94J6(o{<`(({s%Dm2+b^C_aerF_bk_&!vAU^n}YDW$aD zcY{<)yL_K1C)qyVH_#t|p3DCO&)0m4En7qgNgw!}wmfW**H$Q^mD39m>{cnA^bNDs z(rMo*xt0?B)2LhwD5W%iiES#q^K7Lw&c6^?1sw$w`x!nwxqG2c4AgQ%Qh?(?;7L{x=(h1yz6f)%(CqUaf_%R4 z83(MTvOt%uSgfF3l)IkY6mY5SNb#^-EE27k{%owAp0@D2zyfsxvEcQCZi$qXi<71 zI9}T;aSfMiv~E}bkMP2C3VnG$h?D+lkU_GNI};YSaTvt>GZP1 z7t=xKCp`_-q$K_}4Z2=}6R+C=Ot3}kq$NqOX>UM2r0t~kr0ux;@Nk{94iO#`)BIK9 zi5`)jNIE4Skq*M=F(hSeSrvl5aJcqm;Xx}cZt<3 z8D)#z+Hi@ISoq%16=SCaCfv7o_O(x^CA|>)_IHP68Z^0)@R8?J8y}U|3xMr#U!h1JwkL?WplnbbkCtaOnN}d5f{ME!olg g|9eESwQcRp=xMt*7T^A(EF}($xo