You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

597 lines
16 KiB

  1. #region License
  2. // Copyright (c) 2007 James Newton-King
  3. //
  4. // Permission is hereby granted, free of charge, to any person
  5. // obtaining a copy of this software and associated documentation
  6. // files (the "Software"), to deal in the Software without
  7. // restriction, including without limitation the rights to use,
  8. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the
  10. // Software is furnished to do so, subject to the following
  11. // conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be
  14. // included in all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  17. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  18. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  19. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  20. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  21. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23. // OTHER DEALINGS IN THE SOFTWARE.
  24. #endregion
  25. using System;
  26. using System.Globalization;
  27. using System.IO;
  28. #if HAVE_BIG_INTEGER
  29. using System.Numerics;
  30. #endif
  31. namespace Newtonsoft.Json.Serialization
  32. {
  33. internal class TraceJsonWriter : JsonWriter
  34. {
  35. private readonly JsonWriter _innerWriter;
  36. private readonly JsonTextWriter _textWriter;
  37. private readonly StringWriter _sw;
  38. public TraceJsonWriter(JsonWriter innerWriter)
  39. {
  40. _innerWriter = innerWriter;
  41. _sw = new StringWriter(CultureInfo.InvariantCulture);
  42. // prefix the message in the stringwriter to avoid concat with a potentially large JSON string
  43. _sw.Write("Serialized JSON: " + Environment.NewLine);
  44. _textWriter = new JsonTextWriter(_sw);
  45. _textWriter.Formatting = Formatting.Indented;
  46. _textWriter.Culture = innerWriter.Culture;
  47. _textWriter.DateFormatHandling = innerWriter.DateFormatHandling;
  48. _textWriter.DateFormatString = innerWriter.DateFormatString;
  49. _textWriter.DateTimeZoneHandling = innerWriter.DateTimeZoneHandling;
  50. _textWriter.FloatFormatHandling = innerWriter.FloatFormatHandling;
  51. }
  52. public string GetSerializedJsonMessage()
  53. {
  54. return _sw.ToString();
  55. }
  56. public override void WriteValue(decimal value)
  57. {
  58. _textWriter.WriteValue(value);
  59. _innerWriter.WriteValue(value);
  60. base.WriteValue(value);
  61. }
  62. public override void WriteValue(decimal? value)
  63. {
  64. _textWriter.WriteValue(value);
  65. _innerWriter.WriteValue(value);
  66. if (value.HasValue)
  67. {
  68. base.WriteValue(value.GetValueOrDefault());
  69. }
  70. else
  71. {
  72. base.WriteUndefined();
  73. }
  74. }
  75. public override void WriteValue(bool value)
  76. {
  77. _textWriter.WriteValue(value);
  78. _innerWriter.WriteValue(value);
  79. base.WriteValue(value);
  80. }
  81. public override void WriteValue(bool? value)
  82. {
  83. _textWriter.WriteValue(value);
  84. _innerWriter.WriteValue(value);
  85. if (value.HasValue)
  86. {
  87. base.WriteValue(value.GetValueOrDefault());
  88. }
  89. else
  90. {
  91. base.WriteUndefined();
  92. }
  93. }
  94. public override void WriteValue(byte value)
  95. {
  96. _textWriter.WriteValue(value);
  97. _innerWriter.WriteValue(value);
  98. base.WriteValue(value);
  99. }
  100. public override void WriteValue(byte? value)
  101. {
  102. _textWriter.WriteValue(value);
  103. _innerWriter.WriteValue(value);
  104. if (value.HasValue)
  105. {
  106. base.WriteValue(value.GetValueOrDefault());
  107. }
  108. else
  109. {
  110. base.WriteUndefined();
  111. }
  112. }
  113. public override void WriteValue(char value)
  114. {
  115. _textWriter.WriteValue(value);
  116. _innerWriter.WriteValue(value);
  117. base.WriteValue(value);
  118. }
  119. public override void WriteValue(char? value)
  120. {
  121. _textWriter.WriteValue(value);
  122. _innerWriter.WriteValue(value);
  123. if (value.HasValue)
  124. {
  125. base.WriteValue(value.GetValueOrDefault());
  126. }
  127. else
  128. {
  129. base.WriteUndefined();
  130. }
  131. }
  132. public override void WriteValue(byte[] value)
  133. {
  134. _textWriter.WriteValue(value);
  135. _innerWriter.WriteValue(value);
  136. if (value == null)
  137. {
  138. base.WriteUndefined();
  139. }
  140. else
  141. {
  142. base.WriteValue(value);
  143. }
  144. }
  145. public override void WriteValue(DateTime value)
  146. {
  147. _textWriter.WriteValue(value);
  148. _innerWriter.WriteValue(value);
  149. base.WriteValue(value);
  150. }
  151. public override void WriteValue(DateTime? value)
  152. {
  153. _textWriter.WriteValue(value);
  154. _innerWriter.WriteValue(value);
  155. if (value.HasValue)
  156. {
  157. base.WriteValue(value.GetValueOrDefault());
  158. }
  159. else
  160. {
  161. base.WriteUndefined();
  162. }
  163. }
  164. #if !NET20
  165. public override void WriteValue(DateTimeOffset value)
  166. {
  167. _textWriter.WriteValue(value);
  168. _innerWriter.WriteValue(value);
  169. base.WriteValue(value);
  170. }
  171. public override void WriteValue(DateTimeOffset? value)
  172. {
  173. _textWriter.WriteValue(value);
  174. _innerWriter.WriteValue(value);
  175. if (value.HasValue)
  176. {
  177. base.WriteValue(value.GetValueOrDefault());
  178. }
  179. else
  180. {
  181. base.WriteUndefined();
  182. }
  183. }
  184. #endif
  185. public override void WriteValue(double value)
  186. {
  187. _textWriter.WriteValue(value);
  188. _innerWriter.WriteValue(value);
  189. base.WriteValue(value);
  190. }
  191. public override void WriteValue(double? value)
  192. {
  193. _textWriter.WriteValue(value);
  194. _innerWriter.WriteValue(value);
  195. if (value.HasValue)
  196. {
  197. base.WriteValue(value.GetValueOrDefault());
  198. }
  199. else
  200. {
  201. base.WriteUndefined();
  202. }
  203. }
  204. public override void WriteUndefined()
  205. {
  206. _textWriter.WriteUndefined();
  207. _innerWriter.WriteUndefined();
  208. base.WriteUndefined();
  209. }
  210. public override void WriteNull()
  211. {
  212. _textWriter.WriteNull();
  213. _innerWriter.WriteNull();
  214. base.WriteUndefined();
  215. }
  216. public override void WriteValue(float value)
  217. {
  218. _textWriter.WriteValue(value);
  219. _innerWriter.WriteValue(value);
  220. base.WriteValue(value);
  221. }
  222. public override void WriteValue(float? value)
  223. {
  224. _textWriter.WriteValue(value);
  225. _innerWriter.WriteValue(value);
  226. if (value.HasValue)
  227. {
  228. base.WriteValue(value.GetValueOrDefault());
  229. }
  230. else
  231. {
  232. base.WriteUndefined();
  233. }
  234. }
  235. public override void WriteValue(Guid value)
  236. {
  237. _textWriter.WriteValue(value);
  238. _innerWriter.WriteValue(value);
  239. base.WriteValue(value);
  240. }
  241. public override void WriteValue(Guid? value)
  242. {
  243. _textWriter.WriteValue(value);
  244. _innerWriter.WriteValue(value);
  245. if (value.HasValue)
  246. {
  247. base.WriteValue(value.GetValueOrDefault());
  248. }
  249. else
  250. {
  251. base.WriteUndefined();
  252. }
  253. }
  254. public override void WriteValue(int value)
  255. {
  256. _textWriter.WriteValue(value);
  257. _innerWriter.WriteValue(value);
  258. base.WriteValue(value);
  259. }
  260. public override void WriteValue(int? value)
  261. {
  262. _textWriter.WriteValue(value);
  263. _innerWriter.WriteValue(value);
  264. if (value.HasValue)
  265. {
  266. base.WriteValue(value.GetValueOrDefault());
  267. }
  268. else
  269. {
  270. base.WriteUndefined();
  271. }
  272. }
  273. public override void WriteValue(long value)
  274. {
  275. _textWriter.WriteValue(value);
  276. _innerWriter.WriteValue(value);
  277. base.WriteValue(value);
  278. }
  279. public override void WriteValue(long? value)
  280. {
  281. _textWriter.WriteValue(value);
  282. _innerWriter.WriteValue(value);
  283. if (value.HasValue)
  284. {
  285. base.WriteValue(value.GetValueOrDefault());
  286. }
  287. else
  288. {
  289. base.WriteUndefined();
  290. }
  291. }
  292. public override void WriteValue(object value)
  293. {
  294. #if HAVE_BIG_INTEGER
  295. if (value is BigInteger)
  296. {
  297. _textWriter.WriteValue(value);
  298. _innerWriter.WriteValue(value);
  299. InternalWriteValue(JsonToken.Integer);
  300. }
  301. else
  302. #endif
  303. {
  304. _textWriter.WriteValue(value);
  305. _innerWriter.WriteValue(value);
  306. if (value == null)
  307. {
  308. base.WriteUndefined();
  309. }
  310. else
  311. {
  312. // base.WriteValue(value) will error
  313. InternalWriteValue(JsonToken.String);
  314. }
  315. }
  316. }
  317. public override void WriteValue(sbyte value)
  318. {
  319. _textWriter.WriteValue(value);
  320. _innerWriter.WriteValue(value);
  321. base.WriteValue(value);
  322. }
  323. public override void WriteValue(sbyte? value)
  324. {
  325. _textWriter.WriteValue(value);
  326. _innerWriter.WriteValue(value);
  327. if (value.HasValue)
  328. {
  329. base.WriteValue(value.GetValueOrDefault());
  330. }
  331. else
  332. {
  333. base.WriteUndefined();
  334. }
  335. }
  336. public override void WriteValue(short value)
  337. {
  338. _textWriter.WriteValue(value);
  339. _innerWriter.WriteValue(value);
  340. base.WriteValue(value);
  341. }
  342. public override void WriteValue(short? value)
  343. {
  344. _textWriter.WriteValue(value);
  345. _innerWriter.WriteValue(value);
  346. if (value.HasValue)
  347. {
  348. base.WriteValue(value.GetValueOrDefault());
  349. }
  350. else
  351. {
  352. base.WriteUndefined();
  353. }
  354. }
  355. public override void WriteValue(string value)
  356. {
  357. _textWriter.WriteValue(value);
  358. _innerWriter.WriteValue(value);
  359. base.WriteValue(value);
  360. }
  361. public override void WriteValue(TimeSpan value)
  362. {
  363. _textWriter.WriteValue(value);
  364. _innerWriter.WriteValue(value);
  365. base.WriteValue(value);
  366. }
  367. public override void WriteValue(TimeSpan? value)
  368. {
  369. _textWriter.WriteValue(value);
  370. _innerWriter.WriteValue(value);
  371. if (value.HasValue)
  372. {
  373. base.WriteValue(value.GetValueOrDefault());
  374. }
  375. else
  376. {
  377. base.WriteUndefined();
  378. }
  379. }
  380. public override void WriteValue(uint value)
  381. {
  382. _textWriter.WriteValue(value);
  383. _innerWriter.WriteValue(value);
  384. base.WriteValue(value);
  385. }
  386. public override void WriteValue(uint? value)
  387. {
  388. _textWriter.WriteValue(value);
  389. _innerWriter.WriteValue(value);
  390. if (value.HasValue)
  391. {
  392. base.WriteValue(value.GetValueOrDefault());
  393. }
  394. else
  395. {
  396. base.WriteUndefined();
  397. }
  398. }
  399. public override void WriteValue(ulong value)
  400. {
  401. _textWriter.WriteValue(value);
  402. _innerWriter.WriteValue(value);
  403. base.WriteValue(value);
  404. }
  405. public override void WriteValue(ulong? value)
  406. {
  407. _textWriter.WriteValue(value);
  408. _innerWriter.WriteValue(value);
  409. if (value.HasValue)
  410. {
  411. base.WriteValue(value.GetValueOrDefault());
  412. }
  413. else
  414. {
  415. base.WriteUndefined();
  416. }
  417. }
  418. public override void WriteValue(Uri value)
  419. {
  420. _textWriter.WriteValue(value);
  421. _innerWriter.WriteValue(value);
  422. if (value == null)
  423. {
  424. base.WriteUndefined();
  425. }
  426. else
  427. {
  428. base.WriteValue(value);
  429. }
  430. }
  431. public override void WriteValue(ushort value)
  432. {
  433. _textWriter.WriteValue(value);
  434. _innerWriter.WriteValue(value);
  435. base.WriteValue(value);
  436. }
  437. public override void WriteValue(ushort? value)
  438. {
  439. _textWriter.WriteValue(value);
  440. _innerWriter.WriteValue(value);
  441. if (value.HasValue)
  442. {
  443. base.WriteValue(value.GetValueOrDefault());
  444. }
  445. else
  446. {
  447. base.WriteUndefined();
  448. }
  449. }
  450. public override void WriteWhitespace(string ws)
  451. {
  452. _textWriter.WriteWhitespace(ws);
  453. _innerWriter.WriteWhitespace(ws);
  454. base.WriteWhitespace(ws);
  455. }
  456. public override void WriteComment(string text)
  457. {
  458. _textWriter.WriteComment(text);
  459. _innerWriter.WriteComment(text);
  460. base.WriteComment(text);
  461. }
  462. public override void WriteStartArray()
  463. {
  464. _textWriter.WriteStartArray();
  465. _innerWriter.WriteStartArray();
  466. base.WriteStartArray();
  467. }
  468. public override void WriteEndArray()
  469. {
  470. _textWriter.WriteEndArray();
  471. _innerWriter.WriteEndArray();
  472. base.WriteEndArray();
  473. }
  474. public override void WriteStartConstructor(string name)
  475. {
  476. _textWriter.WriteStartConstructor(name);
  477. _innerWriter.WriteStartConstructor(name);
  478. base.WriteStartConstructor(name);
  479. }
  480. public override void WriteEndConstructor()
  481. {
  482. _textWriter.WriteEndConstructor();
  483. _innerWriter.WriteEndConstructor();
  484. base.WriteEndConstructor();
  485. }
  486. public override void WritePropertyName(string name)
  487. {
  488. _textWriter.WritePropertyName(name);
  489. _innerWriter.WritePropertyName(name);
  490. base.WritePropertyName(name);
  491. }
  492. public override void WritePropertyName(string name, bool escape)
  493. {
  494. _textWriter.WritePropertyName(name, escape);
  495. _innerWriter.WritePropertyName(name, escape);
  496. // method with escape will error
  497. base.WritePropertyName(name);
  498. }
  499. public override void WriteStartObject()
  500. {
  501. _textWriter.WriteStartObject();
  502. _innerWriter.WriteStartObject();
  503. base.WriteStartObject();
  504. }
  505. public override void WriteEndObject()
  506. {
  507. _textWriter.WriteEndObject();
  508. _innerWriter.WriteEndObject();
  509. base.WriteEndObject();
  510. }
  511. public override void WriteRawValue(string json)
  512. {
  513. _textWriter.WriteRawValue(json);
  514. _innerWriter.WriteRawValue(json);
  515. // calling base method will write json twice
  516. InternalWriteValue(JsonToken.Undefined);
  517. }
  518. public override void WriteRaw(string json)
  519. {
  520. _textWriter.WriteRaw(json);
  521. _innerWriter.WriteRaw(json);
  522. base.WriteRaw(json);
  523. }
  524. public override void Close()
  525. {
  526. _textWriter.Close();
  527. _innerWriter.Close();
  528. base.Close();
  529. }
  530. public override void Flush()
  531. {
  532. _textWriter.Flush();
  533. _innerWriter.Flush();
  534. }
  535. }
  536. }