PageRenderTime 45ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/src/ServiceStack.Pcl.WinStore/PclExport.WinStore.cs

http://github.com/ServiceStack/ServiceStack
C# | 328 lines | 249 code | 57 blank | 22 comment | 45 complexity | 413561c007887172bfa508bf3e10647e MD5 | raw file
Possible License(s): BSD-3-Clause
  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 static void InitForAot()
  110. {
  111. }
  112. internal class Poco
  113. {
  114. public string Dummy { get; set; }
  115. }
  116. public override void RegisterForAot()
  117. {
  118. RegisterTypeForAot<Poco>();
  119. RegisterElement<Poco, string>();
  120. RegisterElement<Poco, bool>();
  121. RegisterElement<Poco, char>();
  122. RegisterElement<Poco, byte>();
  123. RegisterElement<Poco, sbyte>();
  124. RegisterElement<Poco, short>();
  125. RegisterElement<Poco, ushort>();
  126. RegisterElement<Poco, int>();
  127. RegisterElement<Poco, uint>();
  128. RegisterElement<Poco, long>();
  129. RegisterElement<Poco, ulong>();
  130. RegisterElement<Poco, float>();
  131. RegisterElement<Poco, double>();
  132. RegisterElement<Poco, decimal>();
  133. RegisterElement<Poco, bool?>();
  134. RegisterElement<Poco, char?>();
  135. RegisterElement<Poco, byte?>();
  136. RegisterElement<Poco, sbyte?>();
  137. RegisterElement<Poco, short?>();
  138. RegisterElement<Poco, ushort?>();
  139. RegisterElement<Poco, int?>();
  140. RegisterElement<Poco, uint?>();
  141. RegisterElement<Poco, long?>();
  142. RegisterElement<Poco, ulong?>();
  143. RegisterElement<Poco, float?>();
  144. RegisterElement<Poco, double?>();
  145. RegisterElement<Poco, decimal?>();
  146. //RegisterElement<Poco, JsonValue>();
  147. RegisterTypeForAot<DayOfWeek>(); // used by DateTime
  148. // register built in structs
  149. RegisterTypeForAot<Guid>();
  150. RegisterTypeForAot<TimeSpan>();
  151. RegisterTypeForAot<DateTime>();
  152. RegisterTypeForAot<DateTimeOffset>();
  153. RegisterTypeForAot<Guid?>();
  154. RegisterTypeForAot<TimeSpan?>();
  155. RegisterTypeForAot<DateTime?>();
  156. RegisterTypeForAot<DateTimeOffset?>();
  157. }
  158. public static void RegisterTypeForAot<T>()
  159. {
  160. AotConfig.RegisterSerializers<T>();
  161. }
  162. public static void RegisterQueryStringWriter()
  163. {
  164. var i = 0;
  165. if (QueryStringWriter<Poco>.WriteFn() != null) i++;
  166. }
  167. public static int RegisterElement<T, TElement>()
  168. {
  169. var i = 0;
  170. i += AotConfig.RegisterSerializers<TElement>();
  171. AotConfig.RegisterElement<T, TElement, JsonTypeSerializer>();
  172. AotConfig.RegisterElement<T, TElement, Text.Jsv.JsvTypeSerializer>();
  173. return i;
  174. }
  175. internal class AotConfig
  176. {
  177. internal static JsReader<JsonTypeSerializer> jsonReader;
  178. internal static JsWriter<JsonTypeSerializer> jsonWriter;
  179. internal static JsReader<Text.Jsv.JsvTypeSerializer> jsvReader;
  180. internal static JsWriter<Text.Jsv.JsvTypeSerializer> jsvWriter;
  181. internal static JsonTypeSerializer jsonSerializer;
  182. internal static Text.Jsv.JsvTypeSerializer jsvSerializer;
  183. static AotConfig()
  184. {
  185. jsonSerializer = new JsonTypeSerializer();
  186. jsvSerializer = new Text.Jsv.JsvTypeSerializer();
  187. jsonReader = new JsReader<JsonTypeSerializer>();
  188. jsonWriter = new JsWriter<JsonTypeSerializer>();
  189. jsvReader = new JsReader<Text.Jsv.JsvTypeSerializer>();
  190. jsvWriter = new JsWriter<Text.Jsv.JsvTypeSerializer>();
  191. }
  192. internal static int RegisterSerializers<T>()
  193. {
  194. var i = 0;
  195. i += Register<T, JsonTypeSerializer>();
  196. if (jsonSerializer.GetParseFn<T>() != null) i++;
  197. if (jsonSerializer.GetWriteFn<T>() != null) i++;
  198. if (jsonReader.GetParseFn<T>() != null) i++;
  199. if (jsonWriter.GetWriteFn<T>() != null) i++;
  200. i += Register<T, Text.Jsv.JsvTypeSerializer>();
  201. if (jsvSerializer.GetParseFn<T>() != null) i++;
  202. if (jsvSerializer.GetWriteFn<T>() != null) i++;
  203. if (jsvReader.GetParseFn<T>() != null) i++;
  204. if (jsvWriter.GetWriteFn<T>() != null) i++;
  205. //RegisterCsvSerializer<T>();
  206. RegisterQueryStringWriter();
  207. return i;
  208. }
  209. internal static void RegisterCsvSerializer<T>()
  210. {
  211. CsvSerializer<T>.WriteFn();
  212. CsvSerializer<T>.WriteObject(null, null);
  213. CsvWriter<T>.Write(null, default(IEnumerable<T>));
  214. CsvWriter<T>.WriteRow(null, default(T));
  215. }
  216. public static ParseStringDelegate GetParseFn(Type type)
  217. {
  218. var parseFn = JsonTypeSerializer.Instance.GetParseFn(type);
  219. return parseFn;
  220. }
  221. internal static int Register<T, TSerializer>() where TSerializer : ITypeSerializer
  222. {
  223. var i = 0;
  224. if (JsonWriter<T>.WriteFn() != null) i++;
  225. if (JsonWriter.Instance.GetWriteFn<T>() != null) i++;
  226. if (JsonReader.Instance.GetParseFn<T>() != null) i++;
  227. if (JsonReader<T>.Parse(null) != null) i++;
  228. if (JsonReader<T>.GetParseFn() != null) i++;
  229. //if (JsWriter.GetTypeSerializer<JsonTypeSerializer>().GetWriteFn<T>() != null) i++;
  230. if (new List<T>() != null) i++;
  231. if (new T[0] != null) i++;
  232. JsConfig<T>.ExcludeTypeInfo = false;
  233. if (JsConfig<T>.OnDeserializedFn != null) i++;
  234. if (JsConfig<T>.HasDeserializeFn) i++;
  235. if (JsConfig<T>.SerializeFn != null) i++;
  236. if (JsConfig<T>.DeSerializeFn != null) i++;
  237. //JsConfig<T>.SerializeFn = arg => "";
  238. //JsConfig<T>.DeSerializeFn = arg => default(T);
  239. if (TypeConfig<T>.Properties != null) i++;
  240. WriteListsOfElements<T, TSerializer>.WriteList(null, null);
  241. WriteListsOfElements<T, TSerializer>.WriteIList(null, null);
  242. WriteListsOfElements<T, TSerializer>.WriteEnumerable(null, null);
  243. WriteListsOfElements<T, TSerializer>.WriteListValueType(null, null);
  244. WriteListsOfElements<T, TSerializer>.WriteIListValueType(null, null);
  245. WriteListsOfElements<T, TSerializer>.WriteGenericArrayValueType(null, null);
  246. WriteListsOfElements<T, TSerializer>.WriteArray(null, null);
  247. TranslateListWithElements<T>.LateBoundTranslateToGenericICollection(null, null);
  248. TranslateListWithConvertibleElements<T, T>.LateBoundTranslateToGenericICollection(null, null);
  249. QueryStringWriter<T>.WriteObject(null, null);
  250. return i;
  251. }
  252. internal static void RegisterElement<T, TElement, TSerializer>() where TSerializer : ITypeSerializer
  253. {
  254. DeserializeDictionary<TSerializer>.ParseDictionary<T, TElement>(null, null, null, null);
  255. DeserializeDictionary<TSerializer>.ParseDictionary<TElement, T>(null, null, null, null);
  256. ToStringDictionaryMethods<T, TElement, TSerializer>.WriteIDictionary(null, null, null, null);
  257. ToStringDictionaryMethods<TElement, T, TSerializer>.WriteIDictionary(null, null, null, null);
  258. // Include List deserialisations from the Register<> method above. This solves issue where List<Guid> properties on responses deserialise to null.
  259. // No idea why this is happening because there is no visible exception raised. Suspect IOS is swallowing an AOT exception somewhere.
  260. DeserializeArrayWithElements<TElement, TSerializer>.ParseGenericArray(null, null);
  261. DeserializeListWithElements<TElement, TSerializer>.ParseGenericList(null, null, null);
  262. // Cannot use the line below for some unknown reason - when trying to compile to run on device, mtouch bombs during native code compile.
  263. // Something about this line or its inner workings is offensive to mtouch. Luckily this was not needed for my List<Guide> issue.
  264. // DeserializeCollection<JsonTypeSerializer>.ParseCollection<TElement>(null, null, null);
  265. TranslateListWithElements<TElement>.LateBoundTranslateToGenericICollection(null, typeof(List<TElement>));
  266. TranslateListWithConvertibleElements<TElement, TElement>.LateBoundTranslateToGenericICollection(null, typeof(List<TElement>));
  267. }
  268. }
  269. }
  270. }
  271. #endif