PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/src/ServiceStack.Text/PclExport.WinStore.cs

https://github.com/ServiceStack/ServiceStack.Text
C# | 332 lines | 252 code | 58 blank | 22 comment | 45 complexity | 5b583475179d9d28a76be43442bca73b MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception
  1. //Copyright (c) Service Stack LLC. All Rights Reserved.
  2. //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt
  3. #if NETFX_CORE
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Reflection;
  9. using ServiceStack.Text;
  10. using ServiceStack.Text.Common;
  11. using ServiceStack.Text.Json;
  12. namespace ServiceStack
  13. {
  14. public class WinStorePclExport : PclExport
  15. {
  16. public new static WinStorePclExport Provider = new WinStorePclExport();
  17. public WinStorePclExport()
  18. {
  19. this.PlatformName = Platforms.WindowsStore;
  20. }
  21. public static PclExport Configure()
  22. {
  23. Configure(Provider);
  24. return Provider;
  25. }
  26. public override string ReadAllText(string filePath)
  27. {
  28. var task = Windows.Storage.StorageFile.GetFileFromPathAsync(filePath);
  29. task.AsTask().Wait();
  30. var file = task.GetResults();
  31. var streamTask = file.OpenStreamForReadAsync();
  32. streamTask.Wait();
  33. var fileStream = streamTask.Result;
  34. return new StreamReader(fileStream).ReadToEnd();
  35. }
  36. public override bool FileExists(string filePath)
  37. {
  38. try
  39. {
  40. var task = Windows.Storage.StorageFile.GetFileFromPathAsync(filePath);
  41. //no exception means file exists
  42. return true;
  43. }
  44. catch (Exception ex)
  45. {
  46. //find out through exception
  47. return false;
  48. }
  49. }
  50. public override void WriteLine(string line)
  51. {
  52. System.Diagnostics.Debug.WriteLine(line);
  53. }
  54. public override void WriteLine(string format, params object[] args)
  55. {
  56. System.Diagnostics.Debug.WriteLine(format, args);
  57. }
  58. public override Assembly[] GetAllAssemblies()
  59. {
  60. return AppDomain.CurrentDomain.GetAssemblies();
  61. }
  62. private sealed class AppDomain
  63. {
  64. public static AppDomain CurrentDomain { get; private set; }
  65. public static Assembly[] cacheObj = null;
  66. static AppDomain()
  67. {
  68. CurrentDomain = new AppDomain();
  69. }
  70. public Assembly[] GetAssemblies()
  71. {
  72. return cacheObj ?? GetAssemblyListAsync().Result.ToArray();
  73. }
  74. private async System.Threading.Tasks.Task<IEnumerable<Assembly>> GetAssemblyListAsync()
  75. {
  76. var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
  77. var assemblies = new List<Assembly>();
  78. foreach (Windows.Storage.StorageFile file in await folder.GetFilesAsync())
  79. {
  80. if (file.FileType == ".dll" || file.FileType == ".exe")
  81. {
  82. try
  83. {
  84. var filename = file.Name.Substring(0, file.Name.Length - file.FileType.Length);
  85. AssemblyName name = new AssemblyName() {Name = filename};
  86. Assembly asm = Assembly.Load(name);
  87. assemblies.Add(asm);
  88. }
  89. catch (Exception)
  90. {
  91. // Invalid WinRT assembly!
  92. }
  93. }
  94. }
  95. cacheObj = assemblies.ToArray();
  96. return cacheObj;
  97. }
  98. }
  99. public override string GetAssemblyCodeBase(Assembly assembly)
  100. {
  101. return assembly.GetName().FullName;
  102. }
  103. //public override DateTime ToStableUniversalTime(DateTime dateTime)
  104. //{
  105. // // .Net 2.0 - 3.5 has an issue with DateTime.ToUniversalTime, but works ok with TimeZoneInfo.ConvertTimeToUtc.
  106. // // .Net 4.0+ does this under the hood anyway.
  107. // return TimeZoneInfo.ConvertTimeToUtc(dateTime);
  108. //}
  109. public override void VerifyInAssembly(Type accessType, ICollection<string> assemblyNames)
  110. {
  111. }
  112. public static void InitForAot()
  113. {
  114. }
  115. internal class Poco
  116. {
  117. public string Dummy { get; set; }
  118. }
  119. public override void RegisterForAot()
  120. {
  121. RegisterTypeForAot<Poco>();
  122. RegisterElement<Poco, string>();
  123. RegisterElement<Poco, bool>();
  124. RegisterElement<Poco, char>();
  125. RegisterElement<Poco, byte>();
  126. RegisterElement<Poco, sbyte>();
  127. RegisterElement<Poco, short>();
  128. RegisterElement<Poco, ushort>();
  129. RegisterElement<Poco, int>();
  130. RegisterElement<Poco, uint>();
  131. RegisterElement<Poco, long>();
  132. RegisterElement<Poco, ulong>();
  133. RegisterElement<Poco, float>();
  134. RegisterElement<Poco, double>();
  135. RegisterElement<Poco, decimal>();
  136. RegisterElement<Poco, bool?>();
  137. RegisterElement<Poco, char?>();
  138. RegisterElement<Poco, byte?>();
  139. RegisterElement<Poco, sbyte?>();
  140. RegisterElement<Poco, short?>();
  141. RegisterElement<Poco, ushort?>();
  142. RegisterElement<Poco, int?>();
  143. RegisterElement<Poco, uint?>();
  144. RegisterElement<Poco, long?>();
  145. RegisterElement<Poco, ulong?>();
  146. RegisterElement<Poco, float?>();
  147. RegisterElement<Poco, double?>();
  148. RegisterElement<Poco, decimal?>();
  149. //RegisterElement<Poco, JsonValue>();
  150. RegisterTypeForAot<DayOfWeek>(); // used by DateTime
  151. // register built in structs
  152. RegisterTypeForAot<Guid>();
  153. RegisterTypeForAot<TimeSpan>();
  154. RegisterTypeForAot<DateTime>();
  155. RegisterTypeForAot<DateTimeOffset>();
  156. RegisterTypeForAot<Guid?>();
  157. RegisterTypeForAot<TimeSpan?>();
  158. RegisterTypeForAot<DateTime?>();
  159. RegisterTypeForAot<DateTimeOffset?>();
  160. }
  161. public static void RegisterTypeForAot<T>()
  162. {
  163. AotConfig.RegisterSerializers<T>();
  164. }
  165. public static void RegisterQueryStringWriter()
  166. {
  167. var i = 0;
  168. if (QueryStringWriter<Poco>.WriteFn() != null) i++;
  169. }
  170. public static int RegisterElement<T, TElement>()
  171. {
  172. var i = 0;
  173. i += AotConfig.RegisterSerializers<TElement>();
  174. AotConfig.RegisterElement<T, TElement, JsonTypeSerializer>();
  175. AotConfig.RegisterElement<T, TElement, Text.Jsv.JsvTypeSerializer>();
  176. return i;
  177. }
  178. internal class AotConfig
  179. {
  180. internal static JsReader<JsonTypeSerializer> jsonReader;
  181. internal static JsWriter<JsonTypeSerializer> jsonWriter;
  182. internal static JsReader<Text.Jsv.JsvTypeSerializer> jsvReader;
  183. internal static JsWriter<Text.Jsv.JsvTypeSerializer> jsvWriter;
  184. internal static JsonTypeSerializer jsonSerializer;
  185. internal static Text.Jsv.JsvTypeSerializer jsvSerializer;
  186. static AotConfig()
  187. {
  188. jsonSerializer = new JsonTypeSerializer();
  189. jsvSerializer = new Text.Jsv.JsvTypeSerializer();
  190. jsonReader = new JsReader<JsonTypeSerializer>();
  191. jsonWriter = new JsWriter<JsonTypeSerializer>();
  192. jsvReader = new JsReader<Text.Jsv.JsvTypeSerializer>();
  193. jsvWriter = new JsWriter<Text.Jsv.JsvTypeSerializer>();
  194. }
  195. internal static int RegisterSerializers<T>()
  196. {
  197. var i = 0;
  198. i += Register<T, JsonTypeSerializer>();
  199. if (jsonSerializer.GetParseFn<T>() != null) i++;
  200. if (jsonSerializer.GetWriteFn<T>() != null) i++;
  201. if (jsonReader.GetParseFn<T>() != null) i++;
  202. if (jsonWriter.GetWriteFn<T>() != null) i++;
  203. i += Register<T, Text.Jsv.JsvTypeSerializer>();
  204. if (jsvSerializer.GetParseFn<T>() != null) i++;
  205. if (jsvSerializer.GetWriteFn<T>() != null) i++;
  206. if (jsvReader.GetParseFn<T>() != null) i++;
  207. if (jsvWriter.GetWriteFn<T>() != null) i++;
  208. //RegisterCsvSerializer<T>();
  209. RegisterQueryStringWriter();
  210. return i;
  211. }
  212. internal static void RegisterCsvSerializer<T>()
  213. {
  214. CsvSerializer<T>.WriteFn();
  215. CsvSerializer<T>.WriteObject(null, null);
  216. CsvWriter<T>.Write(null, default(IEnumerable<T>));
  217. CsvWriter<T>.WriteRow(null, default(T));
  218. }
  219. public static ParseStringDelegate GetParseFn(Type type)
  220. {
  221. var parseFn = JsonTypeSerializer.Instance.GetParseFn(type);
  222. return parseFn;
  223. }
  224. internal static int Register<T, TSerializer>() where TSerializer : ITypeSerializer
  225. {
  226. var i = 0;
  227. if (JsonWriter<T>.WriteFn() != null) i++;
  228. if (JsonWriter.Instance.GetWriteFn<T>() != null) i++;
  229. if (JsonReader.Instance.GetParseFn<T>() != null) i++;
  230. if (JsonReader<T>.Parse(null) != null) i++;
  231. if (JsonReader<T>.GetParseFn() != null) i++;
  232. //if (JsWriter.GetTypeSerializer<JsonTypeSerializer>().GetWriteFn<T>() != null) i++;
  233. if (new List<T>() != null) i++;
  234. if (new T[0] != null) i++;
  235. JsConfig<T>.ExcludeTypeInfo = false;
  236. if (JsConfig<T>.OnDeserializedFn != null) i++;
  237. if (JsConfig<T>.HasDeserializeFn) i++;
  238. if (JsConfig<T>.SerializeFn != null) i++;
  239. if (JsConfig<T>.DeSerializeFn != null) i++;
  240. //JsConfig<T>.SerializeFn = arg => "";
  241. //JsConfig<T>.DeSerializeFn = arg => default(T);
  242. if (TypeConfig<T>.Properties != null) i++;
  243. WriteListsOfElements<T, TSerializer>.WriteList(null, null);
  244. WriteListsOfElements<T, TSerializer>.WriteIList(null, null);
  245. WriteListsOfElements<T, TSerializer>.WriteEnumerable(null, null);
  246. WriteListsOfElements<T, TSerializer>.WriteListValueType(null, null);
  247. WriteListsOfElements<T, TSerializer>.WriteIListValueType(null, null);
  248. WriteListsOfElements<T, TSerializer>.WriteGenericArrayValueType(null, null);
  249. WriteListsOfElements<T, TSerializer>.WriteArray(null, null);
  250. TranslateListWithElements<T>.LateBoundTranslateToGenericICollection(null, null);
  251. TranslateListWithConvertibleElements<T, T>.LateBoundTranslateToGenericICollection(null, null);
  252. QueryStringWriter<T>.WriteObject(null, null);
  253. return i;
  254. }
  255. internal static void RegisterElement<T, TElement, TSerializer>() where TSerializer : ITypeSerializer
  256. {
  257. DeserializeDictionary<TSerializer>.ParseDictionary<T, TElement>(null, null, null, null);
  258. DeserializeDictionary<TSerializer>.ParseDictionary<TElement, T>(null, null, null, null);
  259. ToStringDictionaryMethods<T, TElement, TSerializer>.WriteIDictionary(null, null, null, null);
  260. ToStringDictionaryMethods<TElement, T, TSerializer>.WriteIDictionary(null, null, null, null);
  261. // Include List deserialisations from the Register<> method above. This solves issue where List<Guid> properties on responses deserialise to null.
  262. // No idea why this is happening because there is no visible exception raised. Suspect IOS is swallowing an AOT exception somewhere.
  263. DeserializeArrayWithElements<TElement, TSerializer>.ParseGenericArray(null, null);
  264. DeserializeListWithElements<TElement, TSerializer>.ParseGenericList(null, null, null);
  265. // Cannot use the line below for some unknown reason - when trying to compile to run on device, mtouch bombs during native code compile.
  266. // Something about this line or its inner workings is offensive to mtouch. Luckily this was not needed for my List<Guide> issue.
  267. // DeserializeCollection<JsonTypeSerializer>.ParseCollection<TElement>(null, null, null);
  268. TranslateListWithElements<TElement>.LateBoundTranslateToGenericICollection(null, typeof(List<TElement>));
  269. TranslateListWithConvertibleElements<TElement, TElement>.LateBoundTranslateToGenericICollection(null, typeof(List<TElement>));
  270. }
  271. }
  272. }
  273. }
  274. #endif