1 |
william |
105 |
using System; |
2 |
|
|
using System.Collections.Generic; |
3 |
|
|
using System.Linq; |
4 |
|
|
using System.Text; |
5 |
|
|
using libxmltv.Interfaces; |
6 |
william |
106 |
using System.Xml.Linq; |
7 |
william |
110 |
using System.IO; |
8 |
|
|
using System.Xml.Serialization; |
9 |
|
|
using System.Xml; |
10 |
william |
105 |
|
11 |
|
|
namespace libxmltv.Core |
12 |
|
|
{ |
13 |
william |
110 |
[Serializable] |
14 |
|
|
internal class ExtraMetaData : IExtraMetaData |
15 |
william |
105 |
{ |
16 |
william |
110 |
public ExtraMetaData() : this(string.Empty, string.Empty) { } |
17 |
|
|
public ExtraMetaData(XElement node) : this() |
18 |
william |
106 |
{ |
19 |
william |
110 |
//throw new NotImplementedException("ExtraMetaData from XElement as not been implemented"); |
20 |
|
|
if (node == null) { throw new ArgumentNullException("value", "cannot be null"); } |
21 |
|
|
if (node.Name == null) { throw new ArgumentNullException("value.Name", "cannot be null"); } |
22 |
|
|
this.Name = node.Name.ToString(); |
23 |
|
|
this.Value = XElementSerializer<string>.FromXElement(node); |
24 |
william |
106 |
} |
25 |
william |
110 |
public ExtraMetaData(string name, string value) |
26 |
|
|
{ |
27 |
|
|
this.Name = name; |
28 |
|
|
this.Value = value; |
29 |
|
|
} |
30 |
william |
106 |
public override string ToString() |
31 |
|
|
{ |
32 |
|
|
return string.Format("{0}", this.Name); |
33 |
|
|
} |
34 |
william |
110 |
private string _Name; |
35 |
|
|
public string Name { get { return _Name; } set { _Name = value; } } |
36 |
|
|
private string _Value; |
37 |
|
|
public string Value { get { return _Value; } set { _Value = value; } } |
38 |
|
|
|
39 |
|
|
public XElement AsXElement() |
40 |
|
|
{ |
41 |
|
|
//throw new NotImplementedException("ExtraMetaData.AsXElement() has not been implemented"); |
42 |
|
|
return XElementSerializer<string>.ToXElement(Value); |
43 |
|
|
} |
44 |
|
|
|
45 |
|
|
#region sub-classes |
46 |
|
|
private static class XElementSerializer<TValue> |
47 |
|
|
{ |
48 |
|
|
public static XElement ToXElement(TValue value) |
49 |
|
|
{ |
50 |
|
|
if (value == null) |
51 |
|
|
{ |
52 |
|
|
throw new ArgumentNullException("value", string.Format("cannot convert a null '{0}' value to '{1}'.", typeof(TValue).Name, typeof(XElement).Name)); |
53 |
|
|
} |
54 |
|
|
XElement element = null; |
55 |
|
|
try |
56 |
|
|
{ |
57 |
|
|
element = XElement.Parse(value.ToString()); |
58 |
|
|
} |
59 |
|
|
catch (Exception ex) |
60 |
|
|
{ |
61 |
|
|
throw ex; |
62 |
|
|
} |
63 |
|
|
|
64 |
|
|
|
65 |
|
|
|
66 |
|
|
return element; |
67 |
|
|
} |
68 |
|
|
public static TValue FromXElement(XElement node) |
69 |
|
|
{ |
70 |
|
|
if (node == null) |
71 |
|
|
{ |
72 |
|
|
throw new ArgumentNullException("node", string.Format("cannot convert a null '{0}' value to {1}.", typeof(XElement).Name, typeof(TValue).Name)); |
73 |
|
|
} |
74 |
|
|
TValue value = default(TValue); |
75 |
|
|
object raw_object = new object(); |
76 |
|
|
using (var ms = new MemoryStream()) |
77 |
|
|
{ |
78 |
|
|
using (var tw = XmlWriter.Create(ms)) { node.WriteTo(tw); tw.Flush(); tw.Close(); } |
79 |
|
|
ms.Seek(0, SeekOrigin.Begin); |
80 |
|
|
using (var sr = new StreamReader(ms)) { raw_object = sr.ReadToEnd(); } |
81 |
|
|
} |
82 |
|
|
value = (TValue)Convert.ChangeType(raw_object, typeof(TValue)); |
83 |
|
|
return value; |
84 |
|
|
} |
85 |
|
|
} |
86 |
|
|
#endregion |
87 |
william |
105 |
} |
88 |
|
|
} |